master f01514d70f28 cached
379 files
1.7 MB
508.3k tokens
755 symbols
1 requests
Download .txt
Showing preview only (1,882K chars total). Download the full file or copy to clipboard to get everything.
Repository: alfonsomga/symfony.demo.on.roids
Branch: master
Commit: f01514d70f28
Files: 379
Total size: 1.7 MB

Directory structure:
gitextract_ljy0z57z/

├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── app/
│   ├── .htaccess
│   ├── AppCache.php
│   ├── AppKernel.php
│   ├── Resources/
│   │   ├── TwigBundle/
│   │   │   └── views/
│   │   │       └── Exception/
│   │   │           ├── error.html.twig
│   │   │           ├── error403.html.twig
│   │   │           ├── error404.html.twig
│   │   │           └── error500.html.twig
│   │   ├── assets/
│   │   │   ├── css/
│   │   │   │   ├── font-lato.css
│   │   │   │   └── highlight-solarized-light.css
│   │   │   ├── js/
│   │   │   │   ├── bootstrap-3.3.4.js
│   │   │   │   ├── highlight.pack.js
│   │   │   │   ├── jquery-2.1.4.js
│   │   │   │   └── main.js
│   │   │   └── scss/
│   │   │       ├── bootstrap/
│   │   │       │   ├── _alerts.scss
│   │   │       │   ├── _badges.scss
│   │   │       │   ├── _breadcrumbs.scss
│   │   │       │   ├── _button-groups.scss
│   │   │       │   ├── _buttons.scss
│   │   │       │   ├── _carousel.scss
│   │   │       │   ├── _close.scss
│   │   │       │   ├── _code.scss
│   │   │       │   ├── _component-animations.scss
│   │   │       │   ├── _dropdowns.scss
│   │   │       │   ├── _forms.scss
│   │   │       │   ├── _glyphicons.scss
│   │   │       │   ├── _grid.scss
│   │   │       │   ├── _input-groups.scss
│   │   │       │   ├── _jumbotron.scss
│   │   │       │   ├── _labels.scss
│   │   │       │   ├── _list-group.scss
│   │   │       │   ├── _media.scss
│   │   │       │   ├── _mixins.scss
│   │   │       │   ├── _modals.scss
│   │   │       │   ├── _navbar.scss
│   │   │       │   ├── _navs.scss
│   │   │       │   ├── _normalize.scss
│   │   │       │   ├── _pager.scss
│   │   │       │   ├── _pagination.scss
│   │   │       │   ├── _panels.scss
│   │   │       │   ├── _popovers.scss
│   │   │       │   ├── _print.scss
│   │   │       │   ├── _progress-bars.scss
│   │   │       │   ├── _responsive-embed.scss
│   │   │       │   ├── _responsive-utilities.scss
│   │   │       │   ├── _scaffolding.scss
│   │   │       │   ├── _tables.scss
│   │   │       │   ├── _theme.scss
│   │   │       │   ├── _thumbnails.scss
│   │   │       │   ├── _tooltip.scss
│   │   │       │   ├── _type.scss
│   │   │       │   ├── _utilities.scss
│   │   │       │   ├── _variables.scss
│   │   │       │   ├── _wells.scss
│   │   │       │   ├── flatly-theme/
│   │   │       │   │   ├── _bootswatch.scss
│   │   │       │   │   └── _variables.scss
│   │   │       │   └── mixins/
│   │   │       │       ├── _alerts.scss
│   │   │       │       ├── _background-variant.scss
│   │   │       │       ├── _border-radius.scss
│   │   │       │       ├── _buttons.scss
│   │   │       │       ├── _center-block.scss
│   │   │       │       ├── _clearfix.scss
│   │   │       │       ├── _forms.scss
│   │   │       │       ├── _gradients.scss
│   │   │       │       ├── _grid-framework.scss
│   │   │       │       ├── _grid.scss
│   │   │       │       ├── _hide-text.scss
│   │   │       │       ├── _image.scss
│   │   │       │       ├── _labels.scss
│   │   │       │       ├── _list-group.scss
│   │   │       │       ├── _nav-divider.scss
│   │   │       │       ├── _nav-vertical-align.scss
│   │   │       │       ├── _opacity.scss
│   │   │       │       ├── _pagination.scss
│   │   │       │       ├── _panels.scss
│   │   │       │       ├── _progress-bar.scss
│   │   │       │       ├── _reset-filter.scss
│   │   │       │       ├── _resize.scss
│   │   │       │       ├── _responsive-visibility.scss
│   │   │       │       ├── _size.scss
│   │   │       │       ├── _tab-focus.scss
│   │   │       │       ├── _table-row.scss
│   │   │       │       ├── _text-emphasis.scss
│   │   │       │       ├── _text-overflow.scss
│   │   │       │       └── _vendor-prefixes.scss
│   │   │       ├── bootstrap.scss
│   │   │       ├── font-awesome/
│   │   │       │   ├── _animated.scss
│   │   │       │   ├── _bordered-pulled.scss
│   │   │       │   ├── _core.scss
│   │   │       │   ├── _fixed-width.scss
│   │   │       │   ├── _icons.scss
│   │   │       │   ├── _larger.scss
│   │   │       │   ├── _list.scss
│   │   │       │   ├── _mixins.scss
│   │   │       │   ├── _path.scss
│   │   │       │   ├── _rotated-flipped.scss
│   │   │       │   ├── _stacked.scss
│   │   │       │   └── _variables.scss
│   │   │       ├── font-awesome.scss
│   │   │       └── main.scss
│   │   ├── translations/
│   │   │   ├── messages.ca.xliff
│   │   │   ├── messages.cs.xliff
│   │   │   ├── messages.de.xliff
│   │   │   ├── messages.en.xliff
│   │   │   ├── messages.es.xliff
│   │   │   ├── messages.fr.xliff
│   │   │   ├── messages.id.xliff
│   │   │   ├── messages.it.xliff
│   │   │   ├── messages.ja.xliff
│   │   │   ├── messages.nl.xliff
│   │   │   ├── messages.pl.xliff
│   │   │   ├── messages.pt_BR.xliff
│   │   │   ├── messages.ro.xliff
│   │   │   ├── messages.ru.xliff
│   │   │   ├── messages.uk.xliff
│   │   │   ├── validators.ca.xliff
│   │   │   ├── validators.cs.xliff
│   │   │   ├── validators.de.xliff
│   │   │   ├── validators.en.xliff
│   │   │   ├── validators.es.xliff
│   │   │   ├── validators.fr.xliff
│   │   │   ├── validators.id.xliff
│   │   │   ├── validators.it.xliff
│   │   │   ├── validators.ja.xliff
│   │   │   ├── validators.nl.xliff
│   │   │   ├── validators.pl.xliff
│   │   │   ├── validators.pt_BR.xliff
│   │   │   ├── validators.ro.xliff
│   │   │   ├── validators.ru.xliff
│   │   │   └── validators.uk.xliff
│   │   └── views/
│   │       ├── admin/
│   │       │   ├── blog/
│   │       │   │   ├── _form.html.twig
│   │       │   │   ├── edit.html.twig
│   │       │   │   ├── index.html.twig
│   │       │   │   ├── new.html.twig
│   │       │   │   └── show.html.twig
│   │       │   └── layout.html.twig
│   │       ├── base.html.twig
│   │       ├── blog/
│   │       │   ├── _comment_form.html.twig
│   │       │   ├── _delete_post_confirmation.html.twig
│   │       │   ├── comment_form_error.html.twig
│   │       │   ├── index.html.twig
│   │       │   └── post_show.html.twig
│   │       ├── default/
│   │       │   ├── _flash_messages.html.twig
│   │       │   └── homepage.html.twig
│   │       ├── form/
│   │       │   └── fields.html.twig
│   │       └── security/
│   │           └── login.html.twig
│   ├── SymfonyRequirements.php
│   ├── autoload.php
│   ├── check.php
│   ├── config/
│   │   ├── config.yml
│   │   ├── config_dev.yml
│   │   ├── config_prod.yml
│   │   ├── config_test.yml
│   │   ├── parameters.yml.dist
│   │   ├── routing.yml
│   │   ├── routing_dev.yml
│   │   ├── security.yml
│   │   └── services.yml
│   ├── console
│   ├── logs/
│   │   └── .gitkeep
│   └── phpunit.xml.dist
├── composer.json
├── src/
│   ├── .htaccess
│   ├── AppBundle/
│   │   ├── AppBundle.php
│   │   ├── Command/
│   │   │   ├── AddUserCommand.php
│   │   │   ├── DeleteUserCommand.php
│   │   │   └── ListUsersCommand.php
│   │   ├── Controller/
│   │   │   ├── Admin/
│   │   │   │   └── BlogController.php
│   │   │   ├── BlogController.php
│   │   │   └── SecurityController.php
│   │   ├── DataFixtures/
│   │   │   └── ORM/
│   │   │       └── LoadFixtures.php
│   │   ├── Entity/
│   │   │   ├── Comment.php
│   │   │   ├── Post.php
│   │   │   └── User.php
│   │   ├── EventListener/
│   │   │   └── RedirectToPreferredLocaleListener.php
│   │   ├── Form/
│   │   │   ├── CommentType.php
│   │   │   ├── PostType.php
│   │   │   └── Type/
│   │   │       └── DateTimePickerType.php
│   │   ├── Repository/
│   │   │   ├── PostRepository.php
│   │   │   └── UserRepository.php
│   │   ├── Tests/
│   │   │   ├── Controller/
│   │   │   │   ├── Admin/
│   │   │   │   │   └── BlogControllerTest.php
│   │   │   │   ├── BlogControllerTest.php
│   │   │   │   └── DefaultControllerTest.php
│   │   │   └── Utils/
│   │   │       └── SluggerTest.php
│   │   ├── Twig/
│   │   │   └── AppExtension.php
│   │   └── Utils/
│   │       ├── Markdown.php
│   │       ├── MomentFormatConverter.php
│   │       └── Slugger.php
│   ├── CodeExplorerBundle/
│   │   ├── CodeExplorerBundle.php
│   │   ├── DependencyInjection/
│   │   │   └── CodeExplorerExtension.php
│   │   ├── EventListener/
│   │   │   └── ControllerListener.php
│   │   ├── Resources/
│   │   │   ├── config/
│   │   │   │   └── services.yml
│   │   │   └── views/
│   │   │       └── source_code.html.twig
│   │   └── Twig/
│   │       └── SourceCodeExtension.php
│   ├── ElasticSearchBundle/
│   │   ├── Controller/
│   │   │   └── ElasticSearchController.php
│   │   ├── ElasticSearchBundle.php
│   │   ├── Resources/
│   │   │   ├── config/
│   │   │   │   ├── config.yml
│   │   │   │   ├── routing.yml
│   │   │   │   └── services.yml
│   │   │   └── views/
│   │   │       └── elastica_search_results.html.twig
│   │   └── Tests/
│   │       └── Controller/
│   │           └── ElasticSearchControllerTest.php
│   ├── OAuthBundle/
│   │   ├── Controller/
│   │   │   └── OAuthController.php
│   │   ├── DependencyInjection/
│   │   │   ├── Configuration.php
│   │   │   └── OAuthExtension.php
│   │   ├── OAuthBundle.php
│   │   ├── Provider/
│   │   │   └── UserProvider.php
│   │   ├── Resources/
│   │   │   └── config/
│   │   │       ├── config.yml
│   │   │       ├── routing.yml
│   │   │       └── services.yml
│   │   ├── Services/
│   │   │   └── AuthenticationSuccessHandler.php
│   │   └── Tests/
│   │       ├── Controller/
│   │       │   └── OAuthControllerTest.php
│   │       └── OAuthTest.php
│   ├── RabbitMQBundle/
│   │   ├── Controller/
│   │   │   └── RabbitMQController.php
│   │   ├── DependencyInjection/
│   │   │   ├── Configuration.php
│   │   │   └── RabbitMQExtension.php
│   │   ├── RabbitMQBundle.php
│   │   ├── Resources/
│   │   │   ├── config/
│   │   │   │   ├── config.yml
│   │   │   │   ├── config_dev.yml
│   │   │   │   ├── config_test.yml
│   │   │   │   ├── routing.yml
│   │   │   │   └── services.yml
│   │   │   └── views/
│   │   │       └── pdf_post_view.html.twig
│   │   ├── Services/
│   │   │   ├── PDFGenerator.php
│   │   │   └── RabbitMQ/
│   │   │       └── PDFGeneratorConsumer.php
│   │   └── Tests/
│   │       └── Controller/
│   │           └── RabbitMQControllerTest.php
│   ├── RedisBundle/
│   │   ├── Controller/
│   │   │   └── RedisController.php
│   │   ├── RedisBundle.php
│   │   ├── Resources/
│   │   │   ├── config/
│   │   │   │   ├── config.yml
│   │   │   │   ├── routing.yml
│   │   │   │   └── services.yml
│   │   │   └── views/
│   │   │       └── blog/
│   │   │           └── top_posts.html.twig
│   │   └── Tests/
│   │       └── Controller/
│   │           └── RedisControllerTest.php
│   └── RestBundle/
│       ├── Controller/
│       │   └── RestController.php
│       ├── DependencyInjection/
│       │   ├── Configuration.php
│       │   └── RestExtension.php
│       ├── Form/
│       │   ├── CommentRestType.php
│       │   └── PostRestType.php
│       ├── Resources/
│       │   ├── config/
│       │   │   ├── config.yml
│       │   │   ├── routing.yml
│       │   │   ├── serializer/
│       │   │   │   └── AppBundle/
│       │   │   │       ├── Entity.Comment.yml
│       │   │   │       └── Entity.Post.yml
│       │   │   └── services.yml
│       │   └── views/
│       │       ├── Comment/
│       │       │   ├── editComment.html.twig
│       │       │   ├── getComment.html.twig
│       │       │   ├── getComments.html.twig
│       │       │   └── newComment.html.twig
│       │       ├── Post/
│       │       │   ├── editPost.html.twig
│       │       │   ├── getPost.html.twig
│       │       │   ├── getPosts.html.twig
│       │       │   └── newPost.html.twig
│       │       ├── api_base_layout.html.twig
│       │       └── api_index.html.twig
│       ├── RestBundle.php
│       └── Tests/
│           └── Controller/
│               └── RestControllerTest.php
├── vagrant/
│   ├── Vagrantfile
│   └── ansible/
│       ├── hosts_inventory
│       ├── roles/
│       │   ├── Stouts.rabbitmq/
│       │   │   ├── .bumpversion.cfg
│       │   │   ├── .travis.yml
│       │   │   ├── CONTRIBUTORS
│       │   │   ├── LICENSE
│       │   │   ├── Makefile
│       │   │   ├── README.md
│       │   │   ├── defaults/
│       │   │   │   └── main.yml
│       │   │   ├── handlers/
│       │   │   │   └── main.yml
│       │   │   ├── meta/
│       │   │   │   ├── .galaxy_install_info
│       │   │   │   └── main.yml
│       │   │   ├── tasks/
│       │   │   │   ├── install.deb.yml
│       │   │   │   ├── main.yml
│       │   │   │   └── rabbitmq.yml
│       │   │   └── test.yml
│       │   ├── geerlingguy.composer/
│       │   │   ├── .travis.yml
│       │   │   ├── README.md
│       │   │   ├── defaults/
│       │   │   │   └── main.yml
│       │   │   ├── meta/
│       │   │   │   ├── .galaxy_install_info
│       │   │   │   └── main.yml
│       │   │   ├── tasks/
│       │   │   │   ├── global-require.yml
│       │   │   │   └── main.yml
│       │   │   ├── templates/
│       │   │   │   ├── auth.json.j2
│       │   │   │   └── composer.sh.j2
│       │   │   └── tests/
│       │   │       ├── inventory
│       │   │       ├── test-global-require.yml
│       │   │       └── test.yml
│       │   ├── geerlingguy.nginx/
│       │   │   ├── .travis.yml
│       │   │   ├── README.md
│       │   │   ├── defaults/
│       │   │   │   └── main.yml
│       │   │   ├── handlers/
│       │   │   │   └── main.yml
│       │   │   ├── meta/
│       │   │   │   ├── .galaxy_install_info
│       │   │   │   └── main.yml
│       │   │   ├── tasks/
│       │   │   │   ├── main.yml
│       │   │   │   ├── setup-Debian.yml
│       │   │   │   ├── setup-RedHat.yml
│       │   │   │   └── vhosts.yml
│       │   │   ├── templates/
│       │   │   │   ├── nginx.conf.j2
│       │   │   │   ├── nginx.repo.j2
│       │   │   │   └── vhosts.j2
│       │   │   ├── tests/
│       │   │   │   ├── inventory
│       │   │   │   └── test.yml
│       │   │   └── vars/
│       │   │       ├── Debian.yml
│       │   │       └── RedHat.yml
│       │   ├── geerlingguy.php/
│       │   │   ├── .travis.yml
│       │   │   ├── README.md
│       │   │   ├── defaults/
│       │   │   │   └── main.yml
│       │   │   ├── handlers/
│       │   │   │   └── main.yml
│       │   │   ├── meta/
│       │   │   │   ├── .galaxy_install_info
│       │   │   │   └── main.yml
│       │   │   ├── tasks/
│       │   │   │   ├── configure-fpm.yml
│       │   │   │   ├── configure.yml
│       │   │   │   ├── install-from-source.yml
│       │   │   │   ├── main.yml
│       │   │   │   ├── setup-Debian.yml
│       │   │   │   └── setup-RedHat.yml
│       │   │   ├── templates/
│       │   │   │   ├── apc.ini.j2
│       │   │   │   ├── fpm-init.j2
│       │   │   │   ├── opcache.ini.j2
│       │   │   │   ├── php-fpm.conf.j2
│       │   │   │   └── php.ini.j2
│       │   │   ├── tests/
│       │   │   │   ├── inventory
│       │   │   │   ├── test-install-from-source.yml
│       │   │   │   └── test-install-package.yml
│       │   │   └── vars/
│       │   │       ├── Debian.yml
│       │   │       └── RedHat.yml
│       │   ├── geerlingguy.redis/
│       │   │   ├── .travis.yml
│       │   │   ├── README.md
│       │   │   ├── defaults/
│       │   │   │   └── main.yml
│       │   │   ├── handlers/
│       │   │   │   └── main.yml
│       │   │   ├── meta/
│       │   │   │   ├── .galaxy_install_info
│       │   │   │   └── main.yml
│       │   │   ├── tasks/
│       │   │   │   ├── main.yml
│       │   │   │   ├── setup-Debian.yml
│       │   │   │   └── setup-RedHat.yml
│       │   │   ├── templates/
│       │   │   │   └── redis.conf.j2
│       │   │   ├── tests/
│       │   │   │   ├── inventory
│       │   │   │   └── test.yml
│       │   │   └── vars/
│       │   │       ├── Debian.yml
│       │   │       └── RedHat.yml
│       │   └── gpstathis.elasticsearch/
│       │       ├── .gitignore
│       │       ├── .travis.yml
│       │       ├── README.md
│       │       ├── Vagrantfile
│       │       ├── defaults/
│       │       │   └── main.yml
│       │       ├── handlers/
│       │       │   └── main.yml
│       │       ├── meta/
│       │       │   ├── .galaxy_install_info
│       │       │   └── main.yml
│       │       ├── tasks/
│       │       │   ├── aws.yml
│       │       │   ├── custom-jars.yml
│       │       │   ├── elastic-install.yml
│       │       │   ├── java.yml
│       │       │   ├── main.yml
│       │       │   ├── marvel.yml
│       │       │   ├── plugins.yml
│       │       │   ├── post-run.yml
│       │       │   ├── spm.yml
│       │       │   └── timezone.yml
│       │       ├── templates/
│       │       │   ├── elasticsearch.default.j2
│       │       │   ├── elasticsearch.in.sh.j2
│       │       │   └── elasticsearch.yml.j2
│       │       ├── tests/
│       │       │   ├── ansible.cfg
│       │       │   ├── elastic_test.sh
│       │       │   ├── local.ini
│       │       │   ├── test1.yml
│       │       │   └── test1_var.yml
│       │       ├── vagrant-inventory.ini
│       │       ├── vagrant-main.yml
│       │       └── vars/
│       │           ├── sample.yml
│       │           └── vagrant.yml
│       ├── setup.yml
│       └── templates/
│           └── rabbitmq-consumers.j2
└── web/
    ├── .htaccess
    ├── app.php
    ├── app_dev.php
    ├── config.php
    ├── css/
    │   ├── api.css
    │   └── app.css
    ├── fonts/
    │   └── font-awesome/
    │       └── FontAwesome.otf
    ├── js/
    │   └── app.js
    └── robots.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Cache and logs (Symfony2)
/app/cache/*
/app/logs/*
!app/cache/.gitkeep
!app/logs/.gitkeep

# Cache and logs (Symfony3)
/var/cache/*
/var/logs/*
!var/cache/.gitkeep
!var/logs/.gitkeep

# Parameters
/app/config/parameters.yml
/app/config/parameters.ini

# Managed by Composer
/app/bootstrap.php.cache
/var/bootstrap.php.cache
/bin/*
!bin/console
!bin/symfony_requirements
/vendor/

# Assets and user uploads
/web/bundles/
/web/uploads/
/web/downloads/

# PHPUnit
/app/phpunit.xml
/phpunit.xml

# Build data
/build/

# Composer PHAR
/composer.phar

# Vagrant
/vagrant/.vagrant/

# IDE
/.idea/

================================================
FILE: .travis.yml
================================================
language: php

sudo: required

cache:
  directories:
    - $HOME/.composer/cache/files

matrix:
  fast_finish: true
  include:
    - php: 5.5
    - php: 5.6
    - php: 7.0
  allow_failures:
    - php: 7.0

services:
  - redis-server
  - elasticsearch
  - rabbitmq

before_install:
    - wget http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
    - tar xf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
    - sudo mv wkhtmltox/bin/wkhtmltopdf /usr/local/bin/
    - chmod +x /usr/local/bin/wkhtmltopdf

install:
  - composer install

before_script:
  - sudo rabbitmqctl add_user admin symfony.demo.on.roids
  - app/console rabbitmq:consumer generate_pdf --env=test &

script:
  - phpunit -c app

================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Alfonso M.

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.



================================================
FILE: README.md
================================================
# The Symfony Demo Application on Roids!
[![Build Status](https://travis-ci.org/alfonsomga/symfony.demo.on.roids.svg)](https://travis-ci.org/alfonsomga/symfony.demo.on.roids)[![Total Downloads](https://poser.pugx.org/alfonsomga/symfony.demo.on.roids/downloads)](https://packagist.org/packages/alfonsomga/symfony.demo.on.roids)[![PHP Version](https://img.shields.io/badge/php-5.5.21+-ff69b4.svg)](https://packagist.org/packages/alfonsomga/symfony.demo.on.roids)[![License](https://poser.pugx.org/alfonsomga/symfony.demo.on.roids/license)](https://packagist.org/packages/alfonsomga/symfony.demo.on.roids)

The "Symfony Demo Application on Roids" is an application based on the original [**Symfony Demo Application**](https://github.com/symfony/symfony-demo) that includes extra features using technologies like [**Elasticsearch**](https://www.elastic.co/products/elasticsearch), [**OAuth**](http://oauth.net/), [**RabbitMQ**](https://www.rabbitmq.com/), [**Redis**](http://redis.io/) and a [**RESTful API**](https://en.wikipedia.org/wiki/Representational_state_transfer) + [**HATEOAS**](https://en.wikipedia.org/wiki/HATEOAS).

<p align="center">
  <a href="#"><img src="http://svgporn.com/logos/elasticsearch.svg" heigh="15%" width="15%"></a>
  <a href="#"><img src="http://svgporn.com/logos/oauth.svg" heigh="15%" width="15%"></a>
  <a href="#"><img src="http://svgporn.com/logos/rabbitmq.svg" heigh="15%" width="15%"></a>
  <a href="#"><img src="http://svgporn.com/logos/redis.svg" heigh="15%" width="15%"></a>
  <a href="#"><img src="https://i.imgur.com/qovozc2.png" heigh="15%" width="15%"></a>
</p>

## Table of Contents
- [Setting up & running the demo with Vagrant + Ansible](#setting-up--running-the-demo-with-vagrant--ansible)
  - [Prerequisites](#prerequisites)
  - [Instructions](#instructions)
- [RESTful API + HATEOAS](#restful-api--hateoas)
- [Elasticsearch](#elasticsearch)
- [OAuth](#oauth)
- [RabbitMQ](#rabbitmq)
- [Redis](#redis)

<img src="http://svgporn.com/logos/ansible.svg" heigh="5%" width="5%" align="right">
<img src="http://svgporn.com/logos/vagrant.svg" heigh="5%" width="5%" align="right">
## Setting up & running the demo with [**Vagrant**](https://www.vagrantup.com/) + [**Ansible**](http://www.ansible.com/)
<img src="http://fotos.subefotos.com/dd1a2c7b983291b6bba45185952f1eaeo.png">
### Prerequisites
- [Vagrant](https://www.vagrantup.com/downloads.html) installed
- [Ansible] (http://docs.ansible.com/ansible/intro_installation.html) installed
- [Virtualbox](https://www.virtualbox.org/wiki/Downloads) installed


### Instructions
1. ``git clone https://github.com/alfonsomga/symfony.demo.on.roids.git``
2. ``cd symfony.demo.on.roids/vagrant/``
3. ``vagrant up``
4. Wait until Ansible installs and configure everything
5. Finally navigate to <a href="http://192.168.50.88/" target="_blank">**http://192.168.50.88**</a> to browse the app
 
Congratulations! You're now ready to use The Symfony Demo On Roids.

<img src="https://i.imgur.com/qovozc2.png" heigh="10%" width="10%" align="right">
## RESTful API + HATEOAS
<img src="http://fotos.subefotos.com/902ef9199023b7d7ff1e37aadc32ee09o.png">

A RESTful API + HATEOAS has been implemented for expose the resources. Different formats are available for manage the data: HTML, JSON and XML.

**Related urls:**
- <a href="http://192.168.50.88/api/v1/" target="_blank">**API Index page**</a>
- <a href="http://192.168.50.88/api/doc" target="_blank">**API Documentation**</a>

**Bundles used:**
- [**FOSRestBundle**](https://github.com/FriendsOfSymfony/FOSRestBundle)
- [**JMSSerializerBundle**](https://github.com/schmittjoh/JMSSerializerBundle)
- [**NelmioApiDocBundle**](https://github.com/nelmio/NelmioApiDocBundle)
- [**FOSHttpCacheBundle**](https://github.com/FriendsOfSymfony/FOSHttpCacheBundle)
- [**BazingaHateoasBundle**](https://github.com/willdurand/BazingaHateoasBundle)
- [**BazingaRestExtraBundle**](https://github.com/willdurand/BazingaRestExtraBundle)

<img src="http://svgporn.com/logos/elasticsearch.svg" heigh="10%" width="10%" align="right">
## Elasticsearch
<img src="http://fotos.subefotos.com/073c48b4ad7243e1ca4385dc34f5a2e9o.png">

Elasticsearch has been used for add a simple search form and show relevant results based on the user search query.

**Related urls:**
- <a href="http://192.168.50.88:9200/_plugin/head/" target="_blank">**Elasticsearch Admin panel**</a>
- <a href="http://192.168.50.88/blog/search-results?q=Lorem+ipsum" target="_blank">**Elasticsearch app search page (results for ``Lorem ipsum``)**</a>

**Bundles used:**
- [**FOSElasticaBundle**](https://github.com/FriendsOfSymfony/FOSElasticaBundle)

<img src="http://svgporn.com/logos/oauth.svg" heigh="15%" width="10%" align="right">
## OAuth
<img src="http://fotos.subefotos.com/8aa0e2f21490393c399ed412b0003ba3o.png">

OAuth has been used for link/unlink an account from an OAuth provider (GitHub in this case) to an existent backend account and allows to log in directly to the backend from a GitHub account.

To use this feature you must [register a new OAuth Application](https://github.com/settings/applications/new) and edit the [parameters.yml.dist](https://github.com/alfonsomga/symfony.demo.on.roids/blob/master/app/config/parameters.yml.dist) file with your app  ``client id`` and ``client secret`` token.

**Related urls:**
- <a href="http://192.168.50.88/en/login" target="_blank">**Login page (click on ``Sign in with GitHub``)**</a>
- <a href="http://192.168.50.88/en/admin/post/" target="_blank">**Manage your OAuth account (``Link`` or ``Unlink`` ``Github Account``)**</a>

**Bundles used:**
- [**HWIOAuthBundle**](https://github.com/hwi/HWIOAuthBundle)

<img src="http://svgporn.com/logos/rabbitmq.svg" heigh="10%" width="10%" align="right">
## RabbitMQ
<img src="http://fotos.subefotos.com/39b1eaf4c05ef3124701805f9d3a80d7o.png">

RabbitMQ has been used for generate a PDF file based on the article content from a consumer in a scalable way.

**Related urls:**
- <a href="http://192.168.50.88:15672" target="_blank">**RabbitMQ Admin panel (User: ``admin`` password: ``symfony.demo.on.roids``)**</a>
- <a href="http://192.168.50.88/en/blog/posts/lorem-ipsum-dolor-sit-amet-consectetur-adipiscing-elit" target="_blank">**Post page (click on ``Download post as PDF``)**</a>

**Bundles used:**
- [**RabbitMqBundle**](https://github.com/videlalvaro/RabbitMqBundle)
- [**KnpSnappyBundle**](https://github.com/KnpLabs/KnpSnappyBundle)

<img src="http://svgporn.com/logos/redis.svg" heigh="10%" width="10%" align="right">
## Redis
<img src="http://fotos.subefotos.com/8e6e6a3507f8145c3bf72d3c9af53951o.png">

Redis has been used for show the top 5 popular posts and set a cache lifetime of 3600 seconds.

**Related urls:**
- <a href="http://192.168.50.88/blog/top-5-popular-posts" target="_blank">**Top 5 popular posts**</a>

**Bundles used:**
- [**SncRedisBundle**](https://github.com/snc/SncRedisBundle)


================================================
FILE: app/.htaccess
================================================
<IfModule mod_authz_core.c>
    Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
    Order deny,allow
    Deny from all
</IfModule>


================================================
FILE: app/AppCache.php
================================================
<?php

use Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache;

class AppCache extends HttpCache
{
}


================================================
FILE: app/AppKernel.php
================================================
<?php

use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        // When you install a third-party bundle or create a new bundle in your
        // application, you must add it in the following array to register it
        // in the application. Otherwise, the bundle won't be enabled and you
        // won't be able to use it.
        $bundles = array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
            new Symfony\Bundle\MonologBundle\MonologBundle(),
            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
            new Symfony\Bundle\AsseticBundle\AsseticBundle(),
            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
            new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(),
            new CodeExplorerBundle\CodeExplorerBundle(),
            new AppBundle\AppBundle(),
            new RestBundle\RestBundle(),
            new OAuthBundle\OAuthBundle(),
            new RedisBundle\RedisBundle(),
            new RabbitMQBundle\RabbitMQBundle(),
            new ElasticSearchBundle\ElasticSearchBundle(),
            new JMS\SerializerBundle\JMSSerializerBundle(),
            new FOS\RestBundle\FOSRestBundle(),
            new Nelmio\ApiDocBundle\NelmioApiDocBundle(),
            new FOS\HttpCacheBundle\FOSHttpCacheBundle(),
            new Bazinga\Bundle\HateoasBundle\BazingaHateoasBundle(),
            new Bazinga\Bundle\RestExtraBundle\BazingaRestExtraBundle(),
            new HWI\Bundle\OAuthBundle\HWIOAuthBundle(),
            new Snc\RedisBundle\SncRedisBundle(),
            new FOS\ElasticaBundle\FOSElasticaBundle(),
            new OldSound\RabbitMqBundle\OldSoundRabbitMqBundle(),
            new Knp\Bundle\SnappyBundle\KnpSnappyBundle(),
        );

        // Some bundles are only used while developing the application or during
        // the unit and functional tests. Therefore, they are only registered
        // when the application runs in 'dev' or 'test' environments. This allows
        // to increase application performance in the production environment.
        if (in_array($this->getEnvironment(), array('dev', 'test'))) {
            $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
            $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
            $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
            $bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle();
            $bundles[] = new Liip\FunctionalTestBundle\LiipFunctionalTestBundle();
        }

        return $bundles;
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
    }
}


================================================
FILE: app/Resources/TwigBundle/views/Exception/error.html.twig
================================================
{#
    This template is used to render any error different from 403, 404 and 500.

    This is the simplest way to customize error pages in Symfony applications.
    In case you need it, you can also hook into the internal exception handling
    made by Symfony. This allows you to perform advanced tasks and even recover
    your application from some errors.
    See http://symfony.com/doc/current/cookbook/controller/error_pages.html
#}

{% extends 'base.html.twig' %}

{% block body_id 'error' %}

{% block main %}
    <h1 class="text-danger">Error</h1>

    <p class="lead">
        There was an unknown error (HTTP {{ status_code }})
        that prevented to complete your request.
    </p>
    <p>
        Try loading this page again in some minutes or
        <a href="{{ path('blog_index') }}">go back to the homepage</a>.
    </p>
{% endblock %}

{% block sidebar %}
    {{ parent() }}

    {{ show_source_code(_self) }}
{% endblock %}


================================================
FILE: app/Resources/TwigBundle/views/Exception/error403.html.twig
================================================
{#
    This template is used to render errors of type HTTP 403 (Forbidden)

    This is the simplest way to customize error pages in Symfony applications.
    In case you need it, you can also hook into the internal exception handling
    made by Symfony. This allows you to perform advanced tasks and even recover
    your application from some errors.
    See http://symfony.com/doc/current/cookbook/controller/error_pages.html
#}

{% extends 'base.html.twig' %}

{% block body_id 'error' %}

{% block main %}
    <h1 class="text-danger"><i class="fa fa-unlock-alt"></i> Error 403</h1>

    <p class="lead">
        You don't have permission to access to this resource.
    </p>
    <p>
        Ask your manager or system administrator to grant you
        access to this resource.
    </p>
{% endblock %}

{% block sidebar %}
    {{ parent() }}

    {{ show_source_code(_self) }}
{% endblock %}


================================================
FILE: app/Resources/TwigBundle/views/Exception/error404.html.twig
================================================
{#
    This template is used to render errors of type HTTP 404 (Not Found)

    This is the simplest way to customize error pages in Symfony applications.
    In case you need it, you can also hook into the internal exception handling
    made by Symfony. This allows you to perform advanced tasks and even recover
    your application from some errors.
    See http://symfony.com/doc/current/cookbook/controller/error_pages.html
#}

{% extends 'base.html.twig' %}

{% block body_id 'error' %}

{% block main %}
    <h1 class="text-danger">Error 404</h1>

    <p class="lead">
        We couldn't find the page you requested.
    </p>
    <p>
        Check out any misspelling in the URL or
        <a href="{{ path('blog_index') }}">go back to the homepage</a>.
    </p>
{% endblock %}

{% block sidebar %}
    {{ parent() }}

    {{ show_source_code(_self) }}
{% endblock %}


================================================
FILE: app/Resources/TwigBundle/views/Exception/error500.html.twig
================================================
{#
    This template is used to render errors of type HTTP 500 (Internal Server Error)

    This is the simplest way to customize error pages in Symfony applications.
    In case you need it, you can also hook into the internal exception handling
    made by Symfony. This allows you to perform advanced tasks and even recover
    your application from some errors.
    See http://symfony.com/doc/current/cookbook/controller/error_pages.html
#}

{% extends 'base.html.twig' %}

{% block body_id 'error' %}

{% block main %}
    <h1 class="text-danger">Error 500</h1>

    <p class="lead">
        There was an internal server error.
    </p>
    <p>
        Try loading this page again in some minutes or
        <a href="{{ path('blog_index') }}">go back to the homepage</a>.
    </p>
{% endblock %}

{% block sidebar %}
    {{ parent() }}

    {{ show_source_code(_self) }}
{% endblock %}


================================================
FILE: app/Resources/assets/css/font-lato.css
================================================
@font-face {
  font-family: 'Lato';
  font-style: normal;
  font-weight: 400;
  src: local('Lato Regular'), local('Lato-Regular'), url('../fonts/lato/Lato-Regular.woff') format('woff');
}
@font-face {
  font-family: 'Lato';
  font-style: normal;
  font-weight: 700;
  src: local('Lato Bold'), local('Lato-Bold'), url('../fonts/lato/Lato-Bold.woff') format('woff');
}
@font-face {
  font-family: 'Lato';
  font-style: italic;
  font-weight: 400;
  src: local('Lato Italic'), local('Lato-Italic'), url('../fonts/lato/Lato-Italic.woff') format('woff');
}
@font-face {
  font-family: 'Lato';
  font-style: italic;
  font-weight: 700;
  src: local('Lato Bold Italic'), local('Lato-BoldItalic'), url('../fonts/lato/Lato-BoldItalic.woff') format('woff');
}


================================================
FILE: app/Resources/assets/css/highlight-solarized-light.css
================================================
/*

Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>

*/

.hljs {
  display: block;
  overflow-x: auto;
  padding: 0.5em;
  background: #fdf6e3;
  color: #657b83;
  -webkit-text-size-adjust: none;
}

.hljs-comment,
.diff .hljs-header,
.hljs-doctype,
.hljs-pi,
.lisp .hljs-string,
.hljs-javadoc {
  color: #93a1a1;
}

/* Solarized Green */
.hljs-keyword,
.hljs-winutils,
.method,
.hljs-addition,
.css .hljs-tag,
.hljs-request,
.hljs-status,
.nginx .hljs-title {
  color: #859900;
}

/* Solarized Cyan */
.hljs-number,
.hljs-command,
.hljs-string,
.hljs-tag .hljs-value,
.hljs-rules .hljs-value,
.hljs-phpdoc,
.hljs-dartdoc,
.tex .hljs-formula,
.hljs-regexp,
.hljs-hexcolor,
.hljs-link_url {
  color: #2aa198;
}

/* Solarized Blue */
.hljs-title,
.hljs-localvars,
.hljs-chunk,
.hljs-decorator,
.hljs-built_in,
.hljs-identifier,
.vhdl .hljs-literal,
.hljs-id,
.css .hljs-function {
  color: #268bd2;
}

/* Solarized Yellow */
.hljs-attribute,
.hljs-variable,
.lisp .hljs-body,
.smalltalk .hljs-number,
.hljs-constant,
.hljs-class .hljs-title,
.hljs-parent,
.hljs-type,
.hljs-link_reference {
  color: #b58900;
}

/* Solarized Orange */
.hljs-preprocessor,
.hljs-preprocessor .hljs-keyword,
.hljs-pragma,
.hljs-shebang,
.hljs-symbol,
.hljs-symbol .hljs-string,
.diff .hljs-change,
.hljs-special,
.hljs-attr_selector,
.hljs-subst,
.hljs-cdata,
.css .hljs-pseudo,
.hljs-header {
  color: #cb4b16;
}

/* Solarized Red */
.hljs-deletion,
.hljs-important {
  color: #dc322f;
}

/* Solarized Violet */
.hljs-link_label {
  color: #6c71c4;
}

.tex .hljs-formula {
  background: #eee8d5;
}


================================================
FILE: app/Resources/assets/js/bootstrap-3.3.4.js
================================================
/*!
 * Bootstrap v3.3.4 (http://getbootstrap.com)
 * Copyright 2011-2015 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 */

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

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

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


+function ($) {
  'use strict';

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

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

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

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

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

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

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

    if (!$.support.transition) return

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

}(jQuery);

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


+function ($) {
  'use strict';

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

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

  Alert.VERSION = '3.3.4'

  Alert.TRANSITION_DURATION = 150

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

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

    var $parent = $(selector)

    if (e) e.preventDefault()

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

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

    if (e.isDefaultPrevented()) return

    $parent.removeClass('in')

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

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


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

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

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

  var old = $.fn.alert

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


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

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


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

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

}(jQuery);

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


+function ($) {
  'use strict';

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

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

  Button.VERSION  = '3.3.4'

  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 = state + 'Text'

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

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

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

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

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

    if (changed) this.$element.toggleClass('active')
  }


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

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

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

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

  var old = $.fn.button

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


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

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


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

  $(document)
    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      var $btn = $(e.target)
      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
      Plugin.call($btn, 'toggle')
      e.preventDefault()
    })
    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
    })

}(jQuery);

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


+function ($) {
  'use strict';

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

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

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

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

  Carousel.VERSION  = '3.3.4'

  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.4
 * http://getbootstrap.com/javascript/#collapse
 * ========================================================================
 * Copyright 2011-2015 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

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

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

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

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

  Collapse.VERSION  = '3.3.4'

  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.4
 * http://getbootstrap.com/javascript/#dropdowns
 * ========================================================================
 * Copyright 2011-2015 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

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

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

  Dropdown.VERSION = '3.3.4'

  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
        $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
      }

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

      if (e.isDefaultPrevented()) return

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

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

    return false
  }

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

    var $this = $(this)

    e.preventDefault()
    e.stopPropagation()

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

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

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

    var desc = ' li:not(.disabled):visible a'
    var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + 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')
  }

  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

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

      if (e.isDefaultPrevented()) return

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

  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()
  }


  // 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', '[role="menu"]', Dropdown.prototype.keydown)
    .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown)

}(jQuery);

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


+function ($) {
  'use strict';

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

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

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

  Modal.VERSION  = '3.3.4'

  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')
        .attr('aria-hidden', false)

      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')
      .attr('aria-hidden', true)
      .off('click.dismiss.bs.modal')
      .off('mouseup.dismiss.bs.modal')

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

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

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

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

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

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

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

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

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

      this.$backdrop = $('<div class="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.4
 * http://getbootstrap.com/javascript/#tooltip
 * Inspired by the original jQuery.tipsy by Jason Frame
 * ========================================================================
 * Copyright 2011-2015 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

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

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

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

  Tooltip.VERSION  = '3.3.4'

  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 && $(this.options.viewport.selector || this.options.viewport)

    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.$tip && self.$tip.is(':visible')) {
      self.hoverState = 'in'
      return
    }

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

    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.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)
    }

    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)

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

      if (autoPlace) {
        var orgPlacement = placement
        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()
        var containerDim = this.getPosition($container)

        placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top'    :
                    placement == 'top'    && pos.top    - actualHeight < containerDim.top    ? 'bottom' :
                    placement == 'right'  && pos.right  + actualWidth  > containerDim.width  ? 'left'   :
                    placement == 'left'   && pos.left   - actualWidth  < containerDim.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  = offset.top  + marginTop
    offset.left = offset.left + marginLeft

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

    $tip.addClass('in')

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

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

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

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

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

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

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

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

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

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

    function complete() {
      if (that.hoverState != 'in') $tip.detach()
      that.$element
        .removeAttr('aria-describedby')
        .trigger('hidden.bs.' + that.type)
      callback && callback()
    }

    this.$element.trigger(e)

    if (e.isDefaultPrevented()) return

    $tip.removeClass('in')

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

    this.hoverState = null

    return this
  }

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

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

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

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

    var elRect    = el.getBoundingClientRect()
    if (elRect.width == null) {
      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
    }
    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null

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

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

  }

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

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

    if (/right|left/.test(placement)) {
      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
      if (topEdgeOffset < viewportDimensions.top) { // top overflow
        delta.top = viewportDimensions.top - topEdgeOffset
      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
      }
    } else {
      var leftEdgeOffset  = pos.left - viewportPadding
      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
        delta.left = viewportDimensions.left - leftEdgeOffset
      } else if (rightEdgeOffset > viewportDimensions.width) { // 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 () {
    return (this.$tip = this.$tip || $(this.options.template))
  }

  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)
      }
    }

    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)
    })
  }


  // 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.4
 * http://getbootstrap.com/javascript/#popovers
 * ========================================================================
 * Copyright 2011-2015 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

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

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

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

  Popover.VERSION  = '3.3.4'

  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.4
 * http://getbootstrap.com/javascript/#scrollspy
 * ========================================================================
 * Copyright 2011-2015 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

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

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

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

  ScrollSpy.VERSION  = '3.3.4'

  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.4
 * http://getbootstrap.com/javascript/#tabs
 * ========================================================================
 * Copyright 2011-2015 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

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

  var Tab = function (element) {
    this.element = $(element)
  }

  Tab.VERSION = '3.3.4'

  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.4
 * http://getbootstrap.com/javascript/#affix
 * ========================================================================
 * Copyright 2011-2015 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

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

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

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

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

    this.checkPosition()
  }

  Affix.VERSION  = '3.3.4'

  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 = $(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);


================================================
FILE: app/Resources/assets/js/highlight.pack.js
================================================
!function(e){"undefined"!=typeof exports?e(exports):(window.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){var n=(e.className+" "+(e.parentNode?e.parentNode.className:"")).split(/\s+/);return n=n.map(function(e){return e.replace(/^lang(uage)?-/,"")}),n.filter(function(e){return N(e)||/no(-?)highlight/.test(e)})[0]}function o(e,n){var t={};for(var r in e)t[r]=e[r];if(n)for(var r in n)t[r]=n[r];return t}function i(e){var n=[];return function r(e,a){for(var o=e.firstChild;o;o=o.nextSibling)3==o.nodeType?a+=o.nodeValue.length:1==o.nodeType&&(n.push({event:"start",offset:a,node:o}),a=r(o,a),t(o).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:o}));return a}(e,0),n}function c(e,r,a){function o(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:"start"==r[0].event?e:r:e.length?e:r}function i(e){function r(e){return" "+e.nodeName+'="'+n(e.value)+'"'}l+="<"+t(e)+Array.prototype.map.call(e.attributes,r).join("")+">"}function c(e){l+="</"+t(e)+">"}function u(e){("start"==e.event?i:c)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=o();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){f.reverse().forEach(c);do u(g.splice(0,1)[0]),g=o();while(g==e&&g.length&&g[0].offset==s);f.reverse().forEach(i)}else"start"==g[0].event?f.push(g[0].node):f.pop(),u(g.splice(0,1)[0])}return l+n(a.substr(s))}function u(e){function n(e){return e&&e.source||e}function t(t,r){return RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var c={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");c[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):Object.keys(a.k).forEach(function(e){u(e,a.k[e])}),a.k=c}a.lR=t(a.l||/\b[A-Za-z0-9_]+\b/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var l=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join("|"),!0):{exec:function(){return null}}}}r(e)}function s(e,t,a,o){function i(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function c(e,n){return r(e.eR,n)?e:e.eW?c(e.parent,n):void 0}function f(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=x.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":E.classPrefix,o='<span class="'+a,i=t?"":"</span>";return o+=e+'">',o+n+i}function d(){if(!w.k)return n(y);var e="",t=0;w.lR.lastIndex=0;for(var r=w.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(w,r);a?(B+=a[1],e+=p(a[0],n(r[0]))):e+=n(r[0]),t=w.lR.lastIndex,r=w.lR.exec(y)}return e+n(y.substr(t))}function h(){if(w.sL&&!R[w.sL])return n(y);var e=w.sL?s(w.sL,y,!0,L[w.sL]):l(y);return w.r>0&&(B+=e.r),"continuous"==w.subLanguageMode&&(L[w.sL]=e.top),p(e.language,e.value,!1,!0)}function v(){return void 0!==w.sL?h():d()}function b(e,t){var r=e.cN?p(e.cN,"",!0):"";e.rB?(M+=r,y=""):e.eB?(M+=n(t)+r,y=""):(M+=r,y=t),w=Object.create(e,{parent:{value:w}})}function m(e,t){if(y+=e,void 0===t)return M+=v(),0;var r=i(t,w);if(r)return M+=v(),b(r,t),r.rB?0:t.length;var a=c(w,t);if(a){var o=w;o.rE||o.eE||(y+=t),M+=v();do w.cN&&(M+="</span>"),B+=w.r,w=w.parent;while(w!=a.parent);return o.eE&&(M+=n(t)),y="",a.starts&&b(a.starts,""),o.rE?0:t.length}if(f(t,w))throw new Error('Illegal lexeme "'+t+'" for mode "'+(w.cN||"<unnamed>")+'"');return y+=t,t.length||1}var x=N(e);if(!x)throw new Error('Unknown language: "'+e+'"');u(x);for(var w=o||x,L={},M="",k=w;k!=x;k=k.parent)k.cN&&(M=p(k.cN,"",!0)+M);var y="",B=0;try{for(var C,j,I=0;;){if(w.t.lastIndex=I,C=w.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}m(t.substr(I));for(var k=w;k.parent;k=k.parent)k.cN&&(M+="</span>");return{r:B,value:M,language:e,top:w}}catch(A){if(-1!=A.message.indexOf("Illegal"))return{r:0,value:n(t)};throw A}}function l(e,t){t=t||E.languages||Object.keys(R);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(N(n)){var t=s(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function f(e){return E.tabReplace&&(e=e.replace(/^((<[^>]+>|\t)+)/gm,function(e,n){return n.replace(/\t/g,E.tabReplace)})),E.useBR&&(e=e.replace(/\n/g,"<br>")),e}function g(e,n,t){var r=n?x[n]:t,a=[e.trim()];return e.match(/(\s|^)hljs(\s|$)/)||a.push("hljs"),r&&a.push(r),a.join(" ").trim()}function p(e){var n=a(e);if(!/no(-?)highlight/.test(n)){var t;E.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div"),t.innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n")):t=e;var r=t.textContent,o=n?s(n,r,!0):l(r),u=i(t);if(u.length){var p=document.createElementNS("http://www.w3.org/1999/xhtml","div");p.innerHTML=o.value,o.value=c(u,i(p),r)}o.value=f(o.value),e.innerHTML=o.value,e.className=g(e.className,n,o.language),e.result={language:o.language,re:o.r},o.second_best&&(e.second_best={language:o.second_best.language,re:o.second_best.r})}}function d(e){E=o(E,e)}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll("pre code");Array.prototype.forEach.call(e,p)}}function v(){addEventListener("DOMContentLoaded",h,!1),addEventListener("load",h,!1)}function b(n,t){var r=R[n]=t(e);r.aliases&&r.aliases.forEach(function(e){x[e]=n})}function m(){return Object.keys(R)}function N(e){return R[e]||R[x[e]]}var E={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},R={},x={};return e.highlight=s,e.highlightAuto=l,e.fixMarkup=f,e.highlightBlock=p,e.configure=d,e.initHighlighting=h,e.initHighlightingOnLoad=v,e.registerLanguage=b,e.listLanguages=m,e.getLanguage=N,e.inherit=o,e.IR="[a-zA-Z][a-zA-Z0-9_]*",e.UIR="[a-zA-Z_][a-zA-Z0-9_]*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},e.CLCM={cN:"comment",b:"//",e:"$",c:[e.PWM]},e.CBCM={cN:"comment",b:"/\\*",e:"\\*/",c:[e.PWM]},e.HCM={cN:"comment",b:"#",e:"$",c:[e.PWM]},e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e});hljs.registerLanguage("javascript",function(r){return{aliases:["js"],k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document"},c:[{cN:"pi",r:10,v:[{b:/^\s*('|")use strict('|")/},{b:/^\s*('|")use asm('|")/}]},r.ASM,r.QSM,r.CLCM,r.CBCM,r.CNM,{b:"("+r.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[r.CLCM,r.CBCM,r.RM,{b:/</,e:/>;/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[r.inherit(r.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[r.CLCM,r.CBCM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+r.IR,r:0}]}});hljs.registerLanguage("twig",function(){var e={cN:"params",b:"\\(",e:"\\)"},t="attribute block constant cycle date dump include max min parent random range source template_from_string",a={cN:"function",bK:t,r:0,c:[e]},r={cN:"filter",b:/\|[A-Za-z]+\:?/,k:"abs batch capitalize convert_encoding date date_modify default escape first format join json_encode keys last length lower merge nl2br number_format raw replace reverse round slice sort split striptags title trim upper url_encode",c:[a]},c="autoescape block do embed extends filter flush for if import include macro sandbox set spaceless use verbatim";return c=c+" "+c.split(" ").map(function(e){return"end"+e}).join(" "),{aliases:["craftcms"],cI:!0,sL:"xml",subLanguageMode:"continuous",c:[{cN:"comment",b:/\{#/,e:/#}/},{cN:"template_tag",b:/\{%/,e:/%}/,k:c,c:[r,a]},{cN:"variable",b:/\{\{/,e:/}}/,c:[r,a]}]}});hljs.registerLanguage("sql",function(e){var t={cN:"comment",b:"--",e:"$"};return{cI:!0,i:/[<>]/,c:[{cN:"operator",bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate savepoint release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup",e:/;/,eW:!0,k:{keyword:"abs absolute acos action add adddate addtime aes_decrypt aes_encrypt after aggregate all allocate alter analyze and any are as asc ascii asin assertion at atan atan2 atn2 authorization authors avg backup before begin benchmark between bin binlog bit_and bit_count bit_length bit_or bit_xor both by cache call cascade cascaded case cast catalog ceil ceiling chain change changed char_length character_length charindex charset check checksum checksum_agg choose close coalesce coercibility collate collation collationproperty column columns columns_updated commit compress concat concat_ws concurrent connect connection connection_id consistent constraint constraints continue contributors conv convert convert_tz corresponding cos cot count count_big crc32 create cross cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime data database databases datalength date_add date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts datetimeoffsetfromparts day dayname dayofmonth dayofweek dayofyear deallocate declare decode default deferrable deferred degrees delayed delete des_decrypt des_encrypt des_key_file desc describe descriptor diagnostics difference disconnect distinct distinctrow div do domain double drop dumpfile each else elt enclosed encode encrypt end end-exec engine engines eomonth errors escape escaped event eventdata events except exception exec execute exists exp explain export_set extended external extract fast fetch field fields find_in_set first first_value floor flush for force foreign format found found_rows from from_base64 from_days from_unixtime full function get get_format get_lock getdate getutcdate global go goto grant grants greatest group group_concat grouping grouping_id gtid_subset gtid_subtract handler having help hex high_priority hosts hour ident_current ident_incr ident_seed identified identity if ifnull ignore iif ilike immediate in index indicator inet6_aton inet6_ntoa inet_aton inet_ntoa infile initially inner innodb input insert install instr intersect into is is_free_lock is_ipv4 is_ipv4_compat is_ipv4_mapped is_not is_not_null is_used_lock isdate isnull isolation join key kill language last last_day last_insert_id last_value lcase lead leading least leaves left len lenght level like limit lines ln load load_file local localtime localtimestamp locate lock log log10 log2 logfile logs low_priority lower lpad ltrim make_set makedate maketime master master_pos_wait match matched max md5 medium merge microsecond mid min minute mod mode module month monthname mutex name_const names national natural nchar next no no_write_to_binlog not now nullif nvarchar oct octet_length of old_password on only open optimize option optionally or ord order outer outfile output pad parse partial partition password patindex percent_rank percentile_cont percentile_disc period_add period_diff pi plugin position pow power pragma precision prepare preserve primary prior privileges procedure procedure_analyze processlist profile profiles public publishingservername purge quarter query quick quote quotename radians rand read references regexp relative relaylog release release_lock rename repair repeat replace replicate reset restore restrict return returns reverse revoke right rlike rollback rollup round row row_count rows rpad rtrim savepoint schema scroll sec_to_time second section select serializable server session session_user set sha sha1 sha2 share show sign sin size slave sleep smalldatetimefromparts snapshot some soname soundex sounds_like space sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sql_variant_property sqlstate sqrt square start starting status std stddev stddev_pop stddev_samp stdev stdevp stop str str_to_date straight_join strcmp string stuff subdate substr substring subtime subtring_index sum switchoffset sysdate sysdatetime sysdatetimeoffset system_user sysutcdatetime table tables tablespace tan temporary terminated tertiary_weights then time time_format time_to_sec timediff timefromparts timestamp timestampadd timestampdiff timezone_hour timezone_minute to to_base64 to_days to_seconds todatetimeoffset trailing transaction translation trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse ucase uncompress uncompressed_length unhex unicode uninstall union unique unix_timestamp unknown unlock update upgrade upped upper usage use user user_resources using utc_date utc_time utc_timestamp uuid uuid_short validate_password_strength value values var var_pop var_samp variables variance varp version view warnings week weekday weekofyear weight_string when whenever where with work write xml xor year yearweek zon",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int integer interval number numeric real serial smallint varchar varying int8 serial8 text"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)\}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,e.NM,s,a,t]}});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",a={cN:"function",b:c+"\\(",rB:!0,eE:!0,e:"\\("};return{cI:!0,i:"[=/|']",c:[e.CBCM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[a,e.ASM,e.QSM,e.CSSNM]}]},{cN:"tag",b:c,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[e.CBCM,{cN:"rule",b:"[^\\s]",rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:!0,i:"[^\\s]",starts:{cN:"value",eW:!0,eE:!0,c:[a,e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}});hljs.registerLanguage("php",function(e){var c={cN:"variable",b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},i={cN:"preprocessor",b:/<\?(php)?|\?>/},a={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},n={v:[e.BNM,e.CNM]};return{aliases:["php3","php4","php5","php6"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.CLCM,e.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"},i]},{cN:"comment",b:"__halt_compiler.+?;",eW:!0,k:"__halt_compiler",l:e.UIR},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[e.BE]},i,c,{b:/->+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,a,n]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},a,n]}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"tag",b:"</?",e:">"},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("ini",function(e){return{cI:!0,i:/\S/,c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:!0,k:"on off true false yes no",c:[e.QSM,e.NM],r:0}]}]}});hljs.registerLanguage("markdown",function(){return{aliases:["md","mkdown","mkd"],c:[{cN:"header",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}|	)",e:"$",r:0}]},{cN:"horizontal_rule",b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"link_label",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link_url",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"link_reference",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:"^\\[.+\\]:",rB:!0,c:[{cN:"link_reference",b:"\\[",e:"\\]:",eB:!0,eE:!0,starts:{cN:"link_url",e:"$"}}]}]}});hljs.registerLanguage("xml",function(){var t="[A-Za-z0-9\\._:-]+",e={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"},c={eW:!0,i:/</,r:0,c:[e,{cN:"attribute",b:t,r:0},{b:"=",r:0,c:[{cN:"value",c:[e],v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s\/>]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xsl","plist"],cI:!0,c:[{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[c],starts:{e:"</style>",rE:!0,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[c],starts:{e:"</script>",rE:!0,sL:"javascript"}},e,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:/[^ \/><\n\t]+/,r:0},c]}]}});hljs.registerLanguage("http",function(){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:!0}}]}});hljs.registerLanguage("json",function(e){var t={literal:"true false null"},i=[e.QSM,e.CNM],l={cN:"value",e:",",eW:!0,eE:!0,c:i,k:t},c={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:!0,eE:!0,c:[e.BE],i:"\\n",starts:l}],i:"\\S"},n={b:"\\[",e:"\\]",c:[e.inherit(l,{cN:null})],i:"\\S"};return i.splice(i.length,0,c,n),{c:i,k:t,i:"\\S"}});

================================================
FILE: app/Resources/assets/js/jquery-2.1.4.js
================================================
/*!
 * jQuery JavaScript Library v2.1.4
 * http://jquery.com/
 *
 * Includes Sizzle.js
 * http://sizzlejs.com/
 *
 * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2015-04-28T16:01Z
 */

(function( global, factory ) {

	if ( typeof module === "object" && typeof module.exports === "object" ) {
		// For CommonJS and CommonJS-like environments where a proper `window`
		// is present, execute the factory and get jQuery.
		// For environments that do not have a `window` with a `document`
		// (such as Node.js), expose a factory as module.exports.
		// This accentuates the need for the creation of a real `window`.
		// e.g. var jQuery = require("jquery")(window);
		// See ticket #14549 for more info.
		module.exports = global.document ?
			factory( global, true ) :
			function( w ) {
				if ( !w.document ) {
					throw new Error( "jQuery requires a window with a document" );
				}
				return factory( w );
			};
	} else {
		factory( global );
	}

// Pass this if window is not defined yet
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {

// Support: Firefox 18+
// Can't be in strict mode, several libs including ASP.NET trace
// the stack via arguments.caller.callee and Firefox dies if
// you try to trace through "use strict" call chains. (#13335)
//

var arr = [];

var slice = arr.slice;

var concat = arr.concat;

var push = arr.push;

var indexOf = arr.indexOf;

var class2type = {};

var toString = class2type.toString;

var hasOwn = class2type.hasOwnProperty;

var support = {};



var
	// Use the correct document accordingly with window argument (sandbox)
	document = window.document,

	version = "2.1.4",

	// Define a local copy of jQuery
	jQuery = function( selector, context ) {
		// The jQuery object is actually just the init constructor 'enhanced'
		// Need init if jQuery is called (just allow error to be thrown if not included)
		return new jQuery.fn.init( selector, context );
	},

	// Support: Android<4.1
	// Make sure we trim BOM and NBSP
	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,

	// Matches dashed string for camelizing
	rmsPrefix = /^-ms-/,
	rdashAlpha = /-([\da-z])/gi,

	// Used by jQuery.camelCase as callback to replace()
	fcamelCase = function( all, letter ) {
		return letter.toUpperCase();
	};

jQuery.fn = jQuery.prototype = {
	// The current version of jQuery being used
	jquery: version,

	constructor: jQuery,

	// Start with an empty selector
	selector: "",

	// The default length of a jQuery object is 0
	length: 0,

	toArray: function() {
		return slice.call( this );
	},

	// Get the Nth element in the matched element set OR
	// Get the whole matched element set as a clean array
	get: function( num ) {
		return num != null ?

			// Return just the one element from the set
			( num < 0 ? this[ num + this.length ] : this[ num ] ) :

			// Return all the elements in a clean array
			slice.call( this );
	},

	// Take an array of elements and push it onto the stack
	// (returning the new matched element set)
	pushStack: function( elems ) {

		// Build a new jQuery matched element set
		var ret = jQuery.merge( this.constructor(), elems );

		// Add the old object onto the stack (as a reference)
		ret.prevObject = this;
		ret.context = this.context;

		// Return the newly-formed element set
		return ret;
	},

	// Execute a callback for every element in the matched set.
	// (You can seed the arguments with an array of args, but this is
	// only used internally.)
	each: function( callback, args ) {
		return jQuery.each( this, callback, args );
	},

	map: function( callback ) {
		return this.pushStack( jQuery.map(this, function( elem, i ) {
			return callback.call( elem, i, elem );
		}));
	},

	slice: function() {
		return this.pushStack( slice.apply( this, arguments ) );
	},

	first: function() {
		return this.eq( 0 );
	},

	last: function() {
		return this.eq( -1 );
	},

	eq: function( i ) {
		var len = this.length,
			j = +i + ( i < 0 ? len : 0 );
		return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
	},

	end: function() {
		return this.prevObject || this.constructor(null);
	},

	// For internal use only.
	// Behaves like an Array's method, not like a jQuery method.
	push: push,
	sort: arr.sort,
	splice: arr.splice
};

jQuery.extend = jQuery.fn.extend = function() {
	var options, name, src, copy, copyIsArray, clone,
		target = arguments[0] || {},
		i = 1,
		length = arguments.length,
		deep = false;

	// Handle a deep copy situation
	if ( typeof target === "boolean" ) {
		deep = target;

		// Skip the boolean and the target
		target = arguments[ i ] || {};
		i++;
	}

	// Handle case when target is a string or something (possible in deep copy)
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
		target = {};
	}

	// Extend jQuery itself if only one argument is passed
	if ( i === length ) {
		target = this;
		i--;
	}

	for ( ; i < length; i++ ) {
		// Only deal with non-null/undefined values
		if ( (options = arguments[ i ]) != null ) {
			// Extend the base object
			for ( name in options ) {
				src = target[ name ];
				copy = options[ name ];

				// Prevent never-ending loop
				if ( target === copy ) {
					continue;
				}

				// Recurse if we're merging plain objects or arrays
				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
					if ( copyIsArray ) {
						copyIsArray = false;
						clone = src && jQuery.isArray(src) ? src : [];

					} else {
						clone = src && jQuery.isPlainObject(src) ? src : {};
					}

					// Never move original objects, clone them
					target[ name ] = jQuery.extend( deep, clone, copy );

				// Don't bring in undefined values
				} else if ( copy !== undefined ) {
					target[ name ] = copy;
				}
			}
		}
	}

	// Return the modified object
	return target;
};

jQuery.extend({
	// Unique for each copy of jQuery on the page
	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),

	// Assume jQuery is ready without the ready module
	isReady: true,

	error: function( msg ) {
		throw new Error( msg );
	},

	noop: function() {},

	isFunction: function( obj ) {
		return jQuery.type(obj) === "function";
	},

	isArray: Array.isArray,

	isWindow: function( obj ) {
		return obj != null && obj === obj.window;
	},

	isNumeric: function( obj ) {
		// parseFloat NaNs numeric-cast false positives (null|true|false|"")
		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
		// subtraction forces infinities to NaN
		// adding 1 corrects loss of precision from parseFloat (#15100)
		return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
	},

	isPlainObject: function( obj ) {
		// Not plain objects:
		// - Any object or value whose internal [[Class]] property is not "[object Object]"
		// - DOM nodes
		// - window
		if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
			return false;
		}

		if ( obj.constructor &&
				!hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
			return false;
		}

		// If the function hasn't returned already, we're confident that
		// |obj| is a plain object, created by {} or constructed with new Object
		return true;
	},

	isEmptyObject: function( obj ) {
		var name;
		for ( name in obj ) {
			return false;
		}
		return true;
	},

	type: function( obj ) {
		if ( obj == null ) {
			return obj + "";
		}
		// Support: Android<4.0, iOS<6 (functionish RegExp)
		return typeof obj === "object" || typeof obj === "function" ?
			class2type[ toString.call(obj) ] || "object" :
			typeof obj;
	},

	// Evaluates a script in a global context
	globalEval: function( code ) {
		var script,
			indirect = eval;

		code = jQuery.trim( code );

		if ( code ) {
			// If the code includes a valid, prologue position
			// strict mode pragma, execute code by injecting a
			// script tag into the document.
			if ( code.indexOf("use strict") === 1 ) {
				script = document.createElement("script");
				script.text = code;
				document.head.appendChild( script ).parentNode.removeChild( script );
			} else {
			// Otherwise, avoid the DOM node creation, insertion
			// and removal by using an indirect global eval
				indirect( code );
			}
		}
	},

	// Convert dashed to camelCase; used by the css and data modules
	// Support: IE9-11+
	// Microsoft forgot to hump their vendor prefix (#9572)
	camelCase: function( string ) {
		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
	},

	nodeName: function( elem, name ) {
		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
	},

	// args is for internal usage only
	each: function( obj, callback, args ) {
		var value,
			i = 0,
			length = obj.length,
			isArray = isArraylike( obj );

		if ( args ) {
			if ( isArray ) {
				for ( ; i < length; i++ ) {
					value = callback.apply( obj[ i ], args );

					if ( value === false ) {
						break;
					}
				}
			} else {
				for ( i in obj ) {
					value = callback.apply( obj[ i ], args );

					if ( value === false ) {
						break;
					}
				}
			}

		// A special, fast, case for the most common use of each
		} else {
			if ( isArray ) {
				for ( ; i < length; i++ ) {
					value = callback.call( obj[ i ], i, obj[ i ] );

					if ( value === false ) {
						break;
					}
				}
			} else {
				for ( i in obj ) {
					value = callback.call( obj[ i ], i, obj[ i ] );

					if ( value === false ) {
						break;
					}
				}
			}
		}

		return obj;
	},

	// Support: Android<4.1
	trim: function( text ) {
		return text == null ?
			"" :
			( text + "" ).replace( rtrim, "" );
	},

	// results is for internal usage only
	makeArray: function( arr, results ) {
		var ret = results || [];

		if ( arr != null ) {
			if ( isArraylike( Object(arr) ) ) {
				jQuery.merge( ret,
					typeof arr === "string" ?
					[ arr ] : arr
				);
			} else {
				push.call( ret, arr );
			}
		}

		return ret;
	},

	inArray: function( elem, arr, i ) {
		return arr == null ? -1 : indexOf.call( arr, elem, i );
	},

	merge: function( first, second ) {
		var len = +second.length,
			j = 0,
			i = first.length;

		for ( ; j < len; j++ ) {
			first[ i++ ] = second[ j ];
		}

		first.length = i;

		return first;
	},

	grep: function( elems, callback, invert ) {
		var callbackInverse,
			matches = [],
			i = 0,
			length = elems.length,
			callbackExpect = !invert;

		// Go through the array, only saving the items
		// that pass the validator function
		for ( ; i < length; i++ ) {
			callbackInverse = !callback( elems[ i ], i );
			if ( callbackInverse !== callbackExpect ) {
				matches.push( elems[ i ] );
			}
		}

		return matches;
	},

	// arg is for internal usage only
	map: function( elems, callback, arg ) {
		var value,
			i = 0,
			length = elems.length,
			isArray = isArraylike( elems ),
			ret = [];

		// Go through the array, translating each of the items to their new values
		if ( isArray ) {
			for ( ; i < length; i++ ) {
				value = callback( elems[ i ], i, arg );

				if ( value != null ) {
					ret.push( value );
				}
			}

		// Go through every key on the object,
		} else {
			for ( i in elems ) {
				value = callback( elems[ i ], i, arg );

				if ( value != null ) {
					ret.push( value );
				}
			}
		}

		// Flatten any nested arrays
		return concat.apply( [], ret );
	},

	// A global GUID counter for objects
	guid: 1,

	// Bind a function to a context, optionally partially applying any
	// arguments.
	proxy: function( fn, context ) {
		var tmp, args, proxy;

		if ( typeof context === "string" ) {
			tmp = fn[ context ];
			context = fn;
			fn = tmp;
		}

		// Quick check to determine if target is callable, in the spec
		// this throws a TypeError, but we will just return undefined.
		if ( !jQuery.isFunction( fn ) ) {
			return undefined;
		}

		// Simulated bind
		args = slice.call( arguments, 2 );
		proxy = function() {
			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
		};

		// Set the guid of unique handler to the same of original handler, so it can be removed
		proxy.guid = fn.guid = fn.guid || jQuery.guid++;

		return proxy;
	},

	now: Date.now,

	// jQuery.support is not used in Core but other projects attach their
	// properties to it so it needs to exist.
	support: support
});

// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
});

function isArraylike( obj ) {

	// Support: iOS 8.2 (not reproducible in simulator)
	// `in` check used to prevent JIT error (gh-2145)
	// hasOwn isn't used here due to false negatives
	// regarding Nodelist length in IE
	var length = "length" in obj && obj.length,
		type = jQuery.type( obj );

	if ( type === "function" || jQuery.isWindow( obj ) ) {
		return false;
	}

	if ( obj.nodeType === 1 && length ) {
		return true;
	}

	return type === "array" || length === 0 ||
		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}
var Sizzle =
/*!
 * Sizzle CSS Selector Engine v2.2.0-pre
 * http://sizzlejs.com/
 *
 * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2014-12-16
 */
(function( window ) {

var i,
	support,
	Expr,
	getText,
	isXML,
	tokenize,
	compile,
	select,
	outermostContext,
	sortInput,
	hasDuplicate,

	// Local document vars
	setDocument,
	document,
	docElem,
	documentIsHTML,
	rbuggyQSA,
	rbuggyMatches,
	matches,
	contains,

	// Instance-specific data
	expando = "sizzle" + 1 * new Date(),
	preferredDoc = window.document,
	dirruns = 0,
	done = 0,
	classCache = createCache(),
	tokenCache = createCache(),
	compilerCache = createCache(),
	sortOrder = function( a, b ) {
		if ( a === b ) {
			hasDuplicate = true;
		}
		return 0;
	},

	// General-purpose constants
	MAX_NEGATIVE = 1 << 31,

	// Instance methods
	hasOwn = ({}).hasOwnProperty,
	arr = [],
	pop = arr.pop,
	push_native = arr.push,
	push = arr.push,
	slice = arr.slice,
	// Use a stripped-down indexOf as it's faster than native
	// http://jsperf.com/thor-indexof-vs-for/5
	indexOf = function( list, elem ) {
		var i = 0,
			len = list.length;
		for ( ; i < len; i++ ) {
			if ( list[i] === elem ) {
				return i;
			}
		}
		return -1;
	},

	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",

	// Regular expressions

	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
	whitespace = "[\\x20\\t\\r\\n\\f]",
	// http://www.w3.org/TR/css3-syntax/#characters
	characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",

	// Loosely modeled on CSS identifier characters
	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
	identifier = characterEncoding.replace( "w", "w#" ),

	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
		// Operator (capture 2)
		"*([*^$|!~]?=)" + whitespace +
		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
		"*\\]",

	pseudos = ":(" + characterEncoding + ")(?:\\((" +
		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
		// 1. quoted (capture 3; capture 4 or capture 5)
		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
		// 2. simple (capture 6)
		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
		// 3. anything else (capture 2)
		".*" +
		")\\)|)",

	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
	rwhitespace = new RegExp( whitespace + "+", "g" ),
	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),

	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),

	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),

	rpseudo = new RegExp( pseudos ),
	ridentifier = new RegExp( "^" + identifier + "$" ),

	matchExpr = {
		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
		"ATTR": new RegExp( "^" + attributes ),
		"PSEUDO": new RegExp( "^" + pseudos ),
		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
		// For use in libraries implementing .is()
		// We use this for POS matching in `select`
		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
	},

	rinputs = /^(?:input|select|textarea|button)$/i,
	rheader = /^h\d$/i,

	rnative = /^[^{]+\{\s*\[native \w/,

	// Easily-parseable/retrievable ID or TAG or CLASS selectors
	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,

	rsibling = /[+~]/,
	rescape = /'|\\/g,

	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
	funescape = function( _, escaped, escapedWhitespace ) {
		var high = "0x" + escaped - 0x10000;
		// NaN means non-codepoint
		// Support: Firefox<24
		// Workaround erroneous numeric interpretation of +"0x"
		return high !== high || escapedWhitespace ?
			escaped :
			high < 0 ?
				// BMP codepoint
				String.fromCharCode( high + 0x10000 ) :
				// Supplemental Plane codepoint (surrogate pair)
				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
	},

	// Used for iframes
	// See setDocument()
	// Removing the function wrapper causes a "Permission Denied"
	// error in IE
	unloadHandler = function() {
		setDocument();
	};

// Optimize for push.apply( _, NodeList )
try {
	push.apply(
		(arr = slice.call( preferredDoc.childNodes )),
		preferredDoc.childNodes
	);
	// Support: Android<4.0
	// Detect silently failing push.apply
	arr[ preferredDoc.childNodes.length ].nodeType;
} catch ( e ) {
	push = { apply: arr.length ?

		// Leverage slice if possible
		function( target, els ) {
			push_native.apply( target, slice.call(els) );
		} :

		// Support: IE<9
		// Otherwise append directly
		function( target, els ) {
			var j = target.length,
				i = 0;
			// Can't trust NodeList.length
			while ( (target[j++] = els[i++]) ) {}
			target.length = j - 1;
		}
	};
}

function Sizzle( selector, context, results, seed ) {
	var match, elem, m, nodeType,
		// QSA vars
		i, groups, old, nid, newContext, newSelector;

	if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
		setDocument( context );
	}

	context = context || document;
	results = results || [];
	nodeType = context.nodeType;

	if ( typeof selector !== "string" || !selector ||
		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {

		return results;
	}

	if ( !seed && documentIsHTML ) {

		// Try to shortcut find operations when possible (e.g., not under DocumentFragment)
		if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
			// Speed-up: Sizzle("#ID")
			if ( (m = match[1]) ) {
				if ( nodeType === 9 ) {
					elem = context.getElementById( m );
					// Check parentNode to catch when Blackberry 4.6 returns
					// nodes that are no longer in the document (jQuery #6963)
					if ( elem && elem.parentNode ) {
						// Handle the case where IE, Opera, and Webkit return items
						// by name instead of ID
						if ( elem.id === m ) {
							results.push( elem );
							return results;
						}
					} else {
						return results;
					}
				} else {
					// Context is not a document
					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
						contains( context, elem ) && elem.id === m ) {
						results.push( elem );
						return results;
					}
				}

			// Speed-up: Sizzle("TAG")
			} else if ( match[2] ) {
				push.apply( results, context.getElementsByTagName( selector ) );
				return results;

			// Speed-up: Sizzle(".CLASS")
			} else if ( (m = match[3]) && support.getElementsByClassName ) {
				push.apply( results, context.getElementsByClassName( m ) );
				return results;
			}
		}

		// QSA path
		if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
			nid = old = expando;
			newContext = context;
			newSelector = nodeType !== 1 && selector;

			// qSA works strangely on Element-rooted queries
			// We can work around this by specifying an extra ID on the root
			// and working up from there (Thanks to Andrew Dupont for the technique)
			// IE 8 doesn't work on object elements
			if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
				groups = tokenize( selector );

				if ( (old = context.getAttribute("id")) ) {
					nid = old.replace( rescape, "\\$&" );
				} else {
					context.setAttribute( "id", nid );
				}
				nid = "[id='" + nid + "'] ";

				i = groups.length;
				while ( i-- ) {
					groups[i] = nid + toSelector( groups[i] );
				}
				newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
				newSelector = groups.join(",");
			}

			if ( newSelector ) {
				try {
					push.apply( results,
						newContext.querySelectorAll( newSelector )
					);
					return results;
				} catch(qsaError) {
				} finally {
					if ( !old ) {
						context.removeAttribute("id");
					}
				}
			}
		}
	}

	// All others
	return select( selector.replace( rtrim, "$1" ), context, results, seed );
}

/**
 * Create key-value caches of limited size
 * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
 *	deleting the oldest entry
 */
function createCache() {
	var keys = [];

	function cache( key, value ) {
		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
		if ( keys.push( key + " " ) > Expr.cacheLength ) {
			// Only keep the most recent entries
			delete cache[ keys.shift() ];
		}
		return (cache[ key + " " ] = value);
	}
	return cache;
}

/**
 * Mark a function for special use by Sizzle
 * @param {Function} fn The function to mark
 */
function markFunction( fn ) {
	fn[ expando ] = true;
	return fn;
}

/**
 * Support testing using an element
 * @param {Function} fn Passed the created div and expects a boolean result
 */
function assert( fn ) {
	var div = document.createElement("div");

	try {
		return !!fn( div );
	} catch (e) {
		return false;
	} finally {
		// Remove from its parent by default
		if ( div.parentNode ) {
			div.parentNode.removeChild( div );
		}
		// release memory in IE
		div = null;
	}
}

/**
 * Adds the same handler for all of the specified attrs
 * @param {String} attrs Pipe-separated list of attributes
 * @param {Function} handler The method that will be applied
 */
function addHandle( attrs, handler ) {
	var arr = attrs.split("|"),
		i = attrs.length;

	while ( i-- ) {
		Expr.attrHandle[ arr[i] ] = handler;
	}
}

/**
 * Checks document order of two siblings
 * @param {Element} a
 * @param {Element} b
 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
 */
function siblingCheck( a, b ) {
	var cur = b && a,
		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
			( ~b.sourceIndex || MAX_NEGATIVE ) -
			( ~a.sourceIndex || MAX_NEGATIVE );

	// Use IE sourceIndex if available on both nodes
	if ( diff ) {
		return diff;
	}

	// Check if b follows a
	if ( cur ) {
		while ( (cur = cur.nextSibling) ) {
			if ( cur === b ) {
				return -1;
			}
		}
	}

	return a ? 1 : -1;
}

/**
 * Returns a function to use in pseudos for input types
 * @param {String} type
 */
function createInputPseudo( type ) {
	return function( elem ) {
		var name = elem.nodeName.toLowerCase();
		return name === "input" && elem.type === type;
	};
}

/**
 * Returns a function to use in pseudos for buttons
 * @param {String} type
 */
function createButtonPseudo( type ) {
	return function( elem ) {
		var name = elem.nodeName.toLowerCase();
		return (name === "input" || name === "button") && elem.type === type;
	};
}

/**
 * Returns a function to use in pseudos for positionals
 * @param {Function} fn
 */
function createPositionalPseudo( fn ) {
	return markFunction(function( argument ) {
		argument = +argument;
		return markFunction(function( seed, matches ) {
			var j,
				matchIndexes = fn( [], seed.length, argument ),
				i = matchIndexes.length;

			// Match elements found at the specified indexes
			while ( i-- ) {
				if ( seed[ (j = matchIndexes[i]) ] ) {
					seed[j] = !(matches[j] = seed[j]);
				}
			}
		});
	});
}

/**
 * Checks a node for validity as a Sizzle context
 * @param {Element|Object=} context
 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
 */
function testContext( context ) {
	return context && typeof context.getElementsByTagName !== "undefined" && context;
}

// Expose support vars for convenience
support = Sizzle.support = {};

/**
 * Detects XML nodes
 * @param {Element|Object} elem An element or a document
 * @returns {Boolean} True iff elem is a non-HTML XML node
 */
isXML = Sizzle.isXML = function( elem ) {
	// documentElement is verified for cases where it doesn't yet exist
	// (such as loading iframes in IE - #4833)
	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
	return documentElement ? documentElement.nodeName !== "HTML" : false;
};

/**
 * Sets document-related variables once based on the current document
 * @param {Element|Object} [doc] An element or document object to use to set the document
 * @returns {Object} Returns the current document
 */
setDocument = Sizzle.setDocument = function( node ) {
	var hasCompare, parent,
		doc = node ? node.ownerDocument || node : preferredDoc;

	// If no document and documentElement is available, return
	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
		return document;
	}

	// Set our document
	document = doc;
	docElem = doc.documentElement;
	parent = doc.defaultView;

	// Support: IE>8
	// If iframe document is assigned to "document" variable and if iframe has been reloaded,
	// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
	// IE6-8 do not support the defaultView property so parent will be undefined
	if ( parent && parent !== parent.top ) {
		// IE11 does not have attachEvent, so all must suffer
		if ( parent.addEventListener ) {
			parent.addEventListener( "unload", unloadHandler, false );
		} else if ( parent.attachEvent ) {
			parent.attachEvent( "onunload", unloadHandler );
		}
	}

	/* Support tests
	---------------------------------------------------------------------- */
	documentIsHTML = !isXML( doc );

	/* Attributes
	---------------------------------------------------------------------- */

	// Support: IE<8
	// Verify that getAttribute really returns attributes and not properties
	// (excepting IE8 booleans)
	support.attributes = assert(function( div ) {
		div.className = "i";
		return !div.getAttribute("className");
	});

	/* getElement(s)By*
	---------------------------------------------------------------------- */

	// Check if getElementsByTagName("*") returns only elements
	support.getElementsByTagName = assert(function( div ) {
		div.appendChild( doc.createComment("") );
		return !div.getElementsByTagName("*").length;
	});

	// Support: IE<9
	support.getElementsByClassName = rnative.test( doc.getElementsByClassName );

	// Support: IE<10
	// Check if getElementById returns elements by name
	// The broken getElementById methods don't pick up programatically-set names,
	// so use a roundabout getElementsByName test
	support.getById = assert(function( div ) {
		docElem.appendChild( div ).id = expando;
		return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
	});

	// ID find and filter
	if ( support.getById ) {
		Expr.find["ID"] = function( id, context ) {
			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
				var m = context.getElementById( id );
				// Check parentNode to catch when Blackberry 4.6 returns
				// nodes that are no longer in the document #6963
				return m && m.parentNode ? [ m ] : [];
			}
		};
		Expr.filter["ID"] = function( id ) {
			var attrId = id.replace( runescape, funescape );
			return function( elem ) {
				return elem.getAttribute("id") === attrId;
			};
		};
	} else {
		// Support: IE6/7
		// getElementById is not reliable as a find shortcut
		delete Expr.find["ID"];

		Expr.filter["ID"] =  function( id ) {
			var attrId = id.replace( runescape, funescape );
			return function( elem ) {
				var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
				return node && node.value === attrId;
			};
		};
	}

	// Tag
	Expr.find["TAG"] = support.getElementsByTagName ?
		function( tag, context ) {
			if ( typeof context.getElementsByTagName !== "undefined" ) {
				return context.getElementsByTagName( tag );

			// DocumentFragment nodes don't have gEBTN
			} else if ( support.qsa ) {
				return context.querySelectorAll( tag );
			}
		} :

		function( tag, context ) {
			var elem,
				tmp = [],
				i = 0,
				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
				results = context.getElementsByTagName( tag );

			// Filter out possible comments
			if ( tag === "*" ) {
				while ( (elem = results[i++]) ) {
					if ( elem.nodeType === 1 ) {
						tmp.push( elem );
					}
				}

				return tmp;
			}
			return results;
		};

	// Class
	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
		if ( documentIsHTML ) {
			return context.getElementsByClassName( className );
		}
	};

	/* QSA/matchesSelector
	---------------------------------------------------------------------- */

	// QSA and matchesSelector support

	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
	rbuggyMatches = [];

	// qSa(:focus) reports false when true (Chrome 21)
	// We allow this because of a bug in IE8/9 that throws an error
	// whenever `document.activeElement` is accessed on an iframe
	// So, we allow :focus to pass through QSA all the time to avoid the IE error
	// See http://bugs.jquery.com/ticket/13378
	rbuggyQSA = [];

	if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
		// Build QSA regex
		// Regex strategy adopted from Diego Perini
		assert(function( div ) {
			// Select is set to empty string on purpose
			// This is to test IE's treatment of not explicitly
			// setting a boolean content attribute,
			// since its presence should be enough
			// http://bugs.jquery.com/ticket/12359
			docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
				"<select id='" + expando + "-\f]' msallowcapture=''>" +
				"<option selected=''></option></select>";

			// Support: IE8, Opera 11-12.16
			// Nothing should be selected when empty strings follow ^= or $= or *=
			// The test attribute must be unknown in Opera but "safe" for WinRT
			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
			if ( div.querySelectorAll("[msallowcapture^='']").length ) {
				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
			}

			// Support: IE8
			// Boolean attributes and "value" are not treated correctly
			if ( !div.querySelectorAll("[selected]").length ) {
				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
			}

			// Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
			if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
				rbuggyQSA.push("~=");
			}

			// Webkit/Opera - :checked should return selected option elements
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
			// IE8 throws error here and will not see later tests
			if ( !div.querySelectorAll(":checked").length ) {
				rbuggyQSA.push(":checked");
			}

			// Support: Safari 8+, iOS 8+
			// https://bugs.webkit.org/show_bug.cgi?id=136851
			// In-page `selector#id sibing-combinator selector` fails
			if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
				rbuggyQSA.push(".#.+[+~]");
			}
		});

		assert(function( div ) {
			// Support: Windows 8 Native Apps
			// The type and name attributes are restricted during .innerHTML assignment
			var input = doc.createElement("input");
			input.setAttribute( "type", "hidden" );
			div.appendChild( input ).setAttribute( "name", "D" );

			// Support: IE8
			// Enforce case-sensitivity of name attribute
			if ( div.querySelectorAll("[name=d]").length ) {
				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
			}

			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
			// IE8 throws error here and will not see later tests
			if ( !div.querySelectorAll(":enabled").length ) {
				rbuggyQSA.push( ":enabled", ":disabled" );
			}

			// Opera 10-11 does not throw on post-comma invalid pseudos
			div.querySelectorAll("*,:x");
			rbuggyQSA.push(",.*:");
		});
	}

	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
		docElem.webkitMatchesSelector ||
		docElem.mozMatchesSelector ||
		docElem.oMatchesSelector ||
		docElem.msMatchesSelector) )) ) {

		assert(function( div ) {
			// Check to see if it's possible to do matchesSelector
			// on a disconnected node (IE 9)
			support.disconnectedMatch = matches.call( div, "div" );

			// This should fail with an exception
			// Gecko does not error, returns false instead
			matches.call( div, "[s!='']:x" );
			rbuggyMatches.push( "!=", pseudos );
		});
	}

	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );

	/* Contains
	---------------------------------------------------------------------- */
	hasCompare = rnative.test( docElem.compareDocumentPosition );

	// Element contains another
	// Purposefully does not implement inclusive descendent
	// As in, an element does not contain itself
	contains = hasCompare || rnative.test( docElem.contains ) ?
		function( a, b ) {
			var adown = a.nodeType === 9 ? a.documentElement : a,
				bup = b && b.parentNode;
			return a === bup || !!( bup && bup.nodeType === 1 && (
				adown.contains ?
					adown.contains( bup ) :
					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
			));
		} :
		function( a, b ) {
			if ( b ) {
				while ( (b = b.parentNode) ) {
					if ( b === a ) {
						return true;
					}
				}
			}
			return false;
		};

	/* Sorting
	---------------------------------------------------------------------- */

	// Document order sorting
	sortOrder = hasCompare ?
	function( a, b ) {

		// Flag for duplicate removal
		if ( a === b ) {
			hasDuplicate = true;
			return 0;
		}

		// Sort on method existence if only one input has compareDocumentPosition
		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
		if ( compare ) {
			return compare;
		}

		// Calculate position if both inputs belong to the same document
		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
			a.compareDocumentPosition( b ) :

			// Otherwise we know they are disconnected
			1;

		// Disconnected nodes
		if ( compare & 1 ||
			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {

			// Choose the first element that is related to our preferred document
			if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
				return -1;
			}
			if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
				return 1;
			}

			// Maintain original order
			return sortInput ?
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
				0;
		}

		return compare & 4 ? -1 : 1;
	} :
	function( a, b ) {
		// Exit early if the nodes are identical
		if ( a === b ) {
			hasDuplicate = true;
			return 0;
		}

		var cur,
			i = 0,
			aup = a.parentNode,
			bup = b.parentNode,
			ap = [ a ],
			bp = [ b ];

		// Parentless nodes are either documents or disconnected
		if ( !aup || !bup ) {
			return a === doc ? -1 :
				b === doc ? 1 :
				aup ? -1 :
				bup ? 1 :
				sortInput ?
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
				0;

		// If the nodes are siblings, we can do a quick check
		} else if ( aup === bup ) {
			return siblingCheck( a, b );
		}

		// Otherwise we need full lists of their ancestors for comparison
		cur = a;
		while ( (cur = cur.parentNode) ) {
			ap.unshift( cur );
		}
		cur = b;
		while ( (cur = cur.parentNode) ) {
			bp.unshift( cur );
		}

		// Walk down the tree looking for a discrepancy
		while ( ap[i] === bp[i] ) {
			i++;
		}

		return i ?
			// Do a sibling check if the nodes have a common ancestor
			siblingCheck( ap[i], bp[i] ) :

			// Otherwise nodes in our document sort first
			ap[i] === preferredDoc ? -1 :
			bp[i] === preferredDoc ? 1 :
			0;
	};

	return doc;
};

Sizzle.matches = function( expr, elements ) {
	return Sizzle( expr, null, null, elements );
};

Sizzle.matchesSelector = function( elem, expr ) {
	// Set document vars if needed
	if ( ( elem.ownerDocument || elem ) !== document ) {
		setDocument( elem );
	}

	// Make sure that attribute selectors are quoted
	expr = expr.replace( rattributeQuotes, "='$1']" );

	if ( support.matchesSelector && documentIsHTML &&
		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {

		try {
			var ret = matches.call( elem, expr );

			// IE 9's matchesSelector returns false on disconnected nodes
			if ( ret || support.disconnectedMatch ||
					// As well, disconnected nodes are said to be in a document
					// fragment in IE 9
					elem.document && elem.document.nodeType !== 11 ) {
				return ret;
			}
		} catch (e) {}
	}

	return Sizzle( expr, document, null, [ elem ] ).length > 0;
};

Sizzle.contains = function( context, elem ) {
	// Set document vars if needed
	if ( ( context.ownerDocument || context ) !== document ) {
		setDocument( context );
	}
	return contains( context, elem );
};

Sizzle.attr = function( elem, name ) {
	// Set document vars if needed
	if ( ( elem.ownerDocument || elem ) !== document ) {
		setDocument( elem );
	}

	var fn = Expr.attrHandle[ name.toLowerCase() ],
		// Don't get fooled by Object.prototype properties (jQuery #13807)
		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
			fn( elem, name, !documentIsHTML ) :
			undefined;

	return val !== undefined ?
		val :
		support.attributes || !documentIsHTML ?
			elem.getAttribute( name ) :
			(val = elem.getAttributeNode(name)) && val.specified ?
				val.value :
				null;
};

Sizzle.error = function( msg ) {
	throw new Error( "Syntax error, unrecognized expression: " + msg );
};

/**
 * Document sorting and removing duplicates
 * @param {ArrayLike} results
 */
Sizzle.uniqueSort = function( results ) {
	var elem,
		duplicates = [],
		j = 0,
		i = 0;

	// Unless we *know* we can detect duplicates, assume their presence
	hasDuplicate = !support.detectDuplicates;
	sortInput = !support.sortStable && results.slice( 0 );
	results.sort( sortOrder );

	if ( hasDuplicate ) {
		while ( (elem = results[i++]) ) {
			if ( elem === results[ i ] ) {
				j = duplicates.push( i );
			}
		}
		while ( j-- ) {
			results.splice( duplicates[ j ], 1 );
		}
	}

	// Clear input after sorting to release objects
	// See https://github.com/jquery/sizzle/pull/225
	sortInput = null;

	return results;
};

/**
 * Utility function for retrieving the text value of an array of DOM nodes
 * @param {Array|Element} elem
 */
getText = Sizzle.getText = function( elem ) {
	var node,
		ret = "",
		i = 0,
		nodeType = elem.nodeType;

	if ( !nodeType ) {
		// If no nodeType, this is expected to be an array
		while ( (node = elem[i++]) ) {
			// Do not traverse comment nodes
			ret += getText( node );
		}
	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
		// Use textContent for elements
		// innerText usage removed for consistency of new lines (jQuery #11153)
		if ( typeof elem.textContent === "string" ) {
			return elem.textContent;
		} else {
			// Traverse its children
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
				ret += getText( elem );
			}
		}
	} else if ( nodeType === 3 || nodeType === 4 ) {
		return elem.nodeValue;
	}
	// Do not include comment or processing instruction nodes

	return ret;
};

Expr = Sizzle.selectors = {

	// Can be adjusted by the user
	cacheLength: 50,

	createPseudo: markFunction,

	match: matchExpr,

	attrHandle: {},

	find: {},

	relative: {
		">": { dir: "parentNode", first: true },
		" ": { dir: "parentNode" },
		"+": { dir: "previousSibling", first: true },
		"~": { dir: "previousSibling" }
	},

	preFilter: {
		"ATTR": function( match ) {
			match[1] = match[1].replace( runescape, funescape );

			// Move the given value to match[3] whether quoted or unquoted
			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );

			if ( match[2] === "~=" ) {
				match[3] = " " + match[3] + " ";
			}

			return match.slice( 0, 4 );
		},

		"CHILD": function( match ) {
			/* matches from matchExpr["CHILD"]
				1 type (only|nth|...)
				2 what (child|of-type)
				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
				4 xn-component of xn+y argument ([+-]?\d*n|)
				5 sign of xn-component
				6 x of xn-component
				7 sign of y-component
				8 y of y-component
			*/
			match[1] = match[1].toLowerCase();

			if ( match[1].slice( 0, 3 ) === "nth" ) {
				// nth-* requires argument
				if ( !match[3] ) {
					Sizzle.error( match[0] );
				}

				// numeric x and y parameters for Expr.filter.CHILD
				// remember that false/true cast respectively to 0/1
				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );

			// other types prohibit arguments
			} else if ( match[3] ) {
				Sizzle.error( match[0] );
			}

			return match;
		},

		"PSEUDO": function( match ) {
			var excess,
				unquoted = !match[6] && match[2];

			if ( matchExpr["CHILD"].test( match[0] ) ) {
				return null;
			}

			// Accept quoted arguments as-is
			if ( match[3] ) {
				match[2] = match[4] || match[5] || "";

			// Strip excess characters from unquoted arguments
			} else if ( unquoted && rpseudo.test( unquoted ) &&
				// Get excess from tokenize (recursively)
				(excess = tokenize( unquoted, true )) &&
				// advance to the next closing parenthesis
				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {

				// excess is a negative index
				match[0] = match[0].slice( 0, excess );
				match[2] = unquoted.slice( 0, excess );
			}

			// Return only captures needed by the pseudo filter method (type and argument)
			return match.slice( 0, 3 );
		}
	},

	filter: {

		"TAG": function( nodeNameSelector ) {
			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
			return nodeNameSelector === "*" ?
				function() { return true; } :
				function( elem ) {
					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
				};
		},

		"CLASS": function( className ) {
			var pattern = classCache[ className + " " ];

			return pattern ||
				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
				classCache( className, function( elem ) {
					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
				});
		},

		"ATTR": function( name, operator, check ) {
			return function( elem ) {
				var result = Sizzle.attr( elem, name );

				if ( result == null ) {
					return operator === "!=";
				}
				if ( !operator ) {
					return true;
				}

				result += "";

				return operator === "=" ? result === check :
					operator === "!=" ? result !== check :
					operator === "^=" ? check && result.indexOf( check ) === 0 :
					operator === "*=" ? check && result.indexOf( check ) > -1 :
					operator === "$=" ? check && result.slice( -check.length ) === check :
					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
					false;
			};
		},

		"CHILD": function( type, what, argument, first, last ) {
			var simple = type.slice( 0, 3 ) !== "nth",
				forward = type.slice( -4 ) !== "last",
				ofType = what === "of-type";

			return first === 1 && last === 0 ?

				// Shortcut for :nth-*(n)
				function( elem ) {
					return !!elem.parentNode;
				} :

				function( elem, context, xml ) {
					var cache, outerCache, node, diff, nodeIndex, start,
						dir = simple !== forward ? "nextSibling" : "previousSibling",
						parent = elem.parentNode,
						name = ofType && elem.nodeName.toLowerCase(),
						useCache = !xml && !ofType;

					if ( parent ) {

						// :(first|last|only)-(child|of-type)
						if ( simple ) {
							while ( dir ) {
								node = elem;
								while ( (node = node[ dir ]) ) {
									if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
										return false;
									}
								}
								// Reverse direction for :only-* (if we haven't yet done so)
								start = dir = type === "only" && !start && "nextSibling";
							}
							return true;
						}

						start = [ forward ? parent.firstChild : parent.lastChild ];

						// non-xml :nth-child(...) stores cache data on `parent`
						if ( forward && useCache ) {
							// Seek `elem` from a previously-cached index
							outerCache = parent[ expando ] || (parent[ expando ] = {});
							cache = outerCache[ type ] || [];
							nodeIndex = cache[0] === dirruns && cache[1];
							diff = cache[0] === dirruns && cache[2];
							node = nodeIndex && parent.childNodes[ nodeIndex ];

							while ( (node = ++nodeIndex && node && node[ dir ] ||

								// Fallback to seeking `elem` from the start
								(diff = nodeIndex = 0) || start.pop()) ) {

								// When found, cache indexes on `parent` and break
								if ( node.nodeType === 1 && ++diff && node === elem ) {
									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
									break;
								}
							}

						// Use previously-cached element index if available
						} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
							diff = cache[1];

						// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
						} else {
							// Use the same loop as above to seek `elem` from the start
							while ( (node = ++nodeIndex && node && node[ dir ] ||
								(diff = nodeIndex = 0) || start.pop()) ) {

								if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
									// Cache the index of each encountered element
									if ( useCache ) {
										(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
									}

									if ( node === elem ) {
										break;
									}
								}
							}
						}

						// Incorporate the offset, then check against cycle size
						diff -= last;
						return diff === first || ( diff % first === 0 && diff / first >= 0 );
					}
				};
		},

		"PSEUDO": function( pseudo, argument ) {
			// pseudo-class names are case-insensitive
			// http://www.w3.org/TR/selectors/#pseudo-classes
			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
			// Remember that setFilters inherits from pseudos
			var args,
				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
					Sizzle.error( "unsupported pseudo: " + pseudo );

			// The user may use createPseudo to indicate that
			// arguments are needed to create the filter function
			// just as Sizzle does
			if ( fn[ expando ] ) {
				return fn( argument );
			}

			// But maintain support for old signatures
			if ( fn.length > 1 ) {
				args = [ pseudo, pseudo, "", argument ];
				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
					markFunction(function( seed, matches ) {
						var idx,
							matched = fn( seed, argument ),
							i = matched.length;
						while ( i-- ) {
							idx = indexOf( seed, matched[i] );
							seed[ idx ] = !( matches[ idx ] = matched[i] );
						}
					}) :
					function( elem ) {
						return fn( elem, 0, args );
					};
			}

			return fn;
		}
	},

	pseudos: {
		// Potentially complex pseudos
		"not": markFunction(function( selector ) {
			// Trim the selector passed to compile
			// to avoid treating leading and trailing
			// spaces as combinators
			var input = [],
				results = [],
				matcher = compile( selector.replace( rtrim, "$1" ) );

			return matcher[ expando ] ?
				markFunction(function( seed, matches, context, xml ) {
					var elem,
						unmatched = matcher( seed, null, xml, [] ),
						i = seed.length;

					// Match elements unmatched by `matcher`
					while ( i-- ) {
						if ( (elem = unmatched[i]) ) {
							seed[i] = !(matches[i] = elem);
						}
					}
				}) :
				function( elem, context, xml ) {
					input[0] = elem;
					matcher( input, null, xml, results );
					// Don't keep the element (issue #299)
					input[0] = null;
					return !results.pop();
				};
		}),

		"has": markFunction(function( selector ) {
			return function( elem ) {
				return Sizzle( selector, elem ).length > 0;
			};
		}),

		"contains": markFunction(function( text ) {
			text = text.replace( runescape, funescape );
			return function( elem ) {
				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
			};
		}),

		// "Whether an element is represented by a :lang() selector
		// is based solely on the element's language value
		// being equal to the identifier C,
		// or beginning with the identifier C immediately followed by "-".
		// The matching of C against the element's language value is performed case-insensitively.
		// The identifier C does not have to be a valid language name."
		// http://www.w3.org/TR/selectors/#lang-pseudo
		"lang": markFunction( function( lang ) {
			// lang value must be a valid identifier
			if ( !ridentifier.test(lang || "") ) {
				Sizzle.error( "unsupported lang: " + lang );
			}
			lang = lang.replace( runescape, funescape ).toLowerCase();
			return function( elem ) {
				var elemLang;
				do {
					if ( (elemLang = documentIsHTML ?
						elem.lang :
						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {

						elemLang = elemLang.toLowerCase();
						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
					}
				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
				return false;
			};
		}),

		// Miscellaneous
		"target": function( elem ) {
			var hash = window.location && window.location.hash;
			return hash && hash.slice( 1 ) === elem.id;
		},

		"root": function( elem ) {
			return elem === docElem;
		},

		"focus": function( elem ) {
			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
		},

		// Boolean properties
		"enabled": function( elem ) {
			return elem.disabled === false;
		},

		"disabled": function( elem ) {
			return elem.disabled === true;
		},

		"checked": function( elem ) {
			// In CSS3, :checked should return both checked and selected elements
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
			var nodeName = elem.nodeName.toLowerCase();
			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
		},

		"selected": function( elem ) {
			// Accessing this property makes selected-by-default
			// options in Safari work properly
			if ( elem.parentNode ) {
				elem.parentNode.selectedIndex;
			}

			return elem.selected === true;
		},

		// Contents
		"empty": function( elem ) {
			// http://www.w3.org/TR/selectors/#empty-pseudo
			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
			//   but not by others (comment: 8; processing instruction: 7; etc.)
			// nodeType < 6 works because attributes (2) do not appear as children
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
				if ( elem.nodeType < 6 ) {
					return false;
				}
			}
			return true;
		},

		"parent": function( elem ) {
			return !Expr.pseudos["empty"]( elem );
		},

		// Element/input types
		"header": function( elem ) {
			return rheader.test( elem.nodeName );
		},

		"input": function( elem ) {
			return rinputs.test( elem.nodeName );
		},

		"button": function( elem ) {
			var name = elem.nodeName.toLowerCase();
			return name === "input" && elem.type === "button" || name === "button";
		},

		"text": function( elem ) {
			var attr;
			return elem.nodeName.toLowerCase() === "input" &&
				elem.type === "text" &&

				// Support: IE<8
				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
		},

		// Position-in-collection
		"first": createPositionalPseudo(function() {
			return [ 0 ];
		}),

		"last": createPositionalPseudo(function( matchIndexes, length ) {
			return [ length - 1 ];
		}),

		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
			return [ argument < 0 ? argument + length : argument ];
		}),

		"even": createPositionalPseudo(function( matchIndexes, length ) {
			var i = 0;
			for ( ; i < length; i += 2 ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		}),

		"odd": createPositionalPseudo(function( matchIndexes, length ) {
			var i = 1;
			for ( ; i < length; i += 2 ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		}),

		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
			var i = argument < 0 ? argument + length : argument;
			for ( ; --i >= 0; ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		}),

		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
			var i = argument < 0 ? argument + length : argument;
			for ( ; ++i < length; ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		})
	}
};

Expr.pseudos["nth"] = Expr.pseudos["eq"];

// Add button/input type pseudos
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
	Expr.pseudos[ i ] = createInputPseudo( i );
}
for ( i in { submit: true, reset: true } ) {
	Expr.pseudos[ i ] = createButtonPseudo( i );
}

// Easy API for creating new setFilters
function setFilters() {}
setFilters.prototype = Expr.filters = Expr.pseudos;
Expr.setFilters = new setFilters();

tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
	var matched, match, tokens, type,
		soFar, groups, preFilters,
		cached = tokenCache[ selector + " " ];

	if ( cached ) {
		return parseOnly ? 0 : cached.slice( 0 );
	}

	soFar = selector;
	groups = [];
	preFilters = Expr.preFilter;

	while ( soFar ) {

		// Comma and first run
		if ( !matched || (match = rcomma.exec( soFar )) ) {
			if ( match ) {
				// Don't consume trailing commas as valid
				soFar = soFar.slice( match[0].length ) || soFar;
			}
			groups.push( (tokens = []) );
		}

		matched = false;

		// Combinators
		if ( (match = rcombinators.exec( soFar )) ) {
			matched = match.shift();
			tokens.push({
				value: matched,
				// Cast descendant combinators to space
				type: match[0].replace( rtrim, " " )
			});
			soFar = soFar.slice( matched.length );
		}

		// Filters
		for ( type in Expr.filter ) {
			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
				(match = preFilters[ type ]( match ))) ) {
				matched = match.shift();
				tokens.push({
					value: matched,
					type: type,
					matches: match
				});
				soFar = soFar.slice( matched.length );
			}
		}

		if ( !matched ) {
			break;
		}
	}

	// Return the length of the invalid excess
	// if we're just parsing
	// Otherwise, throw an error or return tokens
	return parseOnly ?
		soFar.length :
		soFar ?
			Sizzle.error( selector ) :
			// Cache the tokens
			tokenCache( selector, groups ).slice( 0 );
};

function toSelector( tokens ) {
	var i = 0,
		len = tokens.length,
		selector = "";
	for ( ; i < len; i++ ) {
		selector += tokens[i].value;
	}
	return selector;
}

function addCombinator( matcher, combinator, base ) {
	var dir = combinator.dir,
		checkNonElements = base && dir === "parentNode",
		doneName = done++;

	return combinator.first ?
		// Check against closest ancestor/preceding element
		function( elem, context, xml ) {
			while ( (elem = elem[ dir ]) ) {
				if ( elem.nodeType === 1 || checkNonElements ) {
					return matcher( elem, context, xml );
				}
			}
		} :

		// Check against all ancestor/preceding elements
		function( elem, context, xml ) {
			var oldCache, outerCache,
				newCache = [ dirruns, doneName ];

			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
			if ( xml ) {
				while ( (elem = elem[ dir ]) ) {
					if ( elem.nodeType === 1 || checkNonElements ) {
						if ( matcher( elem, context, xml ) ) {
							return true;
						}
					}
				}
			} else {
				while ( (elem = elem[ dir ]) ) {
					if ( elem.nodeType === 1 || checkNonElements ) {
						outerCache = elem[ expando ] || (elem[ expando ] = {});
						if ( (oldCache = outerCache[ dir ]) &&
							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {

							// Assign to newCache so results back-propagate to previous elements
							return (newCache[ 2 ] = oldCache[ 2 ]);
						} else {
							// Reuse newcache so results back-propagate to previous elements
							outerCache[ dir ] = newCache;

							// A match means we're done; a fail means we have to keep checking
							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
								return true;
							}
						}
					}
				}
			}
		};
}

function elementMatcher( matchers ) {
	return matchers.length > 1 ?
		function( elem, context, xml ) {
			var i = matchers.length;
			while ( i-- ) {
				if ( !matchers[i]( elem, context, xml ) ) {
					return false;
				}
			}
			return true;
		} :
		matchers[0];
}

function multipleContexts( selector, contexts, results ) {
	var i = 0,
		len = contexts.length;
	for ( ; i < len; i++ ) {
		Sizzle( selector, contexts[i], results );
	}
	return results;
}

function condense( unmatched, map, filter, context, xml ) {
	var elem,
		newUnmatched = [],
		i = 0,
		len = unmatched.length,
		mapped = map != null;

	for ( ; i < len; i++ ) {
		if ( (elem = unmatched[i]) ) {
			if ( !filter || filter( elem, context, xml ) ) {
				newUnmatched.push( elem );
				if ( mapped ) {
					map.push( i );
				}
			}
		}
	}

	return newUnmatched;
}

function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
	if ( postFilter && !postFilter[ expando ] ) {
		postFilter = setMatcher( postFilter );
	}
	if ( postFinder && !postFinder[ expando ] ) {
		postFinder = setMatcher( postFinder, postSelector );
	}
	return markFunction(function( seed, results, context, xml ) {
		var temp, i, elem,
			preMap = [],
			postMap = [],
			preexisting = results.length,

			// Get initial elements from seed or context
			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),

			// Prefilter to get matcher input, preserving a map for seed-results synchronization
			matcherIn = preFilter && ( seed || !selector ) ?
				condense( elems, preMap, preFilter, context, xml ) :
				elems,

			matcherOut = matcher ?
				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?

					// ...intermediate processing is necessary
					[] :

					// ...otherwise use results directly
					results :
				matcherIn;

		// Find primary matches
		if ( matcher ) {
			matcher( matcherIn, matcherOut, context, xml );
		}

		// Apply postFilter
		if ( postFilter ) {
			temp = condense( matcherOut, postMap );
			postFilter( temp, [], context, xml );

			// Un-match failing elements by moving them back to matcherIn
			i = temp.length;
			while ( i-- ) {
				if ( (elem = temp[i]) ) {
					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
				}
			}
		}

		if ( seed ) {
			if ( postFinder || preFilter ) {
				if ( postFinder ) {
					// Get the final matcherOut by condensing this intermediate into postFinder contexts
					temp = [];
					i = matcherOut.length;
					while ( i-- ) {
						if ( (elem = matcherOut[i]) ) {
							// Restore matcherIn since elem is not yet a final match
							temp.push( (matcherIn[i] = elem) );
						}
					}
					postFinder( null, (matcherOut = []), temp, xml );
				}

				// Move matched elements from seed to results to keep them synchronized
				i = matcherOut.length;
				while ( i-- ) {
					if ( (elem = matcherOut[i]) &&
						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {

						seed[temp] = !(results[temp] = elem);
					}
				}
			}

		// Add elements to results, through postFinder if defined
		} else {
			matcherOut = condense(
				matcherOut === results ?
					matcherOut.splice( preexisting, matcherOut.length ) :
					matcherOut
			);
			if ( postFinder ) {
				postFinder( null, results, matcherOut, xml );
			} else {
				push.apply( results, matcherOut );
			}
		}
	});
}

function matcherFromTokens( tokens ) {
	var checkContext, matcher, j,
		len = tokens.length,
		leadingRelative = Expr.relative[ tokens[0].type ],
		implicitRelative = leadingRelative || Expr.relative[" "],
		i = leadingRelative ? 1 : 0,

		// The foundational matcher ensures that elements are reachable from top-level context(s)
		matchContext = addCombinator( function( elem ) {
			return elem === checkContext;
		}, implicitRelative, true ),
		matchAnyContext = addCombinator( function( elem ) {
			return indexOf( checkContext, elem ) > -1;
		}, implicitRelative, true ),
		matchers = [ function( elem, context, xml ) {
			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
				(checkContext = context).nodeType ?
					matchContext( elem, context, xml ) :
					matchAnyContext( elem, context, xml ) );
			// Avoid hanging onto element (issue #299)
			checkContext = null;
			return ret;
		} ];

	for ( ; i < len; i++ ) {
		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
		} else {
			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );

			// Return special upon seeing a positional matcher
			if ( matcher[ expando ] ) {
				// Find the next relative operator (if any) for proper handling
				j = ++i;
				for ( ; j < len; j++ ) {
					if ( Expr.relative[ tokens[j].type ] ) {
						break;
					}
				}
				return setMatcher(
					i > 1 && elementMatcher( matchers ),
					i > 1 && toSelector(
						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
					).replace( rtrim, "$1" ),
					matcher,
					i < j && matcherFromTokens( tokens.slice( i, j ) ),
					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
					j < len && toSelector( tokens )
				);
			}
			matchers.push( matcher );
		}
	}

	return elementMatcher( matchers );
}

function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
	var bySet = setMatchers.length > 0,
		byElement = elementMatchers.length > 0,
		superMatcher = function( seed, context, xml, results, outermost ) {
			var elem, j, matcher,
				matchedCount = 0,
				i = "0",
				unmatched = seed && [],
				setMatched = [],
				contextBackup = outermostContext,
				// We must always have either seed elements or outermost context
				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
				// Use integer dirruns iff this is the outermost matcher
				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
				len = elems.length;

			if ( outermost ) {
				outermostContext = context !== document && context;
			}

			// Add elements passing elementMatchers directly to results
			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
			// Support: IE<9, Safari
			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
				if ( byElement && elem ) {
					j = 0;
					while ( (matcher = elementMatchers[j++]) ) {
						if ( matcher( elem, context, xml ) ) {
							results.push( elem );
							break;
						}
					}
					if ( outermost ) {
						dirruns = dirrunsUnique;
					}
				}

				// Track unmatched elements for set filters
				if ( bySet ) {
					// They will have gone through all possible matchers
					if ( (elem = !matcher && elem) ) {
						matchedCount--;
					}

					// Lengthen the array for every element, matched or not
					if ( seed ) {
						unmatched.push( elem );
					}
				}
			}

			// Apply set filters to unmatched elements
			matchedCount += i;
			if ( bySet && i !== matchedCount ) {
				j = 0;
				while ( (matcher = setMatchers[j++]) ) {
					matcher( unmatched, setMatched, context, xml );
				}

				if ( seed ) {
					// Reintegrate element matches to eliminate the need for sorting
					if ( matchedCount > 0 ) {
						while ( i-- ) {
							if ( !(unmatched[i] || setMatched[i]) ) {
								setMatched[i] = pop.call( results );
							}
						}
					}

					// Discard index placeholder values to get only actual matches
					setMatched = condense( setMatched );
				}

				// Add matches to results
				push.apply( results, setMatched );

				// Seedless set matches succeeding multiple successful matchers stipulate sorting
				if ( outermost && !seed && setMatched.length > 0 &&
					( matchedCount + setMatchers.length ) > 1 ) {

					Sizzle.uniqueSort( results );
				}
			}

			// Override manipulation of globals by nested matchers
			if ( outermost ) {
				dirruns = dirrunsUnique;
				outermostContext = contextBackup;
			}

			return unmatched;
		};

	return bySet ?
		markFunction( superMatcher ) :
		superMatcher;
}

compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
	var i,
		setMatchers = [],
		elementMatchers = [],
		cached = compilerCache[ selector + " " ];

	if ( !cached ) {
		// Generate a function of recursive functions that can be used to check each element
		if ( !match ) {
			match = tokenize( selector );
		}
		i = match.length;
		while ( i-- ) {
			cached = matcherFromTokens( match[i] );
			if ( cached[ expando ] ) {
				setMatchers.push( cached );
			} else {
				elementMatchers.push( cached );
			}
		}

		// Cache the compiled function
		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );

		// Save selector and tokenization
		cached.selector = selector;
	}
	return cached;
};

/**
 * A low-level selection function that works with Sizzle's compiled
 *  selector functions
 * @param {String|Function} selector A selector or a pre-compiled
 *  selector function built with Sizzle.compile
 * @param {Element} context
 * @param {Array} [results]
 * @param {Array} [seed] A set of elements to match against
 */
select = Sizzle.select = function( selector, context, results, seed ) {
	var i, tokens, token, type, find,
		compiled = typeof selector === "function" && selector,
		match = !seed && tokenize( (selector = compiled.selector || selector) );

	results = results || [];

	// Try to minimize operations if there is no seed and only one group
	if ( match.length === 1 ) {

		// Take a shortcut and set the context if the root selector is an ID
		tokens = match[0] = match[0].slice( 0 );
		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
				support.getById && context.nodeType === 9 && documentIsHTML &&
				Expr.relative[ tokens[1].type ] ) {

			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
			if ( !context ) {
				return results;

			// Precompiled matchers will still verify ancestry, so step up a level
			} else if ( compiled ) {
				context = context.parentNode;
			}

			selector = selector.slice( tokens.shift().value.length );
		}

		// Fetch a seed set for right-to-left matching
		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
		while ( i-- ) {
			token = tokens[i];

			// Abort if we hit a combinator
			if ( Expr.relative[ (type = token.type) ] ) {
				break;
			}
			if ( (find = Expr.find[ type ]) ) {
				// Search, expanding context for leading sibling combinators
				if ( (seed = find(
					token.matches[0].replace( runescape, funescape ),
					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
				)) ) {

					// If seed is empty or no tokens remain, we can return early
					tokens.splice( i, 1 );
					selector = seed.length && toSelector( tokens );
					if ( !selector ) {
						push.apply( results, seed );
						return results;
					}

					break;
				}
			}
		}
	}

	// Compile and execute a filtering function if one is not provided
	// Provide `match` to avoid retokenization if we modified the selector above
	( compiled || compile( selector, match ) )(
		seed,
		context,
		!documentIsHTML,
		results,
		rsibling.test( selector ) && testContext( context.parentNode ) || context
	);
	return results;
};

// One-time assignments

// Sort stability
support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;

// Support: Chrome 14-35+
// Always assume duplicates if they aren't passed to the comparison function
support.detectDuplicates = !!hasDuplicate;

// Initialize against the default document
setDocument();

// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
// Detached nodes confoundingly follow *each other*
support.sortDetached = assert(function( div1 ) {
	// Should return 1, but returns 4 (following)
	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
});

// Support: IE<8
// Prevent attribute/property "interpolation"
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
if ( !assert(function( div ) {
	div.innerHTML = "<a href='#'></a>";
	return div.firstChild.getAttribute("href") === "#" ;
}) ) {
	addHandle( "type|href|height|width", function( elem, name, isXML ) {
		if ( !isXML ) {
			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
		}
	});
}

// Support: IE<9
// Use defaultValue in place of getAttribute("value")
if ( !support.attributes || !assert(function( div ) {
	div.innerHTML = "<input/>";
	div.firstChild.setAttribute( "value", "" );
	return div.firstChild.getAttribute( "value" ) === "";
}) ) {
	addHandle( "value", function( elem, name, isXML ) {
		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
			return elem.defaultValue;
		}
	});
}

// Support: IE<9
// Use getAttributeNode to fetch booleans when getAttribute lies
if ( !assert(function( div ) {
	return div.getAttribute("disabled") == null;
}) ) {
	addHandle( booleans, function( elem, name, isXML ) {
		var val;
		if ( !isXML ) {
			return elem[ name ] === true ? name.toLowerCase() :
					(val = elem.getAttributeNode( name )) && val.specified ?
					val.value :
				null;
		}
	});
}

return Sizzle;

})( window );



jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.pseudos;
jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;



var rneedsContext = jQuery.expr.match.needsContext;

var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);



var risSimple = /^.[^:#\[\.,]*$/;

// Implement the identical functionality for filter and not
function winnow( elements, qualifier, not ) {
	if ( jQuery.isFunction( qualifier ) ) {
		return jQuery.grep( elements, function( elem, i ) {
			/* jshint -W018 */
			return !!qualifier.call( elem, i, elem ) !== not;
		});

	}

	if ( qualifier.nodeType ) {
		return jQuery.grep( elements, function( elem ) {
			return ( elem === qualifier ) !== not;
		});

	}

	if ( typeof qualifier === "string" ) {
		if ( risSimple.test( qualifier ) ) {
			return jQuery.filter( qualifier, elements, not );
		}

		qualifier = jQuery.filter( qualifier, elements );
	}

	return jQuery.grep( elements, function( elem ) {
		return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
	});
}

jQuery.filter = function( expr, elems, not ) {
	var elem = elems[ 0 ];

	if ( not ) {
		expr = ":not(" + expr + ")";
	}

	return elems.length === 1 && elem.nodeType === 1 ?
		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
			return elem.nodeType === 1;
		}));
};

jQuery.fn.extend({
	find: function( selector ) {
		var i,
			len = this.length,
			ret = [],
			self = this;

		if ( typeof selector !== "string" ) {
			return this.pushStack( jQuery( selector ).filter(function() {
				for ( i = 0; i < len; i++ ) {
					if ( jQuery.contains( self[ i ], this ) ) {
						return true;
					}
				}
			}) );
		}

		for ( i = 0; i < len; i++ ) {
			jQuery.find( selector, self[ i ], ret );
		}

		// Needed because $( selector, context ) becomes $( context ).find( selector )
		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
		ret.selector = this.selector ? this.selector + " " + selector : selector;
		return ret;
	},
	filter: function( selector ) {
		return this.pushStack( winnow(this, selector || [], false) );
	},
	not: function( selector ) {
		return this.pushStack( winnow(this, selector || [], true) );
	},
	is: function( selector ) {
		return !!winnow(
			this,

			// If this is a positional/relative selector, check membership in the returned set
			// so $("p:first").is("p:last") won't return true for a doc with two "p".
			typeof selector === "string" && rneedsContext.test( selector ) ?
				jQuery( selector ) :
				selector || [],
			false
		).length;
	}
});


// Initialize a jQuery object


// A central reference to the root jQuery(document)
var rootjQuery,

	// A simple way to check for HTML strings
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
	// Strict HTML recognition (#11290: must start with <)
	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,

	init = jQuery.fn.init = function( selector, context ) {
		var match, elem;

		// HANDLE: $(""), $(null), $(undefined), $(false)
		if ( !selector ) {
			return this;
		}

		// Handle HTML strings
		if ( typeof selector === "string" ) {
			if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
				// Assume that strings that start and end with <> are HTML and skip the regex check
				match = [ null, selector, null ];

			} else {
				match = rquickExpr.exec( selector );
			}

			// Match html or make sure no context is specified for #id
			if ( match && (match[1] || !context) ) {

				// HANDLE: $(html) -> $(array)
				if ( match[1] ) {
					context = context instanceof jQuery ? context[0] : context;

					// Option to run scripts is true for back-compat
					// Intentionally let the error be thrown if parseHTML is not present
					jQuery.merge( this, jQuery.parseHTML(
						match[1],
						context && context.nodeType ? context.ownerDocument || context : document,
						true
					) );

					// HANDLE: $(html, props)
					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
						for ( match in context ) {
							// Properties of context are called as methods if possible
							if ( jQuery.isFunction( this[ match ] ) ) {
								this[ match ]( context[ match ] );

							// ...and otherwise set as attributes
							} else {
								this.attr( match, context[ match ] );
							}
						}
					}

					return this;

				// HANDLE: $(#id)
				} else {
					elem = document.getElementById( match[2] );

					// Support: Blackberry 4.6
					// gEBID returns nodes no longer in the document (#6963)
					if ( elem && elem.parentNode ) {
						// Inject the element directly into the jQuery object
						this.length = 1;
						this[0] = elem;
					}

					this.context = document;
					this.selector = selector;
					return this;
				}

			// HANDLE: $(expr, $(...))
			} else if ( !context || context.jquery ) {
				return ( context || rootjQuery ).find( selector );

			// HANDLE: $(expr, context)
			// (which is just equivalent to: $(context).find(expr)
			} else {
				return this.constructor( context ).find( selector );
			}

		// HANDLE: $(DOMElement)
		} else if ( selector.nodeType ) {
			this.context = this[0] = selector;
			this.length = 1;
			return this;

		// HANDLE: $(function)
		// Shortcut for document ready
		} else if ( jQuery.isFunction( selector ) ) {
			return typeof rootjQuery.ready !== "undefined" ?
				rootjQuery.ready( selector ) :
				// Execute immediately if ready is not present
				selector( jQuery );
		}

		if ( selector.selector !== undefined ) {
			this.selector = selector.selector;
			this.context = selector.context;
		}

		return jQuery.makeArray( selector, this );
	};

// Give the init function the jQuery prototype for later instantiation
init.prototype = jQuery.fn;

// Initialize central reference
rootjQuery = jQuery( document );


var rparentsprev = /^(?:parents|prev(?:Until|All))/,
	// Methods guaranteed to produce a unique set when starting from a unique set
	guaranteedUnique = {
		children: true,
		contents: true,
		next: true,
		prev: true
	};

jQuery.extend({
	dir: function( elem, dir, until ) {
		var matched = [],
			truncate = until !== undefined;

		while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
			if ( elem.nodeType === 1 ) {
				if ( truncate && jQuery( elem ).is( until ) ) {
					break;
				}
				matched.push( elem );
			}
		}
		return matched;
	},

	sibling: function( n, elem ) {
		var matched = [];

		for ( ; n; n = n.nextSibling ) {
			if ( n.nodeType === 1 && n !== elem ) {
				matched.push( n );
			}
		}

		return matched;
	}
});

jQuery.fn.extend({
	has: function( target ) {
		var targets = jQuery( target, this ),
			l = targets.length;

		return this.filter(function() {
			var i = 0;
			for ( ; i < l; i++ ) {
				if ( jQuery.contains( this, targets[i] ) ) {
					return true;
				}
			}
		});
	},

	closest: function( selectors, context ) {
		var cur,
			i = 0,
			l = this.length,
			matched = [],
			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
				jQuery( selectors, context || this.context ) :
				0;

		for ( ; i < l; i++ ) {
			for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
				// Always skip document fragments
				if ( cur.nodeType < 11 && (pos ?
					pos.index(cur) > -1 :

					// Don't pass non-elements to Sizzle
					cur.nodeType === 1 &&
						jQuery.find.matchesSelector(cur, selectors)) ) {

					matched.push( cur );
					break;
				}
			}
		}

		return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
	},

	// Determine the position of an element within the set
	index: function( elem ) {

		// No argument, return index in parent
		if ( !elem ) {
			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
		}

		// Index in selector
		if ( typeof elem === "string" ) {
			return indexOf.call( jQuery( elem ), this[ 0 ] );
		}

		// Locate the position of the desired element
		return indexOf.call( this,

			// If it receives a jQuery object, the first element is used
			elem.jquery ? elem[ 0 ] : elem
		);
	},

	add: function( selector, context ) {
		return this.pushStack(
			jQuery.unique(
				jQuery.merge( this.get(), jQuery( selector, context ) )
			)
		);
	},

	addBack: function( selector ) {
		return this.add( selector == null ?
			this.prevObject : this.prevObject.filter(selector)
		);
	}
});

function sibling( cur, dir ) {
	while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
	return cur;
}

jQuery.each({
	parent: function( elem ) {
		var parent = elem.parentNode;
		return parent && parent.nodeType !== 11 ? parent : null;
	},
	parents: function( elem ) {
		return jQuery.dir( elem, "parentNode" );
	},
	parentsUntil: function( elem, i, until ) {
		return jQuery.dir( elem, "parentNode", until );
	},
	next: function( elem ) {
		return sibling( elem, "nextSibling" );
	},
	prev: function( elem ) {
		return sibling( elem, "previousSibling" );
	},
	nextAll: function( elem ) {
		return jQuery.dir( elem, "nextSibling" );
	},
	prevAll: function( elem ) {
		return jQuery.dir( elem, "previousSibling" );
	},
	nextUntil: function( elem, i, until ) {
		return jQuery.dir( elem, "nextSibling", until );
	},
	prevUntil: function( elem, i, until ) {
		return jQuery.dir( elem, "previousSibling", until );
	},
	siblings: function( elem ) {
		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
	},
	children: function( elem ) {
		return jQuery.sibling( elem.firstChild );
	},
	contents: function( elem ) {
		return elem.contentDocument || jQuery.merge( [], elem.childNodes );
	}
}, function( name, fn ) {
	jQuery.fn[ name ] = function( until, selector ) {
		var matched = jQuery.map( this, fn, until );

		if ( name.slice( -5 ) !== "Until" ) {
			selector = until;
		}

		if ( selector && typeof selector === "string" ) {
			matched = jQuery.filter( selector, matched );
		}

		if ( this.length > 1 ) {
			// Remove duplicates
			if ( !guaranteedUnique[ name ] ) {
				jQuery.unique( matched );
			}

			// Reverse order for parents* and prev-derivatives
			if ( rparentsprev.test( name ) ) {
				matched.reverse();
			}
		}

		return this.pushStack( matched );
	};
});
var rnotwhite = (/\S+/g);



// String to Object options format cache
var optionsCache = {};

// Convert String-formatted options into Object-formatted ones and store in cache
function createOptions( options ) {
	var object = optionsCache[ options ] = {};
	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
		object[ flag ] = true;
	});
	return object;
}

/*
 * Create a callback list using the following parameters:
 *
 *	options: an optional list of space-separated options that will change how
 *			the callback list behaves or a more traditional option object
 *
 * By default a callback list will act like an event callback list and can be
 * "fired" multiple times.
 *
 * Possible options:
 *
 *	once:			will ensure the callback list can only be fired once (like a Deferred)
 *
 *	memory:			will keep track of previous values and will call any callback added
 *					after the list has been fired right away with the latest "memorized"
 *					values (like a Deferred)
 *
 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
 *
 *	stopOnFalse:	interrupt callings when a callback returns false
 *
 */
jQuery.Callbacks = function( options ) {

	// Convert options from String-formatted to Object-formatted if needed
	// (we check in cache first)
	options = typeof options === "string" ?
		( optionsCache[ options ] || createOptions( options ) ) :
		jQuery.extend( {}, options );

	var // Last fire value (for non-forgettable lists)
		memory,
		// Flag to know if list was already fired
		fired,
		// Flag to know if list is currently firing
		firing,
		// First callback to fire (used internally by add and fireWith)
		firingStart,
		// End of the loop when firing
		firingLength,
		// Index of currently firing callback (modified by remove if needed)
		firingIndex,
		// Actual callback list
		list = [],
		// Stack of fire calls for repeatable lists
		stack = !options.once && [],
		// Fire callbacks
		fire = function( data ) {
			memory = options.memory && data;
			fired = true;
			firingIndex = firingStart || 0;
			firingStart = 0;
			firingLength = list.length;
			firing = true;
			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
					memory = false; // To prevent further calls using add
					break;
				}
			}
			firing = false;
			if ( list ) {
				if ( stack ) {
					if ( stack.length ) {
						fire( stack.shift() );
					}
				} else if ( memory ) {
					list = [];
				} else {
					self.disable();
				}
			}
		},
		// Actual Callbacks object
		self = {
			// Add a callback or a collection of callbacks to the list
			add: function() {
				if ( list ) {
					// First, we save the current length
					var start = list.length;
					(function add( args ) {
						jQuery.each( args, function( _, arg ) {
							var type = jQuery.type( arg );
							if ( type === "function" ) {
								if ( !options.unique || !self.has( arg ) ) {
									list.push( arg );
								}
							} else if ( arg && arg.length && type !== "string" ) {
								// Inspect recursively
								add( arg );
							}
						});
					})( arguments );
					// Do we need to add the callbacks to the
					// current firing batch?
					if ( firing ) {
						firingLength = list.length;
					// With memory, if we're not firing then
					// we should call right away
					} else if ( memory ) {
						firingStart = start;
						fire( memory );
					}
				}
				return this;
			},
			// Remove a callback from the list
			remove: function() {
				if ( list ) {
					jQuery.each( arguments, function( _, arg ) {
						var index;
						while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
							list.splice( index, 1 );
							// Handle firing indexes
							if ( firing ) {
								if ( index <= firingLength ) {
									firingLength--;
								}
								if ( index <= firingIndex ) {
									firingIndex--;
								}
							}
						}
					});
				}
				return this;
			},
			// Check if a given callback is in the list.
			// If no argument is given, return whether or not list has callbacks attached.
			has: function( fn ) {
				return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
			},
			// Remove all callbacks from the list
			empty: function() {
				list = [];
				firingLength = 0;
				return this;
			},
			// Have the list do nothing anymore
			disable: function() {
				list = stack = memory = undefined;
				return this;
			},
			// Is it disabled?
			disabled: function() {
				return !list;
			},
			// Lock the list in its current state
			lock: function() {
				stack = undefined;
				if ( !memory ) {
					self.disable();
				}
				return this;
			},
			// Is it locked?
			locked: function() {
				return !stack;
			},
			// Call all callbacks with the given context and arguments
			fireWith: function( context, args ) {
				if ( list && ( !fired || stack ) ) {
					args = args || [];
					args = [ context, args.slice ? args.slice() : args ];
					if ( firing ) {
						stack.push( args );
					} else {
						fire( args );
					}
				}
				return this;
			},
			// Call all the callbacks with the given arguments
			fire: function() {
				self.fireWith( this, arguments );
				return this;
			},
			// To know if the callbacks have already been called at least once
			fired: function() {
				return !!fired;
			}
		};

	return self;
};


jQuery.extend({

	Deferred: function( func ) {
		var tuples = [
				// action, add listener, listener list, final state
				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
				[ "notify", "progress", jQuery.Callbacks("memory") ]
			],
			state = "pending",
			promise = {
				state: function() {
					return state;
				},
				always: function() {
					deferred.done( arguments ).fail( arguments );
					return this;
				},
				then: function( /* fnDone, fnFail, fnProgress */ ) {
					var fns = arguments;
					return jQuery.Deferred(function( newDefer ) {
						jQuery.each( tuples, function( i, tuple ) {
							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
							// deferred[ done | fail | progress ] for forwarding actions to newDefer
							deferred[ tuple[1] ](function() {
								var returned = fn && fn.apply( this, arguments );
								if ( returned && jQuery.isFunction( returned.promise ) ) {
									returned.promise()
										.done( newDefer.resolve )
										.fail( newDefer.reject )
										.progress( newDefer.notify );
								} else {
									newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
								}
							});
						});
						fns = null;
					}).promise();
				},
				// Get a promise for this deferred
				// If obj is provided, the promise aspect is added to the object
				promise: function( obj ) {
					return obj != null ? jQuery.extend( obj, promise ) : promise;
				}
			},
			deferred = {};

		// Keep pipe for back-compat
		promise.pipe = promise.then;

		// Add list-specific methods
		jQuery.each( tuples, function( i, tuple ) {
			var list = tuple[ 2 ],
				stateString = tuple[ 3 ];

			// promise[ done | fail | progress ] = list.add
			promise[ tuple[1] ] = list.add;

			// Handle state
			if ( stateString ) {
				list.add(function() {
					// state = [ resolved
Download .txt
gitextract_ljy0z57z/

├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── app/
│   ├── .htaccess
│   ├── AppCache.php
│   ├── AppKernel.php
│   ├── Resources/
│   │   ├── TwigBundle/
│   │   │   └── views/
│   │   │       └── Exception/
│   │   │           ├── error.html.twig
│   │   │           ├── error403.html.twig
│   │   │           ├── error404.html.twig
│   │   │           └── error500.html.twig
│   │   ├── assets/
│   │   │   ├── css/
│   │   │   │   ├── font-lato.css
│   │   │   │   └── highlight-solarized-light.css
│   │   │   ├── js/
│   │   │   │   ├── bootstrap-3.3.4.js
│   │   │   │   ├── highlight.pack.js
│   │   │   │   ├── jquery-2.1.4.js
│   │   │   │   └── main.js
│   │   │   └── scss/
│   │   │       ├── bootstrap/
│   │   │       │   ├── _alerts.scss
│   │   │       │   ├── _badges.scss
│   │   │       │   ├── _breadcrumbs.scss
│   │   │       │   ├── _button-groups.scss
│   │   │       │   ├── _buttons.scss
│   │   │       │   ├── _carousel.scss
│   │   │       │   ├── _close.scss
│   │   │       │   ├── _code.scss
│   │   │       │   ├── _component-animations.scss
│   │   │       │   ├── _dropdowns.scss
│   │   │       │   ├── _forms.scss
│   │   │       │   ├── _glyphicons.scss
│   │   │       │   ├── _grid.scss
│   │   │       │   ├── _input-groups.scss
│   │   │       │   ├── _jumbotron.scss
│   │   │       │   ├── _labels.scss
│   │   │       │   ├── _list-group.scss
│   │   │       │   ├── _media.scss
│   │   │       │   ├── _mixins.scss
│   │   │       │   ├── _modals.scss
│   │   │       │   ├── _navbar.scss
│   │   │       │   ├── _navs.scss
│   │   │       │   ├── _normalize.scss
│   │   │       │   ├── _pager.scss
│   │   │       │   ├── _pagination.scss
│   │   │       │   ├── _panels.scss
│   │   │       │   ├── _popovers.scss
│   │   │       │   ├── _print.scss
│   │   │       │   ├── _progress-bars.scss
│   │   │       │   ├── _responsive-embed.scss
│   │   │       │   ├── _responsive-utilities.scss
│   │   │       │   ├── _scaffolding.scss
│   │   │       │   ├── _tables.scss
│   │   │       │   ├── _theme.scss
│   │   │       │   ├── _thumbnails.scss
│   │   │       │   ├── _tooltip.scss
│   │   │       │   ├── _type.scss
│   │   │       │   ├── _utilities.scss
│   │   │       │   ├── _variables.scss
│   │   │       │   ├── _wells.scss
│   │   │       │   ├── flatly-theme/
│   │   │       │   │   ├── _bootswatch.scss
│   │   │       │   │   └── _variables.scss
│   │   │       │   └── mixins/
│   │   │       │       ├── _alerts.scss
│   │   │       │       ├── _background-variant.scss
│   │   │       │       ├── _border-radius.scss
│   │   │       │       ├── _buttons.scss
│   │   │       │       ├── _center-block.scss
│   │   │       │       ├── _clearfix.scss
│   │   │       │       ├── _forms.scss
│   │   │       │       ├── _gradients.scss
│   │   │       │       ├── _grid-framework.scss
│   │   │       │       ├── _grid.scss
│   │   │       │       ├── _hide-text.scss
│   │   │       │       ├── _image.scss
│   │   │       │       ├── _labels.scss
│   │   │       │       ├── _list-group.scss
│   │   │       │       ├── _nav-divider.scss
│   │   │       │       ├── _nav-vertical-align.scss
│   │   │       │       ├── _opacity.scss
│   │   │       │       ├── _pagination.scss
│   │   │       │       ├── _panels.scss
│   │   │       │       ├── _progress-bar.scss
│   │   │       │       ├── _reset-filter.scss
│   │   │       │       ├── _resize.scss
│   │   │       │       ├── _responsive-visibility.scss
│   │   │       │       ├── _size.scss
│   │   │       │       ├── _tab-focus.scss
│   │   │       │       ├── _table-row.scss
│   │   │       │       ├── _text-emphasis.scss
│   │   │       │       ├── _text-overflow.scss
│   │   │       │       └── _vendor-prefixes.scss
│   │   │       ├── bootstrap.scss
│   │   │       ├── font-awesome/
│   │   │       │   ├── _animated.scss
│   │   │       │   ├── _bordered-pulled.scss
│   │   │       │   ├── _core.scss
│   │   │       │   ├── _fixed-width.scss
│   │   │       │   ├── _icons.scss
│   │   │       │   ├── _larger.scss
│   │   │       │   ├── _list.scss
│   │   │       │   ├── _mixins.scss
│   │   │       │   ├── _path.scss
│   │   │       │   ├── _rotated-flipped.scss
│   │   │       │   ├── _stacked.scss
│   │   │       │   └── _variables.scss
│   │   │       ├── font-awesome.scss
│   │   │       └── main.scss
│   │   ├── translations/
│   │   │   ├── messages.ca.xliff
│   │   │   ├── messages.cs.xliff
│   │   │   ├── messages.de.xliff
│   │   │   ├── messages.en.xliff
│   │   │   ├── messages.es.xliff
│   │   │   ├── messages.fr.xliff
│   │   │   ├── messages.id.xliff
│   │   │   ├── messages.it.xliff
│   │   │   ├── messages.ja.xliff
│   │   │   ├── messages.nl.xliff
│   │   │   ├── messages.pl.xliff
│   │   │   ├── messages.pt_BR.xliff
│   │   │   ├── messages.ro.xliff
│   │   │   ├── messages.ru.xliff
│   │   │   ├── messages.uk.xliff
│   │   │   ├── validators.ca.xliff
│   │   │   ├── validators.cs.xliff
│   │   │   ├── validators.de.xliff
│   │   │   ├── validators.en.xliff
│   │   │   ├── validators.es.xliff
│   │   │   ├── validators.fr.xliff
│   │   │   ├── validators.id.xliff
│   │   │   ├── validators.it.xliff
│   │   │   ├── validators.ja.xliff
│   │   │   ├── validators.nl.xliff
│   │   │   ├── validators.pl.xliff
│   │   │   ├── validators.pt_BR.xliff
│   │   │   ├── validators.ro.xliff
│   │   │   ├── validators.ru.xliff
│   │   │   └── validators.uk.xliff
│   │   └── views/
│   │       ├── admin/
│   │       │   ├── blog/
│   │       │   │   ├── _form.html.twig
│   │       │   │   ├── edit.html.twig
│   │       │   │   ├── index.html.twig
│   │       │   │   ├── new.html.twig
│   │       │   │   └── show.html.twig
│   │       │   └── layout.html.twig
│   │       ├── base.html.twig
│   │       ├── blog/
│   │       │   ├── _comment_form.html.twig
│   │       │   ├── _delete_post_confirmation.html.twig
│   │       │   ├── comment_form_error.html.twig
│   │       │   ├── index.html.twig
│   │       │   └── post_show.html.twig
│   │       ├── default/
│   │       │   ├── _flash_messages.html.twig
│   │       │   └── homepage.html.twig
│   │       ├── form/
│   │       │   └── fields.html.twig
│   │       └── security/
│   │           └── login.html.twig
│   ├── SymfonyRequirements.php
│   ├── autoload.php
│   ├── check.php
│   ├── config/
│   │   ├── config.yml
│   │   ├── config_dev.yml
│   │   ├── config_prod.yml
│   │   ├── config_test.yml
│   │   ├── parameters.yml.dist
│   │   ├── routing.yml
│   │   ├── routing_dev.yml
│   │   ├── security.yml
│   │   └── services.yml
│   ├── console
│   ├── logs/
│   │   └── .gitkeep
│   └── phpunit.xml.dist
├── composer.json
├── src/
│   ├── .htaccess
│   ├── AppBundle/
│   │   ├── AppBundle.php
│   │   ├── Command/
│   │   │   ├── AddUserCommand.php
│   │   │   ├── DeleteUserCommand.php
│   │   │   └── ListUsersCommand.php
│   │   ├── Controller/
│   │   │   ├── Admin/
│   │   │   │   └── BlogController.php
│   │   │   ├── BlogController.php
│   │   │   └── SecurityController.php
│   │   ├── DataFixtures/
│   │   │   └── ORM/
│   │   │       └── LoadFixtures.php
│   │   ├── Entity/
│   │   │   ├── Comment.php
│   │   │   ├── Post.php
│   │   │   └── User.php
│   │   ├── EventListener/
│   │   │   └── RedirectToPreferredLocaleListener.php
│   │   ├── Form/
│   │   │   ├── CommentType.php
│   │   │   ├── PostType.php
│   │   │   └── Type/
│   │   │       └── DateTimePickerType.php
│   │   ├── Repository/
│   │   │   ├── PostRepository.php
│   │   │   └── UserRepository.php
│   │   ├── Tests/
│   │   │   ├── Controller/
│   │   │   │   ├── Admin/
│   │   │   │   │   └── BlogControllerTest.php
│   │   │   │   ├── BlogControllerTest.php
│   │   │   │   └── DefaultControllerTest.php
│   │   │   └── Utils/
│   │   │       └── SluggerTest.php
│   │   ├── Twig/
│   │   │   └── AppExtension.php
│   │   └── Utils/
│   │       ├── Markdown.php
│   │       ├── MomentFormatConverter.php
│   │       └── Slugger.php
│   ├── CodeExplorerBundle/
│   │   ├── CodeExplorerBundle.php
│   │   ├── DependencyInjection/
│   │   │   └── CodeExplorerExtension.php
│   │   ├── EventListener/
│   │   │   └── ControllerListener.php
│   │   ├── Resources/
│   │   │   ├── config/
│   │   │   │   └── services.yml
│   │   │   └── views/
│   │   │       └── source_code.html.twig
│   │   └── Twig/
│   │       └── SourceCodeExtension.php
│   ├── ElasticSearchBundle/
│   │   ├── Controller/
│   │   │   └── ElasticSearchController.php
│   │   ├── ElasticSearchBundle.php
│   │   ├── Resources/
│   │   │   ├── config/
│   │   │   │   ├── config.yml
│   │   │   │   ├── routing.yml
│   │   │   │   └── services.yml
│   │   │   └── views/
│   │   │       └── elastica_search_results.html.twig
│   │   └── Tests/
│   │       └── Controller/
│   │           └── ElasticSearchControllerTest.php
│   ├── OAuthBundle/
│   │   ├── Controller/
│   │   │   └── OAuthController.php
│   │   ├── DependencyInjection/
│   │   │   ├── Configuration.php
│   │   │   └── OAuthExtension.php
│   │   ├── OAuthBundle.php
│   │   ├── Provider/
│   │   │   └── UserProvider.php
│   │   ├── Resources/
│   │   │   └── config/
│   │   │       ├── config.yml
│   │   │       ├── routing.yml
│   │   │       └── services.yml
│   │   ├── Services/
│   │   │   └── AuthenticationSuccessHandler.php
│   │   └── Tests/
│   │       ├── Controller/
│   │       │   └── OAuthControllerTest.php
│   │       └── OAuthTest.php
│   ├── RabbitMQBundle/
│   │   ├── Controller/
│   │   │   └── RabbitMQController.php
│   │   ├── DependencyInjection/
│   │   │   ├── Configuration.php
│   │   │   └── RabbitMQExtension.php
│   │   ├── RabbitMQBundle.php
│   │   ├── Resources/
│   │   │   ├── config/
│   │   │   │   ├── config.yml
│   │   │   │   ├── config_dev.yml
│   │   │   │   ├── config_test.yml
│   │   │   │   ├── routing.yml
│   │   │   │   └── services.yml
│   │   │   └── views/
│   │   │       └── pdf_post_view.html.twig
│   │   ├── Services/
│   │   │   ├── PDFGenerator.php
│   │   │   └── RabbitMQ/
│   │   │       └── PDFGeneratorConsumer.php
│   │   └── Tests/
│   │       └── Controller/
│   │           └── RabbitMQControllerTest.php
│   ├── RedisBundle/
│   │   ├── Controller/
│   │   │   └── RedisController.php
│   │   ├── RedisBundle.php
│   │   ├── Resources/
│   │   │   ├── config/
│   │   │   │   ├── config.yml
│   │   │   │   ├── routing.yml
│   │   │   │   └── services.yml
│   │   │   └── views/
│   │   │       └── blog/
│   │   │           └── top_posts.html.twig
│   │   └── Tests/
│   │       └── Controller/
│   │           └── RedisControllerTest.php
│   └── RestBundle/
│       ├── Controller/
│       │   └── RestController.php
│       ├── DependencyInjection/
│       │   ├── Configuration.php
│       │   └── RestExtension.php
│       ├── Form/
│       │   ├── CommentRestType.php
│       │   └── PostRestType.php
│       ├── Resources/
│       │   ├── config/
│       │   │   ├── config.yml
│       │   │   ├── routing.yml
│       │   │   ├── serializer/
│       │   │   │   └── AppBundle/
│       │   │   │       ├── Entity.Comment.yml
│       │   │   │       └── Entity.Post.yml
│       │   │   └── services.yml
│       │   └── views/
│       │       ├── Comment/
│       │       │   ├── editComment.html.twig
│       │       │   ├── getComment.html.twig
│       │       │   ├── getComments.html.twig
│       │       │   └── newComment.html.twig
│       │       ├── Post/
│       │       │   ├── editPost.html.twig
│       │       │   ├── getPost.html.twig
│       │       │   ├── getPosts.html.twig
│       │       │   └── newPost.html.twig
│       │       ├── api_base_layout.html.twig
│       │       └── api_index.html.twig
│       ├── RestBundle.php
│       └── Tests/
│           └── Controller/
│               └── RestControllerTest.php
├── vagrant/
│   ├── Vagrantfile
│   └── ansible/
│       ├── hosts_inventory
│       ├── roles/
│       │   ├── Stouts.rabbitmq/
│       │   │   ├── .bumpversion.cfg
│       │   │   ├── .travis.yml
│       │   │   ├── CONTRIBUTORS
│       │   │   ├── LICENSE
│       │   │   ├── Makefile
│       │   │   ├── README.md
│       │   │   ├── defaults/
│       │   │   │   └── main.yml
│       │   │   ├── handlers/
│       │   │   │   └── main.yml
│       │   │   ├── meta/
│       │   │   │   ├── .galaxy_install_info
│       │   │   │   └── main.yml
│       │   │   ├── tasks/
│       │   │   │   ├── install.deb.yml
│       │   │   │   ├── main.yml
│       │   │   │   └── rabbitmq.yml
│       │   │   └── test.yml
│       │   ├── geerlingguy.composer/
│       │   │   ├── .travis.yml
│       │   │   ├── README.md
│       │   │   ├── defaults/
│       │   │   │   └── main.yml
│       │   │   ├── meta/
│       │   │   │   ├── .galaxy_install_info
│       │   │   │   └── main.yml
│       │   │   ├── tasks/
│       │   │   │   ├── global-require.yml
│       │   │   │   └── main.yml
│       │   │   ├── templates/
│       │   │   │   ├── auth.json.j2
│       │   │   │   └── composer.sh.j2
│       │   │   └── tests/
│       │   │       ├── inventory
│       │   │       ├── test-global-require.yml
│       │   │       └── test.yml
│       │   ├── geerlingguy.nginx/
│       │   │   ├── .travis.yml
│       │   │   ├── README.md
│       │   │   ├── defaults/
│       │   │   │   └── main.yml
│       │   │   ├── handlers/
│       │   │   │   └── main.yml
│       │   │   ├── meta/
│       │   │   │   ├── .galaxy_install_info
│       │   │   │   └── main.yml
│       │   │   ├── tasks/
│       │   │   │   ├── main.yml
│       │   │   │   ├── setup-Debian.yml
│       │   │   │   ├── setup-RedHat.yml
│       │   │   │   └── vhosts.yml
│       │   │   ├── templates/
│       │   │   │   ├── nginx.conf.j2
│       │   │   │   ├── nginx.repo.j2
│       │   │   │   └── vhosts.j2
│       │   │   ├── tests/
│       │   │   │   ├── inventory
│       │   │   │   └── test.yml
│       │   │   └── vars/
│       │   │       ├── Debian.yml
│       │   │       └── RedHat.yml
│       │   ├── geerlingguy.php/
│       │   │   ├── .travis.yml
│       │   │   ├── README.md
│       │   │   ├── defaults/
│       │   │   │   └── main.yml
│       │   │   ├── handlers/
│       │   │   │   └── main.yml
│       │   │   ├── meta/
│       │   │   │   ├── .galaxy_install_info
│       │   │   │   └── main.yml
│       │   │   ├── tasks/
│       │   │   │   ├── configure-fpm.yml
│       │   │   │   ├── configure.yml
│       │   │   │   ├── install-from-source.yml
│       │   │   │   ├── main.yml
│       │   │   │   ├── setup-Debian.yml
│       │   │   │   └── setup-RedHat.yml
│       │   │   ├── templates/
│       │   │   │   ├── apc.ini.j2
│       │   │   │   ├── fpm-init.j2
│       │   │   │   ├── opcache.ini.j2
│       │   │   │   ├── php-fpm.conf.j2
│       │   │   │   └── php.ini.j2
│       │   │   ├── tests/
│       │   │   │   ├── inventory
│       │   │   │   ├── test-install-from-source.yml
│       │   │   │   └── test-install-package.yml
│       │   │   └── vars/
│       │   │       ├── Debian.yml
│       │   │       └── RedHat.yml
│       │   ├── geerlingguy.redis/
│       │   │   ├── .travis.yml
│       │   │   ├── README.md
│       │   │   ├── defaults/
│       │   │   │   └── main.yml
│       │   │   ├── handlers/
│       │   │   │   └── main.yml
│       │   │   ├── meta/
│       │   │   │   ├── .galaxy_install_info
│       │   │   │   └── main.yml
│       │   │   ├── tasks/
│       │   │   │   ├── main.yml
│       │   │   │   ├── setup-Debian.yml
│       │   │   │   └── setup-RedHat.yml
│       │   │   ├── templates/
│       │   │   │   └── redis.conf.j2
│       │   │   ├── tests/
│       │   │   │   ├── inventory
│       │   │   │   └── test.yml
│       │   │   └── vars/
│       │   │       ├── Debian.yml
│       │   │       └── RedHat.yml
│       │   └── gpstathis.elasticsearch/
│       │       ├── .gitignore
│       │       ├── .travis.yml
│       │       ├── README.md
│       │       ├── Vagrantfile
│       │       ├── defaults/
│       │       │   └── main.yml
│       │       ├── handlers/
│       │       │   └── main.yml
│       │       ├── meta/
│       │       │   ├── .galaxy_install_info
│       │       │   └── main.yml
│       │       ├── tasks/
│       │       │   ├── aws.yml
│       │       │   ├── custom-jars.yml
│       │       │   ├── elastic-install.yml
│       │       │   ├── java.yml
│       │       │   ├── main.yml
│       │       │   ├── marvel.yml
│       │       │   ├── plugins.yml
│       │       │   ├── post-run.yml
│       │       │   ├── spm.yml
│       │       │   └── timezone.yml
│       │       ├── templates/
│       │       │   ├── elasticsearch.default.j2
│       │       │   ├── elasticsearch.in.sh.j2
│       │       │   └── elasticsearch.yml.j2
│       │       ├── tests/
│       │       │   ├── ansible.cfg
│       │       │   ├── elastic_test.sh
│       │       │   ├── local.ini
│       │       │   ├── test1.yml
│       │       │   └── test1_var.yml
│       │       ├── vagrant-inventory.ini
│       │       ├── vagrant-main.yml
│       │       └── vars/
│       │           ├── sample.yml
│       │           └── vagrant.yml
│       ├── setup.yml
│       └── templates/
│           └── rabbitmq-consumers.j2
└── web/
    ├── .htaccess
    ├── app.php
    ├── app_dev.php
    ├── config.php
    ├── css/
    │   ├── api.css
    │   └── app.css
    ├── fonts/
    │   └── font-awesome/
    │       └── FontAwesome.otf
    ├── js/
    │   └── app.js
    └── robots.txt
Download .txt
SYMBOL INDEX (755 symbols across 65 files)

FILE: app/AppCache.php
  class AppCache (line 5) | class AppCache extends HttpCache

FILE: app/AppKernel.php
  class AppKernel (line 6) | class AppKernel extends Kernel
    method registerBundles (line 8) | public function registerBundles()
    method registerContainerConfiguration (line 60) | public function registerContainerConfiguration(LoaderInterface $loader)

FILE: app/Resources/assets/js/bootstrap-3.3.4.js
  function transitionEnd (line 34) | function transitionEnd() {
  function removeElement (line 126) | function removeElement() {
  function Plugin (line 142) | function Plugin(option) {
  function Plugin (line 247) | function Plugin(option) {
  function Plugin (line 466) | function Plugin(option) {
  function getTargetFromTrigger (line 685) | function getTargetFromTrigger($trigger) {
  function Plugin (line 697) | function Plugin(option) {
  function clearMenus (line 829) | function clearMenus(e) {
  function getParent (line 848) | function getParent($this) {
  function Plugin (line 865) | function Plugin(option) {
  function Plugin (line 1194) | function Plugin(option, _relatedTarget) {
  function complete (line 1540) | function complete() {
  function Plugin (line 1692) | function Plugin(option) {
  function Plugin (line 1801) | function Plugin(option) {
  function ScrollSpy (line 1844) | function ScrollSpy(element, options) {
  function Plugin (line 1964) | function Plugin(option) {
  function next (line 2071) | function next() {
  function Plugin (line 2117) | function Plugin(option) {
  function Plugin (line 2274) | function Plugin(option) {

FILE: app/Resources/assets/js/highlight.pack.js
  function n (line 1) | function n(e){return e.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").repl...
  function t (line 1) | function t(e){return e.nodeName.toLowerCase()}
  function r (line 1) | function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}
  function a (line 1) | function a(e){var n=(e.className+" "+(e.parentNode?e.parentNode.classNam...
  function o (line 1) | function o(e,n){var t={};for(var r in e)t[r]=e[r];if(n)for(var r in n)t[...
  function i (line 1) | function i(e){var n=[];return function r(e,a){for(var o=e.firstChild;o;o...
  function c (line 1) | function c(e,r,a){function o(){return e.length&&r.length?e[0].offset!=r[...
  function u (line 1) | function u(e){function n(e){return e&&e.source||e}function t(t,r){return...
  function s (line 1) | function s(e,t,a,o){function i(e,n){for(var t=0;t<n.c.length;t++)if(r(n....
  function l (line 1) | function l(e,t){t=t||E.languages||Object.keys(R);var r={r:0,value:n(e)},...
  function f (line 1) | function f(e){return E.tabReplace&&(e=e.replace(/^((<[^>]+>|\t)+)/gm,fun...
  function g (line 1) | function g(e,n,t){var r=n?x[n]:t,a=[e.trim()];return e.match(/(\s|^)hljs...
  function p (line 1) | function p(e){var n=a(e);if(!/no(-?)highlight/.test(n)){var t;E.useBR?(t...
  function d (line 1) | function d(e){E=o(E,e)}
  function h (line 1) | function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll("...
  function v (line 1) | function v(){addEventListener("DOMContentLoaded",h,!1),addEventListener(...
  function b (line 1) | function b(n,t){var r=R[n]=t(e);r.aliases&&r.aliases.forEach(function(e)...
  function m (line 1) | function m(){return Object.keys(R)}
  function N (line 1) | function N(e){return R[e]||R[x[e]]}

FILE: app/Resources/assets/js/jquery-2.1.4.js
  function isArraylike (line 533) | function isArraylike( obj ) {
  function Sizzle (line 750) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 864) | function createCache() {
  function markFunction (line 882) | function markFunction( fn ) {
  function assert (line 891) | function assert( fn ) {
  function addHandle (line 913) | function addHandle( attrs, handler ) {
  function siblingCheck (line 928) | function siblingCheck( a, b ) {
  function createInputPseudo (line 955) | function createInputPseudo( type ) {
  function createButtonPseudo (line 966) | function createButtonPseudo( type ) {
  function createPositionalPseudo (line 977) | function createPositionalPseudo( fn ) {
  function testContext (line 1000) | function testContext( context ) {
  function setFilters (line 2009) | function setFilters() {}
  function toSelector (line 2080) | function toSelector( tokens ) {
  function addCombinator (line 2090) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2143) | function elementMatcher( matchers ) {
  function multipleContexts (line 2157) | function multipleContexts( selector, contexts, results ) {
  function condense (line 2166) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2187) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2280) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2338) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function winnow (line 2634) | function winnow( elements, qualifier, not ) {
  function sibling (line 2958) | function sibling( cur, dir ) {
  function createOptions (line 3036) | function createOptions( options ) {
  function completed (line 3430) | function completed() {
  function Data (line 3535) | function Data() {
  function dataAttr (line 3726) | function dataAttr( elem, key, data ) {
  function returnTrue (line 4066) | function returnTrue() {
  function returnFalse (line 4070) | function returnFalse() {
  function safeActiveElement (line 4074) | function safeActiveElement() {
  function manipulationTarget (line 4946) | function manipulationTarget( elem, content ) {
  function disableScript (line 4956) | function disableScript( elem ) {
  function restoreScript (line 4960) | function restoreScript( elem ) {
  function setGlobalEval (line 4973) | function setGlobalEval( elems, refElements ) {
  function cloneCopyEvent (line 4984) | function cloneCopyEvent( src, dest ) {
  function getAll (line 5018) | function getAll( context, tag ) {
  function fixInput (line 5029) | function fixInput( src, dest ) {
  function actualDisplay (line 5484) | function actualDisplay( name, doc ) {
  function defaultDisplay (line 5506) | function defaultDisplay( nodeName ) {
  function curCSS (line 5553) | function curCSS( elem, name, computed ) {
  function addGetHookIf (line 5601) | function addGetHookIf( conditionFn, hookFn ) {
  function computePixelPositionAndBoxSizingReliable (line 5641) | function computePixelPositionAndBoxSizingReliable() {
  function vendorPropName (line 5746) | function vendorPropName( style, name ) {
  function setPositiveNumber (line 5768) | function setPositiveNumber( elem, value, subtract ) {
  function augmentWidthOrHeight (line 5776) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
  function getWidthOrHeight (line 5815) | function getWidthOrHeight( elem, name, extra ) {
  function showHide (line 5859) | function showHide( elements, show ) {
  function Tween (line 6157) | function Tween( elem, options, prop, end, easing ) {
  function createFxNow (line 6326) | function createFxNow() {
  function genFx (line 6334) | function genFx( type, includeWidth ) {
  function createTween (line 6354) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 6368) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 6501) | function propFilter( props, specialEasing ) {
  function Animation (line 6538) | function Animation( elem, properties, options ) {
  function addToPrefiltersOrTransports (line 7586) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 7618) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 7645) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 7665) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 7721) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 8179) | function done( status, nativeStatusText, responses, headers ) {
  function buildParams (line 8423) | function buildParams( prefix, obj, traditional, add ) {
  function getWindow (line 8917) | function getWindow( elem ) {

FILE: app/SymfonyRequirements.php
  class Requirement (line 33) | class Requirement
    method __construct (line 50) | public function __construct($fulfilled, $testMessage, $helpHtml, $help...
    method isFulfilled (line 64) | public function isFulfilled()
    method getTestMessage (line 74) | public function getTestMessage()
    method getHelpText (line 84) | public function getHelpText()
    method getHelpHtml (line 94) | public function getHelpHtml()
    method isOptional (line 104) | public function isOptional()
  class PhpIniRequirement (line 115) | class PhpIniRequirement extends Requirement
    method __construct (line 131) | public function __construct($cfgName, $evaluation, $approveCfgAbsence ...
  class RequirementCollection (line 169) | class RequirementCollection implements IteratorAggregate
    method getIterator (line 178) | public function getIterator()
    method add (line 188) | public function add(Requirement $requirement)
    method addRequirement (line 201) | public function addRequirement($fulfilled, $testMessage, $helpHtml, $h...
    method addRecommendation (line 214) | public function addRecommendation($fulfilled, $testMessage, $helpHtml,...
    method addPhpIniRequirement (line 232) | public function addPhpIniRequirement($cfgName, $evaluation, $approveCf...
    method addPhpIniRecommendation (line 250) | public function addPhpIniRecommendation($cfgName, $evaluation, $approv...
    method addCollection (line 260) | public function addCollection(RequirementCollection $collection)
    method all (line 270) | public function all()
    method getRequirements (line 280) | public function getRequirements()
    method getFailedRequirements (line 297) | public function getFailedRequirements()
    method getRecommendations (line 314) | public function getRecommendations()
    method getFailedRecommendations (line 331) | public function getFailedRecommendations()
    method hasPhpIniConfigIssue (line 348) | public function hasPhpIniConfigIssue()
    method getPhpIniConfigPath (line 364) | public function getPhpIniConfigPath()
  class SymfonyRequirements (line 377) | class SymfonyRequirements extends RequirementCollection
    method __construct (line 384) | public function __construct()
    method getRealpathCacheSize (line 748) | protected function getRealpathCacheSize()

FILE: app/check.php
  function get_error_message (line 77) | function get_error_message(Requirement $requirement, $lineSize)
  function echo_title (line 89) | function echo_title($title, $style = null)
  function echo_style (line 99) | function echo_style($style, $message)
  function echo_block (line 116) | function echo_block($style, $title, $message)
  function has_color_support (line 129) | function has_color_support()

FILE: src/AppBundle/AppBundle.php
  class AppBundle (line 36) | class AppBundle extends Bundle

FILE: src/AppBundle/Command/AddUserCommand.php
  class AddUserCommand (line 38) | class AddUserCommand extends ContainerAwareCommand
    method configure (line 50) | protected function configure()
    method initialize (line 74) | protected function initialize(InputInterface $input, OutputInterface $...
    method interact (line 89) | protected function interact(InputInterface $input, OutputInterface $ou...
    method execute (line 170) | protected function execute(InputInterface $input, OutputInterface $out...
    method passwordValidator (line 217) | public function passwordValidator($plainPassword)
    method emailValidator (line 236) | public function emailValidator($email)
    method getCommandHelp (line 254) | private function getCommandHelp()

FILE: src/AppBundle/Command/DeleteUserCommand.php
  class DeleteUserCommand (line 35) | class DeleteUserCommand extends ContainerAwareCommand
    method configure (line 47) | protected function configure()
    method initialize (line 66) | protected function initialize(InputInterface $input, OutputInterface $...
    method interact (line 71) | protected function interact(InputInterface $input, OutputInterface $ou...
    method execute (line 106) | protected function execute(InputInterface $input, OutputInterface $out...
    method usernameValidator (line 137) | public function usernameValidator($username)

FILE: src/AppBundle/Command/ListUsersCommand.php
  class ListUsersCommand (line 33) | class ListUsersCommand extends ContainerAwareCommand
    method configure (line 43) | protected function configure()
    method initialize (line 77) | protected function initialize(InputInterface $input, OutputInterface $...
    method execute (line 86) | protected function execute(InputInterface $input, OutputInterface $out...
    method sendReport (line 129) | private function sendReport($contents, $recipient)

FILE: src/AppBundle/Controller/Admin/BlogController.php
  class BlogController (line 36) | class BlogController extends Controller
    method indexAction (line 53) | public function indexAction()
    method newAction (line 71) | public function newAction(Request $request)
    method showAction (line 118) | public function showAction(Post $post)
    method editAction (line 141) | public function editAction(Post $post, Request $request)
    method deleteAction (line 182) | public function deleteAction(Request $request, Post $post)
    method createDeleteForm (line 212) | private function createDeleteForm(Post $post)

FILE: src/AppBundle/Controller/BlogController.php
  class BlogController (line 33) | class BlogController extends Controller
    method indexAction (line 39) | public function indexAction($page)
    method postShowAction (line 58) | public function postShowAction(Post $post)
    method commentNewAction (line 74) | public function commentNewAction(Request $request, Post $post)
    method commentFormAction (line 110) | public function commentFormAction(Post $post)

FILE: src/AppBundle/Controller/SecurityController.php
  class SecurityController (line 24) | class SecurityController extends Controller
    method loginAction (line 29) | public function loginAction()
    method loginCheckAction (line 49) | public function loginCheckAction()
    method logoutAction (line 62) | public function logoutAction()

FILE: src/AppBundle/DataFixtures/ORM/LoadFixtures.php
  class LoadFixtures (line 33) | class LoadFixtures implements FixtureInterface, ContainerAwareInterface
    method load (line 41) | public function load(ObjectManager $manager)
    method loadUsers (line 47) | private function loadUsers(ObjectManager $manager)
    method loadPosts (line 69) | private function loadPosts(ObjectManager $manager)
    method setContainer (line 102) | public function setContainer(ContainerInterface $container = null)
    method getPostContent (line 107) | private function getPostContent()
    method getPhrases (line 147) | private function getPhrases()
    method getRandomPostTitle (line 168) | private function getRandomPostTitle()
    method getRandomPostSummary (line 175) | private function getRandomPostSummary()
    method getRandomCommentContent (line 185) | private function getRandomCommentContent()

FILE: src/AppBundle/Entity/Comment.php
  class Comment (line 29) | class Comment
    method __construct (line 68) | public function __construct()
    method isLegitComment (line 76) | public function isLegitComment()
    method getId (line 83) | public function getId()
    method setId (line 88) | public function setId($id)
    method getContent (line 93) | public function getContent()
    method setContent (line 97) | public function setContent($content)
    method getAuthorEmail (line 102) | public function getAuthorEmail()
    method setAuthorEmail (line 106) | public function setAuthorEmail($authorEmail)
    method getPublishedAt (line 111) | public function getPublishedAt()
    method setPublishedAt (line 115) | public function setPublishedAt(\DateTime $publishedAt)
    method getPost (line 120) | public function getPost()
    method setPost (line 124) | public function setPost(Post $post)

FILE: src/AppBundle/Entity/Post.php
  class Post (line 21) | class Post
    method __construct (line 105) | public function __construct()
    method getId (line 113) | public function getId()
    method setId (line 118) | public function setId($id)
    method getTitle (line 123) | public function getTitle()
    method setTitle (line 128) | public function setTitle($title)
    method getSlug (line 133) | public function getSlug()
    method setSlug (line 138) | public function setSlug($slug)
    method getContent (line 143) | public function getContent()
    method setContent (line 148) | public function setContent($content)
    method getAuthorEmail (line 153) | public function getAuthorEmail()
    method setAuthorEmail (line 158) | public function setAuthorEmail($authorEmail)
    method isAuthor (line 170) | public function isAuthor(User $user)
    method getPublishedAt (line 175) | public function getPublishedAt()
    method setPublishedAt (line 180) | public function setPublishedAt($publishedAt)
    method getComments (line 185) | public function getComments()
    method addComment (line 190) | public function addComment(Comment $comment)
    method removeComment (line 196) | public function removeComment(Comment $comment)
    method getSummary (line 202) | public function getSummary()
    method setSummary (line 207) | public function setSummary($summary)
    method getUpdatedAt (line 212) | public function getUpdatedAt()
    method setUpdatedAt (line 217) | public function setUpdatedAt($updatedAt)
    method getGeneratedAt (line 223) | public function getGeneratedAt()
    method setGeneratedAt (line 228) | public function setGeneratedAt($generatedAt)
    method getPdfName (line 234) | public function getPdfName()
    method setPdfName (line 239) | public function setPdfName($pdfName)
    method getIsPdfGenerated (line 244) | public function getIsPdfGenerated()
    method setIsPdfGenerated (line 249) | public function setIsPdfGenerated($isPdfGenerated)

FILE: src/AppBundle/Entity/User.php
  class User (line 20) | class User implements UserInterface
    method getId (line 59) | public function getId()
    method getUsername (line 67) | public function getUsername()
    method setUsername (line 71) | public function setUsername($username)
    method getEmail (line 76) | public function getEmail()
    method setEmail (line 80) | public function setEmail($email)
    method getPassword (line 88) | public function getPassword()
    method setPassword (line 92) | public function setPassword($password)
    method getRoles (line 100) | public function getRoles()
    method setRoles (line 112) | public function setRoles(array $roles)
    method getSalt (line 120) | public function getSalt()
    method eraseCredentials (line 132) | public function eraseCredentials()
    method getGithubId (line 141) | public function getGithubId()
    method setGithubId (line 151) | public function setGithubId($github_id)
    method getGithubAccessToken (line 159) | public function getGithubAccessToken()
    method setGithubAccessToken (line 169) | public function setGithubAccessToken($github_access_token)

FILE: src/AppBundle/EventListener/RedirectToPreferredLocaleListener.php
  class RedirectToPreferredLocaleListener (line 26) | class RedirectToPreferredLocaleListener
    method __construct (line 52) | public function __construct(UrlGeneratorInterface $urlGenerator, $loca...
    method onKernelRequest (line 76) | public function onKernelRequest(GetResponseEvent $event)

FILE: src/AppBundle/Form/CommentType.php
  class CommentType (line 27) | class CommentType extends AbstractType
    method buildForm (line 32) | public function buildForm(FormBuilderInterface $builder, array $options)
    method configureOptions (line 49) | public function configureOptions(OptionsResolver $resolver)

FILE: src/AppBundle/Form/PostType.php
  class PostType (line 24) | class PostType extends AbstractType
    method buildForm (line 29) | public function buildForm(FormBuilderInterface $builder, array $options)
    method configureOptions (line 61) | public function configureOptions(OptionsResolver $resolver)

FILE: src/AppBundle/Form/Type/DateTimePickerType.php
  class DateTimePickerType (line 27) | class DateTimePickerType extends AbstractType
    method __construct (line 34) | public function __construct()
    method buildView (line 42) | public function buildView(FormView $view, FormInterface $form, array $...
    method configureOptions (line 51) | public function configureOptions(OptionsResolver $resolver)
    method getParent (line 61) | public function getParent()

FILE: src/AppBundle/Repository/PostRepository.php
  class PostRepository (line 24) | class PostRepository extends EntityRepository
    method queryLatest (line 26) | public function queryLatest()
    method findLatest (line 39) | public function findLatest()

FILE: src/AppBundle/Repository/UserRepository.php
  class UserRepository (line 25) | class UserRepository extends EntityRepository

FILE: src/AppBundle/Tests/Controller/Admin/BlogControllerTest.php
  class BlogControllerTest (line 33) | class BlogControllerTest extends WebTestCase
    method testRegularUsersCannotAccessToTheBackend (line 35) | public function testRegularUsersCannotAccessToTheBackend()
    method testAdministratorUsersCanAccessToTheBackend (line 47) | public function testAdministratorUsersCanAccessToTheBackend()
    method testIndex (line 59) | public function testIndex()

FILE: src/AppBundle/Tests/Controller/BlogControllerTest.php
  class BlogControllerTest (line 27) | class BlogControllerTest extends WebTestCase
    method testIndex (line 29) | public function testIndex()

FILE: src/AppBundle/Tests/Controller/DefaultControllerTest.php
  class DefaultControllerTest (line 27) | class DefaultControllerTest extends WebTestCase
    method testPublicUrls (line 36) | public function testPublicUrls($url)
    method testSecureUrls (line 54) | public function testSecureUrls($url)
    method getPublicUrls (line 68) | public function getPublicUrls()
    method getSecureUrls (line 78) | public function getSecureUrls()

FILE: src/AppBundle/Tests/Utils/SluggerTest.php
  class SluggerTest (line 26) | class SluggerTest extends \PHPUnit_Framework_TestCase
    method testSlugify (line 31) | public function testSlugify($string, $slug)
    method getSlugs (line 39) | public function getSlugs()

FILE: src/AppBundle/Twig/AppExtension.php
  class AppExtension (line 29) | class AppExtension extends \Twig_Extension
    method __construct (line 41) | public function __construct(Markdown $parser, $locales)
    method getFilters (line 50) | public function getFilters()
    method getFunctions (line 60) | public function getFunctions()
    method markdownToHtml (line 74) | public function markdownToHtml($content)
    method getLocales (line 86) | public function getLocales()
    method getName (line 101) | public function getName()

FILE: src/AppBundle/Utils/Markdown.php
  class Markdown (line 22) | class Markdown
    method __construct (line 34) | public function __construct()
    method toHtml (line 45) | public function toHtml($text)

FILE: src/AppBundle/Utils/MomentFormatConverter.php
  class MomentFormatConverter (line 19) | class MomentFormatConverter
    method convert (line 48) | public function convert($format)

FILE: src/AppBundle/Utils/Slugger.php
  class Slugger (line 21) | class Slugger
    method slugify (line 28) | public function slugify($string)

FILE: src/CodeExplorerBundle/CodeExplorerBundle.php
  class CodeExplorerBundle (line 19) | class CodeExplorerBundle extends Bundle

FILE: src/CodeExplorerBundle/DependencyInjection/CodeExplorerExtension.php
  class CodeExplorerExtension (line 22) | class CodeExplorerExtension extends Extension
    method load (line 24) | public function load(array $configs, ContainerBuilder $container)

FILE: src/CodeExplorerBundle/EventListener/ControllerListener.php
  class ControllerListener (line 29) | class ControllerListener
    method __construct (line 33) | public function __construct(SourceCodeExtension $twigExtension)
    method registerCurrentController (line 38) | public function registerCurrentController(FilterControllerEvent $event)

FILE: src/CodeExplorerBundle/Twig/SourceCodeExtension.php
  class SourceCodeExtension (line 23) | class SourceCodeExtension extends \Twig_Extension
    method __construct (line 28) | public function __construct($kernelRootDir)
    method setController (line 33) | public function setController($controller)
    method getFunctions (line 41) | public function getFunctions()
    method showSourceCode (line 48) | public function showSourceCode(\Twig_Environment $twig, \Twig_Template...
    method getController (line 56) | private function getController()
    method getCallableReflector (line 85) | private function getCallableReflector($callable)
    method getTemplateSource (line 100) | private function getTemplateSource(\Twig_Template $template)
    method unindentCode (line 122) | private function unindentCode($code)
    method getName (line 140) | public function getName()

FILE: src/ElasticSearchBundle/Controller/ElasticSearchController.php
  class ElasticSearchController (line 8) | class ElasticSearchController extends Controller
    method searchAction (line 10) | public function searchAction(Request $request, $page)

FILE: src/ElasticSearchBundle/ElasticSearchBundle.php
  class ElasticSearchBundle (line 7) | class ElasticSearchBundle extends Bundle

FILE: src/ElasticSearchBundle/Tests/Controller/ElasticSearchControllerTest.php
  class ElasticSearchControllerTest (line 9) | class ElasticSearchControllerTest extends WebTestCase
    method __construct (line 13) | public function __construct()
    method testElasticSearch (line 22) | public function testElasticSearch()
    method populateElasticSearchIndices (line 55) | public function populateElasticSearchIndices()

FILE: src/OAuthBundle/Controller/OAuthController.php
  class OAuthController (line 15) | class OAuthController extends Controller
    method disconnectServiceAction (line 17) | public function disconnectServiceAction(Request $request, $service, $u...

FILE: src/OAuthBundle/DependencyInjection/Configuration.php
  class Configuration (line 13) | class Configuration implements ConfigurationInterface
    method getConfigTreeBuilder (line 18) | public function getConfigTreeBuilder()

FILE: src/OAuthBundle/DependencyInjection/OAuthExtension.php
  class OAuthExtension (line 15) | class OAuthExtension extends Extension
    method load (line 20) | public function load(array $configs, ContainerBuilder $container)

FILE: src/OAuthBundle/OAuthBundle.php
  class OAuthBundle (line 7) | class OAuthBundle extends Bundle

FILE: src/OAuthBundle/Provider/UserProvider.php
  class UserProvider (line 18) | class UserProvider extends OAuthUserProvider
    method __construct (line 35) | public function __construct(EntityManager $entityManager, ContainerInt...
    method loadUserByOAuthUserResponse (line 46) | public function loadUserByOAuthUserResponse(UserResponseInterface $res...

FILE: src/OAuthBundle/Services/AuthenticationSuccessHandler.php
  class AuthenticationSuccessHandler (line 18) | class AuthenticationSuccessHandler implements AuthenticationSuccessHandl...
    method __construct (line 35) | public function __construct(AuthorizationChecker $security, \Symfony\B...
    method onAuthenticationSuccess (line 46) | public function onAuthenticationSuccess(Request $request, TokenInterfa...

FILE: src/OAuthBundle/Tests/Controller/OAuthControllerTest.php
  class OAuthControllerTest (line 14) | class OAuthControllerTest extends WebTestCase
    method __construct (line 18) | public function __construct()
    method testDisconnectService (line 24) | public function testDisconnectService()

FILE: src/OAuthBundle/Tests/OAuthTest.php
  class OAuthTest (line 16) | class OAuthTest extends WebTestCase
    method testOAuth (line 18) | public function testOAuth()

FILE: src/RabbitMQBundle/Controller/RabbitMQController.php
  class RabbitMQController (line 9) | class RabbitMQController extends Controller
    method generatePdfAction (line 11) | public function generatePdfAction(Post $post)

FILE: src/RabbitMQBundle/DependencyInjection/Configuration.php
  class Configuration (line 13) | class Configuration implements ConfigurationInterface
    method getConfigTreeBuilder (line 18) | public function getConfigTreeBuilder()

FILE: src/RabbitMQBundle/DependencyInjection/RabbitMQExtension.php
  class RabbitMQExtension (line 15) | class RabbitMQExtension extends Extension
    method load (line 20) | public function load(array $configs, ContainerBuilder $container)

FILE: src/RabbitMQBundle/RabbitMQBundle.php
  class RabbitMQBundle (line 7) | class RabbitMQBundle extends Bundle

FILE: src/RabbitMQBundle/Services/PDFGenerator.php
  class PDFGenerator (line 15) | class PDFGenerator
    method __construct (line 33) | public function __construct(Serializer $serializer, ContainerInterface...
    method setPost (line 43) | public function setPost(Post $post)
    method checkExistingUpdatedPdf (line 51) | public function checkExistingUpdatedPdf()
    method generateNewPdf (line 63) | public function generateNewPdf()
    method generateUniquePdfName (line 83) | public function generateUniquePdfName()

FILE: src/RabbitMQBundle/Services/RabbitMQ/PDFGeneratorConsumer.php
  class PDFGeneratorConsumer (line 16) | class PDFGeneratorConsumer implements ConsumerInterface
    method __construct (line 39) | public function __construct(ContainerInterface $container, TwigEngine ...
    method execute (line 51) | public function execute(AMQPMessage $msg)

FILE: src/RabbitMQBundle/Tests/Controller/RabbitMQControllerTest.php
  class RabbitMQControllerTest (line 9) | class RabbitMQControllerTest extends WebTestCase
    method __construct (line 13) | public function __construct()
    method testRabbitMQ (line 19) | public function testRabbitMQ()

FILE: src/RedisBundle/Controller/RedisController.php
  class RedisController (line 15) | class RedisController extends Controller
    method ListTopFivePopularPostAction (line 17) | public function ListTopFivePopularPostAction()

FILE: src/RedisBundle/RedisBundle.php
  class RedisBundle (line 7) | class RedisBundle extends Bundle

FILE: src/RedisBundle/Tests/Controller/RedisControllerTest.php
  class RedisControllerTest (line 14) | class RedisControllerTest extends WebTestCase
    method __construct (line 18) | public function __construct()
    method testRedisController (line 24) | public function testRedisController()

FILE: src/RestBundle/Controller/RestController.php
  class RestController (line 31) | class RestController extends FOSRestController
    method indexApiAction (line 47) | public function indexApiAction()
    method getPostsAction (line 73) | public function getPostsAction()
    method getPostAction (line 100) | public function getPostAction($id)
    method newPostFormAction (line 129) | public function newPostFormAction()
    method newPostAction (line 156) | public function newPostAction(Request $request)
    method updatePostAction (line 198) | public function updatePostAction(Request $request, $id)
    method editPostFormAction (line 241) | public function editPostFormAction($id)
    method editPostAction (line 272) | public function editPostAction(Request $request, $id)
    method deletePostAction (line 306) | public function deletePostAction($id)
    method getCommentsAction (line 330) | public function getCommentsAction()
    method getCommentAction (line 356) | public function getCommentAction($id)
    method getCommentsFromPostAction (line 385) | public function getCommentsFromPostAction($id)
    method newCommentFormAction (line 409) | public function newCommentFormAction()
    method newCommentAction (line 438) | public function newCommentAction(Request $request, $id)
    method updateCommentAction (line 481) | public function updateCommentAction(Request $request, $id)
    method editCommentFormAction (line 524) | public function editCommentFormAction($id)
    method editCommentAction (line 555) | public function editCommentAction(Request $request, $id)
    method deleteCommentAction (line 590) | public function deleteCommentAction($id)

FILE: src/RestBundle/DependencyInjection/Configuration.php
  class Configuration (line 13) | class Configuration implements ConfigurationInterface
    method getConfigTreeBuilder (line 18) | public function getConfigTreeBuilder()

FILE: src/RestBundle/DependencyInjection/RestExtension.php
  class RestExtension (line 15) | class RestExtension extends Extension
    method load (line 20) | public function load(array $configs, ContainerBuilder $container)

FILE: src/RestBundle/Form/CommentRestType.php
  class CommentRestType (line 29) | class CommentRestType extends AbstractType
    method buildForm (line 34) | public function buildForm(FormBuilderInterface $builder, array $options)
    method configureOptions (line 60) | public function configureOptions(OptionsResolver $resolver)
    method getName (line 71) | public function getName()

FILE: src/RestBundle/Form/PostRestType.php
  class PostRestType (line 11) | class PostRestType extends AbstractType
    method buildForm (line 16) | public function buildForm(FormBuilderInterface $builder, array $options)
    method configureOptions (line 44) | public function configureOptions(OptionsResolver $resolver)
    method getName (line 55) | public function getName()

FILE: src/RestBundle/RestBundle.php
  class RestBundle (line 7) | class RestBundle extends Bundle

FILE: src/RestBundle/Tests/Controller/RestControllerTest.php
  class RestControllerTest (line 18) | class RestControllerTest extends WebTestCase
    method __construct (line 22) | public function __construct()
    method testResourcesIndex (line 28) | public function testResourcesIndex()
    method testApiDocIndex (line 40) | public function testApiDocIndex()
    method testResponseFormats (line 52) | public function testResponseFormats()
    method testGetPosts (line 78) | public function testGetPosts()
    method testGetPost (line 87) | public function testGetPost()
    method testNewPost (line 105) | public function testNewPost()
    method testEditPost (line 128) | public function testEditPost()
    method testRemovePost (line 158) | public function testRemovePost()
    method testGetComments (line 176) | public function testGetComments()
    method testGetCommentsFromSpecificPost (line 184) | public function testGetCommentsFromSpecificPost()
    method testGetComment (line 213) | public function testGetComment()
    method testNewComment (line 234) | public function testNewComment()
    method testEditComment (line 258) | public function testEditComment()
    method testRemoveComment (line 291) | public function testRemoveComment()
    method getExamplePostData (line 312) | public function getExamplePostData()
    method getExampleCommentData (line 324) | public function getExampleCommentData()
    method getExamplePostEntity (line 332) | public function getExamplePostEntity()
    method getExampleCommentEntity (line 354) | public function getExampleCommentEntity()

FILE: web/js/app.js
  function Y (line 23) | function Y(t){var n="length" in t&&t.length,i=e.type(t);if(i==="function...
  function i (line 34) | function i(e,t,n,i){var m,l,d,c,w,g,x,h,b,v;if((t?t.ownerDocument||t:f)!...
  function M (line 39) | function M(){var n=[];function e(i,r){if(n.push(i+" ")>t.cacheLength){de...
  function l (line 39) | function l(e){e[o]=!0;return e}
  function h (line 39) | function h(e){var n=a.createElement("div");try{return!!e(n)}catch(t){ret...
  function V (line 39) | function V(e,n){var r=e.split("|"),i=e.length;while(i--){t.attrHandle[r[...
  function K (line 39) | function K(e,t){var n=t&&e,i=n&&e.nodeType===1&&t.nodeType===1&&(~t.sour...
  function ge (line 39) | function ge(e){return function(t){var n=t.nodeName.toLowerCase();return ...
  function Ee (line 39) | function Ee(e){return function(t){var n=t.nodeName.toLowerCase();return(...
  function w (line 39) | function w(e){return l(function(t){t=+t;return l(function(n,i){var r,s=e...
  function G (line 39) | function G(e){return e&&typeof e.getElementsByTagName!=="undefined"&&e}
  function J (line 53) | function J(){}
  function P (line 53) | function P(e){var t=0,i=e.length,n="";for(;t<i;t++){n+=e[t].value};retur...
  function B (line 53) | function B(e,t,n){var i=t.dir,r=n&&i==="parentNode",s=pe++;return t.firs...
  function I (line 55) | function I(e){return e.length>1?function(t,n,i){var r=e.length;while(r--...
  function ce (line 55) | function ce(e,t,n){var r=0,o=t.length;for(;r<o;r++){i(e,t[r],n)};return n}
  function O (line 55) | function O(e,t,n,i,r){var s,a=[],o=0,f=e.length,u=t!=null;for(;o<f;o++){...
  function z (line 55) | function z(e,t,n,i,r,s){if(i&&!i[o]){i=z(i)};if(r&&!r[o]){r=z(r,s)};retu...
  function X (line 57) | function X(e){var u,r,i,a=e.length,f=t.relative[e[0].type],l=f||t.relati...
  function de (line 58) | function de(e,n){var r=n.length>0,s=e.length>0,o=function(o,u,f,l,c){var...
  function I (line 60) | function I(t,n,i){if(e.isFunction(n)){return e.grep(t,function(e,t){retu...
  function de (line 67) | function de(e,t){while((e=e[t])&&e.nodeType!==1){};return e}
  function Ke (line 67) | function Ke(t){var n=re[t]={};e.each(t.match(l)||[],function(e,t){n[t]=!...
  function H (line 76) | function H(){r.removeEventListener("DOMContentLoaded",H,!1);t.removeEven...
  function d (line 79) | function d(){Object.defineProperty(this.cache={},0,{get:function(){retur...
  function ye (line 84) | function ye(t,n,i){var o;if(i===undefined&&t.nodeType===1){o="data-"+n.r...
  function A (line 86) | function A(){return!0}
  function x (line 86) | function x(){return!1}
  function te (line 86) | function te(){try{return r.activeElement}catch(e){}}
  function ue (line 93) | function ue(t,n){return e.nodeName(t,"table")&&e.nodeName(n.nodeType!==1...
  function Ue (line 93) | function Ue(e){e.type=(e.getAttribute("type")!==null)+"/"+e.type;return e}
  function Je (line 93) | function Je(e){var t=qt.exec(e.type);if(t){e.type=t[1]}
  function z (line 94) | function z(e,t){var n=0,r=e.length;for(;n<r;n++){i.set(e[n],"globalEval"...
  function Be (line 94) | function Be(t,n){var a,d,o,f,u,c,l,r;if(n.nodeType!==1){return};if(i.has...
  function a (line 94) | function a(t,n){var i=t.getElementsByTagName?t.getElementsByTagName(n||"...
  function Ze (line 94) | function Ze(e,t){var n=t.nodeName.toLowerCase();if(n==="input"&&We.test(...
  function Xe (line 100) | function Xe(n,i){var o,r=e(i.createElement(n)).appendTo(i.body),s=t.getD...
  function V (line 100) | function V(t){var i=r,n=Ne[t];if(!n){n=Xe(t,i);if(n==="none"||!n){O=(O||...
  function C (line 100) | function C(t,n,i){var s,a,u,o,r=t.style;i=i||j(t);if(i){o=i.getPropertyV...
  function be (line 100) | function be(e,t){return{get:function(){if(e()){delete this.get;return};r...
  function u (line 100) | function u(){n.style.cssText="-webkit-box-sizing:border-box;-moz-box-siz...
  function Ee (line 100) | function Ee(e,t){if(t in e){return t};var i=t[0].toUpperCase()+t.slice(1...
  function Se (line 100) | function Se(e,t,n){var i=ut.exec(t);return i?Math.max(0,i[1]-(n||0))+(i[...
  function qe (line 100) | function qe(t,n,i,r,o){var s=i===(r?"border":"content")?4:n==="width"?1:...
  function Le (line 101) | function Le(t,n,i){var u=!0,r=n==="width"?t.offsetWidth:t.offsetHeight,s...
  function je (line 101) | function je(t,n){var s,r,u,a=[],o=0,f=t.length;for(;o<f;o++){r=t[o];if(!...
  function u (line 104) | function u(e,t,n,i,r){return new u.prototype.init(e,t,n,i,r)}
  function De (line 109) | function De(){setTimeout(function(){m=undefined});return(m=e.now())}
  function P (line 109) | function P(e,t){var i,r=0,n={height:e};t=t?1:0;for(;r<4;r+=2-t){i=h[r];n...
  function xe (line 109) | function xe(e,t,n){var r,o=(b[t]||[]).concat(b["*"]),i=0,s=o.length;for(...
  function Qe (line 109) | function Qe(t,n,r){var o,d,g,h,u,y,l,m,c=this,p={},a=t.style,f=t.nodeTyp...
  function Ye (line 114) | function Ye(t,n){var i,o,a,r,s;for(i in t){o=e.camelCase(i);a=n[o];r=t[i...
  function oe (line 115) | function oe(t,n,i){var u,f,a=0,c=N.length,o=e.Deferred().always(function...
  function ae (line 132) | function ae(t){return function(n,i){if(typeof n!=="string"){i=n;n="*"};v...
  function ne (line 133) | function ne(t,n,i,r){var o={},a=(t===X);function s(u){var f;o[u]=!0;e.ea...
  function U (line 134) | function U(t,n){var i,r,o=e.ajaxSettings.flatOptions||{};for(i in n){if(...
  function Ve (line 134) | function Ve(e,t,n){var s,o,r,u,a=e.contents,i=e.dataTypes;while(i[0]==="...
  function Ge (line 135) | function Ge(e,t,n,i){var c,r,o,f,u,a={},l=e.dataTypes.slice();if(l[1]){f...
  function g (line 141) | function g(t,n,o,l){var d,T,v,g,h,c=n;if(a===2){return};a=2;if(x){clearT...
  function B (line 146) | function B(t,n,i,r){var o;if(e.isArray(n)){e.each(n,function(e,n){if(i||...
  function ce (line 154) | function ce(t){return e.isWindow(t)?t:t.nodeType===9&&t.defaultView}
  function n (line 159) | function n(){return ia.apply(null,arguments)}
  function nd (line 159) | function nd(e){ia=e}
  function Ae (line 159) | function Ae(e){return"[object Array]"===Object.prototype.toString.call(e)}
  function Oe (line 159) | function Oe(e){return e instanceof Date||"[object Date]"===Object.protot...
  function Xr (line 159) | function Xr(e,t){var a,n=[];for(a=0;a<e.length;++a)n.push(t(e[a],a));ret...
  function B (line 159) | function B(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
  function Ee (line 159) | function Ee(e,t){for(var a in t)B(t,a)&&(e[a]=t[a]);return B(t,"toString...
  function fe (line 159) | function fe(e,t,a,n){return Nt(e,t,a,n,!0).utc()}
  function Br (line 159) | function Br(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2...
  function o (line 159) | function o(e){return null==e._pf&&(e._pf=Br()),e._pf}
  function fa (line 159) | function fa(e){if(null==e._isValid){var t=o(e);e._isValid=!(isNaN(e._d.g...
  function ka (line 159) | function ka(e){var t=fe(NaN);return null!=e?Ee(o(t),e):o(t).userInvalida...
  function Qe (line 159) | function Qe(e,t){var s,a,n;if("undefined"!=typeof t._isAMomentObject&&(e...
  function Me (line 159) | function Me(e){Qe(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN...
  function O (line 159) | function O(e){return e instanceof Me||null!=e&&null!=e._isAMomentObject}
  function c (line 159) | function c(e){return 0>e?Math.ceil(e):Math.floor(e)}
  function m (line 159) | function m(e){var t=+e,a=0;return 0!==t&&isFinite(t)&&(a=c(t)),a}
  function ca (line 159) | function ca(e,t,a){var n,d=Math.min(e.length,t.length),r=Math.abs(e.leng...
  function Ya (line 159) | function Ya(){}
  function ua (line 159) | function ua(e){return e?e.toLowerCase().replace("_","-"):e}
  function Qr (line 159) | function Qr(e){for(var a,t,r,n,s=0;s<e.length;){for(n=ua(e[s]).split("-"...
  function St (line 159) | function St(e){var t=null;if(!K[e]&&"undefined"!=typeof module&&module&&...
  function ce (line 159) | function ce(e,t){var a;return e&&(a="undefined"==typeof t?Q(e):wt(e,t),a...
  function wt (line 159) | function wt(e,t){return null!==t?(t.abbr=e,K[e]=K[e]||new Ya,K[e].set(t)...
  function Q (line 159) | function Q(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr...
  function M (line 159) | function M(e,t){var a=e.toLowerCase();pe[a]=pe[a+"s"]=pe[t]=e}
  function T (line 159) | function T(e){return"string"==typeof e?pe[e]||pe[e.toLowerCase()]:void 0}
  function Wt (line 159) | function Wt(e){var a,t,n={};for(t in e)B(e,t)&&(a=T(t),a&&(n[a]=e[t]));r...
  function ne (line 159) | function ne(e,t){return function(a){return null!=a?(yt(this,e,a),n.updat...
  function Ce (line 159) | function Ce(e,t){return e._d["get"+(e._isUTC?"UTC":"")+t]()}
  function yt (line 159) | function yt(e,t,a){return e._d["set"+(e._isUTC?"UTC":"")+t](a)}
  function pt (line 159) | function pt(e,t){var a;if("object"==typeof e)for(a in e)this.set(a,e[a])...
  function at (line 159) | function at(e,t,a){var n=""+Math.abs(e),r=t-n.length,s=e>=0;return(s?a?"...
  function s (line 159) | function s(e,t,a,n){var s=n;"string"==typeof n&&(s=function(){return thi...
  function ed (line 159) | function ed(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.rep...
  function ad (line 159) | function ad(e){var t,n,a=e.match(da);for(t=0,n=a.length;n>t;t++)ue[a[t]]...
  function nt (line 159) | function nt(e,t){return e.isValid()?(t=Tt(t,e.localeData()),Yt[t]=Yt[t]|...
  function Tt (line 159) | function Tt(e,t){function n(e){return t.longDateFormat(e)||e};var a=5;fo...
  function td (line 159) | function td(e){return"function"==typeof e&&"[object Function]"===Object....
  function a (line 159) | function a(e,t,a){Ie[e]=td(t)?t:function(e){return e&&a?a:t}}
  function ld (line 159) | function ld(e,t){return B(Ie,e)?Ie[e](t._strict,t._locale):new RegExp(Md...
  function Md (line 159) | function Md(e){return e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\...
  function l (line 159) | function l(e,t){var a,n=t;for("string"==typeof e&&(e=[e]),"number"==type...
  function Le (line 159) | function Le(e,t){l(e,function(e,a,n,s){n._w=n._w||{},t(e,n._w,n,s)})}
  function Td (line 159) | function Td(e,t,a){null!=t&&B(Ve,e)&&Ve[e](t,a._a,a,e)}
  function st (line 159) | function st(e,t){return new Date(Date.UTC(e,t+1,0)).getUTCDate()}
  function kd (line 159) | function kd(e){return this._months[e.month()]}
  function gd (line 159) | function gd(e){return this._monthsShort[e.month()]}
  function wd (line 159) | function wd(e,t,a){var n,s,r;for(this._monthsParse||(this._monthsParse=[...
  function Zt (line 159) | function Zt(e,t){var a;return"string"==typeof t&&(t=e.localeData().month...
  function Kt (line 159) | function Kt(e){return null!=e?(Zt(this,e),n.updateOffset(this,!0),this):...
  function Sd (line 159) | function Sd(){return st(this.year(),this.month())}
  function Xe (line 159) | function Xe(e){var a,t=e._a;return t&&-2===o(e).overflow&&(a=t[F]<0||t[F...
  function At (line 159) | function At(e){n.suppressDeprecationWarnings===!1&&"undefined"!=typeof c...
  function g (line 159) | function g(e,t){var a=!0;return Ee(function(){return a&&(At(e+"\n"+(new ...
  function vd (line 159) | function vd(e,t){na[e]||(At(t),na[e]=!0)}
  function Rt (line 159) | function Rt(e){var t,n,a=e._i,s=rd.exec(a);if(s){for(o(e).iso=!0,t=0,n=M...
  function Dd (line 160) | function Dd(e){var t=id.exec(e._i);return null!==t?void(e._d=new Date(+t...
  function es (line 160) | function es(e,t,a,n,s,d,i){var r=new Date(e,t,a,n,s,d,i);return 1970>e&&...
  function Be (line 160) | function Be(e){var t=new Date(Date.UTC.apply(null,arguments));return 197...
  function Bt (line 160) | function Bt(e){return Ut(e)?366:365}
  function Ut (line 160) | function Ut(e){return e%4===0&&e%100!==0||e%400===0}
  function fd (line 160) | function fd(){return Ut(this.year())}
  function ee (line 160) | function ee(e,t,a){var s,r=a-t,n=a-e.day();return n>r&&(n-=7),r-7>n&&(n+...
  function hd (line 160) | function hd(e){return ee(e,this._week.dow,this._week.doy).week}
  function Ld (line 160) | function Ld(){return this._week.dow}
  function cd (line 160) | function cd(){return this._week.doy}
  function Yd (line 160) | function Yd(e){var t=this.localeData().week(this);return null==e?t:this....
  function pd (line 160) | function pd(e){var t=ee(this,1,4).week;return null==e?t:this.add(7*(e-t)...
  function yd (line 160) | function yd(e,t,a,n,s){var r,i=6+s-n,o=Be(e,0,1+i),d=o.getUTCDay();retur...
  function qr (line 160) | function qr(e){var t=Math.round((this.clone().startOf("day")-this.clone(...
  function oe (line 160) | function oe(e,t,a){return null!=e?e:null!=t?t:a}
  function Rr (line 160) | function Rr(e){var t=new Date;return e._useUTC?[t.getUTCFullYear(),t.get...
  function Ke (line 160) | function Ke(e){var t,s,r,n,a=[];if(!e._d){for(r=Rr(e),e._w&&null==e._a[v...
  function Sr (line 160) | function Sr(e){var t,o,r,n,a,s,d;t=e._w,null!=t.GG||null!=t.W||null!=t.E...
  function Ze (line 160) | function Ze(e){if(e._f===n.ISO_8601)return void Rt(e);e._a=[],o(e).empty...
  function vr (line 160) | function vr(e,t,a){var n;return null==a?t:null!=e.meridiemHour?e.meridie...
  function Hr (line 160) | function Hr(e){var t,r,s,n,a;if(0===e._f.length)return o(e).invalidForma...
  function br (line 160) | function br(e){if(!e._d){var t=Wt(e._i);e._a=[t.year,t.month,t.day||t.da...
  function Wr (line 160) | function Wr(e){var t=new Me(Xe(Jt(e)));return t._nextDay&&(t.add(1,"d"),...
  function Jt (line 160) | function Jt(e){var t=e._i,a=e._f;return e._locale=e._locale||Q(e._l),nul...
  function jr (line 160) | function jr(e){var t=e._i;void 0===t?e._d=new Date:Oe(t)?e._d=new Date(+...
  function Nt (line 160) | function Nt(e,t,a,n,r){var s={};return"boolean"==typeof a&&(n=a,a=void 0...
  function i (line 160) | function i(e,t,a,n){return Nt(e,t,a,n,!1)}
  function Gt (line 160) | function Gt(e,t){var n,a;if(1===t.length&&Ae(t[0])&&(t=t[0]),!t.length)r...
  function wr (line 160) | function wr(){var e=[].slice.call(arguments,0);return Gt("isBefore",e)}
  function gr (line 160) | function gr(){var e=[].slice.call(arguments,0);return Gt("isAfter",e)}
  function Pe (line 160) | function Pe(e){var t=Wt(e),i=t.year||0,o=t.quarter||0,m=t.month||0,d=t.w...
  function dt (line 160) | function dt(e){return e instanceof Pe}
  function Vt (line 160) | function Vt(e,t){s(e,0,0,function(){var e=this.utcOffset(),a="+";return ...
  function ht (line 160) | function ht(e){var a=(e||"").match(Je)||[],s=a[a.length-1]||[],t=(s+"")....
  function Lt (line 160) | function Lt(e,t){var a,s;return t._isUTC?(a=t.clone(),s=(O(e)||Oe(e)?+e:...
  function ut (line 160) | function ut(e){return 15*-Math.round(e._d.getTimezoneOffset()/15)}
  function pr (line 160) | function pr(e,t){var s,a=this._offset||0;return null!=e?("string"==typeo...
  function yr (line 160) | function yr(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffs...
  function Yr (line 160) | function Yr(e){return this.utcOffset(0,e)}
  function fr (line 160) | function fr(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e...
  function Dr (line 160) | function Dr(){return this._tzm?this.utcOffset(this._tzm):"string"==typeo...
  function Tr (line 160) | function Tr(e){return e=e?i(e).utcOffset():0,(this.utcOffset()-e)%60===0}
  function kr (line 160) | function kr(){return this.utcOffset()>this.clone().month(0).utcOffset()|...
  function xr (line 160) | function xr(){if("undefined"!=typeof this._isDSTShifted)return this._isD...
  function Fr (line 161) | function Fr(){return!this._isUTC}
  function Ur (line 161) | function Ur(){return this._isUTC}
  function It (line 161) | function It(){return this._isUTC&&0===this._offset}
  function C (line 161) | function C(e,t){var s,r,d,a=e,n=null;return dt(e)?a={ms:e._milliseconds,...
  function R (line 161) | function R(e,t){var a=e&&parseFloat(e.replace(",","."));return(isNaN(a)?...
  function Xt (line 161) | function Xt(e,t){var a={milliseconds:0,months:0};return a.months=t.month...
  function Nr (line 161) | function Nr(e,t){var a;return t=Lt(t,e),e.isBefore(t)?a=Xt(e,t):(a=Xt(t,...
  function jt (line 161) | function jt(e,t){return function(a,n){var r,s;return null===n||isNaN(+n)...
  function Dt (line 161) | function Dt(e,t,a,s){var i=t._milliseconds,d=t._days,r=t._months;s=null=...
  function Ir (line 161) | function Ir(e,t){var s=e||i(),r=Lt(s,this).startOf("day"),a=this.diff(r,...
  function Vr (line 161) | function Vr(){return new Me(this)}
  function Zr (line 161) | function Zr(e,t){var a;return t=T("undefined"!=typeof t?t:"millisecond")...
  function Kr (line 161) | function Kr(e,t){var a;return t=T("undefined"!=typeof t?t:"millisecond")...
  function Cr (line 161) | function Cr(e,t,a){return this.isAfter(e,a)&&this.isBefore(t,a)}
  function Gr (line 161) | function Gr(e,t){var a;return t=T(t||"millisecond"),"millisecond"===t?(e...
  function Pr (line 161) | function Pr(e,t,a){var n,s,r=Lt(e,this),d=6e4*(r.utcOffset()-this.utcOff...
  function Ar (line 161) | function Ar(e,t){var s,r,n=12*(t.year()-e.year())+(t.month()-e.month()),...
  function zr (line 161) | function zr(){return this.clone().locale("en").format("ddd MMM DD YYYY H...
  function gt (line 161) | function gt(){var e=this.clone().utc();return 0<e.year()&&e.year()<=9999...
  function Er (line 161) | function Er(e){var t=nt(this,e||n.defaultFormat);return this.localeData(...
  function Jr (line 161) | function Jr(e,t){return this.isValid()?C({to:this,from:e}).locale(this.l...
  function Or (line 161) | function Or(e){return this.from(i(),e)}
  function Hd (line 161) | function Hd(e,t){return this.isValid()?C({from:this,to:e}).locale(this.l...
  function Rn (line 161) | function Rn(e){return this.to(i(),e)}
  function vt (line 161) | function vt(e){var t;return void 0===e?this._locale._abbr:(t=Q(e),null!=...
  function bt (line 161) | function bt(){return this._locale}
  function Ka (line 161) | function Ka(e){switch(e=T(e)){case"year":this.month(0);case"quarter":cas...
  function Ia (line 161) | function Ia(e){return e=T(e),void 0===e||"millisecond"===e?this:this.sta...
  function Ua (line 161) | function Ua(){return+this._d-6e4*(this._offset||0)}
  function Ja (line 161) | function Ja(){return Math.floor(+this/1e3)}
  function Ga (line 161) | function Ga(){return this._offset?new Date(+this):this._d}
  function Ca (line 161) | function Ca(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.m...
  function Na (line 161) | function Na(){var e=this;return{years:e.year(),months:e.month(),date:e.d...
  function Ra (line 161) | function Ra(){return fa(this)}
  function qa (line 161) | function qa(){return Ee({},o(this))}
  function nn (line 161) | function nn(){return o(this).overflow}
  function ze (line 161) | function ze(e,t){s(0,[e,e.length],0,t)}
  function zt (line 161) | function zt(e,t,a){return ee(i([e,11,31+t-a]),t,a).week}
  function Qa (line 161) | function Qa(e){var t=ee(this,this.localeData()._week.dow,this.localeData...
  function en (line 161) | function en(e){var t=ee(this,1,4).year;return null==e?t:this.add(e-t,"y")}
  function dn (line 161) | function dn(){return zt(this.year(),1,4)}
  function ja (line 161) | function ja(){var e=this.localeData()._week;return zt(this.year(),e.dow,...
  function wa (line 161) | function wa(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3...
  function ga (line 161) | function ga(e,t){return"string"!=typeof e?e:isNaN(e)?(e=t.weekdaysParse(...
  function va (line 161) | function va(e){return this._weekdays[e.day()]}
  function Sa (line 161) | function Sa(e){return this._weekdaysShort[e.day()]}
  function Ha (line 161) | function Ha(e){return this._weekdaysMin[e.day()]}
  function Aa (line 161) | function Aa(e){var t,a,n;for(this._weekdaysParse=this._weekdaysParse||[]...
  function Fa (line 161) | function Fa(e){var t=this._isUTC?this._d.getUTCDay():this._d.getDay();re...
  function xa (line 161) | function xa(e){var t=(this.day()+7-this.localeData()._week.dow)%7;return...
  function tn (line 161) | function tn(e){return null==e?this.day()||7:this.day(this.day()%7?e:e-7)}
  function Ot (line 161) | function Ot(e,t){s(e,0,0,function(){return this.localeData().meridiem(th...
  function Pt (line 161) | function Pt(e,t){return t._meridiemParse}
  function Qn (line 161) | function Qn(e){return"p"===(e+"").toLowerCase().charAt(0)}
  function Jn (line 161) | function Jn(e,t,a){return e>11?a?"pm":"PM":a?"am":"AM"}
  function En (line 161) | function En(e,t){t[X]=m(1e3*("0."+e))}
  function zn (line 161) | function zn(){return this._isUTC?"UTC":""}
  function xn (line 161) | function xn(){return this._isUTC?"Coordinated Universal Time":""}
  function Fn (line 161) | function Fn(e){return i(1e3*e)}
  function An (line 161) | function An(){return i.apply(null,arguments).parseZone()}
  function Pn (line 161) | function Pn(e,t,a){var n=this._calendar[e];return"function"==typeof n?n....
  function Cn (line 161) | function Cn(e){var a=this._longDateFormat[e],t=this._longDateFormat[e.to...
  function Nn (line 161) | function Nn(){return this._invalidDate}
  function Bn (line 161) | function Bn(e){return this._ordinal.replace("%d",e)}
  function qt (line 161) | function qt(e){return e}
  function Kn (line 161) | function Kn(e,t,a,n){var s=this._relativeTime[a];return"function"==typeo...
  function cn (line 161) | function cn(e,t){var a=this._relativeTime[e>0?"future":"past"];return"fu...
  function hn (line 161) | function hn(e){var a,t;for(t in e)a=e[t],"function"==typeof a?this[t]=a:...
  function Qt (line 161) | function Qt(e,t,a,n){var r=Q(),s=fe().set(n,t);return r[a](s,e)}
  function he (line 161) | function he(e,t,a,n,s){if("number"==typeof e&&(t=e,e=void 0),e=e||"",nul...
  function un (line 161) | function un(e,t){return he(e,t,"months",12,"month")}
  function pn (line 161) | function pn(e,t){return he(e,t,"monthsShort",12,"month")}
  function fn (line 161) | function fn(e,t){return he(e,t,"weekdays",7,"day")}
  function Hn (line 161) | function Hn(e,t){return he(e,t,"weekdaysShort",7,"day")}
  function bn (line 161) | function bn(e,t){return he(e,t,"weekdaysMin",7,"day")}
  function vn (line 161) | function vn(){var e=this._data;return this._milliseconds=x(this._millise...
  function Et (line 161) | function Et(e,t,a,n){var s=C(t,a);return e._milliseconds+=n*s._milliseco...
  function Dn (line 161) | function Dn(e,t){return Et(this,e,t,1)}
  function ln (line 161) | function ln(e,t){return Et(this,e,t,-1)}
  function sa (line 161) | function sa(e){return 0>e?Math.floor(e):Math.ceil(e)}
  function Gn (line 161) | function Gn(){var d,i,r,o,s,n=this._milliseconds,e=this._days,t=this._mo...
  function Da (line 161) | function Da(e){return 4800*e/146097}
  function ot (line 161) | function ot(e){return 146097*e/4800}
  function rn (line 161) | function rn(e){var t,n,a=this._milliseconds;if(e=T(e),"month"===e||"year...
  function sn (line 161) | function sn(){return this._milliseconds+864e5*this._days+this._months%12...
  function P (line 161) | function P(e){return function(){return this.as(e)}}
  function Va (line 161) | function Va(e){return e=T(e),this[e+"s"]()}
  function Z (line 161) | function Z(e){return function(){return this._data[e]}}
  function Sn (line 161) | function Sn(){return c(this.days()/7)}
  function Ba (line 161) | function Ba(e,t,a,n,s){return s.relativeTime(t||1,!!a,e,n)}
  function Xa (line 161) | function Xa(e,t,a){var n=C(e).abs(),m=se(n.as("s")),i=se(n.as("m")),o=se...
  function Ea (line 161) | function Ea(e,t){return void 0===z[e]?!1:void 0===t?z[e]:(z[e]=t,!0)}
  function ba (line 161) | function ba(e){var a=this.localeData(),t=Xa(this,!e,a);return e&&(t=a.pa...
  function Ue (line 161) | function Ue(){var e,d,i,r=it(this._milliseconds)/1e3,M=it(this._days),s=...
  function On (line 161) | function On(e,t){var a=e.split("_");return t%10===1&&t%100!==11?a[0]:t%1...
  function V (line 161) | function V(e,t,a){var n={mm:t?"хвіліна_хвіліны_хвілін":"хвіліну_хвіліны_...
  function Zn (line 161) | function Zn(e,t){var n={nominative:"студзень_люты_сакавік_красавік_траве...
  function mn (line 161) | function mn(e,t){var n={nominative:"нядзеля_панядзелак_аўторак_серада_ча...
  function rt (line 161) | function rt(e,t,a){var n={mm:"munutenn",MM:"miz",dd:"devezh"};return e+"...
  function Mn (line 161) | function Mn(e){switch(ra(e)){case 1:case 3:case 4:case 5:case 9:return e...
  function ra (line 161) | function ra(e){return e>9?ra(e%10):e}
  function Ln (line 161) | function Ln(e,t){return 2===t?an(e):e}
  function an (line 161) | function an(e){var t={m:"v",b:"v",d:"z"};return void 0===t[e.charAt(0)]?...
  function te (line 161) | function te(e,t,a){var n=e+" ";switch(a){case"m":return t?"jedna minuta"...
  function De (line 161) | function De(e){return e>1&&5>e&&1!==~~(e/10)}
  function y (line 161) | function y(e,t,a,n){var s=e+" ";switch(a){case"s":return t||n?"pár sekun...
  function J (line 161) | function J(e,t,a,n){var s={m:["eine Minute","einer Minute"],h:["eine Stu...
  function G (line 161) | function G(e,t,a,n){var s={m:["eine Minute","einer Minute"],h:["eine Stu...
  function H (line 161) | function H(e,t,a,n){var s={s:["mõne sekundi","mõni sekund","paar sekundi...
  function p (line 161) | function p(e,t,a,n){var s="";switch(a){case"s":return n?"muutaman sekunn...
  function Za (line 161) | function Za(e,t){return 10>e?t?Ns[e]:Fe[e]:e}
  function q (line 161) | function q(e,t,a){var n=e+" ";switch(a){case"m":return t?"jedna minuta":...
  function k (line 161) | function k(e,t,a,n){var s=e;switch(a){case"s":return n||t?"néhány másodp...
  function oa (line 161) | function oa(e){return(e?"":"[múlt] ")+"["+or[this.day()]+"] LT[-kor]"}
  function Pa (line 161) | function Pa(e,t){var n={nominative:"հունվար_փետրվար_մարտ_ապրիլ_մայիս_հու...
  function Wa (line 161) | function Wa(e,t){var a="հնվ_փտր_մրտ_ապր_մյս_հնս_հլս_օգս_սպտ_հկտ_նմբ_դկտ"...
  function Xn (line 161) | function Xn(e,t){var a="կիրակի_երկուշաբթի_երեքշաբթի_չորեքշաբթի_հինգշաբթի...
  function Te (line 161) | function Te(e){return e%100===11?!0:e%10===1?!1:!0}
  function S (line 161) | function S(e,t,a,n){var s=e+" ";switch(a){case"s":return t||n?"nokkrar s...
  function jn (line 161) | function jn(e,t){var n={nominative:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი...
  function Yn (line 161) | function Yn(e,t){var n={nominative:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხ...
  function ke (line 161) | function ke(e,t,a,n){var s={m:["eng Minutt","enger Minutt"],h:["eng Ston...
  function Tn (line 161) | function Tn(e){var t=e.substr(0,e.indexOf(" "));return we(t)?"a "+e:"an ...
  function gn (line 161) | function gn(e){var t=e.substr(0,e.indexOf(" "));return we(t)?"viru "+e:"...
  function we (line 161) | function we(e){if(e=parseInt(e,10),isNaN(e))return!1;if(0>e)return!0;if(...
  function qn (line 161) | function qn(e,t,a,n){return t?"kelios sekundės":n?"kelių sekundžių":"kel...
  function on (line 161) | function on(e,t){var n={nominative:"sausis_vasaris_kovas_balandis_gegužė...
  function ie (line 161) | function ie(e,t,a,n){return t?N(a)[0]:n?N(a)[1]:N(a)[2]}
  function Ct (line 161) | function Ct(e){return e%10===0||e>10&&20>e}
  function N (line 161) | function N(e){return ur[e].split("_")}
  function ve (line 161) | function ve(e,t,a,n){var s=e+" ";return 1===e?s+ie(e,t,a[0],n):t?s+(Ct(e...
  function Oa (line 161) | function Oa(e,t){var n=-1===t.indexOf("dddd HH:mm"),a=lr[e.day()];return...
  function ma (line 161) | function ma(e,t,a){return a?t%10===1&&11!==t?e[2]:e[3]:t%10===1&&11!==t?...
  function Se (line 161) | function Se(e,t,a){return e+" "+ma(ta[a],e,t)}
  function ge (line 161) | function ge(e,t,a){return ma(ta[a],e,t)}
  function kn (line 161) | function kn(e,t){return t?"dažas sekundes":"dažām sekundēm"}
  function Ne (line 161) | function Ne(e){return 5>e%10&&e%10>1&&~~(e/10)%10!==1}
  function ae (line 161) | function ae(e,t,a){var n=e+" ";switch(a){case"m":return t?"minuta":"minu...
  function le (line 161) | function le(e,t,a){var s={mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"a...
  function za (line 161) | function za(e,t){var a=e.split("_");return t%10===1&&t%100!==11?a[0]:t%1...
  function re (line 161) | function re(e,t,a){var n={mm:t?"минута_минуты_минут":"минуту_минуты_мину...
  function In (line 161) | function In(e,t){var n={nominative:"январь_февраль_март_апрель_май_июнь_...
  function Vn (line 161) | function Vn(e,t){var n={nominative:"янв_фев_март_апр_май_июнь_июль_авг_с...
  function yn (line 161) | function yn(e,t){var n={nominative:"воскресенье_понедельник_вторник_сред...
  function Ye (line 161) | function Ye(e){return e>1&&5>e}
  function D (line 161) | function D(e,t,a,n){var s=e+" ";switch(a){case"s":return t||n?"pár sekún...
  function f (line 161) | function f(e,t,a,n){var s=e+" ";switch(a){case"s":return t||n?"nekaj sek...
  function w (line 161) | function w(e,t,a,n){var s={s:["viensas secunds","'iensas secunds"],m:["'...
  function wn (line 161) | function wn(e,t){var a=e.split("_");return t%10===1&&t%100!==11?a[0]:t%1...
  function me (line 161) | function me(e,t,a){var n={mm:"хвилина_хвилини_хвилин",hh:"година_години_...
  function Wn (line 161) | function Wn(e,t){var n={nominative:"січень_лютий_березень_квітень_травен...
  function Un (line 161) | function Un(e,t){var n={nominative:"неділя_понеділок_вівторок_середа_чет...
  function de (line 161) | function de(e){return function(){return e+"о"+(11===this.hours()?"б":"")...
  function e (line 167) | function e(){var i=document.createElement('bootstrap'),e={WebkitTransiti...
  function r (line 167) | function r(){o.detach().trigger('closed.bs.alert').remove()}
  function o (line 167) | function o(i){return this.each(function(){var n=t(this),o=n.data('bs.ale...
  function i (line 169) | function i(i){return this.each(function(){var n=t(this),o=n.data('bs.but...
  function i (line 170) | function i(i){return this.each(function(){var s=t(this),o=s.data('bs.car...
  function o (line 171) | function o(e){var i,o=e.attr('data-target')||(i=e.attr('href'))&&i.repla...
  function i (line 171) | function i(i){return this.each(function(){var s=t(this),o=s.data('bs.col...
  function n (line 171) | function n(e){if(e&&e.which===3)return;t(a).remove();t(i).each(function(...
  function o (line 171) | function o(e){var i=e.attr('data-target');if(!i){i=e.attr('href');i=i&&/...
  function s (line 171) | function s(i){return this.each(function(){var n=t(this),o=n.data('bs.dro...
  function i (line 175) | function i(i,o){return this.each(function(){var s=t(this),n=s.data('bs.m...
  function s (line 176) | function s(){if(n.hoverState!='in')o.detach();n.$element.removeAttr('ari...
  function i (line 179) | function i(i){return this.each(function(){var n=t(this),o=n.data('bs.too...
  function i (line 179) | function i(i){return this.each(function(){var n=t(this),o=n.data('bs.pop...
  function e (line 179) | function e(i,o){this.$body=t(document.body);this.$scrollElement=t(i).is(...
  function i (line 179) | function i(i){return this.each(function(){var n=t(this),o=n.data('bs.scr...
  function r (line 179) | function r(){s.removeClass('active').find('> .dropdown-menu > .active')....
  function o (line 180) | function o(i){return this.each(function(){var n=t(this),o=n.data('bs.tab...
  function i (line 180) | function i(i){return this.each(function(){var n=t(this),o=n.data('bs.aff...
  function t (line 181) | function t(e){return e.replace(/&/gm,'&amp;').replace(/</gm,'&lt;').repl...
  function l (line 181) | function l(e){return e.nodeName.toLowerCase()}
  function u (line 181) | function u(e,t){var r=e&&e.exec(t);return r&&0==r.index}
  function N (line 181) | function N(e){var t=(e.className+' '+(e.parentNode?e.parentNode.classNam...
  function o (line 181) | function o(e,t){var n={};for(var r in e)n[r]=e[r];if(t)for(var r in t)n[...
  function b (line 181) | function b(e){var t=[];return function r(e,n){for(var a=e.firstChild;a;a...
  function y (line 181) | function y(e,r,i){function p(){return e.length&&r.length?e[0].offset!=r[...
  function v (line 182) | function v(e){function n(e){return e&&e.source||e};function t(t,r){retur...
  function s (line 182) | function s(e,o,h,M){function B(e,t){for(var r=0;r<t.c.length;r++)if(u(t....
  function c (line 182) | function c(e,a){a=a||r.languages||Object.keys(n);var c={r:0,value:t(e)},...
  function f (line 182) | function f(e){return r.tabReplace&&(e=e.replace(/^((<[^>]+>|\t)+)/gm,fun...
  function w (line 182) | function w(e,t,r){var a=t?d[t]:r,n=[e.trim()];return e.match(/(\s|^)hljs...
  function p (line 182) | function p(e){var a=N(e);if(!/no(-?)highlight/.test(a)){var n;r.useBR?(n...
  function k (line 182) | function k(e){r=o(r,e)}
  function a (line 182) | function a(){if(!a.called){a.called=!0;var e=document.querySelectorAll('...
  function m (line 182) | function m(){addEventListener('DOMContentLoaded',a,!1),addEventListener(...
  function g (line 182) | function g(t,r){var a=n[t]=r(e);a.aliases&&a.aliases.forEach(function(e)...
  function h (line 182) | function h(){return Object.keys(n)}
  function i (line 182) | function i(e){return n[e]||n[d[e]]}
Condensed preview — 379 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,917K chars).
[
  {
    "path": ".gitignore",
    "chars": 591,
    "preview": "# Cache and logs (Symfony2)\n/app/cache/*\n/app/logs/*\n!app/cache/.gitkeep\n!app/logs/.gitkeep\n\n# Cache and logs (Symfony3)"
  },
  {
    "path": ".travis.yml",
    "chars": 731,
    "preview": "language: php\n\nsudo: required\n\ncache:\n  directories:\n    - $HOME/.composer/cache/files\n\nmatrix:\n  fast_finish: true\n  in"
  },
  {
    "path": "LICENSE",
    "chars": 1078,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Alfonso M.\n\nPermission is hereby granted, free of charge, to any person obtain"
  },
  {
    "path": "README.md",
    "chars": 6892,
    "preview": "# The Symfony Demo Application on Roids!\n[![Build Status](https://travis-ci.org/alfonsomga/symfony.demo.on.roids.svg)](h"
  },
  {
    "path": "app/.htaccess",
    "chars": 143,
    "preview": "<IfModule mod_authz_core.c>\n    Require all denied\n</IfModule>\n<IfModule !mod_authz_core.c>\n    Order deny,allow\n    Den"
  },
  {
    "path": "app/AppCache.php",
    "chars": 101,
    "preview": "<?php\n\nuse Symfony\\Bundle\\FrameworkBundle\\HttpCache\\HttpCache;\n\nclass AppCache extends HttpCache\n{\n}\n"
  },
  {
    "path": "app/AppKernel.php",
    "chars": 3166,
    "preview": "<?php\n\nuse Symfony\\Component\\HttpKernel\\Kernel;\nuse Symfony\\Component\\Config\\Loader\\LoaderInterface;\n\nclass AppKernel ex"
  },
  {
    "path": "app/Resources/TwigBundle/views/Exception/error.html.twig",
    "chars": 947,
    "preview": "{#\n    This template is used to render any error different from 403, 404 and 500.\n\n    This is the simplest way to custo"
  },
  {
    "path": "app/Resources/TwigBundle/views/Exception/error403.html.twig",
    "chars": 898,
    "preview": "{#\n    This template is used to render errors of type HTTP 403 (Forbidden)\n\n    This is the simplest way to customize er"
  },
  {
    "path": "app/Resources/TwigBundle/views/Exception/error404.html.twig",
    "chars": 877,
    "preview": "{#\n    This template is used to render errors of type HTTP 404 (Not Found)\n\n    This is the simplest way to customize er"
  },
  {
    "path": "app/Resources/TwigBundle/views/Exception/error500.html.twig",
    "chars": 891,
    "preview": "{#\n    This template is used to render errors of type HTTP 500 (Internal Server Error)\n\n    This is the simplest way to "
  },
  {
    "path": "app/Resources/assets/css/font-lato.css",
    "chars": 750,
    "preview": "@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Lato Regular'), local('Lato-"
  },
  {
    "path": "app/Resources/assets/css/highlight-solarized-light.css",
    "chars": 1616,
    "preview": "/*\n\nOrginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>\n\n*/\n\n.hljs {\n  display: block"
  },
  {
    "path": "app/Resources/assets/js/bootstrap-3.3.4.js",
    "chars": 67546,
    "preview": "/*!\n * Bootstrap v3.3.4 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "app/Resources/assets/js/highlight.pack.js",
    "chars": 21544,
    "preview": "!function(e){\"undefined\"!=typeof exports?e(exports):(window.hljs=e({}),\"function\"==typeof define&&define.amd&&define([],"
  },
  {
    "path": "app/Resources/assets/js/jquery-2.1.4.js",
    "chars": 247597,
    "preview": "/*!\n * jQuery JavaScript Library v2.1.4\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Cop"
  },
  {
    "path": "app/Resources/assets/js/main.js",
    "chars": 1627,
    "preview": "/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the full copyr"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_alerts.scss",
    "chars": 1550,
    "preview": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_badges.scss",
    "chars": 1230,
    "preview": "//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  m"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_breadcrumbs.scss",
    "chars": 595,
    "preview": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: $breadcrumb-padding-v"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_button-groups.scss",
    "chars": 5721,
    "preview": "//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-gro"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_buttons.scss",
    "chars": 3691,
    "preview": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_carousel.scss",
    "chars": 5479,
    "preview": "//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_close.scss",
    "chars": 815,
    "preview": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: ($font-s"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_code.scss",
    "chars": 1401,
    "preview": "//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\nco"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_component-animations.scss",
    "chars": 819,
    "preview": "//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `."
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_dropdowns.scss",
    "chars": 4783,
    "preview": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display:"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_forms.scss",
    "chars": 15281,
    "preview": "//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_glyphicons.scss",
    "chars": 20411,
    "preview": "//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus a"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_grid.scss",
    "chars": 1443,
    "preview": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container wi"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_input-groups.scss",
    "chars": 4243,
    "preview": "//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.i"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_jumbotron.scss",
    "chars": 984,
    "preview": "//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: $jumbotron-padding ($jum"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_labels.scss",
    "chars": 1156,
    "preview": "//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3e"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_list-group.scss",
    "chars": 3070,
    "preview": "//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_media.scss",
    "chars": 780,
    "preview": ".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_mixins.scss",
    "chars": 957,
    "preview": "// Mixins\n// --------------------------------------------------\n\n// Utilities\n@import \"mixins/hide-text\";\n@import \"mixin"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_modals.scss",
    "chars": 3612,
    "preview": "//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scr"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_navbar.scss",
    "chars": 14729,
    "preview": "//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static n"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_navs.scss",
    "chars": 4950,
    "preview": "//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// ------------------------------------"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_normalize.scss",
    "chars": 7650,
    "preview": "/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prev"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_pager.scss",
    "chars": 855,
    "preview": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: $li"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_pagination.scss",
    "chars": 2033,
    "preview": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_panels.scss",
    "chars": 6249,
    "preview": "//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: $line-heigh"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_popovers.scss",
    "chars": 3517,
    "preview": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_print.scss",
    "chars": 2133,
    "preview": "/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// =============================="
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_progress-bars.scss",
    "chars": 1992,
    "preview": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -----------------------"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_responsive-embed.scss",
    "chars": 546,
    "preview": "// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n  position: relative;\n  display:"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_responsive-utilities.scss",
    "chars": 4390,
    "preview": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n/"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_scaffolding.scss",
    "chars": 3166,
    "preview": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This r"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_tables.scss",
    "chars": 4662,
    "preview": "//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: $table-bg;\n}\ncaption {\n"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_theme.scss",
    "chars": 8165,
    "preview": "\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables\";\n@impor"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_thumbnails.scss",
    "chars": 892,
    "preview": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.th"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_tooltip.scss",
    "chars": 2953,
    "preview": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  "
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_type.scss",
    "chars": 6146,
    "preview": "//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_utilities.scss",
    "chars": 765,
    "preview": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.c"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_variables.scss",
    "chars": 30826,
    "preview": "$bootstrap-sass-asset-helper: false !default;\n//\n// Variables\n// --------------------------------------------------\n\n\n//"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/_wells.scss",
    "chars": 535,
    "preview": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding:"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/flatly-theme/_bootswatch.scss",
    "chars": 4749,
    "preview": "// Flatly 3.3.4 theme by https://bootswatch.com/flatly/\n// Bootswatch\n// -----------------------------------------------"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/flatly-theme/_variables.scss",
    "chars": 27154,
    "preview": "// Flatly 3.3.4 theme by https://bootswatch.com/flatly/\n// Variables\n// ------------------------------------------------"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_alerts.scss",
    "chars": 263,
    "preview": "// Alerts\n\n@mixin alert-variant($background, $border, $text-color) {\n  background-color: $background;\n  border-color: $b"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_background-variant.scss",
    "chars": 212,
    "preview": "// Contextual backgrounds\n\n// [converter] $parent hack\n@mixin bg-variant($parent, $color) {\n  #{$parent} {\n    backgroun"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_border-radius.scss",
    "chars": 492,
    "preview": "// Single side border-radius\n\n@mixin border-top-radius($radius) {\n  border-top-right-radius: $radius;\n   border-top-left"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_buttons.scss",
    "chars": 1092,
    "preview": "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_center-block.scss",
    "chars": 126,
    "preview": "// Center-align a block level element\n\n@mixin center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: au"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_clearfix.scss",
    "chars": 611,
    "preview": "// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contentedi"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_forms.scss",
    "chars": 2771,
    "preview": "// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and succ"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_gradients.scss",
    "chars": 4392,
    "preview": "// Gradients\n\n\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_grid-framework.scss",
    "chars": 2347,
    "preview": "// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any va"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_grid.scss",
    "chars": 3190,
    "preview": "// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n@mixin container-f"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_hide-text.scss",
    "chars": 594,
    "preview": "// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins be"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_image.scss",
    "chars": 1208,
    "preview": "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the "
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_labels.scss",
    "chars": 167,
    "preview": "// Labels\n\n@mixin label-variant($color) {\n  background-color: $color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      back"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_list-group.scss",
    "chars": 593,
    "preview": "// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n  .list-group-item-#{$state} {\n    color: "
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_nav-divider.scss",
    "chars": 238,
    "preview": "// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: #e5e5"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_nav-vertical-align.scss",
    "chars": 370,
    "preview": "// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_opacity.scss",
    "chars": 149,
    "preview": "// Opacity\n\n@mixin opacity($opacity) {\n  opacity: $opacity;\n  // IE8 filter\n  $opacity-ie: ($opacity * 100);\n  filter: a"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_pagination.scss",
    "chars": 460,
    "preview": "// Pagination\n\n@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $border-radius) {\n  > li {\n   "
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_panels.scss",
    "chars": 543,
    "preview": "// Panels\n\n@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {\n  border-color: $bor"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_progress-bar.scss",
    "chars": 200,
    "preview": "// Progress bars\n\n@mixin progress-bar-variant($color) {\n  background-color: $color;\n\n  // Deprecated parent class requir"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_reset-filter.scss",
    "chars": 246,
    "preview": "// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the I"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_resize.scss",
    "chars": 202,
    "preview": "// Resize anything\n\n@mixin resizable($direction) {\n  resize: $direction; // Options: horizontal, vertical, both\n  overfl"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_responsive-visibility.scss",
    "chars": 503,
    "preview": "// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n// [converter] $parent "
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_size.scss",
    "chars": 147,
    "preview": "// Sizing shortcuts\n\n@mixin size($width, $height) {\n  width: $width;\n  height: $height;\n}\n\n@mixin square($size) {\n  @inc"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_tab-focus.scss",
    "chars": 165,
    "preview": "// WebKit-style focus\n\n@mixin tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_table-row.scss",
    "chars": 715,
    "preview": "// Tables\n\n@mixin table-row-variant($state, $background) {\n  // Exact selectors below required to override `.table-strip"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_text-emphasis.scss",
    "chars": 189,
    "preview": "// Typography\n\n// [converter] $parent hack\n@mixin text-emphasis-variant($parent, $color) {\n  #{$parent} {\n    color: $co"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_text-overflow.scss",
    "chars": 168,
    "preview": "// Text overflow\n// Requires inline-block or block for proper styling\n\n@mixin text-overflow() {\n  overflow: hidden;\n  te"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap/mixins/_vendor-prefixes.scss",
    "chars": 6642,
    "preview": "// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our"
  },
  {
    "path": "app/Resources/assets/scss/bootstrap.scss",
    "chars": 1485,
    "preview": "// Core variables and mixins\n@import \"bootstrap/variables\";\n@import \"bootstrap/mixins\";\n\n// Flatly Theme\n@import \"bootst"
  },
  {
    "path": "app/Resources/assets/scss/font-awesome/_animated.scss",
    "chars": 715,
    "preview": "// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite line"
  },
  {
    "path": "app/Resources/assets/scss/font-awesome/_bordered-pulled.scss",
    "chars": 332,
    "preview": "// Bordered & Pulled\n// -------------------------\n\n.#{$fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: so"
  },
  {
    "path": "app/Resources/assets/scss/font-awesome/_core.scss",
    "chars": 513,
    "preview": "// Base Class Definition\n// -------------------------\n\n.#{$fa-css-prefix} {\n  display: inline-block;\n  font: normal norm"
  },
  {
    "path": "app/Resources/assets/scss/font-awesome/_fixed-width.scss",
    "chars": 120,
    "preview": "// Fixed Width Icons\n// -------------------------\n.#{$fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "app/Resources/assets/scss/font-awesome/_icons.scss",
    "chars": 37883,
    "preview": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters th"
  },
  {
    "path": "app/Resources/assets/scss/font-awesome/_larger.scss",
    "chars": 375,
    "preview": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.#{$fa-css-pr"
  },
  {
    "path": "app/Resources/assets/scss/font-awesome/_list.scss",
    "chars": 378,
    "preview": "// List Icons\n// -------------------------\n\n.#{$fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: $fa-li-width;\n  li"
  },
  {
    "path": "app/Resources/assets/scss/font-awesome/_mixins.scss",
    "chars": 1000,
    "preview": "// Mixins\n// --------------------------\n\n@mixin fa-icon() {\n  display: inline-block;\n  font: normal normal normal #{$fa-"
  },
  {
    "path": "app/Resources/assets/scss/font-awesome/_path.scss",
    "chars": 783,
    "preview": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('#{$fa-font-path}/f"
  },
  {
    "path": "app/Resources/assets/scss/font-awesome/_rotated-flipped.scss",
    "chars": 672,
    "preview": "// Rotated & Flipped Icons\n// -------------------------\n\n.#{$fa-css-prefix}-rotate-90  { @include fa-icon-rotate(90deg, "
  },
  {
    "path": "app/Resources/assets/scss/font-awesome/_stacked.scss",
    "chars": 482,
    "preview": "// Stacked Icons\n// -------------------------\n\n.#{$fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;"
  },
  {
    "path": "app/Resources/assets/scss/font-awesome/_variables.scss",
    "chars": 16877,
    "preview": "// Variables\n// --------------------------\n\n$fa-font-path:        \"../fonts/font-awesome\" !default;\n$fa-font-size-base: "
  },
  {
    "path": "app/Resources/assets/scss/font-awesome.scss",
    "chars": 561,
    "preview": "/*!\n *  Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/lice"
  },
  {
    "path": "app/Resources/assets/scss/main.scss",
    "chars": 5136,
    "preview": "/*!\n *  Symfony Demo Application by @symfony\n *  License: MIT License\n */\n\n@import \"bootstrap/variables\";\n@import \"boots"
  },
  {
    "path": "app/Resources/translations/messages.ca.xliff",
    "chars": 12171,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.cs.xliff",
    "chars": 10828,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.de.xliff",
    "chars": 12898,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.en.xliff",
    "chars": 12526,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.es.xliff",
    "chars": 12442,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.fr.xliff",
    "chars": 10831,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.id.xliff",
    "chars": 10682,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.it.xliff",
    "chars": 10783,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.ja.xliff",
    "chars": 10017,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.nl.xliff",
    "chars": 11836,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.pl.xliff",
    "chars": 12787,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.pt_BR.xliff",
    "chars": 12558,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.ro.xliff",
    "chars": 12863,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.ru.xliff",
    "chars": 12862,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/messages.uk.xliff",
    "chars": 12788,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.ca.xliff",
    "chars": 1750,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.cs.xliff",
    "chars": 1871,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.de.xliff",
    "chars": 1573,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.en.xliff",
    "chars": 1657,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.es.xliff",
    "chars": 1770,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.fr.xliff",
    "chars": 1736,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.id.xliff",
    "chars": 1659,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.it.xliff",
    "chars": 1698,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.ja.xliff",
    "chars": 1507,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.nl.xliff",
    "chars": 1659,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.pl.xliff",
    "chars": 1668,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.pt_BR.xliff",
    "chars": 1711,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.ro.xliff",
    "chars": 1699,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.ru.xliff",
    "chars": 1735,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/translations/validators.uk.xliff",
    "chars": 1694,
    "preview": "<?xml version=\"1.0\"?>\n<xliff version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\">\n    <file source-language=\"en\""
  },
  {
    "path": "app/Resources/views/admin/blog/_form.html.twig",
    "chars": 914,
    "preview": "{#\n    By default, forms enable client-side validation. This means that you can't\n    test the server-side validation er"
  },
  {
    "path": "app/Resources/views/admin/blog/edit.html.twig",
    "chars": 822,
    "preview": "{% extends 'admin/layout.html.twig' %}\n\n{% block body_id 'admin_post_edit' %}\n\n{% block main %}\n    <h1>{{ 'title.edit_p"
  },
  {
    "path": "app/Resources/views/admin/blog/index.html.twig",
    "chars": 2845,
    "preview": "{% extends 'admin/layout.html.twig' %}\n\n{% block body_id 'admin_post_index' %}\n\n{% block main %}\n    <h1>{{ 'title.post_"
  },
  {
    "path": "app/Resources/views/admin/blog/new.html.twig",
    "chars": 840,
    "preview": "{% extends 'admin/layout.html.twig' %}\n\n{% block body_id 'admin_post_new' %}\n\n{% block main %}\n    <h1>{{ 'title.post_ne"
  },
  {
    "path": "app/Resources/views/admin/blog/show.html.twig",
    "chars": 1424,
    "preview": "{% extends 'admin/layout.html.twig' %}\n\n{% block body_id 'admin_post_show' %}\n\n{% block main %}\n    <h1>{{ post.title }}"
  },
  {
    "path": "app/Resources/views/admin/layout.html.twig",
    "chars": 800,
    "preview": "{#\n   This is the base template of the all backend pages. Since this layout is similar\n   to the global layout, we inher"
  },
  {
    "path": "app/Resources/views/base.html.twig",
    "chars": 8545,
    "preview": "{#\n   This is the base template used as the application layout which contains the\n   common elements and decorates all t"
  },
  {
    "path": "app/Resources/views/blog/_comment_form.html.twig",
    "chars": 1451,
    "preview": "{#\n    By default, forms enable client-side validation. This means that you can't\n    test the server-side validation er"
  },
  {
    "path": "app/Resources/views/blog/_delete_post_confirmation.html.twig",
    "chars": 810,
    "preview": "{# Bootstrap modal, see http://getbootstrap.com/javascript/#modals #}\n<div class=\"modal fade\" id=\"confirmationModal\" tab"
  },
  {
    "path": "app/Resources/views/blog/comment_form_error.html.twig",
    "chars": 262,
    "preview": "{% extends 'base.html.twig' %}\n\n{% block body_id 'comment_form_error' %}\n\n{% block main %}\n    <h1 class=\"text-danger\">{"
  },
  {
    "path": "app/Resources/views/blog/index.html.twig",
    "chars": 866,
    "preview": "{% extends 'base.html.twig' %}\n\n{% block body_id 'blog_index' %}\n\n{% block main %}\n    {% for post in posts %}\n        <"
  },
  {
    "path": "app/Resources/views/blog/post_show.html.twig",
    "chars": 4731,
    "preview": "{% extends 'base.html.twig' %}\n\n{% block body_id 'blog_post_show' %}\n\n{% block main %}\n    <h1>{{ post.title }}</h1>\n\n  "
  },
  {
    "path": "app/Resources/views/default/_flash_messages.html.twig",
    "chars": 951,
    "preview": "{#\n   This is a template fragment designed to be included in other templates\n   See http://symfony.com/doc/current/book/"
  },
  {
    "path": "app/Resources/views/default/homepage.html.twig",
    "chars": 1571,
    "preview": "{% extends 'base.html.twig' %}\n\n{% block body_id 'homepage' %}\n\n{#\n    the homepage is a special page which displays nei"
  },
  {
    "path": "app/Resources/views/form/fields.html.twig",
    "chars": 604,
    "preview": "{#\n   Each field type is rendered by a template fragment, which is determined\n   by the value of your getName() method a"
  },
  {
    "path": "app/Resources/views/security/login.html.twig",
    "chars": 4207,
    "preview": "{% extends 'base.html.twig' %}\n\n{% block body_id 'login' %}\n\n{% block main %}\n    {% if error %}\n        <div class=\"ale"
  },
  {
    "path": "app/SymfonyRequirements.php",
    "chars": 31511,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "app/autoload.php",
    "chars": 325,
    "preview": "<?php\n\nuse Doctrine\\Common\\Annotations\\AnnotationRegistry;\nuse Composer\\Autoload\\ClassLoader;\n\nerror_reporting(error_rep"
  },
  {
    "path": "app/check.php",
    "chars": 3943,
    "preview": "<?php\n\nrequire_once dirname(__FILE__).'/SymfonyRequirements.php';\n\n$lineSize = 70;\n$symfonyRequirements = new SymfonyReq"
  },
  {
    "path": "app/config/config.yml",
    "chars": 4465,
    "preview": "# This is the main configuration file of your application. It stores all the\n# common options for every execution enviro"
  },
  {
    "path": "app/config/config_dev.yml",
    "chars": 943,
    "preview": "imports:\n    - { resource: config.yml }\n    - { resource: '@RabbitMQBundle/Resources/config/config_dev.yml' }\n\nframework"
  },
  {
    "path": "app/config/config_prod.yml",
    "chars": 535,
    "preview": "imports:\n    - { resource: config.yml }\n\n#framework:\n#    validation:\n#        cache: apc\n\n#doctrine:\n#    orm:\n#       "
  },
  {
    "path": "app/config/config_test.yml",
    "chars": 1214,
    "preview": "imports:\n    - { resource: config_dev.yml }\n    - { resource: '@RabbitMQBundle/Resources/config/config_test.yml' }\n\nfram"
  },
  {
    "path": "app/config/parameters.yml.dist",
    "chars": 2117,
    "preview": "# This file defines the canonical configuration parameters of the application.\n# Symfony uses this file as a template to"
  },
  {
    "path": "app/config/routing.yml",
    "chars": 1599,
    "preview": "# These first lines load the all routes defined as @Route() annotations in any\n# controller defined inside the src/AppBu"
  },
  {
    "path": "app/config/routing_dev.yml",
    "chars": 238,
    "preview": "_wdt:\n    resource: \"@WebProfilerBundle/Resources/config/routing/wdt.xml\"\n    prefix:   /_wdt\n\n_profiler:\n    resource: "
  },
  {
    "path": "app/config/security.yml",
    "chars": 2541,
    "preview": "security:\n    encoders:\n        # Our user class and the algorithm we'll use to encode passwords\n        # http://symfon"
  },
  {
    "path": "app/config/services.yml",
    "chars": 1690,
    "preview": "services:\n    # First we define some basic services to make these utilities available in\n    # the entire application\n  "
  },
  {
    "path": "app/console",
    "chars": 880,
    "preview": "#!/usr/bin/env php\n<?php\n\nuse Symfony\\Bundle\\FrameworkBundle\\Console\\Application;\nuse Symfony\\Component\\Console\\Input\\Ar"
  },
  {
    "path": "app/logs/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "app/phpunit.xml.dist",
    "chars": 1496,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<!-- http://phpunit.de/manual/current/en/appendixes.configuration.html -->\n<phpu"
  },
  {
    "path": "composer.json",
    "chars": 3776,
    "preview": "{\n    \"name\": \"alfonsomga/symfony.demo.on.roids\",\n    \"license\": \"MIT\",\n    \"type\": \"project\",\n    \"description\": \"The S"
  },
  {
    "path": "src/.htaccess",
    "chars": 143,
    "preview": "<IfModule mod_authz_core.c>\n    Require all denied\n</IfModule>\n<IfModule !mod_authz_core.c>\n    Order deny,allow\n    Den"
  },
  {
    "path": "src/AppBundle/AppBundle.php",
    "chars": 1671,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Command/AddUserCommand.php",
    "chars": 10547,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Command/DeleteUserCommand.php",
    "chars": 4822,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Command/ListUsersCommand.php",
    "chars": 5466,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Controller/Admin/BlogController.php",
    "chars": 8193,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Controller/BlogController.php",
    "chars": 4124,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Controller/SecurityController.php",
    "chars": 1981,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/DataFixtures/ORM/LoadFixtures.php",
    "chars": 6847,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Entity/Comment.php",
    "chars": 2764,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Entity/Post.php",
    "chars": 5137,
    "preview": "<?php\n\nnamespace AppBundle\\Entity;\n\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Doctrine\\Common\\Collections\\ArrayCollection;\nus"
  },
  {
    "path": "src/AppBundle/Entity/User.php",
    "chars": 3780,
    "preview": "<?php\n\nnamespace AppBundle\\Entity;\n\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Component\\Security\\Core\\User\\UserInterf"
  },
  {
    "path": "src/AppBundle/EventListener/RedirectToPreferredLocaleListener.php",
    "chars": 2857,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Form/CommentType.php",
    "chars": 1659,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Form/PostType.php",
    "chars": 2194,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Form/Type/DateTimePickerType.php",
    "chars": 1667,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Repository/PostRepository.php",
    "chars": 1099,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Repository/UserRepository.php",
    "chars": 798,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Tests/Controller/Admin/BlogControllerTest.php",
    "chars": 2220,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Tests/Controller/BlogControllerTest.php",
    "chars": 1034,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Tests/Controller/DefaultControllerTest.php",
    "chars": 2496,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Tests/Utils/SluggerTest.php",
    "chars": 1199,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Twig/AppExtension.php",
    "chars": 2733,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Utils/Markdown.php",
    "chars": 1154,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Utils/MomentFormatConverter.php",
    "chars": 1345,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/AppBundle/Utils/Slugger.php",
    "chars": 728,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/CodeExplorerBundle/CodeExplorerBundle.php",
    "chars": 427,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/CodeExplorerBundle/DependencyInjection/CodeExplorerExtension.php",
    "chars": 857,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/CodeExplorerBundle/EventListener/ControllerListener.php",
    "chars": 1609,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/CodeExplorerBundle/Resources/config/services.yml",
    "chars": 533,
    "preview": "services:\n    code_explorer.twig.source_code_extension:\n        public:    false\n        class:     CodeExplorerBundle\\T"
  },
  {
    "path": "src/CodeExplorerBundle/Resources/views/source_code.html.twig",
    "chars": 1672,
    "preview": "<div class=\"section source-code\">\n    <p>\n        {{ 'help.show_code'|trans|raw }}\n    </p>\n\n    <button type=\"button\" c"
  },
  {
    "path": "src/CodeExplorerBundle/Twig/SourceCodeExtension.php",
    "chars": 4672,
    "preview": "<?php\n\n/*\n * This file is part of the Symfony package.\n *\n * (c) Fabien Potencier <fabien@symfony.com>\n *\n * For the ful"
  },
  {
    "path": "src/ElasticSearchBundle/Controller/ElasticSearchController.php",
    "chars": 1653,
    "preview": "<?php\n\nnamespace ElasticSearchBundle\\Controller;\n\nuse Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller;\nuse Symfony\\"
  },
  {
    "path": "src/ElasticSearchBundle/ElasticSearchBundle.php",
    "chars": 133,
    "preview": "<?php\n\nnamespace ElasticSearchBundle;\n\nuse Symfony\\Component\\HttpKernel\\Bundle\\Bundle;\n\nclass ElasticSearchBundle extend"
  },
  {
    "path": "src/ElasticSearchBundle/Resources/config/config.yml",
    "chars": 888,
    "preview": "fos_elastica:\n    clients:\n        default: { host: localhost, port: 9200 }\n    indexes:\n        app:\n            index_"
  }
]

// ... and 179 more files (download for full content)

About this extraction

This page contains the full source code of the alfonsomga/symfony.demo.on.roids GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 379 files (1.7 MB), approximately 508.3k tokens, and a symbol index with 755 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!