.gitignore000066400000000000000000000004471516074605400130630ustar00rootroot00000000000000cache/ vendor/ build/ *.diff *.err *.orig *.log *.rej *.swo *.swp *.zip *.vi *~ *.sass-cache .DS_Store ._* Thumbs.db .cache .project .settings .tmproj *.esproj nbproject *.sublime-project *.sublime-workspace .hg .svn .CVS .idea node_modules config.ini cache.properties composer.phar phpunit.xml .htaccess000066400000000000000000000004431516074605400126650ustar00rootroot00000000000000 Options -MultiViews +SymLinksIfOwnerMatch RewriteEngine On #RewriteBase /path/to/gitlist/ RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [L,NC] order allow,deny deny from all .travis.yml000066400000000000000000000002341516074605400131760ustar00rootroot00000000000000language: php before_script: - curl -s http://getcomposer.org/installer | php - php composer.phar install --dev php: - 5.3 - 5.4 script: phpunit INSTALL.md000066400000000000000000000047111516074605400125210ustar00rootroot00000000000000# GitList Installation * Download GitList from [gitlist.org](http://gitlist.org/) and decompress to your `/var/www/gitlist` folder, or anywhere else you want to place GitList. * Rename the `config.ini-example` file to `config.ini`. * Open up the `config.ini` and configure your installation. You'll have to provide where your repositories are located and the base GitList URL (in our case, http://localhost/gitlist). * Create the cache folder and give read/write permissions to your web server user: ``` cd /var/www/gitlist mkdir cache chmod 777 cache ``` That's it, installation complete! ## Webserver configuration Apache is the "default" webserver for GitList. You will find the configuration inside the `.htaccess` file. However, nginx and lighttpd are also supported. ### nginx server.conf ``` server { server_name MYSERVER; access_log /var/log/nginx/MYSERVER.access.log combined; error_log /var/log/nginx/MYSERVER.error.log error; root /var/www/DIR; index index.php; # auth_basic "Restricted"; # auth_basic_user_file .htpasswd; location = /robots.txt { allow all; log_not_found off; access_log off; } location ~* ^/index.php.*$ { fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # if you're using php5-fpm via tcp fastcgi_pass 127.0.0.1:9000; # if you're using php5-fpm via socket #fastcgi_pass unix:/var/run/php5-fpm.sock; include /etc/nginx/fastcgi_params; } location / { try_files $uri @gitlist; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { add_header Vary "Accept-Encoding"; expires max; try_files $uri @gitlist; tcp_nodelay off; tcp_nopush on; } # location ~* \.(git|svn|patch|htaccess|log|route|plist|inc|json|pl|po|sh|ini|sample|kdev4)$ { # deny all; # } location @gitlist { rewrite ^/.*$ /index.php; } } ``` ### lighttpd ``` # GitList is located in /var/www/gitlist server.document-root = "/var/www" url.rewrite-once = ( "^/gitlist/web/.+" => "$0", "^/gitlist/favicon\.ico$" => "$0", "^/gitlist(/[^\?]*)(\?.*)?" => "/gitlist/index.php$1$2" ) ``` ### hiawatha ``` UrlToolkit { ToolkitID = gitlist RequestURI isfile Return # If you have example.com/gitlist/ ; Otherwise remove "/gitlist" below Match ^/gitlist/.* Rewrite /gitlist/index.php Match ^/gitlist/.*\.ini DenyAccess } ``` LICENSE.txt000066400000000000000000000027051516074605400127150ustar00rootroot00000000000000Copyright (c) 2012, Klaus Silveira and contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of GitList nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. README.md000066400000000000000000000123561516074605400123540ustar00rootroot00000000000000# GitList: an elegant git repository viewer [![Build Status](https://secure.travis-ci.org/klaussilveira/gitlist.png)](http://travis-ci.org/klaussilveira/gitlist) GitList is an elegant and modern web interface for interacting with multiple git repositories. It allows you to browse repositories using your favorite browser, viewing files under different revisions, commit history, diffs. It also generates RSS feeds for each repository, allowing you to stay up-to-date with the latest changes anytime, anywhere. GitList was written in PHP, on top of the [Silex](http://silex.sensiolabs.org/) microframework and powered by the Twig template engine. This means that GitList is easy to install and easy to customize. Also, the GitList gorgeous interface was made possible due to [Bootstrap](http://twitter.github.com/bootstrap/). ## Features * Multiple repository support * Multiple branch support * Multiple tag support * Commit history, blame, diff * RSS feeds * Syntax highlighting * Repository statistics ## Screenshots [![GitList Screenshot](http://dl.dropbox.com/u/62064441/th1.jpg)](http://cloud.github.com/downloads/klaussilveira/gitlist/1.jpg) [![GitList Screenshot](http://dl.dropbox.com/u/62064441/th2.jpg)](http://cloud.github.com/downloads/klaussilveira/gitlist/2.jpg) [![GitList Screenshot](http://dl.dropbox.com/u/62064441/th3.jpg)](http://cloud.github.com/downloads/klaussilveira/gitlist/3.jpg) [![GitList Screenshot](http://dl.dropbox.com/u/62064441/th4.jpg)](http://cloud.github.com/downloads/klaussilveira/gitlist/4.jpg) [![GitList Screenshot](http://dl.dropbox.com/u/62064441/th5.jpg)](http://cloud.github.com/downloads/klaussilveira/gitlist/5.jpg) You can also see a live demo [here](http://gitlist-khornberg.rhcloud.com/). ## Requirements In order to run GitList on your server, you'll need: * git * Apache with mod_rewrite enabled or nginx * PHP 5.3.3 ## Installation * Download GitList from [gitlist.org](http://gitlist.org/) and decompress to your `/var/www/gitlist` folder, or anywhere else you want to place GitList. * Do not download a branch or tag from GitHub, unless you want to use the development version. The version available for download at the website already has all dependencies bundled, so you don't have to use composer or any other tool * Rename the `config.ini-example` file to `config.ini`. * Open up the `config.ini` and configure your installation. You'll have to provide where your repositories are located. * In case GitList isn't accessed through the root of the website, open .htaccess and edit RewriteBase (for example, /gitlist/ if GitList is accessed through http://localhost/gitlist/). * Create the cache folder and give read/write permissions to your web server user: ``` cd /var/www/gitlist mkdir cache chmod 777 cache ``` That's it, installation complete! If you're having problems, check the [Troubleshooting](https://github.com/klaussilveira/gitlist/wiki/Troubleshooting) page. ## Authors and contributors * [Klaus Silveira](http://www.klaussilveira.com) (Creator, developer) ## License [New BSD license](http://www.opensource.org/licenses/bsd-license.php) ## Todo * improve the current test code coverage * test the interface * submodule support * multilanguage support ## Development GitList uses [Composer](http://getcomposer.org/) to manage dependencies and [Ant](http://ant.apache.org/) to build the project. In order to run all the targets in the build script, you will need [PHPUnit](http://www.phpunit.de/), [phpcpd](https://github.com/sebastianbergmann/phpcpd), [phploc](https://github.com/sebastianbergmann/phploc), [PHPMD](http://phpmd.org/) and [PHP_Depend](http://pdepend.org). Once you have all the dependencies set, you can clone the repository and run Ant: ``` git clone https://github.com/klaussilveira/gitlist.git ant ``` If you just want to get the project dependencies, instead of building everything: ``` git clone https://github.com/klaussilveira/gitlist.git curl -s http://getcomposer.org/installer | php php composer.phar install ``` If you have Composer in your path, things get easier. But you know the drill. ## Contributing If you are a developer, we need your help. GitList is a young project and we have lot's of stuff to do. Some developers are contributing with new features, others with bug fixes. But you can also dedicate yourself to refactoring the current codebase and improving what we already have. This is very important, we want GitList to be a state-of-the-art application, and we need your help for that. * Stay tuned to possible bugs, suboptimal code, duplicated code, overcomplicated expressions and unused code with [PHPMD](http://ci.gitlist.org:8080/job/GitList%20\(master\)/9/pmdResult/?) in our CI server * Try to fix any [violations](http://ci.gitlist.org:8080/job/GitList%20\(master\)/violations/) reported * Improve the [test coverage](http://ci.gitlist.org:8080/job/GitList%20\(master\)/9/cloverphp-report/) by creating unit and functional tests ## Further information If you want to know more about customizing GitList, check the [Customization](https://github.com/klaussilveira/gitlist/wiki/Customizing) page on the wiki. Also, if you're having problems with GitList, check the [Troubleshooting](https://github.com/klaussilveira/gitlist/wiki/Troubleshooting) page. Don't forget to report issues and suggest new features! :) boot.php000066400000000000000000000006631516074605400125470ustar00rootroot00000000000000mount('', new GitList\Controller\MainController()); $app->mount('', new GitList\Controller\BlobController()); $app->mount('', new GitList\Controller\CommitController()); $app->mount('', new GitList\Controller\TreeController()); $app->mount('', new GitList\Controller\NetworkController()); return $app; build.xml000066400000000000000000000101101516074605400127000ustar00rootroot00000000000000 cache/000077500000000000000000000000001516074605400121315ustar00rootroot00000000000000cache/.gitkeep000066400000000000000000000000001516074605400135500ustar00rootroot00000000000000composer.json000066400000000000000000000010721516074605400136100ustar00rootroot00000000000000{ "name": "klaussilveira/gitlist", "require": { "silex/silex": "1.*", "twig/twig": "1.*", "symfony/twig-bridge": "2.3.*", "symfony/filesystem": "2.3.*", "klaussilveira/gitter": "0.2.*" }, "require-dev": { "symfony/browser-kit": "2.3.*", "symfony/css-selector": "2.3.*", "phpunit/phpunit": "3.7.*", "phpmd/phpmd": "1.5.*", "phploc/phploc": "2.0.*" }, "minimum-stability": "stable", "autoload": { "psr-0": { "GitList": "src/" } } } composer.lock000066400000000000000000001630561516074605400136020ustar00rootroot00000000000000{ "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" ], "hash": "7da88707f9633dd77c76d56060cc3832", "packages": [ { "name": "klaussilveira/gitter", "version": "0.2.0", "source": { "type": "git", "url": "https://github.com/klaussilveira/gitter.git", "reference": "910a3d324caf53d8d21b55fb80a9a6735974a80c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/klaussilveira/gitter/zipball/910a3d324caf53d8d21b55fb80a9a6735974a80c", "reference": "910a3d324caf53d8d21b55fb80a9a6735974a80c", "shasum": "" }, "require": { "php": ">=5.3.0", "symfony/process": ">=2.2" }, "require-dev": { "phpunit/phpunit": ">=3.7.1", "symfony/filesystem": ">=2.2" }, "type": "library", "autoload": { "psr-0": { "Gitter": "lib/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-2-Clause" ], "authors": [ { "name": "Klaus Silveira", "email": "klaussilveira@php.net", "homepage": "http://www.klaussilveira.com/", "role": "Developer" } ], "description": "Gitter allows you to interact in an object oriented manner with Git repositories.", "homepage": "https://github.com/klaussilveira/gitter", "keywords": [ "git", "vcs" ], "time": "2013-06-01 13:32:37" }, { "name": "pimple/pimple", "version": "v1.0.2", "source": { "type": "git", "url": "https://github.com/fabpot/Pimple.git", "reference": "ae11e57e8c2bb414b2ff93396dbbfc0eb92feb94" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/fabpot/Pimple/zipball/ae11e57e8c2bb414b2ff93396dbbfc0eb92feb94", "reference": "ae11e57e8c2bb414b2ff93396dbbfc0eb92feb94", "shasum": "" }, "require": { "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-0": { "Pimple": "lib/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" } ], "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", "homepage": "http://pimple.sensiolabs.org", "keywords": [ "container", "dependency injection" ], "time": "2013-03-08 08:21:40" }, { "name": "psr/log", "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", "shasum": "" }, "type": "library", "autoload": { "psr-0": { "Psr\\Log\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "http://www.php-fig.org/" } ], "description": "Common interface for logging libraries", "keywords": [ "log", "psr", "psr-3" ], "time": "2012-12-21 11:40:51" }, { "name": "silex/silex", "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/fabpot/Silex.git", "reference": "a4d3f85ffbd6946b69f142f2965f56cb35ee95ea" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/fabpot/Silex/zipball/a4d3f85ffbd6946b69f142f2965f56cb35ee95ea", "reference": "a4d3f85ffbd6946b69f142f2965f56cb35ee95ea", "shasum": "" }, "require": { "php": ">=5.3.3", "pimple/pimple": "1.*", "symfony/event-dispatcher": ">=2.3,<2.4-dev", "symfony/http-foundation": ">=2.3,<2.4-dev", "symfony/http-kernel": ">=2.3,<2.4-dev", "symfony/routing": ">=2.3,<2.4-dev" }, "require-dev": { "doctrine/dbal": ">=2.2.0,<2.4.0-dev", "monolog/monolog": "~1.4,>=1.4.1", "phpunit/phpunit": "~3.7", "swiftmailer/swiftmailer": "5.*", "symfony/browser-kit": ">=2.3,<2.4-dev", "symfony/config": ">=2.3,<2.4-dev", "symfony/css-selector": ">=2.3,<2.4-dev", "symfony/dom-crawler": ">=2.3,<2.4-dev", "symfony/finder": ">=2.3,<2.4-dev", "symfony/form": ">=2.3,<2.4-dev", "symfony/locale": ">=2.3,<2.4-dev", "symfony/monolog-bridge": ">=2.3,<2.4-dev", "symfony/options-resolver": ">=2.3,<2.4-dev", "symfony/process": ">=2.3,<2.4-dev", "symfony/security": ">=2.3,<2.4-dev", "symfony/serializer": ">=2.3,<2.4-dev", "symfony/translation": ">=2.3,<2.4-dev", "symfony/twig-bridge": ">=2.3,<2.4-dev", "symfony/validator": ">=2.3,<2.4-dev", "twig/twig": ">=1.8.0,<2.0-dev" }, "suggest": { "symfony/browser-kit": ">=2.3,<2.4-dev", "symfony/css-selector": ">=2.3,<2.4-dev", "symfony/dom-crawler": ">=2.3,<2.4-dev", "symfony/form": ">=2.3,<2.4-dev" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.1.x-dev" } }, "autoload": { "psr-0": { "Silex": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Igor Wiedler", "email": "igor@wiedler.ch", "homepage": "http://wiedler.ch/igor/" } ], "description": "The PHP micro-framework based on the Symfony2 Components", "homepage": "http://silex.sensiolabs.org", "keywords": [ "microframework" ], "time": "2013-07-04 07:15:36" }, { "name": "symfony/debug", "version": "v2.3.4", "target-dir": "Symfony/Component/Debug", "source": { "type": "git", "url": "https://github.com/symfony/Debug.git", "reference": "729f6d19cfc401c4942e43fcc1059103bd6df130" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Debug/zipball/729f6d19cfc401c4942e43fcc1059103bd6df130", "reference": "729f6d19cfc401c4942e43fcc1059103bd6df130", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "symfony/http-foundation": "~2.1", "symfony/http-kernel": "~2.1" }, "suggest": { "symfony/class-loader": "", "symfony/http-foundation": "", "symfony/http-kernel": "" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\Debug\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Debug Component", "homepage": "http://symfony.com", "time": "2013-08-08 14:16:10" }, { "name": "symfony/event-dispatcher", "version": "v2.3.4", "target-dir": "Symfony/Component/EventDispatcher", "source": { "type": "git", "url": "https://github.com/symfony/EventDispatcher.git", "reference": "41c9826457c65fa3cf746f214985b7ca9cba42f8" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/41c9826457c65fa3cf746f214985b7ca9cba42f8", "reference": "41c9826457c65fa3cf746f214985b7ca9cba42f8", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "symfony/dependency-injection": "~2.0" }, "suggest": { "symfony/dependency-injection": "", "symfony/http-kernel": "" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\EventDispatcher\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony EventDispatcher Component", "homepage": "http://symfony.com", "time": "2013-07-21 12:12:18" }, { "name": "symfony/filesystem", "version": "v2.3.4", "target-dir": "Symfony/Component/Filesystem", "source": { "type": "git", "url": "https://github.com/symfony/Filesystem.git", "reference": "87acbbef6d35ba649f96f09cc572c45119b360c3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Filesystem/zipball/87acbbef6d35ba649f96f09cc572c45119b360c3", "reference": "87acbbef6d35ba649f96f09cc572c45119b360c3", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\Filesystem\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Filesystem Component", "homepage": "http://symfony.com", "time": "2013-07-21 12:12:18" }, { "name": "symfony/http-foundation", "version": "v2.3.4", "target-dir": "Symfony/Component/HttpFoundation", "source": { "type": "git", "url": "https://github.com/symfony/HttpFoundation.git", "reference": "fdf130fe65457aedbc4639a22f4ef9d3be5c002c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/fdf130fe65457aedbc4639a22f4ef9d3be5c002c", "reference": "fdf130fe65457aedbc4639a22f4ef9d3be5c002c", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\HttpFoundation\\": "" }, "classmap": [ "Symfony/Component/HttpFoundation/Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony HttpFoundation Component", "homepage": "http://symfony.com", "time": "2013-08-26 05:49:51" }, { "name": "symfony/http-kernel", "version": "v2.3.4", "target-dir": "Symfony/Component/HttpKernel", "source": { "type": "git", "url": "https://github.com/symfony/HttpKernel.git", "reference": "9d35da40f07bbe7a4f8dfbc41555d2b69de674bf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/9d35da40f07bbe7a4f8dfbc41555d2b69de674bf", "reference": "9d35da40f07bbe7a4f8dfbc41555d2b69de674bf", "shasum": "" }, "require": { "php": ">=5.3.3", "psr/log": "~1.0", "symfony/debug": "~2.3", "symfony/event-dispatcher": "~2.1", "symfony/http-foundation": "~2.2" }, "require-dev": { "symfony/browser-kit": "~2.2", "symfony/class-loader": "~2.1", "symfony/config": "~2.0", "symfony/console": "~2.2", "symfony/dependency-injection": "~2.0", "symfony/finder": "~2.0", "symfony/process": "~2.0", "symfony/routing": "~2.2", "symfony/stopwatch": "~2.2", "symfony/templating": "~2.2" }, "suggest": { "symfony/browser-kit": "", "symfony/class-loader": "", "symfony/config": "", "symfony/console": "", "symfony/dependency-injection": "", "symfony/finder": "" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\HttpKernel\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony HttpKernel Component", "homepage": "http://symfony.com", "time": "2013-08-27 08:58:24" }, { "name": "symfony/process", "version": "v2.3.4", "target-dir": "Symfony/Component/Process", "source": { "type": "git", "url": "https://github.com/symfony/Process.git", "reference": "1e91553e1cedd0b8fb1da6ea4f89b02e21713d5b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Process/zipball/1e91553e1cedd0b8fb1da6ea4f89b02e21713d5b", "reference": "1e91553e1cedd0b8fb1da6ea4f89b02e21713d5b", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\Process\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Process Component", "homepage": "http://symfony.com", "time": "2013-08-22 06:42:25" }, { "name": "symfony/routing", "version": "v2.3.4", "target-dir": "Symfony/Component/Routing", "source": { "type": "git", "url": "https://github.com/symfony/Routing.git", "reference": "69af3f07dbf3ae93dd513dbc373f561cb2e7f143" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Routing/zipball/69af3f07dbf3ae93dd513dbc373f561cb2e7f143", "reference": "69af3f07dbf3ae93dd513dbc373f561cb2e7f143", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "doctrine/common": "~2.2", "psr/log": "~1.0", "symfony/config": "~2.2", "symfony/yaml": "~2.0" }, "suggest": { "doctrine/common": "", "symfony/config": "", "symfony/yaml": "" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\Routing\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Routing Component", "homepage": "http://symfony.com", "time": "2013-08-23 15:14:07" }, { "name": "symfony/twig-bridge", "version": "v2.3.4", "target-dir": "Symfony/Bridge/Twig", "source": { "type": "git", "url": "https://github.com/symfony/TwigBridge.git", "reference": "0d12c4c785db544c73ad5a87dcdd44b466d753a2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/TwigBridge/zipball/0d12c4c785db544c73ad5a87dcdd44b466d753a2", "reference": "0d12c4c785db544c73ad5a87dcdd44b466d753a2", "shasum": "" }, "require": { "php": ">=5.3.3", "twig/twig": "~1.11" }, "require-dev": { "symfony/form": "~2.2", "symfony/http-kernel": "~2.2", "symfony/routing": "~2.2", "symfony/security": "~2.0", "symfony/templating": "~2.1", "symfony/translation": "~2.2", "symfony/yaml": "~2.0" }, "suggest": { "symfony/form": "", "symfony/http-kernel": "", "symfony/routing": "", "symfony/security": "", "symfony/templating": "", "symfony/translation": "", "symfony/yaml": "" }, "type": "symfony-bridge", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Bridge\\Twig\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Twig Bridge", "homepage": "http://symfony.com", "time": "2013-08-13 20:18:00" }, { "name": "twig/twig", "version": "v1.13.2", "source": { "type": "git", "url": "https://github.com/fabpot/Twig.git", "reference": "6d6a1009427d1f398c9d40904147bf9f723d5755" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/fabpot/Twig/zipball/6d6a1009427d1f398c9d40904147bf9f723d5755", "reference": "6d6a1009427d1f398c9d40904147bf9f723d5755", "shasum": "" }, "require": { "php": ">=5.2.4" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.13-dev" } }, "autoload": { "psr-0": { "Twig_": "lib/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Armin Ronacher", "email": "armin.ronacher@active-4.com" } ], "description": "Twig, the flexible, fast, and secure template language for PHP", "homepage": "http://twig.sensiolabs.org", "keywords": [ "templating" ], "time": "2013-08-03 15:35:31" } ], "packages-dev": [ { "name": "pdepend/pdepend", "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", "reference": "6fcfb7666c95f341b42f02c94a47b3a51ed484e0" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/pdepend/pdepend/zipball/6fcfb7666c95f341b42f02c94a47b3a51ed484e0", "reference": "6fcfb7666c95f341b42f02c94a47b3a51ed484e0", "shasum": "" }, "require": { "php": ">=5.2.3" }, "bin": [ "src/bin/pdepend" ], "type": "library", "notification-url": "https://packagist.org/downloads/", "description": "Official version of pdepend to be handled with Composer", "time": "2013-07-25 19:23:48" }, { "name": "phploc/phploc", "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phploc.git", "reference": "2d81bba7621b5b2c0644525f489fbee3e64ca03d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phploc/zipball/2d81bba7621b5b2c0644525f489fbee3e64ca03d", "reference": "2d81bba7621b5b2c0644525f489fbee3e64ca03d", "shasum": "" }, "require": { "php": ">=5.3.3", "sebastian/finder-facade": ">=1.1.0", "sebastian/git": ">=1.0.0", "sebastian/version": ">=1.0.0", "symfony/console": ">=2.2.0" }, "bin": [ "composer/bin/phploc" ], "type": "library", "extra": { "branch-alias": { "dev-master": "2.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "A tool for quickly measuring the size of a PHP project.", "homepage": "https://github.com/sebastianbergmann/phploc", "time": "2013-09-04 08:30:10" }, { "name": "phpmd/phpmd", "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", "reference": "692b7b1b64518091b2b1bea91b489dbb13598c07" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpmd/phpmd/zipball/692b7b1b64518091b2b1bea91b489dbb13598c07", "reference": "692b7b1b64518091b2b1bea91b489dbb13598c07", "shasum": "" }, "require": { "pdepend/pdepend": ">=1.1.1", "php": ">=5.3.0" }, "bin": [ "src/bin/phpmd" ], "type": "library", "notification-url": "https://packagist.org/downloads/", "include-path": [ "../../pdepend/pdepend/src/main/php", "src/main/php" ], "description": "Official version of PHPMD handled with Composer.", "time": "2013-07-26 14:47:02" }, { "name": "phpunit/php-code-coverage", "version": "1.2.13", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", "reference": "466e7cd2554b4e264c9e3f31216d25ac0e5f3d94" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/466e7cd2554b4e264c9e3f31216d25ac0e5f3d94", "reference": "466e7cd2554b4e264c9e3f31216d25ac0e5f3d94", "shasum": "" }, "require": { "php": ">=5.3.3", "phpunit/php-file-iterator": ">=1.3.0@stable", "phpunit/php-text-template": ">=1.1.1@stable", "phpunit/php-token-stream": ">=1.1.3@stable" }, "require-dev": { "phpunit/phpunit": "3.7.*@dev" }, "suggest": { "ext-dom": "*", "ext-xdebug": ">=2.0.5" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.2.x-dev" } }, "autoload": { "classmap": [ "PHP/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ "coverage", "testing", "xunit" ], "time": "2013-09-10 08:14:32" }, { "name": "phpunit/php-file-iterator", "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", "reference": "16a78140ed2fc01b945cfa539665fadc6a038029" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/16a78140ed2fc01b945cfa539665fadc6a038029", "reference": "16a78140ed2fc01b945cfa539665fadc6a038029", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "File/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "FilterIterator implementation that filters files based on a list of suffixes.", "homepage": "http://www.phpunit.de/", "keywords": [ "filesystem", "iterator" ], "time": "2012-10-11 11:44:38" }, { "name": "phpunit/php-text-template", "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", "reference": "5180896f51c5b3648ac946b05f9ec02be78a0b23" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5180896f51c5b3648ac946b05f9ec02be78a0b23", "reference": "5180896f51c5b3648ac946b05f9ec02be78a0b23", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "Text/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Simple template engine.", "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ "template" ], "time": "2012-10-31 18:15:28" }, { "name": "phpunit/php-timer", "version": "1.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "PHP/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Utility class for timing", "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ "timer" ], "time": "2013-08-02 07:42:54" }, { "name": "phpunit/php-token-stream", "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", "reference": "5220af2a7929aa35cf663d97c89ad3d50cf5fa3e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/5220af2a7929aa35cf663d97c89ad3d50cf5fa3e", "reference": "5220af2a7929aa35cf663d97c89ad3d50cf5fa3e", "shasum": "" }, "require": { "ext-tokenizer": "*", "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.2-dev" } }, "autoload": { "classmap": [ "PHP/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Wrapper around PHP's tokenizer extension.", "homepage": "https://github.com/sebastianbergmann/php-token-stream/", "keywords": [ "tokenizer" ], "time": "2013-09-13 04:58:23" }, { "name": "phpunit/phpunit", "version": "3.7.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", "reference": "4b024e753e3421837afbcca962c8724c58b39376" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4b024e753e3421837afbcca962c8724c58b39376", "reference": "4b024e753e3421837afbcca962c8724c58b39376", "shasum": "" }, "require": { "ext-dom": "*", "ext-pcre": "*", "ext-reflection": "*", "ext-spl": "*", "php": ">=5.3.3", "phpunit/php-code-coverage": "~1.2.1", "phpunit/php-file-iterator": ">=1.3.1", "phpunit/php-text-template": ">=1.1.1", "phpunit/php-timer": ">=1.0.4", "phpunit/phpunit-mock-objects": "~1.2.0", "symfony/yaml": "~2.0" }, "require-dev": { "pear-pear/pear": "1.9.4" }, "suggest": { "ext-json": "*", "ext-simplexml": "*", "ext-tokenizer": "*", "phpunit/php-invoker": ">=1.1.0,<1.2.0" }, "bin": [ "composer/bin/phpunit" ], "type": "library", "extra": { "branch-alias": { "dev-master": "3.7.x-dev" } }, "autoload": { "classmap": [ "PHPUnit/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "", "../../symfony/yaml/" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "The PHP Unit Testing framework.", "homepage": "http://www.phpunit.de/", "keywords": [ "phpunit", "testing", "xunit" ], "time": "2013-09-16 03:09:52" }, { "name": "phpunit/phpunit-mock-objects", "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", "reference": "5794e3c5c5ba0fb037b11d8151add2a07fa82875" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/5794e3c5c5ba0fb037b11d8151add2a07fa82875", "reference": "5794e3c5c5ba0fb037b11d8151add2a07fa82875", "shasum": "" }, "require": { "php": ">=5.3.3", "phpunit/php-text-template": ">=1.1.1@stable" }, "suggest": { "ext-soap": "*" }, "type": "library", "autoload": { "classmap": [ "PHPUnit/" ] }, "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sb@sebastian-bergmann.de", "role": "lead" } ], "description": "Mock Object library for PHPUnit", "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", "keywords": [ "mock", "xunit" ], "time": "2013-01-13 10:24:48" }, { "name": "sebastian/finder-facade", "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/finder-facade.git", "reference": "1e396fda3449fce9df032749fa4fa2619e0347e0" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/1e396fda3449fce9df032749fa4fa2619e0347e0", "reference": "1e396fda3449fce9df032749fa4fa2619e0347e0", "shasum": "" }, "require": { "symfony/finder": ">=2.2.0", "theseer/fdomdocument": ">=1.3.1" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.", "homepage": "https://github.com/sebastianbergmann/finder-facade", "time": "2013-05-28 06:10:03" }, { "name": "sebastian/git", "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/git.git", "reference": "a99fbc102e982c1404041ef3e4d431562b29bcba" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/git/zipball/a99fbc102e982c1404041ef3e4d431562b29bcba", "reference": "a99fbc102e982c1404041ef3e4d431562b29bcba", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.2-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Simple wrapper for Git", "homepage": "http://www.github.com/sebastianbergmann/git", "keywords": [ "git" ], "time": "2013-08-04 09:35:29" }, { "name": "sebastian/version", "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", "reference": "5d879c9144bf41d5a06132f3d194c01ef6c6b3f4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/5d879c9144bf41d5a06132f3d194c01ef6c6b3f4", "reference": "5d879c9144bf41d5a06132f3d194c01ef6c6b3f4", "shasum": "" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", "time": "2013-05-29 10:02:00" }, { "name": "symfony/browser-kit", "version": "v2.3.4", "target-dir": "Symfony/Component/BrowserKit", "source": { "type": "git", "url": "https://github.com/symfony/BrowserKit.git", "reference": "2639dc4eec81f92760e05396a93bb78000b4f5ca" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/BrowserKit/zipball/2639dc4eec81f92760e05396a93bb78000b4f5ca", "reference": "2639dc4eec81f92760e05396a93bb78000b4f5ca", "shasum": "" }, "require": { "php": ">=5.3.3", "symfony/dom-crawler": "~2.0" }, "require-dev": { "symfony/css-selector": "~2.0", "symfony/process": "~2.0" }, "suggest": { "symfony/process": "" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\BrowserKit\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony BrowserKit Component", "homepage": "http://symfony.com", "time": "2013-07-21 12:12:18" }, { "name": "symfony/console", "version": "v2.3.4", "target-dir": "Symfony/Component/Console", "source": { "type": "git", "url": "https://github.com/symfony/Console.git", "reference": "db78f8ff7fc9e28d25ff9a0bf6ddf9f0e35fbbe3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Console/zipball/db78f8ff7fc9e28d25ff9a0bf6ddf9f0e35fbbe3", "reference": "db78f8ff7fc9e28d25ff9a0bf6ddf9f0e35fbbe3", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "symfony/event-dispatcher": "~2.1" }, "suggest": { "symfony/event-dispatcher": "" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\Console\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Console Component", "homepage": "http://symfony.com", "time": "2013-08-17 16:34:49" }, { "name": "symfony/css-selector", "version": "v2.3.4", "target-dir": "Symfony/Component/CssSelector", "source": { "type": "git", "url": "https://github.com/symfony/CssSelector.git", "reference": "885544201cb24e79754da1dbd61bd779c2e4353e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/CssSelector/zipball/885544201cb24e79754da1dbd61bd779c2e4353e", "reference": "885544201cb24e79754da1dbd61bd779c2e4353e", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\CssSelector\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" }, { "name": "Jean-François Simon", "email": "jeanfrancois.simon@sensiolabs.com" } ], "description": "Symfony CssSelector Component", "homepage": "http://symfony.com", "time": "2013-07-21 12:12:18" }, { "name": "symfony/dom-crawler", "version": "v2.3.4", "target-dir": "Symfony/Component/DomCrawler", "source": { "type": "git", "url": "https://github.com/symfony/DomCrawler.git", "reference": "e05e07fe8958a304b5e135f8e65d4ae6148cf59b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/e05e07fe8958a304b5e135f8e65d4ae6148cf59b", "reference": "e05e07fe8958a304b5e135f8e65d4ae6148cf59b", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "symfony/css-selector": "~2.0" }, "suggest": { "symfony/css-selector": "" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\DomCrawler\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony DomCrawler Component", "homepage": "http://symfony.com", "time": "2013-07-21 12:12:18" }, { "name": "symfony/finder", "version": "v2.3.4", "target-dir": "Symfony/Component/Finder", "source": { "type": "git", "url": "https://github.com/symfony/Finder.git", "reference": "4a0fee5b86f5bbd9dfdc11ec124eba2915737ce1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Finder/zipball/4a0fee5b86f5bbd9dfdc11ec124eba2915737ce1", "reference": "4a0fee5b86f5bbd9dfdc11ec124eba2915737ce1", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\Finder\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Finder Component", "homepage": "http://symfony.com", "time": "2013-08-13 20:18:00" }, { "name": "symfony/yaml", "version": "v2.3.4", "target-dir": "Symfony/Component/Yaml", "source": { "type": "git", "url": "https://github.com/symfony/Yaml.git", "reference": "5a279f1b5f5e1045a6c432354d9ea727ff3a9847" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/Yaml/zipball/5a279f1b5f5e1045a6c432354d9ea727ff3a9847", "reference": "5a279f1b5f5e1045a6c432354d9ea727ff3a9847", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-0": { "Symfony\\Component\\Yaml\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" } ], "description": "Symfony Yaml Component", "homepage": "http://symfony.com", "time": "2013-08-24 15:26:22" }, { "name": "theseer/fdomdocument", "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/theseer/fDOMDocument.git", "reference": "871515e1a48aa216627ad7cbfc3516d0838578e1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/871515e1a48aa216627ad7cbfc3516d0838578e1", "reference": "871515e1a48aa216627ad7cbfc3516d0838578e1", "shasum": "" }, "require": { "ext-dom": "*", "lib-libxml": "*", "php": ">=5.3.3" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "lead" } ], "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convinience and to simplify the usage of DOM.", "homepage": "https://github.com/theseer/fDOMDocument", "time": "2013-06-30 12:26:39" } ], "aliases": [ ], "minimum-stability": "stable", "stability-flags": [ ], "platform": [ ], "platform-dev": [ ] } config.ini-example000066400000000000000000000016441516074605400144720ustar00rootroot00000000000000[git] client = '/usr/bin/git' ; Your git executable path default_branch = 'master' ; Default branch when HEAD is detached repositories[] = '/home/git/repositories/' ; Path to your repositories ; If you wish to add more repositories, just add a new line ; WINDOWS USERS ;client = '"C:\Program Files (x86)\Git\bin\git.exe"' ; Your git executable path ;repositories[] = 'C:\Path\to\Repos\' ; Path to your repositories ; You can hide repositories from GitList, just copy this for each repository you want to hide ; hidden[] = '/home/git/repositories/BetaTest' [app] debug = false cache = true ; If you need to specify custom filetypes for certain extensions, do this here [filetypes] ; extension = type ; dist = xml ; If you need to set file types as binary or not, do this here [binary_filetypes] ; extension = true ; svh = false ; map = true ; set the timezone [date] ; timezone = UTC index.php000066400000000000000000000012621516074605400127070ustar00rootroot00000000000000get('date', 'timezone')) { date_default_timezone_set($config->get('date', 'timezone')); } $app = require 'boot.php'; $app->run(); phpunit.xml.dist000066400000000000000000000016131516074605400142420ustar00rootroot00000000000000 ./tests/ src pkg_builder/000077500000000000000000000000001516074605400133555ustar00rootroot00000000000000pkg_builder/Makefile000066400000000000000000000105111516074605400150130ustar00rootroot00000000000000# Main Info NAME = gitlist DESCRIPTION = "An elegant and modern git repository viewer" LICENSE = New BSD GROUP = gitlist VENDOR = gitlist.org URL = "http://www.gitlist.org" #BUILD Info PREFIX = /usr/share PROJROOT = "$(shell pwd)" SRCROOT = "$(shell pwd)/gitlist" UPSTREAM_VERSION = $(shell cat tools/release.info | head -n1 | cut -d"=" -f2) BUILD_STAMP = $(shell date +"%Y%m%d%H%M%S") #Packager Info PACKAGER = $(shell git config user.name) PACKAGER_MAIL = $(shell git config user.email) #Debian Package Info PACKAGE-VERSION= 1 DEBIAN_BUILD_ROOT = ${PROJROOT}/debian/ PROJECT_DEBIAN_LIKE_NAME=$(shell cat tools/release.info | grep name | cut -d"=" -f2) DEBIAN_NAME=$(PROJECT_DEBIAN_LIKE_NAME)$(shell echo "_")$(UPSTREAM_VERSION)-${PACKAGE-VERSION}$(shell echo "_all.deb") DEBIAN_VERSION = # Generating control file define control Package: $(PROJECT_DEBIAN_LIKE_NAME) Version: $(UPSTREAM_VERSION)-${PACKAGE-VERSION} Architecture: all Section: web Priority: optional Maintainer: "${PACKAGER} <${PACKAGER_MAIL}>" Description: ${DESCRIPTION} endef export control all: @echo "... $(UPSTREAM_VERSION)" @echo "... $(PACKAGER)" @echo "... $(PACKAGER_MAIL)" @echo "... $(DEBIAN_NAME)" help: @echo "To use this make file just:" @echo "Download the gitlist tarball and stract it into a folder called gitlist" @echo "make [build_deb|build_rpm|build(apache|nginx|lighthttp)]" clean_deb: @echo "Cleaning . . ." @rm -rf ${DEBIAN_BUILD_ROOT}/*.deb @rm -rf ${PROJROOT}/debian prepare_deb: clean_deb @echo "############################### - Building DEB" @mkdir ${DEBIAN_BUILD_ROOT} -pv @mkdir ${DEBIAN_BUILD_ROOT}/DEBIAN -pv @mkdir ${DEBIAN_BUILD_ROOT}${PREFIX}/${PROJECT_DEBIAN_LIKE_NAME} -pv copy_deb_files: prepare_deb @echo "$$control" > ${DEBIAN_BUILD_ROOT}/DEBIAN/control copy_deb: copy_deb_files @echo Sync files @rsync -avz ${SRCROOT} ${DEBIAN_BUILD_ROOT}${PREFIX}/ md5sum_deb: copy_deb @cd debian; find . -type f ! -regex '.*\.hg.*' ! -regex '.*?debian-binary.*' ! -regex '.*?DEBIAN.*' | xargs -d "\n" md5sum > DEBIAN/md5sums deb_uniq: md5sum_deb @mkdir ${PROJROOT}/pkg -p @dpkg -b debian $(DEBIAN_NAME); @mv $(DEBIAN_NAME) ${PROJROOT}/pkg/ @rm debian -rf @echo '### Wrote $(DEBIAN_NAME) in ${PROJROOT}/pkg/ . . . . . Success' build_deb: deb_uniq #### RPM STUFF RPM_NAME=$(PROJECT_DEBIAN_LIKE_NAME)$(shell echo "_")$(UPSTREAM_VERSION)-${PACKAGE-VERSION}$(shell echo "_all.rpm") DIST_DIR = dist TAR_DIR = tar RPM_DIR = rpm RPM_DIRS = SPECS RPMS SOURCES BUILD clean_rpm: @echo Cleaning temporary dirs... @rm -rf $(TAR_DIR) @rm -rf $(RPM_DIR) @rm -rf $(DIST_DIR) rpm_init: clean_rpm @echo Creating directories... @echo $(DIST_DIR) @mkdir -p $(DIST_DIR) @for dir in $(RPM_DIRS); do \ echo $(RPM_DIR)/$$dir; \ mkdir -p $(RPM_DIR)/$$dir; \ done rpm_preptar: rpm_init @echo Copying files to generate tar... @echo creating directory: $(TAR_DIR)/ @mkdir $(TAR_DIR)/ -p @rsync -avz --exclude ".git" --exclude ".gitignore" --exclude "builder" gitlist $(TAR_DIR)/ rpm_tar: rpm_preptar @echo Generating tarball... @cd $(PROJROOT)/$(TAR_DIR); \ tar cf $(PROJROOT)/$(RPM_DIR)/SOURCES/$(NAME).tar . rpm: rpm_tar @echo Calling rpmbuild... @echo Vesion: $(VERSION) @cp tools/$(NAME).spec $(RPM_DIR)/SPECS/ @cd $(PROJROOT)/$(RPM_DIR)/SPECS ; \ rpmbuild -bb \ --buildroot="$(PROJROOT)/$(RPM_DIR)/BUILD/$(NAME)" \ --define "_topdir $(PROJROOT)/$(RPM_DIR)" \ --define "name $(NAME)" \ --define "summary "$(DESCRIPTION)"" \ --define "version $(UPSTREAM_VERSION)" \ --define "release $(PACKAGE-VERSION)" \ --define "url _$(URL)_" \ --define "license $(LICENSE)" \ --define "group $(GROUP)" \ --define "vendor $(VENDOR)" \ --define "packager $(PACKAGER)" \ --define "prefix $(PREFIX)" \ --define "source_dir $(PROJROOT)/$(RPM_DIR)/SOURCES" \ $(NAME).spec @echo Copying generated RPM to dist dir... @mkdir ${PROJROOT}/pkg -p @cp $(PROJROOT)/$(RPM_DIR)/RPMS/noarch/*.rpm $(PROJROOT)/pkg @rm -rf $(TAR_DIR) @rm -rf $(RPM_DIR) @rm -rf $(DIST_DIR) build_rpm: rpm pkg_builder/README.md000066400000000000000000000015531516074605400146400ustar00rootroot00000000000000# GitList Builder: Tools to build gitlist package ## Status ### Ready to build * Core Deb Packages: ``` $ make build_deb ``` * Core Rpm Packages: ``` $ make build_rpm ``` ### Not Ready (Comming soon) Packages to install configuration files: * make apache_deb * make apache_rpm * make nginx_deb * make nginx_rpm ## Dependencies * To use this package builder you may need to install some development packages like: dpkg-dev or evem rpm; * A tarball of a stable release; ## Instructions To use this builder just download the lastest stable release into this directory and build using the make functions avaible in make help ## How to build The packages can be generated by running Makefile functions like: ``` $ make build_deb $ make build_rpm ``` ## Structure Core package is a simple source package while a configuration package requires all the dependencies. pkg_builder/tools/000077500000000000000000000000001516074605400145155ustar00rootroot00000000000000pkg_builder/tools/gitlist.spec000066400000000000000000000011051516074605400170450ustar00rootroot00000000000000Name: %{name} Summary: %{summary} Version: %{version} Release: %{release} URL: %{url} License: %{license} Group: %{group} Vendor: %{vendor} Packager: %{user} Prefix: %{prefix} BuildArch: noarch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root Source0: %{name}.tar %description %{summary} %prep %setup -c %build %install %{__rm} -rf %{buildroot} %{__mkdir} -p %{buildroot}%{prefix} %{__cp} -Ra * %{buildroot}%{prefix} %clean rm -rf %{buildroot} %files %defattr(0755,root,root) %{prefix}/* %changelog * Thu Jan 21 2013 Bruno Gurgel - Initial pkg_builder/tools/release.info000066400000000000000000000000311516074605400170040ustar00rootroot00000000000000release=0.3 name=gitlist src/000077500000000000000000000000001516074605400116555ustar00rootroot00000000000000src/GitList/000077500000000000000000000000001516074605400132345ustar00rootroot00000000000000src/GitList/Application.php000066400000000000000000000061441516074605400162150ustar00rootroot00000000000000path = realpath($root); $this['debug'] = $config->get('app', 'debug'); $this['filetypes'] = $config->getSection('filetypes'); $this['cache.archives'] = $this->getCachePath() . 'archives'; // Register services $this->register(new TwigServiceProvider(), array( 'twig.path' => $this->getViewPath(), 'twig.options' => $config->get('app', 'cache') ? array('cache' => $this->getCachePath() . 'views') : array(), )); $repositories = $config->get('git', 'repositories'); $this->register(new GitServiceProvider(), array( 'git.client' => $config->get('git', 'client'), 'git.repos' => $repositories, 'ini.file' => "config.ini", 'git.hidden' => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(), 'git.default_branch' => $config->get('git', 'default_branch') ? $config->get('git', 'default_branch') : 'master', )); $this->register(new ViewUtilServiceProvider()); $this->register(new RepositoryUtilServiceProvider()); $this->register(new UrlGeneratorServiceProvider()); $this->register(new RoutingUtilServiceProvider()); $this['twig'] = $this->share($this->extend('twig', function ($twig, $app) { $twig->addFilter('htmlentities', new \Twig_Filter_Function('htmlentities')); $twig->addFilter('md5', new \Twig_Filter_Function('md5')); return $twig; })); // Handle errors $this->error(function (\Exception $e, $code) use ($app) { if ($app['debug']) { return; } return $app['twig']->render('error.twig', array( 'message' => $e->getMessage(), )); }); } public function getPath() { return $this->path . DIRECTORY_SEPARATOR; } public function setPath($path) { $this->path = $path; return $this; } public function getCachePath() { return $this->path . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR; } public function getViewPath() { return $this->path . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR; } } src/GitList/Config.php000066400000000000000000000033371516074605400151600ustar00rootroot00000000000000validateOptions(); return $config; } public function __construct($data = array()) { $this->data = $data; } public function get($section, $option) { if (!array_key_exists($section, $this->data)) { return false; } if (!array_key_exists($option, $this->data[$section])) { return false; } return $this->data[$section][$option]; } public function getSection($section) { if (!array_key_exists($section, $this->data)) { return false; } return $this->data[$section]; } public function set($section, $option, $value) { $this->data[$section][$option] = $value; } protected function validateOptions() { $repositories = $this->get('git', 'repositories'); $atLeastOneOk = false; $atLeastOneWrong = false; foreach ($repositories as $directory) { if (!$directory || !is_dir($directory)) { $atLeastOneWrong = true; } else { $atLeastOneOk = true; } } if (!$atLeastOneOk) { die("Please, edit the config file and provide your repositories directory"); } if ($atLeastOneWrong) { die("One or more of the supplied repository paths appears to be wrong. Please, check the config file"); } } } src/GitList/Controller/000077500000000000000000000000001516074605400153575ustar00rootroot00000000000000src/GitList/Controller/BlobController.php000066400000000000000000000056061516074605400210210ustar00rootroot00000000000000get('{repo}/blob/{commitishPath}', function ($repo, $commitishPath) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); list($branch, $file) = $app['util.routing'] ->parseCommitishPathParam($commitishPath, $repo); list($branch, $file) = $app['util.repository']->extractRef($repository, $branch, $file); $blob = $repository->getBlob("$branch:\"$file\""); $breadcrumbs = $app['util.view']->getBreadcrumbs($file); $fileType = $app['util.repository']->getFileType($file); if ($fileType !== 'image' && $app['util.repository']->isBinary($file)) { return $app->redirect($app['url_generator']->generate('blob_raw', array( 'repo' => $repo, 'commitishPath' => $commitishPath, ))); } return $app['twig']->render('file.twig', array( 'file' => $file, 'fileType' => $fileType, 'blob' => $blob->output(), 'repo' => $repo, 'branch' => $branch, 'breadcrumbs' => $breadcrumbs, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', '.+') ->bind('blob'); $route->get('{repo}/raw/{commitishPath}', function ($repo, $commitishPath) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); list($branch, $file) = $app['util.routing'] ->parseCommitishPathParam($commitishPath, $repo); list($branch, $file) = $app['util.repository']->extractRef($repository, $branch, $file); $blob = $repository->getBlob("$branch:\"$file\"")->output(); $headers = array(); if ($app['util.repository']->isBinary($file)) { $headers['Content-Disposition'] = 'attachment; filename="' . $file . '"'; $headers['Content-Type'] = 'application/octet-stream'; } else { $headers['Content-Type'] = 'text/plain'; } return new Response($blob, 200, $headers); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->bind('blob_raw'); return $route; } } src/GitList/Controller/CommitController.php000066400000000000000000000126541516074605400213740ustar00rootroot00000000000000get('{repo}/commits/search', function (Request $request, $repo) use ($app) { $subRequest = Request::create( '/' . $repo . '/commits/master/search', 'POST', array('query' => $request->get('query')) ); return $app->handle($subRequest, \Symfony\Component\HttpKernel\HttpKernelInterface::SUB_REQUEST); })->assert('repo', $app['util.routing']->getRepositoryRegex()); $route->get('{repo}/commits/{commitishPath}', function ($repo, $commitishPath) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if ($commitishPath === null) { $commitishPath = $repository->getHead(); } list($branch, $file) = $app['util.routing'] ->parseCommitishPathParam($commitishPath, $repo); list($branch, $file) = $app['util.repository']->extractRef($repository, $branch, $file); $type = $file ? "$branch -- \"$file\"" : $branch; $pager = $app['util.view']->getPager($app['request']->get('page'), $repository->getTotalCommits($type)); $commits = $repository->getPaginatedCommits($type, $pager['current']); $categorized = array(); foreach ($commits as $commit) { $date = $commit->getDate(); $date = $date->format('Y-m-d'); $categorized[$date][] = $commit; } krsort($categorized); $template = $app['request']->isXmlHttpRequest() ? 'commits_list.twig' : 'commits.twig'; return $app['twig']->render($template, array( 'page' => 'commits', 'pager' => $pager, 'repo' => $repo, 'branch' => $branch, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'commits' => $categorized, 'file' => $file, )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->value('commitishPath', null) ->bind('commits'); $route->post('{repo}/commits/{branch}/search', function (Request $request, $repo, $branch = '') use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); $query = $request->get('query'); $commits = $repository->searchCommitLog($request->get('query')); $categorized = array(); foreach ($commits as $commit) { $date = $commit->getDate(); $date = $date->format('Y-m-d'); $categorized[$date][] = $commit; } krsort($categorized); return $app['twig']->render('searchcommits.twig', array( 'repo' => $repo, 'branch' => $branch, 'file' => '', 'commits' => $categorized, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'query' => $query )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('branch', $app['util.routing']->getBranchRegex()) ->bind('searchcommits'); $route->get('{repo}/commit/{commit}', function ($repo, $commit) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); $commit = $repository->getCommit($commit); $branch = $repository->getHead(); return $app['twig']->render('commit.twig', array( 'branch' => $branch, 'repo' => $repo, 'commit' => $commit, )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commit', '[a-f0-9^]+') ->bind('commit'); $route->get('{repo}/blame/{commitishPath}', function ($repo, $commitishPath) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); list($branch, $file) = $app['util.routing'] ->parseCommitishPathParam($commitishPath, $repo); list($branch, $file) = $app['util.repository']->extractRef($repository, $branch, $file); $blames = $repository->getBlame("$branch -- \"$file\""); return $app['twig']->render('blame.twig', array( 'file' => $file, 'repo' => $repo, 'branch' => $branch, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'blames' => $blames, )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->bind('blame'); return $route; } } src/GitList/Controller/MainController.php000066400000000000000000000052221516074605400210210ustar00rootroot00000000000000get('/', function() use ($app) { $repositories = $app['git']->getRepositories($app['git.repos']); return $app['twig']->render('index.twig', array( 'repositories' => $repositories, )); })->bind('homepage'); $route->get('/refresh', function(Request $request) use ($app ) { # Go back to calling page return $app->redirect($request->headers->get('Referer')); })->bind('refresh'); $route->get('{repo}/stats/{branch}', function($repo, $branch) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if ($branch === null) { $branch = $repository->getHead(); } $stats = $repository->getStatistics($branch); $authors = $repository->getAuthorStatistics($branch); return $app['twig']->render('stats.twig', array( 'repo' => $repo, 'branch' => $branch, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'stats' => $stats, 'authors' => $authors, )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('branch', $app['util.routing']->getBranchRegex()) ->value('branch', null) ->bind('stats'); $route->get('{repo}/{branch}/rss/', function($repo, $branch) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if ($branch === null) { $branch = $repository->getHead(); } $commits = $repository->getPaginatedCommits($branch); $html = $app['twig']->render('rss.twig', array( 'repo' => $repo, 'branch' => $branch, 'commits' => $commits, )); return new Response($html, 200, array('Content-Type' => 'application/rss+xml')); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('branch', $app['util.routing']->getBranchRegex()) ->value('branch', null) ->bind('rss'); return $route; } } src/GitList/Controller/NetworkController.php000066400000000000000000000114021516074605400215630ustar00rootroot00000000000000get('{repo}/network/{commitishPath}/{page}.json', function ($repo, $commitishPath, $page) use ($app) { /** @var $repository Repository */ $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if ($commitishPath === null) { $commitishPath = $repository->getHead(); } $pager = $app['util.view']->getPager($page, $repository->getTotalCommits($commitishPath)); $commits = $repository->getPaginatedCommits($commitishPath, $pager['current']); $jsonFormattedCommits = array(); foreach ($commits as $commit) { $detailsUrl = $app['url_generator']->generate( 'commit', array( 'repo' => $repo, 'commit' => $commit->getHash() ) ); $jsonFormattedCommits[$commit->getHash()] = array( 'hash' => $commit->getHash(), 'parentsHash' => $commit->getParentsHash(), 'date' => $commit->getDate()->format('U'), 'message' => htmlentities($commit->getMessage()), 'details' => $detailsUrl, 'author' => array( 'name' => $commit->getAuthor()->getName(), 'email' => $commit->getAuthor()->getEmail(), // due to the lack of a inbuilt javascript md5 mechanism, build the full avatar url on the php side 'image' => 'http://gravatar.com/avatar/' . md5( strtolower($commit->getAuthor()->getEmail()) ) . '?s=40' ) ); } $nextPageUrl = null; if ($pager['last'] !== $pager['current']) { $nextPageUrl = $app['url_generator']->generate( 'networkData', array( 'repo' => $repo, 'commitishPath' => $commitishPath, 'page' => $pager['next'] ) ); } // when no commits are given, return an empty response - issue #369 if( count($commits) === 0 ) { return $app->json( array( 'repo' => $repo, 'commitishPath' => $commitishPath, 'nextPage' => null, 'start' => null, 'commits' => $jsonFormattedCommits ), 200 ); } return $app->json( array( 'repo' => $repo, 'commitishPath' => $commitishPath, 'nextPage' => $nextPageUrl, 'start' => $commits[0]->getHash(), 'commits' => $jsonFormattedCommits ), 200 ); } )->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->value('commitishPath', null) ->assert('page', '\d+') ->value('page', '0') ->bind('networkData'); $route->get( '{repo}/network/{commitishPath}', function ($repo, $commitishPath) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if ($commitishPath === null) { $commitishPath = $repository->getHead(); } list($branch, $file) = $app['util.routing']->parseCommitishPathParam($commitishPath, $repo); list($branch, $file) = $app['util.repository']->extractRef($repository, $branch, $file); return $app['twig']->render( 'network.twig', array( 'repo' => $repo, 'branch' => $branch, 'commitishPath' => $commitishPath, ) ); } )->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->value('commitishPath', null) ->bind('network'); return $route; } } src/GitList/Controller/TreeController.php000066400000000000000000000124021516074605400210320ustar00rootroot00000000000000get('{repo}/tree/{commitishPath}/', $treeController = function ($repo, $commitishPath = '') use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if (!$commitishPath) { $commitishPath = $repository->getHead(); } list($branch, $tree) = $app['util.routing']->parseCommitishPathParam($commitishPath, $repo); list($branch, $tree) = $app['util.repository']->extractRef($repository, $branch, $tree); $files = $repository->getTree($tree ? "$branch:\"$tree\"/" : $branch); $breadcrumbs = $app['util.view']->getBreadcrumbs($tree); $parent = null; if (($slash = strrpos($tree, '/')) !== false) { $parent = substr($tree, 0, $slash); } elseif (!empty($tree)) { $parent = ''; } return $app['twig']->render('tree.twig', array( 'files' => $files->output(), 'repo' => $repo, 'branch' => $branch, 'path' => $tree ? $tree . '/' : $tree, 'parent' => $parent, 'breadcrumbs' => $breadcrumbs, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'readme' => $app['util.repository']->getReadme($repository, $branch), )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->bind('tree'); $route->post('{repo}/tree/{branch}/search', function (Request $request, $repo, $branch = '', $tree = '') use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if (!$branch) { $branch = $repository->getHead(); } $query = $request->get('query'); $breadcrumbs = array(array('dir' => 'Search results for: ' . $query, 'path' => '')); $results = $repository->searchTree($query, $branch); return $app['twig']->render('search.twig', array( 'results' => $results, 'repo' => $repo, 'branch' => $branch, 'path' => $tree, 'breadcrumbs' => $breadcrumbs, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'query' => $query )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('branch', $app['util.routing']->getBranchRegex()) ->bind('search'); # Intentionally before next statement, because order appears # to be important, and the other statement got precedence previously. $route->get('{repo}/{format}ball/{branch}', function($repo, $format, $branch) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); $tree = $repository->getBranchTree($branch); if (false === $tree) { return $app->abort(404, 'Invalid commit or tree reference: ' . $branch); } $file = $app['cache.archives'] . DIRECTORY_SEPARATOR . $repo . DIRECTORY_SEPARATOR . substr($tree, 0, 2) . DIRECTORY_SEPARATOR . substr($tree, 2) . '.' . $format; if (!file_exists($file)) { $repository->createArchive($tree, $file, $format); } return new StreamedResponse(function () use ($file) { readfile($file); }, 200, array( 'Content-type' => ('zip' === $format) ? 'application/zip' : 'application/x-tar', 'Content-Description' => 'File Transfer', 'Content-Disposition' => 'attachment; filename="'.$repo.'-'.substr($tree, 0, 6).'.'.$format.'"', 'Content-Transfer-Encoding' => 'binary', )); })->assert('format', '(zip|tar)') ->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('branch', $app['util.routing']->getBranchRegex()) ->bind('archive'); $route->get('{repo}/{branch}/', function($repo, $branch) use ($app, $treeController) { return $treeController($repo, $branch); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('branch', $app['util.routing']->getBranchRegex()) ->bind('branch'); $route->get('{repo}/', function($repo) use ($app, $treeController) { return $treeController($repo); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->bind('repository'); return $route; } } src/GitList/Exception/000077500000000000000000000000001516074605400151725ustar00rootroot00000000000000src/GitList/Exception/BlankDataException.php000066400000000000000000000001411516074605400213770ustar00rootroot00000000000000setDefaultBranch($options['default_branch']); $this->setHidden($options['hidden']); } public function getRepositoryFromName($paths, $repo) { $repositories = $this->getRepositories($paths); $path = $repositories[$repo]['path']; return $this->getRepository($path); } /** * Searches for valid repositories on the specified path * * @param array $paths Array of paths where repositories will be searched * @return array Found repositories, containing their name, path and description */ public function getRepositories($paths) { $allRepositories = array(); foreach ($paths as $path) { $repositories = $this->recurseDirectory($path); if (empty($repositories)) { throw new \RuntimeException('There are no GIT repositories in ' . $path); } $allRepositories = array_merge($allRepositories, $repositories); } $allRepositories = array_unique($allRepositories, SORT_REGULAR); asort($allRepositories); return $allRepositories; } private function recurseDirectory($path, $topLevel = true) { $dir = new \DirectoryIterator($path); $repositories = array(); foreach ($dir as $file) { if ($file->isDot()) { continue; } if (strrpos($file->getFilename(), '.') === 0) { continue; } if (!$file->isReadable()) { continue; } if ($file->isDir()) { $isBare = file_exists($file->getPathname() . '/HEAD'); $isRepository = file_exists($file->getPathname() . '/.git/HEAD'); if ($isRepository || $isBare) { if (in_array($file->getPathname(), $this->getHidden())) { continue; } if ($isBare) { $description = $file->getPathname() . '/description'; } else { $description = $file->getPathname() . '/.git/description'; } if (file_exists($description)) { $description = file_get_contents($description); } else { $description = null; } if (!$topLevel) { $repoName = $file->getPathInfo()->getFilename() . '/' . $file->getFilename(); } else { $repoName = $file->getFilename(); } $repositories[$repoName] = array( 'name' => $repoName, 'path' => $file->getPathname(), 'description' => $description ); continue; } else { $repositories = array_merge($repositories, $this->recurseDirectory($file->getPathname(), false)); } } } return $repositories; } /** * Set default branch as a string. * * @param string $branch Name of branch to use when repo's HEAD is detached. */ protected function setDefaultBranch($branch) { $this->defaultBranch = $branch; return $this; } /** * Return name of default branch as a string. */ public function getDefaultBranch() { return $this->defaultBranch; } /** * Get hidden repository list * * @return array List of repositories to hide */ protected function getHidden() { return $this->hidden; } /** * Set the hidden repository list * * @param array $hidden List of repositories to hide */ protected function setHidden($hidden) { $this->hidden = $hidden; return $this; } /** * Overloads the parent::createRepository method for the correct Repository class instance * * {@inheritdoc} */ public function createRepository($path, $bare = null) { if (file_exists($path . '/.git/HEAD') && !file_exists($path . '/HEAD')) { throw new \RuntimeException('A GIT repository already exists at ' . $path); } $repository = new Repository($path, $this); return $repository->create($bare); } /** * Overloads the parent::getRepository method for the correct Repository class instance * * {@inheritdoc} */ public function getRepository($path) { if (!file_exists($path) || !file_exists($path . '/.git/HEAD') && !file_exists($path . '/HEAD')) { throw new \RuntimeException('There is no GIT repository at ' . $path); } return new Repository($path, $this); } } src/GitList/Git/Repository.php000066400000000000000000000270041516074605400166520ustar00rootroot00000000000000getClient()->run($this, "show $commitHash"); $logs = explode("\n", $logs); return strpos($logs[0], 'commit') === 0; } /** * Get the current branch, returning a default value when HEAD is detached. */ public function getHead($default = null) { $client = $this->getClient(); return parent::getHead($client->getDefaultBranch()); } /** * Show the data from a specific commit * * @param string $commitHash Hash of the specific commit to read data * @return array Commit data */ public function getCommit($commitHash) { $logs = $this->getClient()->run($this, "show --pretty=format:\"%H" . "%h%T%P" . "%an%ae" . "%at%cn%ce" . "%ct" . "" . "" . "\" $commitHash" ); $xmlEnd = strpos($logs, '') + 7; $commitInfo = substr($logs, 0, $xmlEnd); $commitData = substr($logs, $xmlEnd); $logs = explode("\n", $commitData); // Read commit metadata $format = new PrettyFormat; $data = $format->parse($commitInfo); $commit = new Commit; $commit->importData($data[0]); if ($commit->getParentsHash()) { $command = 'diff ' . $commitHash . '~1..' . $commitHash; $logs = explode("\n", $this->getClient()->run($this, $command)); } $commit->setDiffs($this->readDiffLogs($logs)); return $commit; } /** * Blames the provided file and parses the output * * @param string $file File that will be blamed * @return array Commits hashes containing the lines */ public function getBlame($file) { $blame = array(); $logs = $this->getClient()->run($this, "blame --root -sl $file"); $logs = explode("\n", $logs); $i = 0; $previousCommit = ''; foreach ($logs as $log) { if ($log == '') { continue; } preg_match_all("/([a-zA-Z0-9]{40})\s+.*?([0-9]+)\)(.+)/", $log, $match); $currentCommit = $match[1][0]; if ($currentCommit != $previousCommit) { ++$i; $blame[$i] = array( 'line' => '', 'commit' => $currentCommit, 'commitShort' => substr($currentCommit, 0, 8) ); } $blame[$i]['line'] .= PHP_EOL . $match[3][0]; $previousCommit = $currentCommit; } return $blame; } /** * Read diff logs and generate a collection of diffs * * @param array $logs Array of log rows * @return array Array of diffs */ public function readDiffLogs(array $logs) { $diffs = array(); $lineNumOld = 0; $lineNumNew = 0; foreach ($logs as $log) { # Skip empty lines if ($log == "") { continue; } if ('diff' === substr($log, 0, 4)) { if (isset($diff)) { $diffs[] = $diff; } $diff = new Diff; if (preg_match('/^diff --[\S]+ a\/?(.+) b\/?/', $log, $name)) { $diff->setFile($name[1]); } continue; } if ('index' === substr($log, 0, 5)) { $diff->setIndex($log); continue; } if ('---' === substr($log, 0, 3)) { $diff->setOld($log); continue; } if ('+++' === substr($log, 0, 3)) { $diff->setNew($log); continue; } // Handle binary files properly. if ('Binary' === substr($log, 0, 6)) { $m = array(); if (preg_match('/Binary files (.+) and (.+) differ/', $log, $m)) { $diff->setOld($m[1]); $diff->setNew(" {$m[2]}"); } } if (!empty($log)) { switch ($log[0]) { case "@": // Set the line numbers preg_match('/@@ -([0-9]+)/', $log, $matches); $lineNumOld = $matches[1] - 1; $lineNumNew = $matches[1] - 1; break; case "-": $lineNumOld++; break; case "+": $lineNumNew++; break; default: $lineNumOld++; $lineNumNew++; } } else { $lineNumOld++; $lineNumNew++; } if (isset($diff)) { $diff->addLine($log, $lineNumOld, $lineNumNew); } } if (isset($diff)) { $diffs[] = $diff; } return $diffs; } /** * Show the repository commit log with pagination * * @access public * @return array Commit log */ public function getPaginatedCommits($file = null, $page = 0) { $page = 15 * $page; $pager = "--skip=$page --max-count=15"; $command = "log $pager --pretty=format:\"%H" . "%h%T%P" . "%an%ae" . "%at%cn" . "%ce" . "%ct" . "\""; if ($file) { $command .= " $file"; } try { $logs = $this->getPrettyFormat($command); } catch (\RuntimeException $e) { return array(); } foreach ($logs as $log) { $commit = new Commit; $commit->importData($log); $commits[] = $commit; } return $commits; } public function searchCommitLog($query) { $query = escapeshellarg($query); $query = strtr($query, array('[' => '\\[', ']' => '\\]')); $command = "log --grep={$query} --pretty=format:\"%H" . "%h%T%P" . "%an%ae" . "%at%cn" . "%ce" . "%ct" . "\""; try { $logs = $this->getPrettyFormat($command); } catch (\RuntimeException $e) { return array(); } foreach ($logs as $log) { $commit = new Commit; $commit->importData($log); $commits[] = $commit; } return $commits; } public function searchTree($query, $branch) { $query = escapeshellarg($query); try { $results = $this->getClient()->run($this, "grep -I --line-number {$query} $branch"); } catch (\RuntimeException $e) { return false; } $results = explode("\n", $results); foreach ($results as $result) { if ($result == '') { continue; } preg_match_all('/([\w-._]+):([^:]+):([0-9]+):(.+)/', $result, $matches, PREG_SET_ORDER); $data['branch'] = $matches[0][1]; $data['file'] = $matches[0][2]; $data['line'] = $matches[0][3]; $data['match'] = $matches[0][4]; $searchResults[] = $data; } return $searchResults; } public function getAuthorStatistics($branch) { $logs = $this->getClient()->run($this, 'log --pretty=format:"%an||%ae" ' . $branch); if (empty($logs)) { throw new \RuntimeException('No statistics available'); } $logs = explode("\n", $logs); $logs = array_count_values($logs); arsort($logs); foreach ($logs as $user => $count) { $user = explode('||', $user); $data[] = array('name' => $user[0], 'email' => $user[1], 'commits' => $count); } return $data; } public function getStatistics($branch) { // Calculate amount of files, extensions and file size $logs = $this->getClient()->run($this, 'ls-tree -r -l ' . $branch); $lines = explode("\n", $logs); $files = array(); $data['extensions'] = array(); $data['size'] = 0; $data['files'] = 0; foreach ($lines as $key => $line) { if (empty($line)) { unset($lines[$key]); continue; } $files[] = preg_split("/[\s]+/", $line); } foreach ($files as $file) { if ($file[1] == 'blob') { $data['files']++; } if (is_numeric($file[3])) { $data['size'] += $file[3]; } if (($pos = strrpos($file[4], '.')) !== false) { $extension = substr($file[4], $pos); if (($pos = strrpos($extension, '/')) === false) { $data['extensions'][] = $extension; } } } $data['extensions'] = array_count_values($data['extensions']); arsort($data['extensions']); return $data; } /** * Create a TAR or ZIP archive of a git tree * * @param string $tree Tree-ish reference * @param string $output Output File name * @param string $format Archive format */ public function createArchive($tree, $output, $format = 'zip') { $fs = new Filesystem; $fs->mkdir(dirname($output)); $this->getClient()->run($this, "archive --format=$format --output='$output' $tree"); } /** * Return true if $path exists in $branch; return false otherwise. * * @param string $commitish Commitish reference; branch, tag, SHA1, etc. * @param string $path Path whose existence we want to verify. * * GRIPE Arguably belongs in Gitter, as it's generally useful functionality. * Also, this really may not be the best way to do this. */ public function pathExists($commitish, $path) { $output = $this->getClient()->run($this, "ls-tree $commitish '$path'"); if (strlen($output) > 0) { return true; } return false; } } src/GitList/Provider/000077500000000000000000000000001516074605400150265ustar00rootroot00000000000000src/GitList/Provider/GitServiceProvider.php000066400000000000000000000014641516074605400213230ustar00rootroot00000000000000share(function () use ($app) { return new Repository($app); }); } public function boot(Application $app) { } } src/GitList/Provider/RoutingUtilServiceProvider.php000066400000000000000000000011011516074605400230510ustar00rootroot00000000000000share(function () use ($app) { return new Routing($app); }); } public function boot(Application $app) { } } src/GitList/Provider/ViewUtilServiceProvider.php000066400000000000000000000010431516074605400223410ustar00rootroot00000000000000share(function () { return new View; }); } public function boot(Application $app) { } } src/GitList/Util/000077500000000000000000000000001516074605400141515ustar00rootroot00000000000000src/GitList/Util/Repository.php000066400000000000000000000151151516074605400170440ustar00rootroot00000000000000 'php', 'c' => 'clike', 'h' => 'clike', 'cpp' => 'clike', 'm' => 'clike', 'mm' => 'clike', 'ino' => 'clike', 'cs' => 'text/x-csharp', 'java' => 'text/x-java', 'clj' => 'clojure', 'coffee' => 'coffeescript', 'css' => 'css', 'diff' => 'diff', 'ecl' => 'ecl', 'el' => 'erlang', 'go' => 'go', 'groovy' => 'groovy', 'hs' => 'haskell', 'lhs' => 'haskell', 'jsp' => 'htmlembedded', 'asp' => 'htmlembedded', 'aspx' => 'htmlembedded', 'html' => 'htmlmixed', 'tpl' => 'htmlmixed', 'js' => 'javascript', 'json' => 'javascript', 'less' => 'less', 'lua' => 'lua', 'md' => 'markdown', 'markdown' => 'markdown', 'sql' => 'mysql', 'pl' => 'perl', 'pm' => 'perl', 'pas' => 'pascal', 'ini' => 'properties', 'cfg' => 'properties', 'nt' => 'ntriples', 'py' => 'python', 'rb' => 'ruby', 'rst' => 'rst', 'r' => 'r', 'sh' => 'shell', 'ss' => 'scheme', 'scala' => 'text/x-scala', 'scm' => 'scheme', 'sls' => 'scheme', 'sps' => 'scheme', 'rs' => 'rust', 'st' => 'smalltalk', 'tex' => 'stex', 'vbs' => 'vbscript', 'vb' => 'vbscript', 'v' => 'verilog', 'xml' => 'xml', 'xsd' => 'xml', 'xsl' => 'xml', 'xul' => 'xml', 'xlf' => 'xml', 'xliff' => 'xml', 'xaml' => 'xml', 'wxs' => 'xml', 'wxl' => 'xml', 'wxi' => 'xml', 'wsdl' => 'xml', 'svg' => 'xml', 'rss' => 'xml', 'rdf' => 'xml', 'plist' => 'xml', 'mxml' => 'xml', 'kml' => 'xml', 'glade' => 'xml', 'xq' => 'xquery', 'xqm' => 'xquery', 'xquery' => 'xquery', 'xqy' => 'xquery', 'yml' => 'yaml', 'yaml' => 'yaml', 'png' => 'image', 'jpg' => 'image', 'gif' => 'image', 'jpeg' => 'image', 'bmp' => 'image', 'csproj' => 'xml', ); protected static $binaryTypes = array( 'exe', 'com', 'so', 'la', 'o', 'dll', 'pyc', 'jpg', 'jpeg', 'bmp', 'gif', 'png', 'xmp', 'pcx', 'svgz', 'ttf', 'tiff', 'oet', 'gz', 'tar', 'rar', 'zip', '7z', 'jar', 'class', 'odt', 'ods', 'pdf', 'doc', 'docx', 'dot', 'xls', 'xlsx', ); public function __construct(Application $app) { $this->app = $app; } /** * Returns the file type based on filename by treating the extension * * The file type is used by CodeMirror, a Javascript-based IDE implemented in * GitList, to properly highlight the blob syntax (if it's a source-code) * * @param string $file File name * @return mixed File type */ public function getFileType($file) { if (($pos = strrpos($file, '.')) !== false) { $fileType = substr($file, $pos + 1); } else { return 'text'; } if (isset($this->defaultFileTypes[$fileType])) { return $this->defaultFileTypes[$fileType]; } if (!empty($this->app['filetypes'])) { if (isset($this->app['filetypes'][$fileType])) { return $this->app['filetypes'][$fileType]; } } return 'text'; } /** * Returns whether the file is binary. * * @param string $file * * @return boolean */ public function isBinary($file) { if (($pos = strrpos($file, '.')) !== false) { $fileType = substr($file, $pos + 1); } else { return false; } if (in_array($fileType, self::$binaryTypes)) { return true; } if (!empty($this->app['binary_filetypes']) && array_key_exists($fileType, $this->app['binary_filetypes'])) { return $this->app['binary_filetypes'][$fileType]; } return false; } public function getReadme($repository, $branch = null) { $files = $repository->getTree($branch)->output(); if ($branch === null) { $branch = $repository->getHead(); } foreach ($files as $file) { if (preg_match('/^readme*/i', $file['name'])) { return array( 'filename' => $file['name'], 'content' => $repository->getBlob("$branch:\"{$file['name']}\"")->output() ); } } return array(); } /** * Returns an Array where the first value is the tree-ish and the second is the path * * @param \GitList\Git\Repository $repository * @param string $branch * @param string $tree * @return array */ public function extractRef($repository, $branch = '', $tree = '') { $branch = trim($branch, '/'); $tree = trim($tree, '/'); $input = $branch . '/' . $tree; // If the ref appears to be a SHA, just split the string if (preg_match("/^([[:alnum:]]{40})(.+)/", $input, $matches)) { $branch = $matches[1]; } else { // Otherwise, attempt to detect the ref using a list of the project's branches and tags $validRefs = array_merge((array) $repository->getBranches(), (array) $repository->getTags()); foreach ($validRefs as $key => $ref) { if (!preg_match(sprintf("#^%s/#", preg_quote($ref, '#')), $input)) { unset($validRefs[$key]); } } // No exact ref match, so just try our best if (count($validRefs) > 1) { preg_match('/([^\/]+)(.*)/', $input, $matches); $branch = preg_replace('/^\/|\/$/', '', $matches[1]); } else { // Extract branch name $branch = array_shift($validRefs); } } return array($branch, $tree); } } src/GitList/Util/Routing.php000066400000000000000000000107751516074605400163230ustar00rootroot00000000000000app = $app; } /* @brief Return $commitish, $path parsed from $commitishPath, based on * what's in $repo. Raise a 404 if $branchpath does not represent a * valid branch and path. * * A helper for parsing routes that use commit-ish names and paths * separated by /, since route regexes are not enough to get that right. */ public function parseCommitishPathParam($commitishPath, $repo) { $app = $this->app; $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); $commitish = null; $path = null; $slashPosition = strpos($commitishPath, '/'); if (strlen($commitishPath) >= 40 && ($slashPosition === false || $slashPosition === 40)) { // We may have a commit hash as our commitish. $hash = substr($commitishPath, 0, 40); if ($repository->hasCommit($hash)) { $commitish = $hash; } } if ($commitish === null) { $branches = $repository->getBranches(); $tags = $repository->getTags(); if ($tags !== null && count($tags) > 0) { $branches = array_merge($branches, $tags); } $matchedBranch = null; $matchedBranchLength = 0; foreach ($branches as $branch) { if (strpos($commitishPath, $branch) === 0 && strlen($branch) > $matchedBranchLength) { $matchedBranch = $branch; $matchedBranchLength = strlen($matchedBranch); } } if ($matchedBranch === null) { throw new EmptyRepositoryException('This repository is currently empty. There are no commits.'); } $commitish = $matchedBranch; } $commitishLength = strlen($commitish); $path = substr($commitishPath, $commitishLength); if (strpos($path, '/') === 0) { $path = substr($path, 1); } return array($commitish, $path); } public function getBranchRegex() { static $branchRegex = null; if ($branchRegex === null) { $branchRegex = '(?!/|.*([/.]\.|//|@\{|\\\\))[^\040\177 ~^:?*\[]+(?app; $self = $this; $quotedPaths = array_map( function ($repo) use ($app, $self) { $repoName = $repo['name']; //Windows if ($self->isWindows()){ $repoName = str_replace('\\', '\\\\',$repoName); } return $repoName; }, $this->app['git']->getRepositories($this->app['git.repos']) ); usort( $quotedPaths, function ($a, $b) { return strlen($b) - strlen($a); } ); $regex = implode('|', $quotedPaths); } return $regex; } public function isWindows() { switch (PHP_OS) { case 'WIN32': case 'WINNT': case 'Windows': return true; default: return false; } } /** * Strips the base path from a full repository path * * @param string $repoPath Full path to the repository * @return string Relative path to the repository from git.repositories */ public function getRelativePath($repoPath) { if (strpos($repoPath, $this->app['git.repos']) === 0) { $relativePath = substr($repoPath, strlen($this->app['git.repos'])); return ltrim(strtr($relativePath, '\\', '/'), '/'); } else { throw new \InvalidArgumentException( sprintf("Path '%s' does not match configured repository directory", $repoPath) ); } } } src/GitList/Util/View.php000066400000000000000000000024071516074605400155770ustar00rootroot00000000000000 $path) { $breadcrumbs[] = array( 'dir' => $path, 'path' => implode('/', array_slice($paths, 0, $i + 1)), ); } return $breadcrumbs; } public function getPager($pageNumber, $totalCommits) { $pageNumber = (empty($pageNumber)) ? 0 : $pageNumber; $lastPage = intval($totalCommits / 15); // If total commits are integral multiple of 15, the lastPage will be commits/15 - 1. $lastPage = ($lastPage * 15 == $totalCommits) ? $lastPage - 1 : $lastPage; $nextPage = $pageNumber + 1; $previousPage = $pageNumber - 1; return array('current' => $pageNumber, 'next' => $nextPage, 'previous' => $previousPage, 'last' => $lastPage, 'total' => $totalCommits, ); } } tests/000077500000000000000000000000001516074605400122305ustar00rootroot00000000000000tests/InterfaceTest.php000066400000000000000000000361671516074605400155160ustar00rootroot00000000000000mkdir(self::$tmpdir); if (!is_writable(self::$tmpdir)) { $this->markTestSkipped('There are no write permissions in order to create test repositories.'); } $options['path'] = getenv('GIT_CLIENT') ?: '/usr/bin/git'; $options['hidden'] = array(self::$tmpdir . '/hiddenrepo'); $options['default_branch'] = 'master'; $options['ini.file'] = "config.ini"; $cacheDir = self::$tmpdir . DIRECTORY_SEPARATOR . 'cache'; $fs->mkdir($cacheDir); $git = new Client($options); self::$gitPath = $options['path']; // GitTest repository fixture $git->createRepository(self::$tmpdir . 'GitTest'); $repository = $git->getRepository(self::$tmpdir . 'GitTest'); file_put_contents(self::$tmpdir . 'GitTest/README.md', "## GitTest\nGitTest is a *test* repository!"); file_put_contents(self::$tmpdir . 'GitTest/test.php', "setConfig('user.name', 'Luke Skywalker'); $repository->setConfig('user.email', 'luke@rebel.org'); $repository->addAll(); $repository->commit("Initial commit"); $repository->createBranch('issue12'); $repository->createBranch('issue42'); $repository->createBranch('branch/name/wiith/slashes'); // foobar repository fixture $git->createRepository(self::$tmpdir . 'foobar'); $repository = $git->getRepository(self::$tmpdir . 'foobar'); file_put_contents(self::$tmpdir . 'foobar/bar.json', "{\n\"name\": \"foobar\"\n}"); file_put_contents(self::$tmpdir . 'foobar/.git/description', 'This is a test repo!'); $fs->mkdir(self::$tmpdir . 'foobar/myfolder'); $fs->mkdir(self::$tmpdir . 'foobar/testfolder'); file_put_contents(self::$tmpdir . 'foobar/myfolder/mytest.php', "setConfig('user.name', 'Luke Skywalker'); $repository->setConfig('user.email', 'luke@rebel.org'); $repository->addAll(); $repository->commit("First commit"); // Nested repository fixture $nested_dir = self::$tmpdir . 'nested/'; $fs->mkdir($nested_dir); $git->createRepository($nested_dir . 'NestedRepo'); $repository = $git->getRepository($nested_dir . 'NestedRepo'); file_put_contents($nested_dir . 'NestedRepo/.git/description', 'This is a NESTED test repo!'); file_put_contents($nested_dir . 'NestedRepo/README.txt', 'NESTED TEST REPO README'); $repository->setConfig('user.name', 'Luke Skywalker'); $repository->setConfig('user.email', 'luke@rebel.org'); $repository->addAll(); $repository->commit("First commit"); $repository->createBranch("testing"); $repository->checkout("testing"); file_put_contents($nested_dir . 'NestedRepo/README.txt', 'NESTED TEST BRANCH README'); $repository->addAll(); $repository->commit("Changing branch"); $repository->checkout("master"); // master-less repository fixture $git->createRepository(self::$tmpdir . 'develop'); $repository = $git->getRepository(self::$tmpdir . 'develop'); $repository->setConfig('user.name', 'Luke Skywalker'); $repository->setConfig('user.email', 'luke@rebel.org'); file_put_contents(self::$tmpdir . 'develop/README.md', "## develop\ndevelop is a *test* repository!"); $repository->addAll(); $repository->commit("First commit"); $repository->createBranch("develop"); $repository = $repository->checkout('develop'); file_put_contents(self::$tmpdir . 'develop/test.php', "setConfig('user.name', 'Luke Skywalker'); $repository->setConfig('user.email', 'luke@rebel.org'); $repository->addAll(); $repository->commit("Initial commit"); // Detached HEAD repository fixture $git->createRepository(self::$tmpdir . 'detached-head'); $repository = $git->getRepository(self::$tmpdir . 'detached-head'); $repository->setConfig('user.name', 'Luke Skywalker'); $repository->setConfig('user.email', 'luke@rebel.org'); file_put_contents(self::$tmpdir . 'detached-head/README.md', "## detached head\ndetached-head is a *test* repository!"); $repository->addAll(); $repository->commit("First commit"); $repository->checkout('HEAD'); } public function createApplication() { $config = new GitList\Config; $config->set('app', 'debug', true); $config->set('app', 'debug', false); $config->set('git', 'client', self::$gitPath); $config->set('git', 'default_branch', 'master'); $config->set('git', 'repositories', array(self::$tmpdir)); $app = require 'boot.php'; return $app; } public function testInitialPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('title:contains("GitList")')); $this->assertCount(1, $crawler->filter('div.repository-header a:contains("GitTest")')); $this->assertEquals('/GitTest/', $crawler->filter('.repository-header a')->eq(0)->attr('href')); $this->assertEquals('/GitTest/master/rss/', $crawler->filter('.repository-header a')->eq(1)->attr('href')); $this->assertCount(1, $crawler->filter('div.repository-header a:contains("detached-head")')); $this->assertEquals('/detached-head/', $crawler->filter('.repository-header a')->eq(2)->attr('href')); $this->assertEquals('/detached-head/master/rss/', $crawler->filter('.repository-header a')->eq(3)->attr('href')); $this->assertCount(1, $crawler->filter('div.repository-header a:contains("develop")')); $this->assertEquals('/develop/', $crawler->filter('.repository-header a')->eq(4)->attr('href')); $this->assertEquals('/develop/master/rss/', $crawler->filter('.repository-header a')->eq(5)->attr('href')); $this->assertCount(1, $crawler->filter('div.repository-header:contains("foobar")')); $this->assertCount(1, $crawler->filter('div.repository-body:contains("This is a test repo!")')); $this->assertEquals('/foobar/', $crawler->filter('.repository-header a')->eq(6)->attr('href')); $this->assertEquals('/foobar/master/rss/', $crawler->filter('.repository-header a')->eq(7)->attr('href')); $this->assertCount(1, $crawler->filter('div.repository-header a:contains("nested/NestedRepo")')); $this->assertEquals('/nested/NestedRepo/', $crawler->filter('.repository-header a')->eq(8)->attr('href')); $this->assertEquals('/nested/NestedRepo/master/rss/', $crawler->filter('.repository-header a')->eq(9)->attr('href')); $this->assertCount(1, $crawler->filter('div.repository-body:contains("This is a NESTED test repo!")')); } public function testRepositoryPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('.tree tr:contains("README.md")')); $this->assertCount(1, $crawler->filter('.tree tr:contains("test.php")')); $this->assertCount(1, $crawler->filter('.md-header:contains("README.md")')); $this->assertEquals("## GitTest\nGitTest is a *test* repository!", $crawler->filter('#md-content')->eq(0)->text()); $this->assertEquals('/GitTest/blob/master/README.md', $crawler->filter('.tree tr td')->eq(0)->filter('a')->eq(0)->attr('href')); $this->assertEquals('/GitTest/blob/master/test.php', $crawler->filter('.tree tr td')->eq(3)->filter('a')->eq(0)->attr('href')); $this->assertEquals('branch/name/wiith/slashes', $crawler->filter('.dropdown-menu li')->eq(1)->text()); $this->assertEquals('issue12', $crawler->filter('.dropdown-menu li')->eq(2)->text()); $this->assertEquals('issue42', $crawler->filter('.dropdown-menu li')->eq(3)->text()); $this->assertEquals('master', $crawler->filter('.dropdown-menu li')->eq(4)->text()); $crawler = $client->request('GET', '/foobar/'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('.tree tr:contains("myfolder")')); $this->assertCount(1, $crawler->filter('.tree tr:contains("testfolder")')); $this->assertCount(1, $crawler->filter('.tree tr:contains("bar.json")')); $this->assertEquals('/foobar/tree/master/myfolder/', $crawler->filter('.tree tr td')->eq(0)->filter('a')->eq(0)->attr('href')); $this->assertEquals('/foobar/tree/master/testfolder/', $crawler->filter('.tree tr td')->eq(3)->filter('a')->eq(0)->attr('href')); $this->assertEquals('/foobar/blob/master/bar.json', $crawler->filter('.tree tr td')->eq(6)->filter('a')->eq(0)->attr('href')); $this->assertCount(0, $crawler->filter('.md-header')); $this->assertEquals('master', $crawler->filter('.dropdown-menu li')->eq(1)->text()); } public function testBlobPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/blob/master/test.php'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('.breadcrumb .active:contains("test.php")')); $this->assertEquals('/GitTest/raw/master/test.php', $crawler->filter('.source-header .btn-group a')->eq(0)->attr('href')); $this->assertEquals('/GitTest/blame/master/test.php', $crawler->filter('.source-header .btn-group a')->eq(1)->attr('href')); $this->assertEquals('/GitTest/commits/master/test.php', $crawler->filter('.source-header .btn-group a')->eq(2)->attr('href')); } public function testRawPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/raw/master/test.php'); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals("getResponse()->getContent()); } public function testBlamePage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/blame/master/test.php'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('.source-header .meta:contains("test.php")')); $this->assertRegexp('/\/GitTest\/commit\/[a-zA-Z0-9%]+/', $crawler->filter('.blame-view .commit')->eq(0)->filter('a')->attr('href')); $crawler = $client->request('GET', '/foobar/blame/master/bar.json'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('.source-header .meta:contains("bar.json")')); $this->assertRegexp('/\/foobar\/commit\/[a-zA-Z0-9%]+/', $crawler->filter('.blame-view .commit')->eq(0)->filter('a')->attr('href')); } public function testHistoryPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/commits/master/test.php'); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals('Initial commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text()); $crawler = $client->request('GET', '/GitTest/commits/master/README.md'); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals('Initial commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text()); $crawler = $client->request('GET', '/foobar/commits/master/bar.json'); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals('First commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text()); } public function testCommitsPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/commits'); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals('Initial commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text()); $crawler = $client->request('GET', '/foobar/commits'); $this->assertTrue($client->getResponse()->isOk()); $this->assertEquals('First commit', $crawler->filter('.table tbody tr td h4')->eq(0)->text()); } public function testStatsPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/GitTest/stats'); $this->assertTrue($client->getResponse()->isOk()); $this->assertRegexp('/.php: 1 files/', $crawler->filter('.table tbody')->eq(0)->text()); $this->assertRegexp('/.md: 1 files/', $crawler->filter('.table tbody')->eq(0)->text()); $this->assertRegexp('/Total files: 2/', $crawler->filter('.table tbody')->eq(0)->text()); $this->assertRegexp('/Luke Skywalker: 1 commits/', $crawler->filter('.table tbody')->eq(0)->text()); } public function testRssPage() { $client = $this->createClient(); $client->request('GET', '/GitTest/master/rss/'); $response = $client->getResponse(); $this->assertTrue($response->isOk()); $this->assertRegexp('/Latest commits in GitTest:master/', $client->getResponse()->getContent()); $this->assertRegexp('/Initial commit/', $client->getResponse()->getContent()); } public function testNestedRepoPage() { $client = $this->createClient(); $client->request('GET', '/nested/NestedRepo/'); $response = $client->getResponse(); $this->assertTrue($response->isOk()); $this->assertRegexp('/NESTED TEST REPO README/', $client->getResponse()->getContent()); } public function testDevelopRepo() { $client = $this->createClient(); $crawler = $client->request('GET', '/develop/'); $this->assertTrue($client->getResponse()->isOk()); } public function testNestedRepoBranch() { $client = $this->createClient(); $crawler = $client->request('GET', '/nested/NestedRepo/testing/'); $this->assertTrue($client->getResponse()->isOk()); $this->assertRegexp('/NESTED TEST BRANCH README/', $client->getResponse()->getContent()); } public static function tearDownAfterClass() { $fs = new Filesystem(); $fs->remove(self::$tmpdir); } } views/000077500000000000000000000000001516074605400122235ustar00rootroot00000000000000views/blame.twig000066400000000000000000000012751516074605400142040ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'commits' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: [{dir: 'Blame', path:''}]} %}
{{ file }}
{% for blame in blames %} {% endfor %}
{{ blame.commitShort }}
{{ blame.line }}

{% endblock %} views/branch_menu.twig000066400000000000000000000015371516074605400154060ustar00rootroot00000000000000
views/breadcrumb.twig000066400000000000000000000010031516074605400152170ustar00rootroot00000000000000 views/commit.twig000066400000000000000000000062771516074605400144230ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'commits' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: [{dir: "Commit #{commit.hash}", path:''}]} %}
Browse code

{{ commit.message }}

{% if commit.body is not empty %}

{{ commit.body | nl2br }}

{% endif %} {{ commit.author.name }} authored on {{ commit.date | date('d/m/Y \\a\\t H:i:s') }}
Showing {{ commit.changedFiles }} changed files
{% for diff in commit.diffs %}
{% for line in diff.getLines %} {% endfor %}
{% if line.getType != 'chunk' %} {% endif %} {{ line.getNumOld }} {% if line.getType != 'chunk' %} {% endif %} {% if line.getType != 'chunk' %} {% endif %} {{ line.getNumNew }} {% if line.getType != 'chunk' %} {% endif %} {{ line.getLine }}
{% endfor %}
{% endblock %} views/commits.twig000066400000000000000000000004271516074605400145750ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'commits' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: [{dir: 'Commit history', path:''}]} %} {% include 'commits_list.twig' %}
{% endblock %} views/commits_list.twig000066400000000000000000000024371516074605400156330ustar00rootroot00000000000000{% if commits %} {% for date, commit in commits %} {% for item in commit %} {% endfor %}
{{ date | date("F j, Y") }}
View {{ item.shortHash }}

{{ item.message }}

{{ item.author.name }} authored on {{ item.date | date('d/m/Y \\a\\t H:i:s') }}
{% endfor %} {% else %}

No results found.

{% endif %} {% if page != 'searchcommits' %} {% endif %} views/error.twig000066400000000000000000000004561516074605400142550ustar00rootroot00000000000000{% extends 'layout.twig' %} {% block title %}GitList{% endblock %} {% block body %} {% include 'navigation.twig' %}
Oops! {{ message }}

{% include 'footer.twig' %}
{% endblock %} views/file.twig000066400000000000000000000024471516074605400140450ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'files' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: breadcrumbs} %}
{% if fileType == 'image' %}
{{ file }}
{% elseif fileType == 'markdown' %}
{{ blob }}
{% else %}
{{ blob|htmlentities|raw }}
{% endif %}

{% endblock %} views/footer.twig000066400000000000000000000001561516074605400144170ustar00rootroot00000000000000 views/index.twig000066400000000000000000000022031516074605400142230ustar00rootroot00000000000000{% extends 'layout.twig' %} {% block title %}GitList{% endblock %} {% block body %} {% include 'navigation.twig' %}
{% for repository in repositories %}
{% if repository.description %}

{{ repository.description }}

{% else %}

There is no repository description file. Please, create one to remove this message.

{% endif %}
{% endfor %}

{% include 'footer.twig' %}
{% endblock %} views/layout.twig000066400000000000000000000023441516074605400144370ustar00rootroot00000000000000 {% block title %}Welcome!{% endblock %} {% block body %}{% endblock %} views/layout_page.twig000066400000000000000000000023071516074605400154320ustar00rootroot00000000000000{% extends 'layout.twig' %} {% block body %} {% include 'navigation.twig' %}
{% if page in ['commits', 'searchcommits'] %} {% else %} {% endif %} {% if branches is defined %} {% include 'branch_menu.twig' %} {% endif %} {% include 'menu.twig' %}
{% block content %}{% endblock %} {% include 'footer.twig' %}
{% endblock %} views/menu.twig000066400000000000000000000011321516074605400140600ustar00rootroot00000000000000 views/navigation.twig000066400000000000000000000016401516074605400152570ustar00rootroot00000000000000 views/network.twig000066400000000000000000000011051516074605400146050ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'network' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: [{dir: 'Network', path:''}]} %}
Network Graph of {{ repo }} / {{ commitishPath }}
{#
#}

{% endblock %} views/rss.twig000066400000000000000000000012561516074605400137320ustar00rootroot00000000000000 Latest commits in {{ repo }}:{{ branch }} RSS provided by GitList {{ url('homepage') }} {% for commit in commits %} {{ commit.message }} {{ commit.author.name }} authored {{ commit.shortHash }} in {{ commit.date | date('d/m/Y \\a\\t H:i:s') }} {{ url('commit', {repo: repo, commit: commit.hash}) }} {{ commit.date | date('r') }} {% endfor %} views/search.twig000066400000000000000000000030251516074605400143640ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'files' %} {% block title %}GitList{% endblock %} {% block content %} {% embed 'breadcrumb.twig' with {breadcrumbs: breadcrumbs} %} {% block extra %} {% endblock %} {% endembed %} {% if results %} {% for result in results %} {% endfor %}
name match
{{ result.file }} {{ result.match }}
{% else %}

No results found.

{% endif %}
{% endblock %} views/searchcommits.twig000066400000000000000000000004631516074605400157630ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'searchcommits' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: [{dir: 'Commits search results for: ' ~ query, path:''}]} %} {% include 'commits_list.twig' %}
{% endblock %} views/stats.twig000066400000000000000000000030341516074605400142550ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'stats' %} {% block title %}GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: [{dir: 'Statistics', path:''}]} %}
File extensions ({{ stats.extensions|length }}) Authors ({{ authors|length }}) Other
    {% for ext, amount in stats.extensions %}
  • {{ ext }}: {{ amount }} files
  • {% endfor %}
    {% for author in authors %}
  • {{ author.name }}: {{ author.commits }} commits
  • {% endfor %}

Total files: {{ stats.files }}

Total bytes: {{ stats.size }} bytes ({{ ((stats.size / 1024) / 1024) | number_format }} MB)


{% endblock %} views/tree.twig000066400000000000000000000055701516074605400140650ustar00rootroot00000000000000{% extends 'layout_page.twig' %} {% set page = 'files' %} {% block title %}GitList{% endblock %} {% block content %} {% embed 'breadcrumb.twig' with {breadcrumbs: breadcrumbs} %} {% block extra %} {% endblock %} {% endembed %} {% if files is not empty %} {% if parent is not null %} {% endif %} {% for file in files %} {% endfor %}
name mode size
{% if not parent %} .. {% else %} .. {% endif %}
{{ file.name }} {{ file.mode }} {% if file.size %}{{ (file.size / 1024) | number_format }} kb{% endif %}
{% else %}

This repository is empty.

{% endif %} {% if readme is defined and readme is not empty %}
{{ readme.filename }}
{{ readme.content }}
{% endif %}
{% endblock %} web/000077500000000000000000000000001516074605400116435ustar00rootroot00000000000000web/Makefile000077500000000000000000000001001516074605400132750ustar00rootroot00000000000000bootstrap: lessc --compress less/bootstrap.less > css/style.cssweb/css/000077500000000000000000000000001516074605400124335ustar00rootroot00000000000000web/css/style.css000066400000000000000000002702071516074605400143150ustar00rootroot00000000000000/*! * Bootstrap v2.0.3 * * Copyright 2012 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;overflow-y:scroll;overflow:-moz-scrollbars-vertical;-ms-overflow-y:scroll}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333;background-color:#fff;padding-bottom:40px}a{color:#4183c4;text-decoration:none}a:hover{color:#2c5d8d;text-decoration:underline}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574%;*margin-left:2.0744680846382977%}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:99.99999998999999%;*width:99.94680850063828%}.row-fluid .span11{width:91.489361693%;*width:91.4361702036383%}.row-fluid .span10{width:82.97872339599999%;*width:82.92553190663828%}.row-fluid .span9{width:74.468085099%;*width:74.4148936096383%}.row-fluid .span8{width:65.95744680199999%;*width:65.90425531263828%}.row-fluid .span7{width:57.446808505%;*width:57.3936170156383%}.row-fluid .span6{width:48.93617020799999%;*width:48.88297871863829%}.row-fluid .span5{width:40.425531911%;*width:40.3723404216383%}.row-fluid .span4{width:31.914893614%;*width:31.8617021246383%}.row-fluid .span3{width:23.404255317%;*width:23.3510638276383%}.row-fluid .span2{width:14.89361702%;*width:14.8404255306383%}.row-fluid .span1{width:6.382978723%;*width:6.329787233638298%}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:""}.container-fluid:after{clear:both}p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px}p small{font-size:11px;color:#999}.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px}h1,h2,h3,h4,h5,h6{margin:0;font-family:inherit;font-weight:bold;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999}h1{font-size:30px;line-height:36px}h1 small{font-size:18px}h2{font-size:24px;line-height:36px}h2 small{font-size:18px}h3{font-size:18px;line-height:27px}h3 small{font-size:14px}h4,h5,h6{line-height:18px}h4{font-size:14px}h4 small{font-size:12px}h5{font-size:12px}h6{font-size:11px;color:#999;text-transform:uppercase}.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eee}.page-header h1{line-height:1}ul,ol{padding:0;margin:0 0 9px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}ul{list-style:disc}ol{list-style:decimal}li{line-height:18px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:18px}dt,dd{line-height:18px}dt{font-weight:bold;line-height:17px}dd{margin-left:9px}.dl-horizontal dt{float:left;width:120px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:130px}hr{margin:18px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}strong{font-weight:bold}em{font-style:italic}.muted{color:#999}abbr[title]{cursor:help;border-bottom:1px dotted #ddd}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px}blockquote small{display:block;line-height:18px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:18px;font-style:normal;line-height:18px}small{font-size:100%}cite{font-style:normal}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12.025px;line-height:18px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:18px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 18px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333;border:0;border-bottom:1px solid #eee}legend small{font-size:13.5px;color:#999}label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px;color:#333}input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555;background-color:#fff;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.uneditable-textarea{width:auto;height:auto}label input,label textarea,label select{display:block}input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;background-color:transparent;border:0 \9;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}input[type="image"]{border:0}input[type="file"]{width:auto;padding:initial;line-height:initial;background-color:#fff;background-color:initial;border:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto}select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px}input[type="file"]{line-height:18px \9}select{width:220px;background-color:#fff}select[multiple],select[size]{height:auto}input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}textarea{height:auto}input[type="hidden"]{display:none}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-ms-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}input:focus,textarea:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(82,168,236,.6)}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}input,textarea,.uneditable-input{margin-left:0}input.span12,textarea.span12,.uneditable-input.span12{width:930px}input.span11,textarea.span11,.uneditable-input.span11{width:850px}input.span10,textarea.span10,.uneditable-input.span10{width:770px}input.span9,textarea.span9,.uneditable-input.span9{width:690px}input.span8,textarea.span8,.uneditable-input.span8{width:610px}input.span7,textarea.span7,.uneditable-input.span7{width:530px}input.span6,textarea.span6,.uneditable-input.span6{width:450px}input.span5,textarea.span5,.uneditable-input.span5{width:370px}input.span4,textarea.span4,.uneditable-input.span4{width:290px}input.span3,textarea.span3,.uneditable-input.span3{width:210px}input.span2,textarea.span2,.uneditable-input.span2{width:130px}input.span1,textarea.span1,.uneditable-input.span1{width:50px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee;border-color:#ddd}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;*zoom:1}.form-actions:before,.form-actions:after{display:table;content:""}.form-actions:after{clear:both}.uneditable-input{overflow:hidden;white-space:nowrap;cursor:not-allowed;background-color:#fff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}:-moz-placeholder{color:#999}::-webkit-input-placeholder{color:#999}.help-block,.help-inline{color:#555}.help-block{display:block;margin-bottom:9px}.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px}.input-prepend,.input-append{margin-bottom:5px}.input-prepend input,.input-append input,.input-prepend select,.input-append select,.input-prepend .uneditable-input,.input-append .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:middle;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend input:focus,.input-append input:focus,.input-prepend select:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{z-index:2}.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc}.input-prepend .add-on,.input-append .add-on{display:inline-block;width:auto;height:18px;min-width:16px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:1px solid #ccc}.input-prepend .add-on,.input-append .add-on,.input-prepend .btn,.input-append .btn{margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .uneditable-input{border-right-color:#ccc;border-left-color:#eee}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.form-search{margin:3px 0 0 0;padding:0}.search-query{padding:3px;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;font-size:11px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:9px}legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:18px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:160px}.form-horizontal .help-block{margin-top:9px;margin-bottom:0}.form-horizontal .form-actions{padding-left:160px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:18px}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5}table .span1{float:none;width:44px;margin-left:0}table .span2{float:none;width:124px;margin-left:0}table .span3{float:none;width:204px;margin-left:0}table .span4{float:none;width:284px;margin-left:0}table .span5{float:none;width:364px;margin-left:0}table .span6{float:none;width:444px;margin-left:0}table .span7{float:none;width:524px;margin-left:0}table .span8{float:none;width:604px;margin-left:0}table .span9{float:none;width:684px;margin-left:0}table .span10{float:none;width:764px;margin-left:0}table .span11{float:none;width:844px;margin-left:0}table .span12{float:none;width:924px;margin-left:0}table .span13{float:none;width:1004px;margin-left:0}table .span14{float:none;width:1084px;margin-left:0}table .span15{float:none;width:1164px;margin-left:0}table .span16{float:none;width:1244px;margin-left:0}table .span17{float:none;width:1324px;margin-left:0}table .span18{float:none;width:1404px;margin-left:0}table .span19{float:none;width:1484px;margin-left:0}table .span20{float:none;width:1564px;margin-left:0}table .span21{float:none;width:1644px;margin-left:0}table .span22{float:none;width:1724px;margin-left:0}table .span23{float:none;width:1804px;margin-left:0}table .span24{float:none;width:1884px;margin-left:0}.tree{width:100%;margin-bottom:18px;border:1px solid #cacaca}.tree thead th{padding:8px;line-height:18px;text-align:left;vertical-align:bottom;background-color:#f4f4f4;background-image:-moz-linear-gradient(top,#fafafa,#eaeaea);background-image:-ms-linear-gradient(top,#fafafa,#eaeaea);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fafafa),to(#eaeaea));background-image:-webkit-linear-gradient(top,#fafafa,#eaeaea);background-image:-o-linear-gradient(top,#fafafa,#eaeaea);background-image:linear-gradient(top,#fafafa,#eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea',GradientType=0);border-bottom:1px solid #d7d7d7;font-weight:bold;color:#555;text-shadow:1px 1px 1px #fff}.tree tbody td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-bottom:1px solid #EEE;background-color:#f8f8f8}.tree caption+thead tr:first-child th,.tree caption+thead tr:first-child td,.tree colgroup+thead tr:first-child th,.tree colgroup+thead tr:first-child td,.tree thead:first-child tr:first-child th,.tree thead:first-child tr:first-child td{border-top:0}.tree tbody tr:last-child td{border-bottom:0}.source-view{width:100%;margin-bottom:18px;border:1px solid #cacaca}.source-view .source-header{padding:8px;line-height:18px;text-align:left;vertical-align:bottom;background-color:#f4f4f4;background-image:-moz-linear-gradient(top,#fafafa,#eaeaea);background-image:-ms-linear-gradient(top,#fafafa,#eaeaea);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fafafa),to(#eaeaea));background-image:-webkit-linear-gradient(top,#fafafa,#eaeaea);background-image:-o-linear-gradient(top,#fafafa,#eaeaea);background-image:linear-gradient(top,#fafafa,#eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea',GradientType=0);border-bottom:1px solid #d7d7d7;font-weight:bold;color:#555;text-shadow:1px 1px 1px #fff;height:28px}.source-view .source-header .meta{float:left;padding:4px 0;font-size:14px}.source-view pre{margin:0;padding:12px;border:0}.source-view #sourcecode{margin:0;padding:0;border:0;width:100%;height:600px}.source-view .source-diff{background-color:#f5f5f5}.source-view .source-diff pre{margin:0;padding:0 0 0 6px;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.source-view .source-diff pre:hover{background-color:#ffc}.source-view .source-diff table td{padding:0}.source-view .source-diff .new{background-color:#DFD}.source-view .source-diff .old{background-color:#FDD}.source-view .source-diff .chunk{background-color:#e8e8e8;color:#999}.source-view .source-diff .lineNo{color:#aaa;background-color:#e8e8e8;padding:0 6px;text-align:right;border-right:1px solid #ddd;font-family:monospace}.source-view .image-blob{padding:10px;max-width:600px}.blame-view{width:100%;background-color:#f5f5f5}.blame-view td{vertical-align:top;padding:8px}.blame-view tr{border-bottom:1px solid #ccc}.blame-view tr:last-child{border-bottom:0}.blame-view .line{font-weight:700;border-right:1px solid #ccc}.blame-view .commit{font-weight:700;border-right:1px solid #ccc}.blame-view pre{margin:0;padding:0;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.commit-view{width:100%;margin-bottom:18px;border:1px solid #cacaca;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.commit-view .commit-header{padding:8px;line-height:18px;text-align:left;vertical-align:bottom;background-color:#f4f4f4;background-image:-moz-linear-gradient(top,#fafafa,#eaeaea);background-image:-ms-linear-gradient(top,#fafafa,#eaeaea);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fafafa),to(#eaeaea));background-image:-webkit-linear-gradient(top,#fafafa,#eaeaea);background-image:-o-linear-gradient(top,#fafafa,#eaeaea);background-image:linear-gradient(top,#fafafa,#eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea',GradientType=0);border-bottom:1px solid #d7d7d7;font-weight:bold;text-shadow:1px 1px 1px #fff}.commit-view .commit-header h4{padding:4px 0}.commit-view .commit-body{padding:8px}.commit-list{list-style-type:none}.commit-list li{padding:8px 5px 8px 5px;font-size:14px;font-weight:700;border-bottom:1px solid #d7d7d7}.commit-list li .meta{font-weight:normal;font-size:14px;color:#999}.commit-list li:last-child{border-bottom:0;margin-bottom:25px}.repository{margin-bottom:18px;border:1px solid #d7d7d7;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.repository .repository-header{border-bottom:1px solid #d7d7d7;text-shadow:1px 1px 1px #fff;padding:8px;font-weight:700;font-size:14px}.repository .repository-body{padding:8px;background-color:#f7f7f7}.repository .repository-body p{margin:0}.readme-view{border:1px solid #cacaca}.md-view{width:100%;margin-bottom:18px}.md-header{padding:8px;line-height:18px;text-align:left;vertical-align:bottom;background-color:#f4f4f4;background-image:-moz-linear-gradient(top,#fafafa,#eaeaea);background-image:-ms-linear-gradient(top,#fafafa,#eaeaea);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fafafa),to(#eaeaea));background-image:-webkit-linear-gradient(top,#fafafa,#eaeaea);background-image:-o-linear-gradient(top,#fafafa,#eaeaea);background-image:linear-gradient(top,#fafafa,#eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea',GradientType=0);border-bottom:1px solid #d7d7d7;font-weight:bold;color:#555;text-shadow:1px 1px 1px #fff;height:28px}.md-header .meta{float:left;padding:4px 0;font-size:14px}#md-content{padding:30px;color:#000}.network-view{width:100%;margin-bottom:18px;border:1px solid #cacaca;position:relative}.network-view.loading-commits:before{content:"";display:block;height:100px;width:200px;box-sizing:border-box;padding:10px;font-weight:bold;position:absolute;left:50%;top:50%;margin-left:-100px;margin-top:-50px;color:#555;background:rgba(255,255,255,0.8) url("../img/ajax-loader.gif") no-repeat center;z-index:2000;border:1px solid #eee;border-radius:8px;box-shadow:2px 2px 2px #eee}.network-view.loading-commits .network-header .meta:after{content:" - Loading"}.network-view .network-header{padding:8px;line-height:18px;text-align:left;vertical-align:bottom;background-color:#f4f4f4;background-image:-moz-linear-gradient(top,#fafafa,#eaeaea);background-image:-ms-linear-gradient(top,#fafafa,#eaeaea);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fafafa),to(#eaeaea));background-image:-webkit-linear-gradient(top,#fafafa,#eaeaea);background-image:-o-linear-gradient(top,#fafafa,#eaeaea);background-image:linear-gradient(top,#fafafa,#eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea',GradientType=0);border-bottom:1px solid #d7d7d7;font-weight:bold;color:#555;text-shadow:1px 1px 1px #fff;height:28px}.network-view .network-header .meta{float:left;padding:4px 0;font-size:14px}.network-view pre{margin:0;padding:12px;border:0}.network-view .network-graph{background-color:#f5f5f5;height:400px;overflow:hidden;cursor:move;position:relative}.network-view .network-graph .network-commit-overlay{position:absolute;width:400px;top:0;left:0;padding:8px;margin:0 0 18px;list-style:none;background-color:#fbfbfb;background-image:-moz-linear-gradient(top,#fff,#f5f5f5);background-image:-ms-linear-gradient(top,#fff,#f5f5f5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#fff,#f5f5f5);background-image:-o-linear-gradient(top,#fff,#f5f5f5);background-image:linear-gradient(top,#fff,#f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#f5f5f5',GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.4),0 0 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 0 rgba(255,255,255,0.4),0 0 10px rgba(0,0,0,0.1);box-shadow:0 1px 0 rgba(255,255,255,0.4),0 0 10px rgba(0,0,0,0.1)}.network-view .network-graph .network-commit-overlay img{float:left;margin-right:8px}.network-view .network-graph .network-commit-overlay>h4,.network-view .network-graph .network-commit-overlay>p{padding-left:48px}.rss{display:inline-block;width:16px;height:16px;*margin-right:.3em;line-height:16px;vertical-align:text-top;background-image:url("../img/feed.png");background-position:0 0;background-repeat:no-repeat}.rss:last-child{*margin-left:0}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0}.icon-white{background-image:url("../img/glyphicons-halflings-white.png")}.icon-spaced{padding:0 3px 0 3px}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";opacity:.3;filter:alpha(opacity=30)}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown:hover .caret,.open .caret{opacity:1;filter:alpha(opacity=100)}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:4px 0;margin:1px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#333;white-space:nowrap}.dropdown-menu .dropdown-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#4183c4}.open{*z-index:1000}.open .dropdown-menu{display:block}.pull-right .dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:"\2191"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0,0,0,0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;filter:alpha(opacity=0);-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-ms-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1;filter:alpha(opacity=100)}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-ms-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-ms-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(top,#fff,#e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#e6e6e6',GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-ms-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^="icon-"]{margin-top:1px}.btn-small{padding:5px 9px;font-size:11px;line-height:16px}.btn-small [class^="icon-"]{margin-top:-1px}.btn-mini{padding:2px 6px;font-size:11px;line-height:14px}.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#ccc;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25)}.btn-primary{background-color:#417ac4;background-image:-moz-linear-gradient(top,#4183c4,#416dc4);background-image:-ms-linear-gradient(top,#4183c4,#416dc4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#4183c4),to(#416dc4));background-image:-webkit-linear-gradient(top,#4183c4,#416dc4);background-image:-o-linear-gradient(top,#4183c4,#416dc4);background-image:linear-gradient(top,#4183c4,#416dc4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4183c4',endColorstr='#416dc4',GradientType=0);border-color:#416dc4 #416dc4 #2c4c8d;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#416dc4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#416dc4;*background-color:#3862b4}.btn-primary:active,.btn-primary.active{background-color:#3257a0 \9}.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-ms-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(top,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450',endColorstr='#f89406',GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-ms-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(top,#ee5f5b,#bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#bd362f',GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-ms-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(top,#62c462,#51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462',endColorstr='#51a351',GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-ms-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(top,#5bc0de,#2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de',endColorstr='#2f96b4',GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{background-color:#414141;background-image:-moz-linear-gradient(top,#555,#222);background-image:-ms-linear-gradient(top,#555,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#555),to(#222));background-image:-webkit-linear-gradient(top,#555,#222);background-image:-o-linear-gradient(top,#555,#222);background-image:linear-gradient(top,#555,#222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555',endColorstr='#222222',GradientType=0);border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-group{position:relative;*zoom:1;*margin-left:.3em}.btn-group:before,.btn-group:after{display:table;content:""}.btn-group:after{clear:both}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:9px;margin-bottom:9px}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-group>.btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125),inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05);*padding-top:4px;*padding-bottom:4px}.btn-group>.btn-mini.dropdown-toggle{padding-left:5px;padding-right:5px}.btn-group>.btn-small.dropdown-toggle{*padding-top:4px;*padding-bottom:4px}.btn-group>.btn-large.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#416dc4}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:7px;margin-left:0}.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100)}.btn-mini .caret{margin-top:5px}.btn-small .caret{margin-top:6px}.btn-large .caret{margin-top:6px;border-left-width:5px;border-right-width:5px;border-top-width:5px}.dropup .btn-large .caret{border-bottom:5px solid #000;border-top:0}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:.75;filter:alpha(opacity=75)}.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853}.alert-heading{color:inherit}.alert .close{position:relative;top:-2px;right:-21px;line-height:18px}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847}.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-left:0;margin-bottom:18px;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#4183c4}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:18px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#4183c4}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#4183c4;border-bottom-color:#4183c4;margin-top:6px}.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#2c5d8d;border-bottom-color:#2c5d8d}.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333;border-bottom-color:#333}.nav>.dropdown.active>a:hover{color:#000;cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.navbar{*position:relative;*z-index:2;overflow:visible;margin-bottom:18px}.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;border-bottom:1px solid #cacaca;background-color:#f4f4f4;background-image:-moz-linear-gradient(top,#fafafa,#eaeaea);background-image:-ms-linear-gradient(top,#fafafa,#eaeaea);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fafafa),to(#eaeaea));background-image:-webkit-linear-gradient(top,#fafafa,#eaeaea);background-image:-o-linear-gradient(top,#fafafa,#eaeaea);background-image:linear-gradient(top,#fafafa,#eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea',GradientType=0);-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.4),0 0 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 0 rgba(255,255,255,0.4),0 0 10px rgba(0,0,0,0.1);box-shadow:0 1px 0 rgba(255,255,255,0.4),0 0 10px rgba(0,0,0,0.1)}.navbar .container{width:auto}.nav-collapse.collapse{height:auto}.navbar{color:#333}.navbar .brand:hover{text-decoration:none}.navbar .brand{float:left;display:block;padding:10px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#7b7b7b;text-shadow:1px 1px 1px #fff;font-weight:700;letter-spacing:1px}.navbar .navbar-text{margin-bottom:0;line-height:40px}.navbar .navbar-link{color:#222}.navbar .navbar-link:hover{color:#4183c4}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn{margin:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#fff;background-color:#fff;border:1px solid #b3b3b3;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1),0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15);outline:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-bottom{bottom:0}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right}.navbar .nav>li{display:block;float:left}.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#222;text-decoration:none;font-weight:700}.navbar .btn{display:inline-block;padding:4px 10px 4px;margin:5px 5px 6px;line-height:18px}.navbar .btn-group{margin:0;padding:5px 5px 6px}.navbar .nav>li>a:hover{color:#4183c4;text-decoration:none;background:transparent}.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#4183c4;text-decoration:none}.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#eaeaea;border-right:1px solid #fafafa}.navbar .nav.pull-right{margin-left:10px;margin-right:0}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#f4f4f4;background-image:-moz-linear-gradient(top,#fafafa,#eaeaea);background-image:-ms-linear-gradient(top,#fafafa,#eaeaea);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fafafa),to(#eaeaea));background-image:-webkit-linear-gradient(top,#fafafa,#eaeaea);background-image:-o-linear-gradient(top,#fafafa,#eaeaea);background-image:linear-gradient(top,#fafafa,#eaeaea);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fafafa',endColorstr='#eaeaea',GradientType=0);border-color:#eaeaea #eaeaea #c4c4c4;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#eaeaea;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{background-color:#eaeaea;*background-color:#ddd}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#d1d1d1 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:9px}.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:10px}.navbar-fixed-bottom .dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0;bottom:-7px;top:auto}.navbar-fixed-bottom .dropdown-menu:after{border-top:6px solid #fff;border-bottom:0;bottom:-6px;top:auto}.navbar .nav li.dropdown .dropdown-toggle .caret,.navbar .nav li.dropdown.open .caret{border-top-color:#555;border-bottom-color:#999}.navbar .nav li.dropdown.active .caret{opacity:1;filter:alpha(opacity=100)}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:transparent}.navbar .nav li.dropdown.active>.dropdown-toggle:hover{color:#fff}.navbar .pull-right .dropdown-menu,.navbar .dropdown-menu.pull-right{left:auto;right:0}.navbar .pull-right .dropdown-menu:before,.navbar .dropdown-menu.pull-right:before{left:auto;right:12px}.navbar .pull-right .dropdown-menu:after,.navbar .dropdown-menu.pull-right:after{left:auto;right:13px}.breadcrumb{padding:7px 14px;margin:0 0 18px;list-style:none;background-color:#fbfbfb;background-image:-moz-linear-gradient(top,#fff,#f5f5f5);background-image:-ms-linear-gradient(top,#fff,#f5f5f5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#fff,#f5f5f5);background-image:-o-linear-gradient(top,#fff,#f5f5f5);background-image:linear-gradient(top,#fff,#f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#f5f5f5',GradientType=0);border:1px solid #ddd;font-weight:700;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.breadcrumb li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #fff}.breadcrumb .divider{padding:0 5px;color:#999}.breadcrumb .active a{color:#333}.download-buttons{padding:0 8px 0 0;display:inline-block}.rss-icon{clear:both;display:inline-table}.pagination{height:36px;margin:18px 0}.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination li{display:inline}.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0}.pagination a:hover,.pagination .active a{background-color:#f5f5f5}.pagination .active a{color:#999;cursor:default}.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999;background-color:transparent;cursor:default}.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1}.pager:before,.pager:after{display:table;content:""}.pager:after{clear:both}.pager li{display:inline}.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a{float:right}.pager .previous a{float:left}.pager .disabled a,.pager .disabled a:hover{color:#999;background-color:#fff;cursor:default}.modal-open .dropdown-menu{z-index:2050}.modal-open .dropdown.open{*z-index:2050}.modal-open .popover{z-index:2060}.modal-open .tooltip{z-index:2070}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-ms-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out;top:-25%}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-body{overflow-y:auto;max-height:400px;padding:15px}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;*zoom:1}.modal-footer:before,.modal-footer:after{display:table;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-2px}.tooltip.right{margin-left:2px}.tooltip.bottom{margin-top:2px}.tooltip.left{margin-left:-2px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px}.popover.top{margin-top:-5px}.popover.right{margin-left:5px}.popover.bottom{margin-top:5px}.popover.left{margin-left:-5px}.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000}.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000}.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000}.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000}.popover .arrow{position:absolute;width:0;height:0}.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000;background:rgba(0,0,0,0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3)}.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.popover-content{padding:14px;background-color:#fff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:18px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:0 1px 1px rgba(0,0,0,0.075);box-shadow:0 1px 1px rgba(0,0,0,0.075)}a.thumbnail:hover{border-color:#4183c4;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px}.label,.badge{font-size:10.998px;font-weight:bold;line-height:14px;color:#fff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-ms-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(top,#f5f5f5,#f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#f9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.progress .bar{width:0;height:18px;color:#fff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-ms-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(top,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf',endColorstr='#0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-ms-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-ms-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(top,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35',GradientType=0)}.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-ms-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(top,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462',endColorstr='#57a957',GradientType=0)}.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-ms-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(top,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de',endColorstr='#339bb9',GradientType=0)}.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-ms-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(top,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450',endColorstr='#f89406',GradientType=0)}.progress-warning.progress-striped .bar{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:18px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:18px;line-height:1}.carousel-inner{overflow:hidden;width:100%;position:relative}.carousel .item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-ms-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{left:auto;right:15px}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{color:#fff}.hero-unit{padding:60px;margin-bottom:30px;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px}.hero-unit p{font-size:18px;font-weight:200;line-height:27px;color:inherit}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.space-right{padding:0 8px 0 0}.space-left{padding:0 0 0 8px}.CodeMirror{line-height:16px;font-family:Consolas,"Liberation Mono",Courier,monospace;font-size:12px;position:relative;overflow:hidden}.CodeMirror-scroll{overflow-x:auto;overflow-y:hidden;height:auto;position:relative;outline:0}.CodeMirror-scrollbar{float:right;overflow-x:hidden;overflow-y:scroll;margin-left:-1px}.CodeMirror-scrollbar-inner{width:1px}.CodeMirror-scrollbar.cm-sb-overlap{position:absolute;z-index:1;float:none;right:0;min-width:12px}.CodeMirror-scrollbar.cm-sb-nonoverlap{min-width:12px}.CodeMirror-scrollbar.cm-sb-ie7{min-width:18px}.CodeMirror-gutter{position:absolute;left:0;top:0;z-index:10;background-color:#f7f7f7;border-right:1px solid #eee;min-width:2em;height:100%;padding-right:3px}.CodeMirror-gutter-text{color:#aaa;text-align:right;padding:.4em .2em .4em .4em;white-space:pre!important}.CodeMirror-lines{padding:.4em;white-space:pre;cursor:text;margin-left:5px}.CodeMirror-lines *{pointer-events:none}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;-o-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;padding:0;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-wrap .CodeMirror-scroll{overflow-x:hidden}.CodeMirror textarea{outline:none!important}.CodeMirror pre.CodeMirror-cursor{z-index:10;position:absolute;visibility:hidden;border-left:1px solid black;border-right:0;width:0}.cm-keymap-fat-cursor pre.CodeMirror-cursor{width:auto;border:0;background:transparent;background:rgba(0,200,0,0.4)}.cm-keymap-fat-cursor pre.CodeMirror-cursor:not(#nonsense_id){filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.CodeMirror-focused pre.CodeMirror-cursor{visibility:visible}div.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused div.CodeMirror-selected{background:#d7d4f0}.CodeMirror-searching{background:#ffa;background:rgba(255,255,0,0.4)}.cm-s-default span.cm-keyword{color:#708}.cm-s-default span.cm-atom{color:#219}.cm-s-default span.cm-number{color:#164}.cm-s-default span.cm-def{color:#00f}.cm-s-default span.cm-variable{color:black}.cm-s-default span.cm-variable-2{color:#05a}.cm-s-default span.cm-variable-3{color:#085}.cm-s-default span.cm-property{color:black}.cm-s-default span.cm-operator{color:black}.cm-s-default span.cm-comment{color:#a50}.cm-s-default span.cm-string{color:#a11}.cm-s-default span.cm-string-2{color:#f50}.cm-s-default span.cm-meta{color:#555}.cm-s-default span.cm-error{color:#f00}.cm-s-default span.cm-qualifier{color:#555}.cm-s-default span.cm-builtin{color:#30a}.cm-s-default span.cm-bracket{color:#cc7}.cm-s-default span.cm-tag{color:#170}.cm-s-default span.cm-attribute{color:#00c}.cm-s-default span.cm-header{color:blue}.cm-s-default span.cm-quote{color:#090}.cm-s-default span.cm-hr{color:#999}.cm-s-default span.cm-link{color:#00c}span.cm-header,span.cm-strong{font-weight:bold}span.cm-em{font-style:italic}span.cm-emstrong{font-style:italic;font-weight:bold}span.cm-link{text-decoration:underline}div.CodeMirror span.CodeMirror-matchingbracket{color:#0f0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22}web/img/000077500000000000000000000000001516074605400124175ustar00rootroot00000000000000web/img/ajax-loader.gif000066400000000000000000000255101516074605400153000ustar00rootroot00000000000000GIF89a ¥TVT¬®¬„†„ÜÚÜlnlÄÆÄìî윚œdbd¼¾¼”’”äæä|z|ÔÒÔüúü¤¢¤\^\´¶´ŒŽŒäâätvtÌÎÌôöôljl\Z\´²´ŒŠŒÜÞÜtrtÌÊÌôòôœžœdfdÄÂÄ”–”ìêì|~|ÔÖÔüþü¤¦¤ÿÿÿ!ÿ NETSCAPE2.0!ù (, ú@”pHš:"QÈTl:&` 9žXg†J=e¿C wz:%&˜x fJ˜¬‡7 Õ_®O" Cs\ ( n‰O!D mBRc—O#jD#€([cwYT¨_®µ¶Y&#§·O%”Ÿ( ¶\­B S ¶!cC#ÍÏÑD%#¶\¼M£áDçèìíÁX  Y%sñN"\%X$P±óÅ[,'¦`ص쀂BVM÷ÄÁƒYDºM``H…CÞéÀ%Ò ˆ¼ÃŒÊ€vC"`À@¦›á‚!ù ', …TVT¬®¬ÜÚÜ„‚„ÄÆÄìî윚œtrt¼º¼dbdäæäŒŽŒÔÒÔüúü¤¦¤\^\´¶´äâ䌊ŒÌÎÌôöô¤¢¤|~|ÄÂÄ\Z\´²´ÜÞÜ„†„ÌÊÌôòôœžœtvt¼¾¼ljlìêì”–”ÔÖÔüþü¬ª¬ÿÿÿîÀ“pH<54‚FqÉlž A( &g“!íBÅGŠ h—¯tp*Ôœ31ªNœj€D>|«'yl|'y'j&…m ^J'^!”M %D `ž&YZo D™D!«mRT´N^"¹Lj¿hjÄE¼§ÈCŒÍK%¯CqÓEiÛDÝß´$Ì×&Ú« ]!à'!^Ãà^Žà¶]ãNL¼¢ëÀº&‘0T!ò @…\ºX ¢À‹¨G èðäE- *ÀÒ`Þ_ñD€ê¯å¯ !ù &, …TVT¬®¬ÜÚÜ„‚„ÄÆÄlnlôòô”–”dbd¼º¼äæäŒŽŒÔÒÔüúü¤¢¤\^\´¶´äâ䌊ŒÌÎÌ|~|ljlÄÂÄ\Z\´²´ÜÞÜ„†„ÌÊÌtrtôöôœšœdfd¼¾¼ìêì”’”ÔÖÔüþü¤¦¤ÿÿÿü@“pH, CÒ†dl;†âä¨JNgHS-l„Du É Ÿq•`©«s±ôLŒË;.ê bj }C€X „"X&$Yu|& B T!Y$‰c¢NtzLN$QYU‡}TjœD#ºD"j“˜U ÂB¹D ÇÂÖËÛÜÝÝ!%%ÊÞF¼äEÄc êD\c—GÛ•c†DUûË 8TÀ`$@_M‰ ãv¢PÅD! Ô Z†áBD ¨¹ÌÀ D š§Ëdw)lÐvÈBPsê !ù *, …TVT¬®¬„‚„ÜÚÜÄÆÄœšœlnlìî켺¼ŒŽŒdbdäæäÔÒÔ¤¦¤|z|üúü\^\´¶´ŒŠŒäâäÌÎ̤¢¤tvtôöôÄÂÄ”–”\Z\´²´„†„ÜÞÜÌÊÌœžœtrtôòô¼¾¼”’”ljlìêìÔÖÔ¬ª¬|~|üþüÿÿÿû@•pH†FÈèPl:` 0<žX'JeŸ—ÁdØàN+ßbª¡™‚Æ"3!|`"ƒìɬ= \$!*!€S `mf'*%S%BfNr#CWCR\tM™XfO¨fyO&Š )O S_  ƒXciÆÇÈÉXDžÊ*TCšÔBf’*q¦Ü°\à„ÜuTéN! ÓîõöÜLi Æ8€–% 瞤P@…Q–u|yÀe–*Ðú’€ŠDj!N4øUAWÔ8LAqCZ’9#sÈ5Ó!ù *, …TVT¬®¬„‚„ÜÚÜlnlÄÆÄœžœìîìdbd¼º¼ŒŽŒäæä|z|ÔÒÔüúü¤¦¤\^\´¶´ŒŠŒäâätvtÌÎÌôöôljlÄÂÄ”–”\Z\´²´„†„ÜÞÜtrtÌÊ̤¢¤ôòôdfd¼¾¼”’”ìêì|~|ÔÖÔüþü¬ª¬ÿÿÿþ@•pHD}@©qÉl%€¨¦à¬:#Ñ,Ä2´|N(kšV„ HÔs/Éå†*„(KÜDL€p¨{V &Yr*{U%"e&~) !De)U{U!$ˆN(£xV£ ±*(  aB £ ±eC®Yœ±ž®°C'À$%·*É$ØV u|×Þ¦ mäéê²\ëLãØJLä(À Ôƒ§bB™R…(ƒ!á®$øó!ÂD1!ЉÀ@_ä DéFd ¼¡Ø`@£Y\$!E&¼<$pÈ3a!ù ), …TVT¬®¬„‚„ÜÚÜlnlÄÆÄ”–”ìîìdbd¼¾¼ŒŽŒäæä|z|ÔÒÔ¤¢¤üúü\^\´¶´ŒŠŒäâätvtÌÎÌœžœôöôljl\Z\´²´„†„ÜÞÜtrtÌÊÌœšœôòôdfdÄÂÄ”’”ìêì|~|ÔÖÔ¤¦¤üþüÿÿÿ÷À”pH,HâÁÓ@IÍ"™ dÂdX¹2ª±‚-cœL€xˆ‰Š5Ö”:ÈÓ·ps?¼X zBr‚Bk„BkD" C "T# ošeD!nr’B r%N„je)we ®w)"®ÊÆÈÉFiw£ÒF €#×H ¶É"ƒÝHŠ[éE(€ÑïCeóDäɆl$F œº6¡º"ÂÐ3r€ÎÂ…$ì+7– ÝD`Q8D@™Ò` PÄ® á >T|H³fÍ !ù *, …TVT¬®¬„†„ÜÚÜlnlÄÆÄœšœìîìdbd¼º¼”’”äæä|z|ÔÒÔ¤¦¤üúü\^\´¶´ŒŽŒäâätvtÌÎ̤¢¤ôöôljlÄÂÄ\Z\´²´ŒŠŒÜÞÜtrtÌÊÌœžœôòôdfd¼¾¼”–”ìêì|~|ÔÖÔ¬ª¬üþüÿÿÿû@•pH,Èd Eð RÉèѨ@Òã£R( /Öªæ’%v0V”°®z…'Ð&„|ÄÕÊö VdF'mBUChV G†C!tC‹iG!mjQTbH€VR zI'¬e¹ºY »J&mÃ*# C†Pº¡B$†§ºØbP¥mÛ¹àP”m¸¹%h’BmÌà D) âÈÿ TÒá@–¢II!€aQD8–e‚DQ,xx#%„*þ- Ààž(Ôí²PÅÚ@"Î{9¤Gš8i!ù ), …TVT¬®¬„‚„ÜÚÜlnlÄÆÄ”–”ìîìdbd¼º¼ŒŽŒäæä|z|ÔÒÔ¤¢¤üúü\^\´¶´ŒŠŒäâätvtÌÎÌœžœôöôljl\Z\´²´„†„ÜÞÜtrtÌÊÌœšœôòôdfdÄÂÄ”’”ìêì|~|ÔÖÔ¤¦¤üþüÿÿÿóÀ”pH,Èã"¢9$ŸÈB€4ˆ ͉5>T*a„ ]"' 5ìNšÌdPB;ôôlJn)zaClIln "E"H u'sO Iku¥) NC(uW TD$ T† STŠE ‚¿ÁªO T®B%šª$ØB"¨Ì^`uàDˆËåB§uéê_³s"%Dß $ÁîB00ЀÔ„0#Ô1.…F@|‚"Á€#¸€óƧH*h˜éúTäÄS€Ø !ZÊ—0c !ù *, …TVT¬®¬„‚„ÜÚÜlnlÄÆÄœšœìîìdbd¼º¼ŒŽŒäæä|z|ÔÒÔ¤¦¤üúü\^\´¶´ŒŠŒäâätvtÌÎ̤¢¤ôöôljlÄÂÄ\Z\´²´„†„ÜÞÜtrtÌÊÌœžœôòôdfd¼¾¼”’”ìêì|~|ÔÖÔ¬ª¬üþüÿÿÿú@•pH,È$q 1ERJdªQ¹€65–³’nr1<†„,€"&R²ðà6äB%d¡rÔC(D Y'L€T jL€aL Y ˜uPU"!gL  ¡]§m°J S±KY"¸J€&¿ O‡Xj·°%Y¡š€¯mÎP‹€Ä"l) ‰PH¿I%fåU %‹ëDÑPòCžjU ‡K‚âm ,‚– ˆŠ(Ö\P¦f•  R δr(4(“@.Åâz@Ï 2”Ä7Dš8s !ù *, …TVT¬®¬„‚„ÜÚÜlnlÄÆÄœšœìîìdbd¼º¼ŒŽŒ|z|ÔÒÔ¤¦¤üúüäæä\^\´¶´ŒŠŒtvtÌÎ̤¢¤ôöôljlÄÂÄ”–”\Z\´²´„†„äâätrtÌÊÌœžœôòôdfd¼¾¼”’”|~|ÔÖÔ¬ª¬üþüìêìÿÿÿþ@•pH,H#j#Pt’Pd@E¢Ø!„JÝ‘#[Ür#Â* O\Dh禰(¢#!1<‡\sI cIT P(\'X)„I&”nP œŸB)wDk\$¤uD ª ‹dTžE¤“m¤P$WC!ÂIfÍF·\ÇÓBu”¯Ú*Sœ^ß*œŸ ÙB$”¤ Tº*% Ü `%(‰8¥éCž$(Ý’@NEBNj[p­„…£´€Èt¤œ”nÈ ½Ü¤pkAË!25£U±§Š !ù ), …TVT¬®¬ÜÚÜ„‚„lnlÄÆÄìîì”–”dbd¼º¼äæäŒŽŒ|z|ÔÒÔüúü¤¦¤\^\´¶´äâ䌊ŒtvtÌÎÌôöôœžœljlÄÂÄ\Z\´²´ÜÞÜ„†„trtÌÊÌôòôœšœdfd¼¾¼ìêì”’”|~|ÔÖÔüþüÿÿÿóÀ”pH,Ȥri–¢$R0€Öã ZèJÄhµ£aöü!5g@`Èk%ná"Žn4yB %mL(QƒJ(FygE(y$vsC$q ƒ]CªŽG³qµ¶EvZ»F' ‚ÁG ±ÇËE• ЃZR"Z§nÖØC(fq‰nÎcC'ª ÌìºÇ ¾Z‚!¶¸[LÄY0jPƒ6t¹ÀŽÕÀiSÅ€˜ƒêm!r€57 Ø•x§JCŸež´`ÀÈLˆ  º !ù ', …TVT¬®¬ÜÚÜ„‚„ljlÄÆÄìî윚œdbd¼¾¼äæätvtÔÒÔüúü¤¦¤”’”\^\´¶´äâätrtÌÎÌôöô¤¢¤\Z\´²´ÜÞÜŒŠŒlnlÌÊÌôòôœžœdfdÄÂÄìêì|z|ÔÖÔüþü¬ª¬”–”ÿÿÿúÀ“pH,Ȥ°ÑP:‘ŽËó¬ G€,@a%V"¥ ¤0ºÂAË YB‡HxšHLyB”X,!D!YIeOZIeUJ xO!sh¡¢£B!$¤G$q#©E%e h De ¢ YBºe½¡"\B²´]!·D$„—¯EÎØÜU%Ý'±ZãØ!»TK¨D ÊGìB Y¸CÈlH€# ».\;‘€!$ 6ìºtl—¾.†]H „Ð.EhH`@kÍ.ܰs÷ªÁ€2äakÀáÀ3U‚!ù *, …TVT¬®¬„‚„ÜÚÜlnlÄÆÄœšœìîìdbd¼º¼ŒŽŒäæä|z|ÔÒÔ¤¦¤üúü\^\´¶´ŒŠŒäâätvtÌÎ̤¢¤ôöôljlÄÂÄ\Z\´²´„†„ÜÞÜtrtÌÊÌœžœôòôdfd¼¾¼”–”ìêì|~|ÔÖÔ¬ª¬üþüÿÿÿó@•pH,Ȥr™ì@%¦TX‚¢1Rt¦ÄÄõÚ ’®-XÕ¢CÓ8´:4ˆDñ£–$DjF!Kn$uI(W}Hn•Gc ˆ (WšHŒ¬Htˆ…±E ¸C}c#¿*—n«¿nɸ%ÂWzŇS G)Ú`bK! ŸC) ëBípH!"nBn)`˜i €€|Sä0+CÀ 0 ž²Æ ˜ Ì<ü`Й” ÂÀiÃìÔš ©†&Þ¯Â- !ù *, …TVT¬®¬„‚„ÜÚÜlnlÄÆÄœžœìîìdbd¼º¼ŒŽŒäæä|z|ÔÒÔüúü¤¦¤\^\´¶´ŒŠŒäâätvtÌÎÌôöôljlÄÂÄ”–”\Z\´²´„†„ÜÞÜtrtÌÊ̤¢¤ôòôdfd¼¾¼”’”ìêì|~|ÔÖÔüþü¬ª¬ÿÿÿ÷@•pH,ȤrÉ.(¢QÓèEE   M‡(ÓVär¶€ò·ƒDˆ"ñu¶1õ%H8òK%S (€J[)E()"€ [EmRu$XDmˆG m–¤E|ƒ©E%)%°¶·¸ ‡y ½C [ Ÿ_ |j*m$€ EŠm¸'mJ% #ÂF(mŒHÅhäE)‡(È¡ÛxS(Z¶@h "Ķ-£¦l؆ÀÁƒ}¾ðksBŹméšLDC­À¶ Ì–`ºöGEƒ‹j}ˆFA"JJK‘ $“ !ù +, …TVT¬®¬„‚„ÜÚÜlnlÄÆÄœšœìîìdbd¼º¼ŒŽŒäæä|z|ÔÒÔ¤¦¤üúü\^\´¶´ŒŠŒäâätvtÌÎ̤¢¤ôöôljlÄÂÄ”–”\Z\´²´„†„ÜÞÜtrtÌÊÌœžœôòôdfd¼¾¼”’”ìêì|~|ÔÖÔ¬ª¬üþüÿÿÿðÀ•pH,ÈäJUi(ŸH `Z‡›éèzL%ÜbÃÀ¹/©rxX™P•zJÝgpz¦ÜP&Y!O^N‚(*V"k‘’“V"”Fny’*C&nSu’R B¥¦Š‘%«B^S ‘*&g)š›ÁÂJ fI"¯H¦»G®I(¦SHÛIÛSÀEÛgæ äGYnU+ S' +ÑÛ¸EþØÒ$)  nã dB ÐmË`€ )ÖX —‘Õ€WH!ìÁS·†‰(Á/+A!ù %, …TVT¬®¬„‚„ÜÞÜtrtÌÊÌœžœôòôdbdŒŽŒ¼º¼ìêì|z|ÔÒÔüúü\^\´¶´ŒŠŒäæä¤¦¤ljl”–”\Z\´²´„†„äâätvtÌÎÌôöôdfd”’”¼¾¼ìîì|~|ÔÖÔüþü¬ª¬ÿÿÿîÀ’pH,Ȥr™„tB ¦TX=S)Èr-.<¤Q–@$Å„µ0f¬"©ä u|L‡Àzi+?VV ~H„G V„ ‹ ~\tŠG–›¡¢% ƒ£Bhm# D‡c \qC{Y \¼%‡ Yo‡ C#$$c ÍV²Š¾‡ÚD# šG†ÍI‡ÏC $qz‡QHÍ’%¬(`À`‚¹#\Íóg娇X*€M]°k­xQLׯÁ€²äK–ª@Âß6-¸@’ !ù +, …TVT¬®¬„‚„ÜÚÜlnlÄÆÄœšœìîìdbd¼º¼ŒŽŒäæä|z|ÔÒÔ¤¦¤üúü\^\´¶´ŒŠŒäâätvtÌÎ̤¢¤ôöôljlÄÂÄ”–”\Z\´²´„†„ÜÞÜtrtÌÊÌœžœôòôdfd¼¾¼”’”ìêì|~|ÔÖÔ¬ª¬üþüÿÿÿùÀ•pH,ȤrÉl6 Ç£xLNâXŠŽî7+\lº"¨[ %€MÅ8™¸‡ªÉáÎOª*X}HG"|t\‚F]S“C•–*šC ]ŸZ vnŠ¥ ]–sš–²ž“œ²]¨+ )¯N¼½B²Y½]™ ½YÐÍB½d D½%L J %ð+* '$D)½öœ„è•BÈh‘²ˆ¸”5ÐÒ8Y€PÄŠÕ9y0¢Z²e½Ìe©p&2!@nHpÇD‚‰<"f©&A!ù (, …TVT¬®¬„‚„ÜÚÜœšœlnlÄÆÄôòôdbdŒŽŒ¼º¼äæä¤¦¤ÔÒÔ|~|üúü\^\´¶´ŒŠŒäâ䤢¤tvtÌÎÌljl”–”\Z\´²´„†„ÜÞÜœžœtrtÌÊÌôöôdfd”’”ÄÂÄìê쬪¬ÔÖÔüþüÿÿÿù@”pH,ȤrÉD-ͨð|¤MF•‚(’A‘äºÂNj. „¥¤ €2©—e#EvJh†‡ˆ‰M!'Dm]TtCU‚M'!|tW¤X˜tq˜qR­U²…R'µ#Ch¨‘Š( %ÊÒF " J•I ˜H´tK%­ÃFê¤D##í(µG ˜yB&Ö˜"Á1Ô Ðù…âÄ…~‘.ѹÌÈ%¢ Që Š¤<èŠrÀX†o>4ˆÖE  ÓNhððˆå´.A!ù +, …TVT¬®¬„‚„ÜÚÜlnlÄÆÄœšœìîìdbd¼º¼ŒŽŒäæä|z|ÔÒÔ¤¦¤üúü\^\´¶´ŒŠŒäâätvtÌÎ̤¢¤ôöôljlÄÂÄ”–”\Z\´²´„†„ÜÞÜtrtÌÊÌœžœôòôdfd¼¾¼”’”ìêì|~|ÔÖÔ¬ª¬üþüÿÿÿòÀ•pH,ȤrÉl:…¦“àðlZ€”ÑðYT‡lÅ8€¾Ã‰×8ɨ˜*ZéAJó¤ ˜T' EWrM|XD!gO ŽXyC!˜XœBžŸ¢+Ÿš§+˜•Bk…C&e¬|oU"ÄC›OX]DvYU—ŽÉ+¦U˜ß¢Ÿº¢˜"H%$E ' o"Ž¿HŽã)…""… çŽTÃâ@ÈŽÖUÑÇ'ÁO~ž¤ŠÆNG«ªLàà‘ÐÁb%"AÀÐ!ù ', …TVT¬®¬ÜÚÜ„‚„trtÌÊÌìî윞œdbd¼º¼ŒŽŒäæäüúü|z|ÔÒÔ\^\´¶´äâ䌊Œôöô¤¦¤ljlÄÂÄ”–”\Z\´²´ÜÞÜ„†„tvtÌÎÌôòôdfd¼¾¼”’”ìêìüþü|~|ÔÖÔ¬ª¬ÿÿÿùÀ“pH,ȤrÉ$2 Íè(I‰#SHdlT¯Ã 02¸`ai|XŽ›ÅÃt€Ê‘d<®,ÒF ||€EƒcxCPW‰ctB‚W’DcW‰D^œW {¥D" i Œ†I %·¸Cc¾Cƒh¾’DwW&’&ž$#R’¯'Í|W¬cDƒËM  ½ ‘K ½HìŽ0ðÂç8!" ј|” ñ6˜Q…0@€º+Ç`0è-0Ý!5 ÐaÃ/ÞI½.À'uJ$N lQI%`N%  L MD` ~'!l po_u‘¢Fun¯E%´p{`X¹^`®¿D D ÅF#`´ªCŠ¢ ÂÄB"tƒ~€aEd¢Ál‡Ð' uOIlùGû¨Ë“†Ê’|`È„8‰jÀ—Â8x%A˜¯Ø xÅÀ@†vBB¢“wñ‹,°äe™ !ù (, …TVT¬®¬„‚„ÜÚÜlnlÄÂÄœžœìî쌎Œdbd¼º¼äæä|z|ÌÎÌüúü¤¦¤´¶´ŒŠŒäâätvtÌÊÌôöô”–”ljl\Z\´²´„†„ÜÞÜtrtįĤ¢¤ôòô”’”dfd¼¾¼ìêì|~|ÔÒÔüþü¬ª¬ÿÿÿö@”pH, M›ÃÈl !rZŒtK¹zQ‘í–ñ%Ž "A,Å”‡¥)‘Á\ÞCʆ(ª{P' xG bb†B%K'lFu…›Duf† lKC{xZv#E¬D% ÄW#&ÅFZÃÊB}[™Ð($l Õ®[D]xbµCmçe&Z ÏCˆR¤†Ç¿C ÉÕBÇŒ8ðG¤@ >@:C"Ä 0´A ,—¦¢ ¦Ãbîàù°oŠB€ڈó`Ò:€2èúGR;web/img/favicon.png000066400000000000000000000015641516074605400145600ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆ\PLTEçH%çH%çH%æH%ðK&øN(ìJ%óL'øN(ùN(øN(ùN(ùN(òK&ùM'ëJ&ïK&øN(ùN(úO(óL'øN(ïK&ùN(ðK&ùN(ùN(øN(øN(ëI%øN(ñL&ûO(õM'êI%èI%úO(úO(÷N'êI%øN(êI%úO(õM'öM'ûO(æH$æH$ôM'öM'óL'ôM'ìJ%ôM'õM'õM'ðK&ëI%íJ&óL(òL&ïJ'îJ'ùN(ôM'ñK&ïK&ûO(îJ%úO(ûO(òL&óL(åG%çH&ôM'öN'øN(øN(÷N'õM'öM'üO(üO(õM'õM'õM'ùN(ùN(ùN(ôM'öM'ùN(òL&òL&üO(æH$åG$æH$æH$æH$÷M'÷N(úN(ùN(üO(éH%úO(øN(÷N'õM'öM'ôM'ûO(óL(q`åÝatRNSýþþþÈàµSZÁ£ÝÑ^k¸{ÉYÇ –ëaÇa¨æó‚ aÜÒˆSøîŠ›³„ ÑÓÒ.1®³’DÑÔDâB69MèÛBCBCB`CJPCBaWCaaTGF]¥Äê/fIDATxÚuÑgoÂ0`KÝ{ï½÷Þ{ï=BÛ>”¦`Éÿ—jsŠÌE­?ÙΣ×w¶fÖžø ý®ëþ|þ :›Ò.AÐøæ"ÐÆD´41&8蕲÷¤¬``TI)[;€‘a_0U*©E·Ù×ëgHXÍf•ÒæPã×aÁ}V/“1Ô Ì*5à5“!¡d]e¨Ò‚^!ð–ËXQR^bÝ ýÝ#¾”*d)«íó…8÷rzùq .‹+L’xž—$4RVMìX\z^AFÂ$ÈFŠ3Ï I98ì9ùJOÞ …º—Ôâ¦ãq| €f*#N` À˜î6I"6cn ˜žõ3" P æÍaþ‹¼~¥Ëf¿AS¿…6cieufzüŒDœ&v àÝ> x·/ø Ø™>ƒƒ`Æ8fìã€íÝ-~ó z †´¾:†IEND®B`‚web/img/feed.png000066400000000000000000000013371516074605400140340ustar00rootroot00000000000000‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<IDATxÚ¤RMHTQ>÷^'Ó Igü™RcMA-.ªMD+-ŠE’ Q-‚ Û¸hSeAP´m•`-7©é’?MšæØó/±Ô§ã{ïÞ¾;Ž ôà{çÞs¾óÝsÏ=L)Eÿó±ÅÏ3X0 ô¯`bÝ„ý¯ï]§ªŠh~–äÌ8ɯ_HÍ̽#)!Þ¡ÈŸ8`Ù­Ñdæñ‘«ü¹Nœ-å{²Iðóº·üoÂfû€R˜åû“â ‘üaüð†äØä]ÄjQÜ$°±‰81¦Š%&Öðý%;¹;‡ä`'9}¡FR²zcotõ°ÙÀ[  „–˜PÌCQ[Á|¹¤ÆCäô>FüÊæ&;S$a”:Lʘ ÂÄ—1¡û"ߥ¦“"9®Dìùú&Fœž6bŽE®ƒä:Z^ÂÓÜÍH¼­ ×8ý¡&5;AÌJ´5¡±äõÕrÌ8nwwßYyÕ`ÈÉQ…e$üÙµúôï²ói4Œ÷"ž™êÕûß6 8‚î‰@ö9–’±ZrØ8*ê«äÞž’BvhhŽÌ¥üSQ˜ ÇxLè‰ðïºÄ¶%‘=ðyš–—òàž'!zEVz@Y Ž s ÐÃâ· `ýˆùª3òí£2‘ãIvcd‹§™l‡˜Ð7§#k=¸á*.ÎÅ{·sû"öeÑñµìê炾¥æŒÝ²E.˜¤ÌE½.\$W@sˆVÛ±Ö”V5oF¸CÊy• îÍ3(b9¯G„²ôO—{Ë öf¦/€®˜À”Z4û¬öŽÝX/ë•ßaÃV{ר9Mú%À´’ ̵wIEND®B`‚web/img/glyphicons-halflings-white.png000077500000000000000000000211111516074605400203660ustar00rootroot00000000000000‰PNG  IHDRÕŸ˜Ó³{ÙPLTEÿÿÿùùùÿÿÿÿÿÿýýýmmmÿÿÿÿÿÿÿÿÿÿÿÿðððþþþöööüüüÿÿÿÿÿÿÚÚÚÂÂÂôôôÿÿÿÿÿÿôôô÷÷÷ÿÿÿ³³³ýýýâââ°°°ÿÿÿÿÿÿûûûçççþþþÿÿÿíííÏÏÏýýýöööíííûûûçççúúúááá’’’þþþþþþÁÁÁ˜˜˜tttáááÐÐÐóóó»»»¡¡¡€€€ýýýÔÔÔbbbÿÿÿÕÕÕøøøÜÜÜúúúûûûéééûûûýýýýýýÑÑÑòòòüüüøøøëëëüüü¶¶¶ÆÆÆåååîîîõõõýýýeeegggððð¶¶¶ààà÷÷÷úúúéééåååúúúøøøËËËÿÿÿ„„„ñññxxx÷÷÷ÝÝÝùùùÈÈÈÒÒÒìììúúúÞÞÞâââæææóóó›››¨¨¨¥¥¥ÜÜÜîîîÿÿÿñññÉÉÉðððÿÿÿÿÿÿÞÞÞÆÆÆ¼¼¼ëëëÖÖÖÐÐÐâââùùùôôôâââìììõõõ´´´ÿÿÿýýýûûûüüüúúúæææäääüüü÷÷÷°°°™™™ýýýìììüüüÁÁÁéééÿÿÿÚÚÚððððððõõõñññþþþøøøþþþŽŽŽâââûûûùùùÜÜÜÿÿÿòòòúúúŸŸŸííí÷÷÷öööèèèóóóúúúõõõõõõ¦¦¦ËËËúúúøøøÓÓÓëëëúúúëë몪ªóóóííí¢¢¢ÏÏÏÚÚÚÖÖÖ¢¢¢ëëëâââùùùUUUÍÍÍÿÿÿÖÖÖãããáááêêêüüüÿÿÿöööûûûóóóôôôÌÌÌÿÿÿÿÿÿùùùõõõÿÿÿòòòýýýÙÙÙüüüûûûüüüééé¿¿¿ûûûêêêéééþþþÿÿÿørOæòtRNSÔÏñ#ïŸ_ /©ðÆâ¿oS·ß?†ÅCá kD¯ÂÀOS_ ¥š²ŒÓ6Ðà>4!~a §@1Ñ_'oÄn¢Ò‹‘€M†¡“3±BQj™¶p&%!lµÃ"Xqr;€— A[‚<`‰am}4…3/0Iˆ¨PCM!6(*gK&YQ¦GDP,å`’{VP¤-êxÁ)hÝ7‡e1]ôˆßW¿³$—‡1ƒbÄzSÜ•cOÙÍ]ÀŠ–U;Zié»'yÜ"€âÐÐ‘ÝØ†‰K 64ÖYœ*.vè@²¸îŽc.};‡ïŸtN%¨DIª˜ÊÐ !Z¶Ð5LñH£2Ú6 ŒƒÉ¯ŽÖ"Š Ô-b±E,,)ÊÀ BŒ·¦>m¹ªÃãúnøö6pmŸRöO wm@°ÝÌVÝ#?É'C…È‘Z#©Žqž‡ìÀbÒÓ|$½:Ü)‰Â/E¾%÷ânR¹q—CàhnµÉ%õiÓÌ“­º¶¶ß}lƒm ?iÿdâdÃ"€,Ø­Ç`¬Hñ"r.z¡¼‹ŽÁ~ýìü(bðQÜU&ê½—)–5õêX#•§ òé™EMªæÜR<Í*p[€[%.©OÉÌ£˜¥k7“lIo°ý¨ý“¶ßJ°F  ¥lV!̡ăuH‚`Ƽ™€—›ç‚&¢,Çz´ÉRk$¤ò¨|$ölŠ»¼Xbü¢âéÇjߪÈdU±û?Σ$Hµî¸©W±¾$Uû'…ÆÅHÜE3*Õ­º€µµU\}ê­ý†(Ò ¤zhVk}gÇu«Rk$¤ò%¨|‰T¨|Úêck¦ç³"ãžä±Dç”ý«ƒ_W+‹®”Ê.QòÒÅ)Õ@«ý“ƽ€H¢À›Íbµs¸ÔlžŽT´©·Dÿô­RÄ2Xm£#a Ýêº3lYÃÎzÌj¹ŽÔã’š#!Þ 4þJ´Ä8Ñ(Œòcµv™‰¾t]­a·˜T™Çàø Ò÷D Î…à¼áQ?^-‹Õ_^$:\ÿìÞV  $«•N|ì=(vˆZ'q6¹Zð׆‡×üB5VìÌî!y†´¼3äßKœÿ㱿bàv4Œñxðëê£âR]al—í!ÔþIÛo‡P‰@Åt¥äVy”ºîàLïÿÙªmlµÚ¿I¨Ub|[*°¶lke'*¾WdîÀÝdà³ðïD·Ó}\W›ƒ_Wß´ù¶¤rÐNÚ?™øÛvÞ«ÁÛ²X%§Ž0u‡öoui*„üJV·€Æ¦‡b%†}ôãˆi5I¥YlNŸE-wÐÏ‚ûf_W3mþIåà…Äý“…—-ŒmƒÊ¬²Q)“S µÖk´«TC7êím¤<"ÄôÜŒ‡b‹T|ìÆ'¦Õ$µÒ˜Ÿ£óóÖR&>¥êO pœõºš¾ù…ê6ݬÒöçú½t±¨î¥S­ŽN\©×¯LŒîmÕø\ÈÎÑÊÄr@¦3žuT b7úÓt.5.q©ôÈ3²r0ü=™8T¿ªi­J©\ëÈ6uF ”²R¸32^÷íñ'ŪŠóÀí±xˆâI« ïÒF„8O{%8­žkJšÓMSÈ´dâBEdæÑè ïW‚CYÃ÷O:/OŒN/—I‹ê_=½€xFE”Ñ! Í=¥æi:oÁ~’¡· yþ?¶š'·š'·š[Í“[Í“[Í“[Í“[Í­–è».¹U>±$÷P–ƦŠc%†] Û\c©´:é| ý,e¯SœZ,‘oš¿XríäÎËXº!ëRæ”ÇÆò@áZøv‚ ‡0Ôç>?Á*ç® Ô<ðþÕ|ø«¼N6þ0ú¹;{¯ažd³ê2Ôév+Däó^tààúÑ[q!òÛžV}Èøf«œÛ¨ÏŽÎ×Yÿêeॗ€Ë)Vyl|" f÷UDzqˆ@ëˆÇ¼˜4Y-˜³YýÍ-!¶6a“žŠB:o%ñJ¤ÛI±´—UQ|£UÆK¨O `¢®=\ ý´­ò:ë0¾°Àx …±Paó‰Ìuˆ@œ»!ç»K†âPÏdÕxhw1>×$jγ“vöZdàè™xñ«ÕSšUAÅ&[URßd•ý7ðøÂz·ký«/˜œðr¢U^¬Žä £ó—w:I.àVÇ®ëôÿc>qí.!·zSÛr&«³Õ2…)Wgù ¾…R -ÎiãQ 8¿çØûPa\О×U%•iÝ¡¦þUï_=àÃpÊø ›Lu ê(îžN¹?†Ÿ 0?Æ:]½Î¬ä†ÔÏt¬B%“U|™úù²¡NsorNÿ¹f¶ú ø,»P !­v" Y¬6¼hLï_­@@…bé·s¯c¶¬£qg˜v4|Â|0lÏŸÐëÔ$SŒõ9ŽîòbʱšÑj#ŽŸ£~žƒÁÒÏ?o²÷}‘‘ƒð}7sAPm:IV¹=n•÷¯ !ôþÕ{±›{ÍÝh¼ÎEࢪ£8¤sèu€ÍoL®ëÈTð$ñ„õ;VÝú¹­sõöcqìD¦3ðø¸ñ üÛ༂3.D«Bˆ«éý«³B4Ì&ìV'ØÜ TÅ `õà½Dï6ÿ™žšÏ·óqýyùjû8V‰Õæ*ëÖíX%ý³›@s«\ÞjrNµ$à|ö=5þΆ 'ìmU«iý«Kýi€%C™ÉIð:ssaÆ…`*`óµ=úl½÷)>ÈuÕ˜MeuSš›·¨Iò_ÎO÷ˆLü£_©}o&©íÀjzÿêÝpèºþ{¨¤ÖáÜlu:OñÁ®«ÆÌ)«s¤%Q@ãÍ$Þ<]f› € xO%…÷PCbhr2£ÕôþÕ¼ŸèýPK·Êëpžf5½Në3^o«ù©ú¼]êe²JÊêÁ¤iÐB˜œ464†€^tï‡uÙ²þUÖŒ:G4'¿ò22YêpÎëˆÌu¦G'/PyÙ4?¡þè.ÕæSB„P_>‘ÑëšI 1t3Γ÷BäÉ­æÉ­æÉ­æÉ­æVóäVóäVóäVóäVs«æÃ]î³!×67(ªÇg ¯¤¥‹Šyƒ°@†” 4>QÚò ßÕV«F­}^XׇìÚ¼ˆ’Õjµ¦e÷26 Lž³Ð%žòY´Gâh û³šl‰C­}­)Óâ< ˆ!ÚE ôðÇE½PçZWZ™½ŒV+þ@†ÏR 5{@ou—Ɇ4²‚²&…„˜´H…Ѭ6÷eµy V‹ˆÝ€˜VÅ¥ÖÁ¬¾ácqZ„Þ’©rìÓJÆçyBêæyžÓˆFzÑõFN¢$¢HbÈÈÕ³*+jÕqòÑÎÀ Ú«˜kÝ¿UàX„¯lºe·ìÄö¾Ä1“ÕÊÚdà0d^õ-‘B%‰ƒ}ê œø¸{Yõ¡™%rÇ*Òj5Ak5¦u«³"Ì,·:~éÒ¸áY¾Ü~ h™÷ûÄSA~¿­6ì ¼fuÁlÕ‡fµŠ{ȵQtATHÐZˆkÀªŠÆ­/_°¸ÕSŸî¼náû¹ ±u']bù]|m`«B…ñÄÁÏÀ¡J,O$íÁdu]·Zs® ÀFLß:©Äùúú›aõø‹À‹Ç™ÕÂÌT4Ïoà~by?wpÇj滥ÖAœ…Ø(€xù]„†¦ú…ªfÕí¶~anÖ§/ž©¸¿^ÈdÕÚ²öcØÚú˜Õ‡,!ÄÐ1©øi&–xi_VK@ip«Íƒ9¯ÐÞVi%a; Õ¯L?‰0J“*¹’šÅª5ܶ¸UÑ·Š“'Á¬ºx^î²6âV[¥^ à{öeU™ÈÒ|—:0ø=0‡»ÈdÛ«o‡¨ç*J“q%•[­ÆõYÃN¸˜.sQ„L‹udš[2×ð9þIýó:WÁn—ÔÈÿÐÙŽÊm™Xl¥Úƒ¾6×!lNl‡ÙVÙÕ§KU¼¤¤jVã\J%©UߊßB°ŽLcKfáb×ö>a“=Òb›~¹R]aG%[ú÷×js@«/9ðMطݘU×>yɲXÇ@}³ ” ëëF¢´tÜg^‚ÛvO\°žÓ¸wv‚p•ϯz3›K5i¤!$P>”ÄÅ€¹'Ò”VÆ›¬”¢Lž2r´ú@¤UMÃÉKÃúZ¯õ‰¹å6Ö×ÀtwŒë§ŸÂ¦bä„mß1âh|ô|É]}~¹0øÀMjA¢À´Ò(JâŠÝÁ­JP68ÌC&yrÈÌ׉e}­jŽ_cËJ½?êI0¬¯kêÛ>š«W™‹áø Æû‹™¯é|¡B¾Þá."TEXd Ô8”Ä!cwµ*E(ÎJ)ÊåÉ!Î[W"­j_ÔÃáТeX_×ÐXB;¤÷¯o°†O0~?¬:P½Cã (.²í¶±[·Ž‘‘ò!Wq£%ßÔ*leÃÀY)E™<^ˆKåZ¹T•60Ö.ðõ#«µøA\ý¤Á5;RmÆtkdÂ/8§)5~‚¿ ¬^0Ú #åCkg–¦¶eÍÌy)²—±Í¶¿‘ÔºÒ°6Ä¥ª<€(?Æ×&ÉõõuîA„áVŸ’õm0^h.—tÌxR*ô×aô©'ö:,¥H§|èÅ–ªÏ l5z„;8+e¦#b'#|û}2Æw(|Kc–J½ Èl6 뀶¾®wù‹^‚ÕŒo×—iúœ3HÓ êR –ŽÌ”9Š,Y“gP«Ö°:N œ[5SÃöû‰R‡!¢§ä[)•ç]€úœi}`úúºm¬’¸N±4Ð¥¹²ãvÑ`|;f¬(®´Fïlt©„¢LÔ8”Ä÷Z#½Aï–¤O%ÕÀY)N¹U®5YêÑeœ¼d–JÎE3dZذ’þÇ<Èx·ÇñØÉñä¶e •@ùPÚ§ÏþÎFúTR œ•2S¡Â·ßüΦ/uˆZ°~ðšCæ3ÇÔXÊz¼ÍÓU¨žâxõ\2s«ñä¶e •DùD.çÉåfBO&enÝ'iÈåR%™?Fy¸VsS~$uˆ®mœw()Á´r”ºo³0*Dí˜Õi!3½:On[Bµ!sʇBäp>Ý£HTÙ1òè ;ö8M×jnʤ‘Ó¤ï¼äqpÞ 1hò^ˆ<¹Õ<¹Õ<¹ÕÜjžÜjžÜjžÜjžÜjnÕÜßû–qÕ(qpõOkª’Ô}¸ßøI?TY8H«®mhyK¸Ìu5ÍÏÂÎIœt÷eÕnQBÞ—`µRÄÂ`¯·EÀPË ­Ú¦ö˜½¹xû™«ž½>¹>€â‘¡yt¾{?|œ×'j)”ÉÆ€µ}YUÛÏäUùÛÜ{ç@Vå‡/€J1ìF+€¬¿7䀉[OW«O[æù ø¹‘‰y³ÇUY«ª•ˆõ!?BôÈD%D™Wj¼>-Ai6x£z)»ÕÎU R½ùª±’7 dõÙŠ@µg‡ˆëï•\†soØ)œaÏ4ßzfŒ[«W+•±>¹¸« œÿPô>ä |•ÛqLãÑG8vâ¸âêÈ£„˜l´j©µ2ZíÆtÜß+åŒV¥ÔA¬6g<„/ŽæQ ‚H­çSrΣ“ÑçÖd}ØùYqàÔg]€sY]ç;]FëCª@5¼YÓÕ–5ÎC©3å8oÙ)kš1'ûüd6«>T *Ëʆ’§Uz(¥m)ûâ®CD `‡ÖHe/¾.ñ:ç—zN¥È9pgo &NC¦×ƒŒÞ‡¼>¶WÓøÕ°_’ñHj ñ)¤Xe6F„ 7p’m¾-è`'Öc†»Ü.Õ«‹ÂAZ=³þ^Ée8÷ÂF×;<ËûÄJ1{óãŠ+8'€Éª'„Ö‡\Aµ*¿Òø[² ‹ñR$UãY)V¹ óAyɃŒw)ŽEc#<ÕT‡ƒ”»\vW•{R­®«ÉëÉýºtÛn(–ÏzÏ!S×7o ×ï€×Ie®Žî™wõ3]ÔçbÜ—üäÇ8¹5|Æi·Ï æêRÛÚJkʱZ‘RO+ê8£U&µ:]•Z‰ieR‰’¬¢‰(üóJËMŠÞ—7—³«ÒZ@Œ²5Ýa^äº\G˜z™¯sª¾éÏU‚Ò*¥rMÏe³zT¬^Ê:ɬ‚õͦX=>Ü$ bi>³U&X¬Qoybb¹GÄøkøÍ8¯ – ÅÒ˜óýÿn).Õ¤òœÙðoã ¥À^Mmád³ZƒÊóië$s«ªo–oÞê*{»4ììÑeLb¤LÙ³""mx: `:mÉkž[ØgeTˆÑ‡Þ¬)Á„'0*T˜›Bá€{!úîIÞ ‘'·š'·š'·š'·š[Í“[Í“[Í“[Í“[]˜ZˆƒÜj QŠ.e '/¸®y÷vQ¤71ø(Z&†óÒX‘õ?(_œšZ”œÇº”){tÄÚ€m˜ZíÿÀWÑÏ)­«-C“ŠÓò´¶ jqání,Ì‹Ÿ"áIv‹¦½ULØ!h¢™Ù꛿îñ©¯Ýsçk’óAcrN‚ôþ佚ф€…VE4ö0úy˜XÜÒ~å4zʸVã³°%·ñ,é¹ßû)føÃÀqtÃp˜u¦~ã  Þø©ŽÑ*ý“©^æÖ0:åýÏéܲö3ÿ3…ÃÏJÎâOô(¦·ö£›ZB?K™^ Àv]’un ŸlçúÿôWþÀ‚¶i0´p6­ˆ[ì°©àC_5Xý#ú[¿öwX3ábñÎ廫ÄR½{ùÎâ¢NKðAîÏÿŒée S«èÓeª|Ýã¹wñ¢ÇxâºÊÞsôño>ÖP\å„”Ô•6Ò;nVÛm¯fëI$àø‰ÇûVÍ“J-ÛJ%ÖŒ¼Ž0¯óUwûYÐŽÉSõóó×n‘uÿÒmÿè—®Æù«xzµÒË—VŸÆ«ÚIµvnôWÿÚ_ÿqLZØÇòé"_—X®z‡Ã÷Æ 8Ç]Ap—‰ƒˆÍ?†¶CÍ‹Ž‘ž5È4ˆ·3ñŽzw(Ü{7e²*Ȳ`Û°¬!AÔQ“:ñKUnõ•¿Âÿzë]ú1y†V„ø›Ga°úCÿêm0îPY ÙšUx6TT&·hVï9V§ þîßÓ¬žzÑ  1[÷X®z‡ZœËÕî„Ð9ªe¢r›qóJ¸³¸NDß/ù¬¹g·þX¦ë*9o—ðíN6«DÃÃ` Ë{à÷ªIï%ËM´z9—ãTûQŽŸà–ˆþþ7fö\"jþÃ_3ÙþÖç~xBá'€ŸùÜ·ˆˆY›]*KÐŒãî“«%"úÔç5«"ðÈqxq~ü’Æ•=·‘¨j¼´ºSá>j¤Vç·&~]2 xzÀF¸ÕíŸ1X•§_yÞùDÀÎ<#N’ÕîïRB÷Ô}KôÏÿÅ/ói‰Šy†ù¿õË !V^¢ñË¿e²JŸ‰‡}/FkïñAßú7Ÿû· âëS©È×+.–(ec—ˆJ:˜zðƒªóW“ZšŠ°ëª–wïÒÙQ™þáðÅž~aÛÒê„ØÍ„öpç6,e5í¯,¬+¢–”Á,ýûÿð­óñ÷ÿt±võ%O^OøüO}ãן -Oüú7>e²ÚkC¦6£waô_þëC ¢‹|½â›9‘‘×*•šÎ‡ØWÆñ¸Aª)×U¶Jgê8<ýZ€´šx^?„ÿ¾2²u¶­Yýí³õè*^?ûÛÚ‡KC­Z¤[‚ÿ©ÿù0.’–àCµ¯@m¾çÓçß$-ßÄ/~ž|Y¥å[eþwƒeQýŸÙ×¶&cëÊOž4s|‰œc’§JåûŸwsïûXÍ8/ñš¼Î6Ï/ Ú¼;ç'F¯LN^8]ÛeadëZ 1'®Ü°ž÷^†Úü™û¼‡L³‘sBdü%Ó+M¢·`ÝãSKö8פ²÷«ìº*ƒª)gl#Ž3"Ä’gÑŠ˜S Ç㋎©qtcxxƒš|H>–¬Æø=ðŒ:³ÅçýÎmÊjÕå¬ßÿìÕUßòÁóv£qìys©Ü’žLglþC6+[FÍSWg…ö“9õ˜ƒwV3¼1µA ë N”ßD¾<Íû«ËÂ$5eÿ(s„ú¡ ÿ[Ð Û¨bú—³‡žaF.”¨]±K¡îÇIEND®B`‚web/img/glyphicons-halflings.png000077500000000000000000000330021516074605400172520ustar00rootroot00000000000000‰PNG  IHDRÕŸ‹ÂtEXtSoftwareAdobe ImageReadyqÉe<÷iTXtXML:com.adobe.xmp glyphicons_small_dark 5kÒ1¡IDATxÚí}ol\E¶§W²´^ÉzŽD$|_w'þCwìþG;ã4¶ÁäÏ<ã1ËÆÉœu˜Ä³Œ6C‚È"À ÆÒæEʼ0 "=ñ€÷,á· ïûÀ’f3oÒ 0 `àýôì¸õ¾ì—Úsnuõ½Ý¾·êT§;1K«ÄmûwëÖ­{~U§ÎuýªªÊ˜1cKά:kÎbö1çü0“ûQá‘!8dM` \¯5e]‹OY½KªA¦*…‡–9c·ã«Î8Þ ?'MÿÑ÷7kþ1ôcü¤]?¦b€ŠÑ½à¶c}x$œ’/ôõÌ$YáÑ3s¡OqY›¢+Ø*bQ8CÞ AÖÆâ,ÿ™•V”¬ÙuXx Ð÷Xðù ÝMYRÇÚ˜5¤ñ@4ð ïEì–Œ°†÷ÔÙë àjt(üJÆ®àÑM¥åü>ÀÍ(=BËJÀCšàþ’¶71Q7º% àWY}¶ù¥dlíP"o÷¤Óþ¬º˜¬HTV-/NPά¬¢Vo öŽcqhOg6¬pw½®Ãªk¼ÚˆÔÇºÒ _“ð€ç)MÒú+À¾I :øH¾î¦z̬/Éž{Æ9øOdnÁVã|–»‘ƒ_©xÊŠŸHÃÅ0k¸èÿ¬t|ˆ²°”Nºþ£‹‡nêÐ3#×3ƒu+/Ua9³%Xàq¾N²özùºg†Š§;yÒî9ïyÈ9øOÔ%~–ã¥áu©ÊÉ—*ú=±ªªÄçIÑp‘cáy}®öY(þ£ëoÖ(•u±$«^¬jŸ¾ î®»ïe\õ‰iXíñœ¬Ùã;X-¥r‡ö×ã¬ѲŠ&¾>º>¥eز’쬜¨aŸsº»?ºû?1aÛ¤^‘›¼û=7þÈ65^Ÿª8†R•6ªÒ¨*úäâ¯4|Q¯N$*>µskUqS”E Ó-î?–D²ªüGàù¡Æ¯ù ÏÕM¸#Û  ŸÖ™¥ÊŸ€U±ïòôÖÓ[û3HVUwŸd#¿)üç~@@V¼ ¨¶ƒ-s'A…Ç]—åΛdn² ¢ú3ð„7UžðuÅúS›‹C잸ïz¾{vì(8l-ëÛ;Þ™•á¹¹£”[;ªV~® é’)t>7QeS¨Â)—jºÅýǹO¥ÿhâc Yîó¢CbµÙÄ7:ã©ì X½ ïáï'Y «9ŸÂÏ ïY1y©=G ÿ6`­=G©¥VÑÿ»B[\¯×y¬QÖ=«ºùuoóÇÉ㺷ý›‚Õc?U|ôgdD‚&ëžtÐÓ¬Cv߈z«ÅЬ¡&öÿAŽ·ÏIåg”)ʨºÊuÈGU÷8Gó*=Wµbù6œyhDåùM$?º.Ü&ÃrÿÁÁvQûÀóCïšíXÔ™vd“ÙrQõÔ]ÄßolåwŽŸïúc÷¦ *-µ˜œ˜‚–7ö3pÄyNV+¼ÔxU^òà4 YiYqDµÒ,48í…ó©Åcäù”ªþÏÜïà~T}¿ˆÿ›Ö™{·Óðî~2ª¦•d£ªn¸ÒsÕ¦S ;˜]ɨDuF_1g•„ÂlâüG×ßzþ”`…cœK瓪²Z>’ß·Óhö{>åŽIoUR—Ε–N'0iž±2üq†®Ë†NÔ°cè‹ùA$+-œ¢å¯y6f´³ø?%«‹xï¾Y­ïõ®ˆúÀû½ÞÊÌUiàJÏU?ìÒm}gôsVYÆU×tñ£Ï&Ùê³îŸ¬†qyôYñTñªù uÃ,°óU«Ê. Uáê§×æc,´w'÷ŠŒ¤aÀóþÇ‰Š¥"MùW$«¬)²ÒˆÊ³¿#iÖ5v³À:ø„}çD¹óÒà6þãÆw}®ªßúëO ¬8sý©òù¶¿Õ÷ÌDðJ,#ž‰`F¸^gë°w¼?Ó‘íšÝtþx¢C~úTåWyfçá-´ê̶B‰Î?WÔªó-×_5T•l¬öÔfúc%—Z}h µî«Ã£ª-ÞûoMüÛ´t<-|sÞ«B›„ÊýDËå?<ŒÃ0ÚµË_Â9/uÿ¯spÆ”­M‘&—xÓ¤=_ª¸hî9ñã`e†¨ù8¦¾kŠ»iâ±ü_^—˜é ó¥gaYÝ«-(x®³ ‹j³Ù£è¬®þ1–Þ;Ñ;_Wÿ˜Ò$t]=Ýúè⣿.^•"_Œ^j}PV¤ ñsaF-ñ+X”Ñž/meU×굪q™½ø;â˜ð>EýÏ4d,ŠsÚ÷»ÄdÐåªÓÉœô¶Xã|燠bÕNÁÊg(…¬îÇGÁãªÿþ Š²Ô‰ýµÎjèS,}ËØ–1{µç§å¥ªn}tñ¸ ݽ.t¾®\}p5¦ü¾‹ñªv*¬½Êµ„^”º»4‰БžoR7¢FÆ+VÔ?ËúOoÅzœÞ:’Žtza‘xF‹p6ž&öîÆ[•R)Òdnd´…KûÜß•@ÕÂÅÜjò®˜TáQg$*⬫ËÉâ茲›³\Ѓ¯ÝDAJR©ê®ˆO*ëãÂOX| n @;Ö3gþ*NùøN}ð»–ת1Ï…·êÔxǹÜÁš|i¹Ðc˨TMä×ñF»3X£ ÖùGX#Ü;U†ÙÖÁF;vàž£ö_Ɉ[mäðó‘áÁéÖ¯äw‹Kä’Ì!l‰T]¬º "Ÿ›ªêeߨ³zx‹¨Úá-rÕ;öñÒíá½t’ݱ¯|Tuׇãåõx«7„ þ½*<Ö¾P€JÚžT×ß½>9š„T«IÝx{U©rõ©p'÷ZU‰,Ûœ[” ÷iNU>=¼_•ˆ‚5¤¬~p:|M>7ä!9ñ¬Ñ•’ÎÞGU“Öw(sOßöZèw/< 늖„µÒ>Tõ’GQ‘ÕÁQRŽÎª¨žJg5t—þ@êœDg蚢ù2–S#EØã®¯‘¼>;Ž|iÏ›¿´êøÿ™d?ú¥û'?ú%ˆ`}¨®Oƒªú$¿xš9åSMoTMxøO‚•ªqöØöâŸ=¶=NPÉ@Ù™½ãM0»…Q¹†‚¯ªzô¡È5¦Dü·¶1”åõ u¦¶¯Ù“ YgéKUìe7µ|¤ÔI9¸uV“yZËtV­˜<`°V„Ir‰ãB!.yS‹úX¶0'¶¬>ãQ—]§.\¤,Ãã:#›Ý?Ù,Û¹ÆÝ>ðÈ_SÕ“C#Ûßð4µXCU„Ê5ªê&¡¼¨*SêM²‰ÆâŸM4ÒêSUuÏcøõžÇ¨Ô»o #«CÕûøÝÜ7àÛþ}îŒ.ïödÛt®ª×кxGgU¯ø+Ù5t„¸D}p»¾‚¼>NýÅÊñ¶æ+Ö+ÑöZ¶øª9åwÏÂæ"ͪòû.xéÖö¿¯“@‘ëÜꪥPÕªëÏØzëý\FïØvi’«ÚíÚv†¡šV+€#*ެþpa­×[V‡ªkŽm:gÅ0”ÌÜ—ÝyàäPUdúÊMU]UÌŸòžëÕzaTúZ>wXÁø¦F+”!¹¨«Iƒ\h­ª>NýÅÊñùm„Æí»Wµ‘S>H­-S—ïÝžïW¾ÙKÓÚÿfŒª£ÄÙrH-WËèËŒ9ì7Šá1’æ0äëY=ü_CÁõ®ïÛ!÷þB|ä뱟µ¼¾ZKyY#Ú¶¤¸8!S~ªêé¬ZC"üíùsò!ð­6<E© wAµî« oo¬ Â;ïôƒT}Ý)¿š¢C«¯[Ë•š_x€Ž¯ô¨ª3sI{QuDñ–‚OìÄ<¼È«®"ð§6Ëuï‹ñS<‘h_xô´—5b|!ñ£ªžÎjÛ›¢Ì»þˆßóý>dFP\— Bí__÷Uïíº²U¶>X#|÷ªƒ¯ü\•n¨¾¼˜ªøSÅyµ¸£Æul^W×÷êÓ…ªíÝÚo×ѹÕÐ%Ny SòòµÉàº>u¯×%CäBÝæep•˜è¦Ê˜1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f¬À\”ÖÇ[i‚m ªÐueõ4hsç¤óè+k)T»iµ³&È¥æÎȨîÔ»dʲ¥´¨±%g¸Rap:©¥ìàYhÝÛª³.ÆPz’*V©»rÍY‘gtH= _S©Qpãâm‡öØß3"KX³ú±£I¶éœ|é–5¶é¯³vGSÕ·J—Ò€,gÉÐíœ cKïµøÌ ÅõO¢ôd¨?CW.Ä«ÉeöjIF«Ô§*J¸DÜvé5± ‡’°ÜkÍuél‰MXA±ütIí¦>¤ÎW“L©AÐ %7£`)ˆ»ô‰õ¨À[(hê6lqëÓ»{ݳXMé _\6ea'uy]1*Ét©§*ßk]S’S5"*ÀÅxY½š­¼Tm{Ò– —r1L« tK)‡‰úÝÀéž™£lÄ êŒbÖñ*Uð’üòr*pô¾‚1¯º¸Ì4ÖÁ/#F}7~µl ^¡¦R¡ÕZ‡ªÞÞìϾgEñ†"9ª"ùôT€‹ñr²V–ªH4ôtŽœ—õ]ÎøÛ3ÃuG~£’ÃÄp­½ðÀ¶¿UunªZ±Æ“  |–JUlU•ˆ[qËé,´&JškîX£ Jh+'5Ò*F•BU”ô•ÕÄÞ”æZ.ÏcKóØWáóNº °7^FÖÊRÕÖý¦ Xø†PퟜÜ;žÌË/ËìŽ}(uõKm#Ì…ùXÝȰÉU!­ÄãÔ‚B¸ÊRUWÃB7@õ NomÌçþÅZ„”úäI>¡Ó>\{[ö|‘cï"QqÀ¼UgãYH¬~x²Vžªñ‚þ3Nxô=3:V²•ì@‡PV„¿×6½cõÆ×#ºùEŠ»ãþ*˜(jú˜¶Rü¿&Ù½ÿãÖSUWÃB_õB? ­\Œþ©¿´£$¨S{ÞªV:$‰{óº·Uâ¢öA$jÔ@o¸˜Ã{‘oÝÛ’Êúà×½í}V婪ßKw]ÞØŠ_7¶v]&Ù½qèŽP`-šMÔ¤‰¬†áÉ( ¼@"Òñ$ÛpôÖSµ¤Wešg訕 €‘pÓ,ä€i÷êJ… _z{âÛü‘†âuðb0Ðô`4w†kWŸbòp–t/¼•^÷¶÷Y¥QµgæôVʈWU£'>½õôÖð®(¡;ý=ÈqöñÈì1¼—JŠ!áûˆB¤Øg¸÷]å¨jÚÁ×(…кù\Ý3tÔÊÀ˜QwÀ´{-›õÚùã·b W[!â»ãyÖßM>Q½ðþD-ª¶N~ØàBl§¶Õ¾‰..5‘ö ³]Ï 'ÛtöÐù{RZ)`¶\O²»O¡võVŽªM¹»Ö€+‘^*pq˜.¨›îuI~pþøãsS¸ˆ_W#ÈG!j1^FToªNËnNlh!6¸ ÐbÎì’$1Ì(‹’ä01{ ÿzcàï칹䯖¬=<­´ˆ‘ &–ø9Ïþµ›C;I ÚHÉñn“¥AJ 8—þ†3ÀÔú¨©ê¨8í£”´^ÑU|T¢ºñÖ¨Œ¨~!€?Þ½ó '«ª)ŠÿB[ S"‡iÄ|]ã¼P³çùâÀ¼Z 6N‚??Pêµ[~NÃUe›7C‹7댔"éá>BLçÕZùÔ¥•T-¥>¥¨—ªvæ)¤S,ǃÆl¨œ!UáQ(P­¬GmAùõålºœq*¿U±Ré¶ .]”àrhJ›ûcÞxžôp˜H)gÀ¹Ôðú>·øZ}JQ5.%¿D•€Õ`L«=›Õ?1f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3fìÖ¬– ,‰zL™ga̘„¨ ŧKq£Öè¾LQdÁlôë ¬9CÃãrnF*¹³Z-™¦)+3V’“¯m꺜®ánØ*Cø×¤Ô8DÉî&\}—MÀÿ€ÏP$Lš>i”¯(Hk:æ^cg³J²üÛ…?ƒ«JµÊŸÃN Öèש‰&*+»µe±­ô±ê³ôðp¿½KÆ#óÞBó›Åx¾$ŽvëjÏ4MŒÇiuzç eËîðB°|CÁésk£ØDõX§ÂÊæn¸Ø–SìOæ¿¶)f[âb”,Ãå`)g¹‹vç9E1N«G²ÊR•»,^xª¸ ënOJô‰*!«Q«ªÖŸåÛa@zÅÞCvÍvd=QV6NãX`¹FŸ»q¢Êˆ!ðk'Oo…09Þ™Ý;ájµÿÌýkZR’ð}ý)/¹ yÀ,$©TºÜD}VãI=|1•ÂJ!™ÊSµðžýc o<]‡‚-$ª:û"ÚDß55Vºg‹îW—¨UUûvpEµÖœªÚñ{ý±=JäEÜ›ë» ¯7íp°qF¡jàñh®þò¤I~ç–«Á¯§6³zõrZPµÇw`,Á‰*S3⽡{;'uoÊÛžNUK9ëÜZ=|1•§?¾ïÖSÕ}þ17žNU 6/¯ã>:Ôígz/ï¬t¼ð~ùë¢âEÓN3CÒ¥Æ;ú,Ì7Ï?¢ÑgeáuûŸ¯s”“$ªvÞ;ÎëU>ú‚{©ÁOjY¹&Q“¢FBåUœ©{)„T)Nå`)g ÝGúU’®}}@Æ-¤òŠÊS}3IN¼ðTªÒ°º»ú8íf:/kÂÅ÷xœ¿ž¡íÝ„xäÝ J·¾gÆ–cî¾K&U¶þl”­úmß–ïä‚Af*aRUϪQ—C 5>ŸEB$КÕås²â^^¹¹jZöØão5Eõ¸K;K/WáuVEÆ­ÒTå¾IN¼ðÔX…ŽÕSDÔ'«Qafø©x=£#?ƪlÃq¯{ö|J…ÅjFp‡Õ9§ï’áOnè̆ó‚ÅY‘?ö ÆŸÄ ¢Dß¶ÂÞ,jß“·_˜ %rA6Aõx1–v–¯±éL –ÂËá®´¸Ï O¡[Š¢ CV—5÷kp†·íoU¯g<.a÷ì±íêóPtïx¦#Û=»é$q:äç°šS›ñÏ ¸«ƒÃÔJÑËìçÓo¡¼{`?[~ëðn²R3~ù [©zì…¥œ%Pök~%ÞV/n—Mk¼œ×ùJÃÓ]¸«UG‹û”óIM?liÆ[]çeMÑýî¾Ý΃6”"è a—œFî0fÕ)À·STzac¦PNZ;¤v¶Êu+ï.¿µx§¹©?ÇYÕªÇ^XŠV2Gñç¬ÂÓÔ‹o޹ëLñRåú¤õ4°7BV—5E4@M•1cÆnF·S]9´1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ•Ùtuz¿oxû²ìäÒ¬Å}(5Šé´¦ÅnB­ÒºW²bÖÄR¥iN§7Îh:½ß7¼8‹ËˆÑÛ3™íÈêÔ§Rø›eK ay‰Zꂹ‚;ÏèïûðÂzW²byÐÉœ¸•] ßß"'Øpµh±VŒJ§·4<_Ô†ÿW¦üd^Ô¬Üåsqæ6vÅœZ·ßÑ=f©;û3”ú”Šß;NÓU¶yFÛe4¨aMD•ºG7JÕ( žj훀ģ_ F`À'ÀKŸ¹¿õ§•ïoa ±Æù¼ êôòË = ¹N¯ƒw;» ß3óÉF\¿ùÉF\`K/_A©ñ°ŠDÍNì¤×Ÿv¿h'ÛIöÈË v*×0Îéo¸ ¿Ûp‹#ùäõ:ÉöÂB ¼k¹N©? 7ÎGµ‹N k(”M£…亮nõZ{P¿r£‡§‚x'vNSða@@< ³ß:ª®mŠ/àþX>Ö?¾°¶Éþêô:—Uëô:x÷!Çwfqí®ßÄ5{8²ÒÊï™ùø>N$`–[{¬«åkí)å P•.±Uf»_bõ6½y¹åº¬¡¹î1ô†(Ê™†ÿc‡·¨ê#t.øÖ T¼pDl!¹®²5± \Pß±¨Ô°«ç§Ör2ë¸:(cÎAZ=/ãNí[%ˆG_â¢~;(«°+GUVƒ’{‰œ´®]¾P5¶ F–iüuz¼8Ôø„+,j<™ ”ò[ý$øX?R[…‡q……®uo²ê¢ŒRqj]biIâŒÚsh“ÎR¸î1«œÆ=k`Õ?|††ÿFއë챸µBãI">GTxõ2<¾!W礒írc¨Ô\J¸ºm.•ÓÕqã‘DQ×x•äôÍÓ4â¹ëÔòºzŽjµ(e^KMCt£ë~(uÄñ]³ÅM&×é- ï(ÊpÕ~r-ƒ ¯š;¤Ÿ´زƓ*a· ¢¼ã P£ej5 ¡{Ìï“ßwGVVÄ[{ZØJÍ IðQkåøÆ«Q-Ù./¬Š\nÓÕv(fÀ…®.ßêª7¼¨>=3ǶӲ¸¬™BT‘%Î >!5uDÐô´¤¼¯`ÿ¢çO¢Éÿå:½ÞÝ¿ÈñYG¹õÜZ%UåìLbž¨J<ª±°RgØÁ»›ÅÏú>°gÂ}–=²¢ê“LÔƒë[1QqdÅÏ i}?ÆÀ«éð£n¢ÊñǶ;Џ¥RUM qrrÐ-Û™”±ï`Æbxc¡K ­T[Ž,n)YâÊS•õØé´P÷,$¹·¡Nïb×õ×éuðîCŽOØbþ8wÃìV‚P¾-ÿß+ˆJ«; UãEÀ¯Ö%fÕƒÓ˜LBÜÚŸ¶/ì~IÖÐ\÷˜ÕBÃÜþ¯]}VUÀÃÞvAéPã› ’r<«Å’ÝA¿\x¬xjC¡†UYÍSO;žóÔÓrÉ 6Ô™î‚ÑÑŽiT{!èeqKɶ Q¯PKßÐ ðúóŽ,ްðéêô§Yd:½ÞÝëªðQxÍs·sQbù¸[JB«>zõwÇr]bŒN7åR&˜`’>–œî±ÈãV!ªú >t'º ŒÁ<Öêa¨*¼­ŸÚ;Ž^?­¤¦F)³O¶\H¾ƒºBTˆÌG383/_·”,qåÓJ»oO}õç)®Îlê‹Ý·ç~å(®ÓtzKËŒV¥Ê¯ž;;†ÁIöÉFµâ¢£{lÍ5²©>ºx;ÑEÄs‚ß¡ ]l¨Qšó²fð³f%2è¾sêKz2I7K|2Àa¡¤®=jמÚìR.:½TÞï^œÅÕé)H¡{Ü¥UŸJá@X×ihoiÎ{d[÷¬|–êuçåÉâÞH–¸òT:¢9m嚢»ÖÓéýþáÅŒƒŒ]Šõ¯Öw-tŸV ¡Št„m)YÜb²êU÷n3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3fÌX –Íí1­`ÌX!-4teAé%v¡<ç?|ㇶÔ&i_¾q†zë Ïð”É] e²R_Ä× ©|& c*kÖ€4fÔñÈ,J «U—øÜ_Äh“ø\1A¤„îîèù•¿éõÅ÷ºeL·ý-‰L\÷¬^çê~ÔP¹hrÃÉ*tqa0¯ƒfTêâ:ßMUùÅÛpÔ>µyd³u¥UÙÏYCÖA>†Ž€ákþ).,ù°+ɦ@Úb÷ÚjE)øÔW°â¾ÙÏ …ÆFÒ+Aþs$¢e¢6\äµQ9oI}4Èx<÷“U.ÕB?¢–BÕÂß«ë#ˆš$‘åHxì.x%,•Ìa!®RThwgd5zðÉÅ÷úDB·ýeŠŽþ².L7@¥*ïž AsduttWëâVUaà‹RU|–I xG¶߇$T®üÃëüñ-Ÿ¬Äë™#_œùIF÷NÀŒö_XufÕo÷ÙÂQ°IDͺI²Þ ?|×eŽ¿ÿå$Û|ê ¥îÙi{œŸŽtÏFÔÛNĸÜwÞs²qqñ?ÕíîäDß½m}o—/`Ó£ªCT±i ¬ñj÷·HÁ}ù2¾Þo^ÕŸÁñ|ªãí’ϧpä„+ýðP§ã;昭´?^$”^ü)«ÞtnÓ9VýâOí­êdDÅÀTŒñ›ÎÙóʘÿäYߪ® #jÓÇvÙþàÊRÕ!*Œë]|6©ÞîÊ!«œ¨~.«îMPx§ýïëG5þåØÚ÷9G6Q©Êçä…¯¹˜IWG·ªjãRT|–^|Yß…&—´gö|JuKØwÿž-w”íýÐçS=3­,ðœ‚7<Þ ßÿ ˆ‡È{oü…-³†¥xL(Eáúïx?Þ ’O¶ßY`¾# ßí¹š·Øß‘ Ì—kTÅHÈgŽEp#¢Fi¸ØqÅ3ð¿ßO2®½_NóîÆŸtëOåˆrR?Þ ./²ªˆºØÁ1œ‡õIEæ”ËÑ;³WNªÂ˜úŽ÷Ð5嘫b+º¿ÏOntutuçªøÖ6RôNéÃãѾ|ã:ßéêâêQµáb×åÓ[Aò–˜«T @ŸÜ€ÄÑÌe-¯óú8Ûhx?tÖ›Q½ŸøCâýïÚS˜‚ðÄCºâ>Hêo=´±ð’5}Œ ·•ùn ¿®´#„¦}ËoÇÞU(¶ãx ‘íåUÕò›<¦ ‚$Ÿk¨G/÷¸ÁÇU×t¥^ñ""ä÷ê9¨ë䮉óÚFv·ð+OîF8k¢±œTm:ê‡ám™*¬¥v0²&ÓÒÅÕ£j×ep’šœ[‘DYÍÇ÷¹ëqÖ3CÓ¹…mÚ!ŽÃÿËH×X¶ºŸm-“õÉQæ÷(£Š—6]ö^#'vvͪ\Q®ºØ¤®[§CT>Iž1 Oʧ+•¶¢—"!uwÏ´ÏÙéõѼ™JÕ5×½ñ»žW‡µ7HTÑ“ÒueóÍvÊ·JzN’ïUW}çL´ º%uÿ¢p&ì:Ô¼ •¨m´ïàƒ6f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘1cÆŒ3f̘±ÿ WY¦ŒÉœ$P,;AUžÓºJ]v†ë‚€ŒŽóÚúÄsßÕ§ ™¯ÚÅ¢{%kååð¨ówÆn£ƒeõd--¬üY™¡•¾øjö7‘ábáɦµˆ¾É®@„ –-/É7p]·ábÃų¯@ÑÁ« ];š`1“k†ƒÁÙµæôÖ€Ôà?*šªÃäè<'ˆ:ÏKßúUß? ¿ºïÉû~«Æ;Ö𮔆eŽAIéÚ:É¥-¯ˆÚk}¢±ÙÂòÄ !^ȯ-ðú5ÑÙ¡o\ÉÂ_í¾]å0Á/¹n xIUîÚ&XšÁef¸Íʬdk›Ôµ ¼Ð‘ýeW’$‘m½‚j®ëO±¾çžžl%e ‰påÎ~êé&RgÐÄžzúΆQ —NUÐÕùÖ^ O¨ÍÈoœCé°š:Ï¥â{f„4mùËÁœPì£è¯#_Sa„¢DÐÐ[¸ÌÑŸÜ ænK<².dúЉ=¤î ’¬@œ}Næ|üµ£Ê Qs~û¬˜ª±ÏŽ›^±Ðúeâÿtýkœ±j•¦]ܽÎSÑ'²šž™¨ ‹v•cke¼ŒñeñM’ýà<ÿÜü"E§:סåä¾¹ä̱í囫âsß-Êß]^• ´ }(¢µ#Jü,œkÜ« È¸w!=3B5¾ð²òK¯ùÔ^ó©Ýj…3FҬﳽãr¹S7QÕ3ÚRæª<¶'J9"¡”]|È_ìˆÐ—‡Á%ÇêØ/Þÿ# TÇé­cGqn"£ê[­cGQ Ñ™†÷gÆŽ¾Õ*iêVÔ!jTú2%ТÈtuhcä•(;²MÙе¼|Çõ' RƸçHge-ƒ«S»ÚÙ1å ˜c½í,µ+¸šjª¢ ©†ýç25{¾²©zu͵¯cx'-¹ÞiË6‚γƒosw–-Ãëµ´¹ªã4”–ΰgØž^'“1 KËð½¶ø\d@ãf#iÿÞ0 †øÙÀ¡=‡ö@Ò%ß5Èz£Ý·ƒûuˆ÷tØ!ì¾]âŠØ±·M|þ×ð![@QDL§ÂÙ;ö7U ßѾ€3ÔÕŠM<Äë¦þÌj[=GH¬ú%¹ûuí-,¼$ë‚SY]ç›…²¨fù­_Á‹—ÌŸËðzD]ü^•6WåÏ€òâNww|²v`ªikMÚ¾cûiqQ–Þ–¾WÂùX°85¢Vͯš§èriÑáI †'ívVG.x R«ÞöZ aN"Fá| 'áã…ÒÚz½/é=bÝó:ÏѨu•—&~Ó¹îÙÎoC¿Ûõ¼ᱎÞnñ{Uê\U®½\z€ôüÃBûY—«ë\I£TÔŸE=ÚªŠ™=ÚÝR9êE£7ùÏÔ†'®b7F.ëd.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(){return clearInterval(this.interval),this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this;return this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h](),!a.support.transition&&this.$element.hasClass("slide")?(this.$element.trigger("slide"),d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")):(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.trigger("slide"),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})),f&&this.cycle(),this}},a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=typeof c=="object"&&c;e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):typeof c=="string"||(c=f.slide)?e[c]():e.cycle()})},a.fn.carousel.defaults={interval:5e3},a.fn.carousel.Constructor=b,a(function(){a("body").on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=!e.data("modal")&&a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find(".in"),e;d&&d.length&&(e=d.data("collapse"),d.collapse("hide"),e||d.data("collapse",null)),this.$element[b](0),this.transition("addClass","show","shown"),this.$element[b](this.$element[0][c])},hide:function(){var a=this.dimension();this.reset(this.$element[a]()),this.transition("removeClass","hide","hidden"),this.$element[a](0)},reset:function(a){var b=this.dimension();this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element.addClass("collapse")},transition:function(b,c,d){var e=this,f=function(){c=="show"&&e.reset(),e.$element.trigger(d)};this.$element.trigger(c)[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a(function(){a("body").on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();a(e).collapse(f)})})}(window.jQuery),!function(a){function d(){a(b).parent().removeClass("open")}"use strict";var b='[data-toggle="dropdown"]',c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),e=c.attr("data-target"),f,g;return e||(e=c.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,"")),f=a(e),f.length||(f=c.parent()),g=f.hasClass("open"),d(),!g&&f.toggleClass("open"),!1}},a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a(function(){a("html").on("click.dropdown.data-api",d),a("body").on("click.dropdown.data-api",b,c.prototype.toggle)})}(window.jQuery),!function(a){function c(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),d.call(b)},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),d.call(b)})}function d(a){this.$element.hide().trigger("hidden"),e.call(this)}function e(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('