[DRE-commits] [tdiary] 01/01: Imported Upstream version 4.0.0

Youhei SASAKI uwabami-guest at alioth.debian.org
Sun Aug 11 21:21:41 UTC 2013


This is an automated email from the git hooks/post-receive script.

uwabami-guest pushed a commit to annotated tag upstream/4.0.0
in repository tdiary.

commit 96d0332c980a57760a42f87cff7c7268c8d2ad81
Author: Youhei SASAKI <uwabami at gfd-dennou.org>
Date:   Tue Aug 6 21:01:56 2013 +0900

    Imported Upstream version 4.0.0
---
 .bundle/config                                     |    4 +
 .bundle/ruby/1.9.1/bin/hikidoc                     |   23 +
 .bundle/ruby/1.9.1/bin/rackup                      |   23 +
 .bundle/ruby/1.9.1/bin/rd2                         |   25 +
 .bundle/ruby/1.9.1/bin/rdswap.rb                   |   25 +
 .bundle/ruby/1.9.1/bin/sprockets                   |   23 +
 .bundle/ruby/1.9.1/bin/tdiary                      |   23 +
 .bundle/ruby/1.9.1/bin/thor                        |   23 +
 .bundle/ruby/1.9.1/bin/tilt                        |   23 +
 .bundle/ruby/1.9.1/cache/fastimage-1.5.0.gem       |  Bin 0 -> 2072576 bytes
 .bundle/ruby/1.9.1/cache/hike-1.2.3.gem            |  Bin 0 -> 8704 bytes
 .bundle/ruby/1.9.1/cache/hikidoc-0.0.6.gem         |  Bin 0 -> 29184 bytes
 .bundle/ruby/1.9.1/cache/multi_json-1.7.7.gem      |  Bin 0 -> 28672 bytes
 .bundle/ruby/1.9.1/cache/rack-1.5.2.gem            |  Bin 0 -> 216576 bytes
 .bundle/ruby/1.9.1/cache/rdtool-0.6.38.gem         |  Bin 0 -> 115712 bytes
 .bundle/ruby/1.9.1/cache/sprockets-2.10.0.gem      |  Bin 0 -> 42496 bytes
 .bundle/ruby/1.9.1/cache/thor-0.18.1.gem           |  Bin 0 -> 83456 bytes
 .bundle/ruby/1.9.1/cache/tilt-1.4.1.gem            |  Bin 0 -> 42496 bytes
 .../ruby/1.9.1/gems/fastimage-1.5.0/MIT-LICENSE    |   20 +
 .../ruby/1.9.1/gems/fastimage-1.5.0/README.textile |  119 +
 .../1.9.1/gems/fastimage-1.5.0/lib/fastimage.rb    |  478 +
 .../gems/fastimage-1.5.0/lib/fastimage/fbr.rb      |   67 +
 .../test/fixtures/exif_orientation.jpg             |  Bin 0 -> 1659857 bytes
 .../gems/fastimage-1.5.0/test/fixtures/faulty.jpg  |  Bin 0 -> 336 bytes
 .../test/fixtures/folder with spaces/test.bmp      |  Bin 0 -> 3296 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test.bmp    |  Bin 0 -> 3296 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test.gif    |  Bin 0 -> 258 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test.ico    |  Bin 0 -> 318 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test.jpg    |  Bin 0 -> 268118 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test.png    |  Bin 0 -> 322 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test.tiff   |  Bin 0 -> 27934 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test2.jpg   |  Bin 0 -> 40065 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test2.tiff  |  Bin 0 -> 72236 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test3.jpg   |  Bin 0 -> 38668 bytes
 .../ruby/1.9.1/gems/fastimage-1.5.0/test/test.rb   |  218 +
 .bundle/ruby/1.9.1/gems/hike-1.2.3/LICENSE         |   20 +
 .bundle/ruby/1.9.1/gems/hike-1.2.3/README.md       |   52 +
 .bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike.rb     |    9 +
 .../1.9.1/gems/hike-1.2.3/lib/hike/extensions.rb   |   23 +
 .../ruby/1.9.1/gems/hike-1.2.3/lib/hike/index.rb   |  206 +
 .../gems/hike-1.2.3/lib/hike/normalized_array.rb   |   59 +
 .../ruby/1.9.1/gems/hike-1.2.3/lib/hike/paths.rb   |   27 +
 .../ruby/1.9.1/gems/hike-1.2.3/lib/hike/trail.rb   |  188 +
 .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/.gitignore   |   17 +
 .../ruby/1.9.1/gems}/hikidoc-0.0.6/COPYING         |    0
 .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/Gemfile      |    4 +
 .../ruby/1.9.1/gems}/hikidoc-0.0.6/NEWS            |    0
 .../ruby/1.9.1/gems}/hikidoc-0.0.6/NEWS.ja         |    0
 .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/README       |   87 +
 .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/README.ja    |   84 +
 .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/Rakefile     |    8 +
 .../1.9.1/gems}/hikidoc-0.0.6/TextFormattingRules  |    0
 .../gems}/hikidoc-0.0.6/TextFormattingRules.ja     |    0
 .../ruby/1.9.1/gems}/hikidoc-0.0.6/bin/hikidoc     |    0
 .../ruby/1.9.1/gems/hikidoc-0.0.6/hikidoc.gemspec  |   23 +
 .../ruby/1.9.1/gems}/hikidoc-0.0.6/lib/hikidoc.rb  |    0
 .../ruby/1.9.1/gems}/hikidoc-0.0.6/setup.rb        |    0
 .../1.9.1/gems/hikidoc-0.0.6/test/hikidoc_test.rb  |    0
 .bundle/ruby/1.9.1/gems/multi_json-1.7.7/.document |    5 +
 .bundle/ruby/1.9.1/gems/multi_json-1.7.7/.rspec    |    3 +
 .../ruby/1.9.1/gems/multi_json-1.7.7/.travis.yml   |   11 +
 .bundle/ruby/1.9.1/gems/multi_json-1.7.7/.yardopts |    6 +
 .../ruby/1.9.1/gems/multi_json-1.7.7/CHANGELOG.md  |  164 +
 .../1.9.1/gems/multi_json-1.7.7/CONTRIBUTING.md    |   46 +
 .bundle/ruby/1.9.1/gems/multi_json-1.7.7/Gemfile   |   31 +
 .../ruby/1.9.1/gems/multi_json-1.7.7/LICENSE.md    |   20 +
 .bundle/ruby/1.9.1/gems/multi_json-1.7.7/README.md |  109 +
 .bundle/ruby/1.9.1/gems/multi_json-1.7.7/Rakefile  |   12 +
 .../1.9.1/gems/multi_json-1.7.7/lib/multi_json.rb  |  160 +
 .../multi_json-1.7.7/lib/multi_json/adapter.rb     |   48 +
 .../lib/multi_json/adapters/gson.rb                |   19 +
 .../lib/multi_json/adapters/jr_jackson.rb          |   19 +
 .../lib/multi_json/adapters/json_common.rb         |   25 +
 .../lib/multi_json/adapters/json_gem.rb            |   11 +
 .../lib/multi_json/adapters/json_pure.rb           |   11 +
 .../lib/multi_json/adapters/nsjsonserialization.rb |   34 +
 .../multi_json-1.7.7/lib/multi_json/adapters/oj.rb |   24 +
 .../lib/multi_json/adapters/ok_json.rb             |   22 +
 .../lib/multi_json/adapters/yajl.rb                |   19 +
 .../lib/multi_json/convertible_hash_keys.rb        |   43 +
 .../multi_json-1.7.7/lib/multi_json/options.rb     |   48 +
 .../lib/multi_json/vendor/okjson.rb                |  600 ++
 .../multi_json-1.7.7/lib/multi_json/version.rb     |   20 +
 .../1.9.1/gems/multi_json-1.7.7/multi_json.gemspec |   22 +
 .../spec/adapter_shared_example.rb                 |  235 +
 .../gems/multi_json-1.7.7/spec/has_options.rb      |   74 +
 .../1.9.1/gems/multi_json-1.7.7/spec/helper.rb     |   35 +
 .../spec/json_common_shared_example.rb             |   30 +
 .../gems/multi_json-1.7.7/spec/multi_json_spec.rb  |  226 +
 .bundle/ruby/1.9.1/gems/rack-1.5.2/COPYING         |   18 +
 .bundle/ruby/1.9.1/gems/rack-1.5.2/KNOWN-ISSUES    |   30 +
 .bundle/ruby/1.9.1/gems/rack-1.5.2/README.rdoc     |  624 ++
 .bundle/ruby/1.9.1/gems/rack-1.5.2/Rakefile        |  125 +
 .bundle/ruby/1.9.1/gems/rack-1.5.2/SPEC            |  237 +
 .bundle/ruby/1.9.1/gems/rack-1.5.2/bin/rackup      |    4 +
 .../ruby/1.9.1/gems/rack-1.5.2/contrib/rack.png    |  Bin 0 -> 23805 bytes
 .../ruby/1.9.1/gems/rack-1.5.2/contrib/rack.svg    |  150 +
 .../1.9.1/gems/rack-1.5.2/contrib/rack_logo.svg    |  111 +
 .../ruby/1.9.1/gems/rack-1.5.2/contrib/rdoc.css    |  412 +
 .../ruby/1.9.1/gems/rack-1.5.2/example/lobster.ru  |    4 +
 .../gems/rack-1.5.2/example/protectedlobster.rb    |   14 +
 .../gems/rack-1.5.2/example/protectedlobster.ru    |    8 +
 .bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack.rb     |   87 +
 .../rack-1.5.2/lib/rack/auth/abstract/handler.rb   |   37 +
 .../rack-1.5.2/lib/rack/auth/abstract/request.rb   |   43 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/auth/basic.rb   |   58 +
 .../gems/rack-1.5.2/lib/rack/auth/digest/md5.rb    |  129 +
 .../gems/rack-1.5.2/lib/rack/auth/digest/nonce.rb  |   51 +
 .../gems/rack-1.5.2/lib/rack/auth/digest/params.rb |   53 +
 .../rack-1.5.2/lib/rack/auth/digest/request.rb     |   41 +
 .../rack-1.5.2/lib/rack/backports/uri/common_18.rb |   56 +
 .../lib/rack/backports/uri/common_192.rb           |   52 +
 .../lib/rack/backports/uri/common_193.rb           |   29 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/body_proxy.rb   |   39 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/builder.rb |  149 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/cascade.rb |   52 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/chunked.rb |   58 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/commonlogger.rb |   64 +
 .../gems/rack-1.5.2/lib/rack/conditionalget.rb     |   67 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/config.rb  |   20 +
 .../gems/rack-1.5.2/lib/rack/content_length.rb     |   33 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/content_type.rb |   29 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/deflater.rb     |  116 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/directory.rb    |  161 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/etag.rb    |   64 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/file.rb    |  138 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler.rb |  107 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/handler/cgi.rb  |   61 +
 .../rack-1.5.2/lib/rack/handler/evented_mongrel.rb |    8 +
 .../gems/rack-1.5.2/lib/rack/handler/fastcgi.rb    |   98 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/handler/lsws.rb |   61 +
 .../gems/rack-1.5.2/lib/rack/handler/mongrel.rb    |  100 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/handler/scgi.rb |   67 +
 .../lib/rack/handler/swiftiplied_mongrel.rb        |    8 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/handler/thin.rb |   27 +
 .../gems/rack-1.5.2/lib/rack/handler/webrick.rb    |   81 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/head.rb    |   22 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/lint.rb    |  699 ++
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/lobster.rb |   65 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/lock.rb    |   26 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/logger.rb  |   18 +
 .../gems/rack-1.5.2/lib/rack/methodoverride.rb     |   31 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/mime.rb    |  677 ++
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/mock.rb    |  190 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/multipart.rb    |   34 +
 .../rack-1.5.2/lib/rack/multipart/generator.rb     |   93 +
 .../gems/rack-1.5.2/lib/rack/multipart/parser.rb   |  176 +
 .../rack-1.5.2/lib/rack/multipart/uploaded_file.rb |   34 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/nulllogger.rb   |   18 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/recursive.rb    |   61 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/reloader.rb     |  109 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/request.rb |  380 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/response.rb     |  155 +
 .../gems/rack-1.5.2/lib/rack/rewindable_input.rb   |  104 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/runtime.rb |   27 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/sendfile.rb     |  155 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/server.rb  |  362 +
 .../rack-1.5.2/lib/rack/session/abstract/id.rb     |  398 +
 .../gems/rack-1.5.2/lib/rack/session/cookie.rb     |  178 +
 .../gems/rack-1.5.2/lib/rack/session/memcache.rb   |   93 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/session/pool.rb |   79 +
 .../gems/rack-1.5.2/lib/rack/showexceptions.rb     |  378 +
 .../1.9.1/gems/rack-1.5.2/lib/rack/showstatus.rb   |  113 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/static.rb  |  153 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/urlmap.rb  |   76 +
 .../ruby/1.9.1/gems/rack-1.5.2/lib/rack/utils.rb   |  628 ++
 .../1.9.1/gems/rack-1.5.2/lib/rack/utils/okjson.rb |  599 ++
 .bundle/ruby/1.9.1/gems/rack-1.5.2/rack.gemspec    |   33 +
 .../1.9.1/gems/rack-1.5.2/test/builder/anything.rb |    5 +
 .../1.9.1/gems/rack-1.5.2/test/builder/comment.ru  |    4 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/builder/end.ru |    5 +
 .../1.9.1/gems/rack-1.5.2/test/builder/line.ru     |    1 +
 .../1.9.1/gems/rack-1.5.2/test/builder/options.ru  |    2 +
 .../gems/rack-1.5.2/test/cgi/assets/folder/test.js |    1 +
 .../gems/rack-1.5.2/test/cgi/assets/fonts/font.eot |    1 +
 .../rack-1.5.2/test/cgi/assets/images/image.png    |    1 +
 .../gems/rack-1.5.2/test/cgi/assets/index.html     |    1 +
 .../rack-1.5.2/test/cgi/assets/javascripts/app.js  |    1 +
 .../rack-1.5.2/test/cgi/assets/stylesheets/app.css |    1 +
 .../1.9.1/gems/rack-1.5.2/test/cgi/lighttpd.conf   |   26 +
 .../1.9.1/gems/rack-1.5.2/test/cgi/rackup_stub.rb  |    6 +
 .../gems/rack-1.5.2/test/cgi/sample_rackup.ru      |    5 +
 .bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test   |    9 +
 .../rack-1.5.2/test/cgi/test+directory/test+file   |    1 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/cgi/test.fcgi  |    8 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/cgi/test.ru    |    5 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/gemloader.rb   |   10 +
 .../gems/rack-1.5.2/test/multipart/bad_robots      |  259 +
 .../1.9.1/gems/rack-1.5.2/test/multipart/binary    |  Bin 0 -> 26667 bytes
 .../test/multipart/content_type_and_no_filename    |    6 +
 .../1.9.1/gems/rack-1.5.2/test/multipart/empty     |   10 +
 .../rack-1.5.2/test/multipart/fail_16384_nofile    |  814 ++
 .../1.9.1/gems/rack-1.5.2/test/multipart/file1.txt |    1 +
 .../test/multipart/filename_and_modification_param |    7 +
 .../test/multipart/filename_with_escaped_quotes    |    6 +
 ...name_with_escaped_quotes_and_modification_param |    7 +
 .../multipart/filename_with_percent_escaped_quotes |    6 +
 .../multipart/filename_with_unescaped_percentages  |    6 +
 .../multipart/filename_with_unescaped_percentages2 |    6 +
 .../multipart/filename_with_unescaped_percentages3 |    6 +
 .../test/multipart/filename_with_unescaped_quotes  |    6 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/multipart/ie   |    6 +
 .../gems/rack-1.5.2/test/multipart/mixed_files     |   21 +
 .../1.9.1/gems/rack-1.5.2/test/multipart/nested    |   10 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/multipart/none |    9 +
 .../1.9.1/gems/rack-1.5.2/test/multipart/semicolon |    6 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/multipart/text |   15 +
 .../1.9.1/gems/rack-1.5.2/test/multipart/webkit    |   32 +
 .../1.9.1/gems/rack-1.5.2/test/rackup/config.ru    |   31 +
 .../rack/handler/registering_myself.rb             |    8 +
 .../1.9.1/gems/rack-1.5.2/test/spec_auth_basic.rb  |   81 +
 .../1.9.1/gems/rack-1.5.2/test/spec_auth_digest.rb |  259 +
 .../1.9.1/gems/rack-1.5.2/test/spec_body_proxy.rb  |   69 +
 .../1.9.1/gems/rack-1.5.2/test/spec_builder.rb     |  214 +
 .../1.9.1/gems/rack-1.5.2/test/spec_cascade.rb     |   61 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_cgi.rb    |  102 +
 .../1.9.1/gems/rack-1.5.2/test/spec_chunked.rb     |   85 +
 .../gems/rack-1.5.2/test/spec_commonlogger.rb      |   57 +
 .../gems/rack-1.5.2/test/spec_conditionalget.rb    |  102 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_config.rb |   22 +
 .../gems/rack-1.5.2/test/spec_content_length.rb    |   83 +
 .../gems/rack-1.5.2/test/spec_content_type.rb      |   45 +
 .../1.9.1/gems/rack-1.5.2/test/spec_deflater.rb    |  204 +
 .../1.9.1/gems/rack-1.5.2/test/spec_directory.rb   |   88 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_etag.rb   |   98 +
 .../1.9.1/gems/rack-1.5.2/test/spec_fastcgi.rb     |  107 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_file.rb   |  213 +
 .../1.9.1/gems/rack-1.5.2/test/spec_handler.rb     |   59 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_head.rb   |   43 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_lint.rb   |  522 ++
 .../1.9.1/gems/rack-1.5.2/test/spec_lobster.rb     |   58 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_lock.rb   |  164 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_logger.rb |   23 +
 .../gems/rack-1.5.2/test/spec_methodoverride.rb    |   75 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_mime.rb   |   51 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_mock.rb   |  269 +
 .../1.9.1/gems/rack-1.5.2/test/spec_mongrel.rb     |  182 +
 .../1.9.1/gems/rack-1.5.2/test/spec_multipart.rb   |  445 +
 .../1.9.1/gems/rack-1.5.2/test/spec_nulllogger.rb  |   20 +
 .../1.9.1/gems/rack-1.5.2/test/spec_recursive.rb   |   72 +
 .../1.9.1/gems/rack-1.5.2/test/spec_request.rb     | 1078 +++
 .../1.9.1/gems/rack-1.5.2/test/spec_response.rb    |  313 +
 .../gems/rack-1.5.2/test/spec_rewindable_input.rb  |  118 +
 .../1.9.1/gems/rack-1.5.2/test/spec_runtime.rb     |   49 +
 .../1.9.1/gems/rack-1.5.2/test/spec_sendfile.rb    |  130 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_server.rb |  143 +
 .../rack-1.5.2/test/spec_session_abstract_id.rb    |   53 +
 .../gems/rack-1.5.2/test/spec_session_cookie.rb    |  367 +
 .../gems/rack-1.5.2/test/spec_session_memcache.rb  |  321 +
 .../gems/rack-1.5.2/test/spec_session_pool.rb      |  209 +
 .../gems/rack-1.5.2/test/spec_showexceptions.rb    |   92 +
 .../1.9.1/gems/rack-1.5.2/test/spec_showstatus.rb  |   84 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_static.rb |  145 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_thin.rb   |   91 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_urlmap.rb |  213 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/spec_utils.rb  |  573 ++
 .../1.9.1/gems/rack-1.5.2/test/spec_webrick.rb     |  143 +
 .../gems/rack-1.5.2/test/static/another/index.html |    1 +
 .../1.9.1/gems/rack-1.5.2/test/static/index.html   |    1 +
 .../ruby/1.9.1/gems/rack-1.5.2/test/testrequest.rb |   78 +
 .../rack/handler/unregistered.rb                   |    7 +
 .../rack/handler/unregistered_long_one.rb          |    7 +
 .../ruby/1.9.1/gems}/rdtool-0.6.38/COPYING.txt     |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/Gemfile         |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/HISTORY         |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/LGPL-2.1        |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/LICENSE.txt     |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/README.html     |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/README.ja.html  |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/README.rd       |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/README.rd.ja    |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/Rakefile        |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/TODO            |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/bin/rd2         |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/bin/rdswap.rb   |    0
 .../1.9.1/gems}/rdtool-0.6.38/doc/rd-draft.html    |    0
 .../1.9.1/gems}/rdtool-0.6.38/doc/rd-draft.ja.html |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/doc/rd-draft.rd |    0
 .../1.9.1/gems}/rdtool-0.6.38/doc/rd-draft.rd.ja   |    0
 .../gems}/rdtool-0.6.38/lib/rd/block-element.rb    |    0
 .../rdtool-0.6.38/lib/rd/complex-list-item.rb      |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/desclist.rb   |    0
 .../gems}/rdtool-0.6.38/lib/rd/document-struct.rb  |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/dot.rd2rc     |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/element.rb    |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/filter.rb     |    0
 .../gems}/rdtool-0.6.38/lib/rd/head-filter.rb      |    0
 .../gems}/rdtool-0.6.38/lib/rd/inline-element.rb   |    0
 .../gems}/rdtool-0.6.38/lib/rd/labeled-element.rb  |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/lib/rd/list.rb  |    0
 .../gems}/rdtool-0.6.38/lib/rd/loose-struct.rb     |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/methodlist.rb |    0
 .../rdtool-0.6.38/lib/rd/output-format-visitor.rb  |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/package.rb    |    0
 .../gems}/rdtool-0.6.38/lib/rd/parser-util.rb      |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/post-install  |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/pre-setup.rb  |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/rbl-file.rb   |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/rbl-suite.rb  |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/rd-struct.rb  |    0
 .../gems}/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb  |    0
 .../gems}/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb  |    0
 .../gems}/rdtool-0.6.38/lib/rd/rd2html-lib.rb      |    0
 .../gems}/rdtool-0.6.38/lib/rd/rd2html-opt.rb      |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/rd2man-lib.rb |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb |    0
 .../gems}/rdtool-0.6.38/lib/rd/rdblockparser.ry    |    0
 .../rdtool-0.6.38/lib/rd/rdblockparser.tab.rb      |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/lib/rd/rdfmt.rb |    0
 .../gems}/rdtool-0.6.38/lib/rd/rdinlineparser.ry   |    0
 .../rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb     |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/rdvisitor.rb  |    0
 .../rdtool-0.6.38/lib/rd/reference-resolver.rb     |    0
 .../gems}/rdtool-0.6.38/lib/rd/search-file.rb      |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/lib/rd/tree.rb  |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/version.rb    |    0
 .../1.9.1/gems}/rdtool-0.6.38/lib/rd/visitor.rb    |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/rdtool.gemspec  |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/setup.rb        |    0
 .../gems}/rdtool-0.6.38/test/data/includee1.html   |    0
 .../gems}/rdtool-0.6.38/test/data/includee2.html   |    0
 .../rdtool-0.6.38/test/data/includee3.nothtml      |    0
 .../gems}/rdtool-0.6.38/test/data/includee4.xhtml  |    0
 .../1.9.1/gems}/rdtool-0.6.38/test/data/label.rbl  |    0
 .../1.9.1/gems}/rdtool-0.6.38/test/data/label2.rbl |    0
 .../rdtool-0.6.38/test/data/sub/includee2.html     |    0
 .../rdtool-0.6.38/test/data/sub/includee4.html     |    0
 .../gems}/rdtool-0.6.38/test/dummy-observer.rb     |    0
 .../ruby/1.9.1/gems}/rdtool-0.6.38/test/dummy.rb   |    0
 .../1.9.1/gems}/rdtool-0.6.38/test/temp-dir.rb     |    0
 .../gems}/rdtool-0.6.38/test/test-block-parser.rb  |    0
 .../gems}/rdtool-0.6.38/test/test-desclist-item.rb |    0
 .../rdtool-0.6.38/test/test-document-element.rb    |    0
 .../rdtool-0.6.38/test/test-document-struct.rb     |    0
 .../1.9.1/gems}/rdtool-0.6.38/test/test-element.rb |    0
 .../gems}/rdtool-0.6.38/test/test-headline.rb      |    0
 .../gems}/rdtool-0.6.38/test/test-inline-parser.rb |    0
 .../gems}/rdtool-0.6.38/test/test-list-item.rb     |    0
 .../1.9.1/gems}/rdtool-0.6.38/test/test-list.rb    |    0
 .../rdtool-0.6.38/test/test-methodlist-item.rb     |    0
 .../rdtool-0.6.38/test/test-nonterminal-element.rb |    0
 .../rdtool-0.6.38/test/test-nonterminal-inline.rb  |    0
 .../test/test-output-format-visitor.rb             |    0
 .../gems}/rdtool-0.6.38/test/test-parser-util.rb   |    0
 .../gems}/rdtool-0.6.38/test/test-rbl-file.rb      |    0
 .../gems}/rdtool-0.6.38/test/test-rbl-suite.rb     |    0
 .../gems}/rdtool-0.6.38/test/test-rd2html-lib.rb   |    0
 .../1.9.1/gems}/rdtool-0.6.38/test/test-rdtree.rb  |    0
 .../gems}/rdtool-0.6.38/test/test-rdvisitor.rb     |    0
 .../rdtool-0.6.38/test/test-reference-resolver.rb  |    0
 .../gems}/rdtool-0.6.38/test/test-reference.rb     |    0
 .../gems}/rdtool-0.6.38/test/test-search-file.rb   |    0
 .../rdtool-0.6.38/test/test-terminal-inline.rb     |    0
 .../gems}/rdtool-0.6.38/test/test-textblock.rb     |    0
 .../1.9.1/gems}/rdtool-0.6.38/test/test-tree.rb    |    0
 .../1.9.1/gems}/rdtool-0.6.38/test/test-version.rb |    0
 .../1.9.1/gems}/rdtool-0.6.38/test/test-visitor.rb |    0
 .../1.9.1/gems}/rdtool-0.6.38/utils/rd-mode.el     |    0
 .bundle/ruby/1.9.1/gems/sprockets-2.10.0/LICENSE   |   21 +
 .bundle/ruby/1.9.1/gems/sprockets-2.10.0/README.md |  507 ++
 .../ruby/1.9.1/gems/sprockets-2.10.0/bin/sprockets |   88 +
 .../sprockets-2.10.0/lib/rake/sprocketstask.rb     |  151 +
 .../1.9.1/gems/sprockets-2.10.0/lib/sprockets.rb   |  108 +
 .../gems/sprockets-2.10.0/lib/sprockets/asset.rb   |  267 +
 .../lib/sprockets/asset_attributes.rb              |  133 +
 .../gems/sprockets-2.10.0/lib/sprockets/base.rb    |  447 +
 .../lib/sprockets/bundled_asset.rb                 |   78 +
 .../lib/sprockets/cache/file_store.rb              |   32 +
 .../gems/sprockets-2.10.0/lib/sprockets/caching.rb |   96 +
 .../lib/sprockets/charset_normalizer.rb            |   41 +
 .../lib/sprockets/closure_compressor.rb            |   22 +
 .../sprockets-2.10.0/lib/sprockets/compressing.rb  |   73 +
 .../gems/sprockets-2.10.0/lib/sprockets/context.rb |  289 +
 .../lib/sprockets/directive_processor.rb           |  408 +
 .../sprockets-2.10.0/lib/sprockets/eco_template.rb |   38 +
 .../sprockets-2.10.0/lib/sprockets/ejs_template.rb |   37 +
 .../gems/sprockets-2.10.0/lib/sprockets/engines.rb |   74 +
 .../sprockets-2.10.0/lib/sprockets/environment.rb  |   88 +
 .../gems/sprockets-2.10.0/lib/sprockets/errors.rb  |   20 +
 .../gems/sprockets-2.10.0/lib/sprockets/index.rb   |  100 +
 .../lib/sprockets/jst_processor.rb                 |   29 +
 .../sprockets-2.10.0/lib/sprockets/manifest.rb     |  261 +
 .../gems/sprockets-2.10.0/lib/sprockets/mime.rb    |   49 +
 .../gems/sprockets-2.10.0/lib/sprockets/paths.rb   |   58 +
 .../lib/sprockets/processed_asset.rb               |  152 +
 .../sprockets-2.10.0/lib/sprockets/processing.rb   |  206 +
 .../sprockets-2.10.0/lib/sprockets/processor.rb    |   32 +
 .../lib/sprockets/safety_colons.rb                 |   28 +
 .../lib/sprockets/sass_cache_store.rb              |   29 +
 .../lib/sprockets/sass_compressor.rb               |   27 +
 .../lib/sprockets/sass_functions.rb                |   70 +
 .../lib/sprockets/sass_importer.rb                 |   29 +
 .../lib/sprockets/sass_template.rb                 |   60 +
 .../lib/sprockets/scss_template.rb                 |   13 +
 .../gems/sprockets-2.10.0/lib/sprockets/server.rb  |  247 +
 .../sprockets-2.10.0/lib/sprockets/static_asset.rb |   58 +
 .../lib/sprockets/uglifier_compressor.rb           |   29 +
 .../gems/sprockets-2.10.0/lib/sprockets/utils.rb   |   69 +
 .../gems/sprockets-2.10.0/lib/sprockets/version.rb |    3 +
 .../lib/sprockets/yui_compressor.rb                |   27 +
 .bundle/ruby/1.9.1/gems/thor-0.18.1/.document      |    5 +
 .bundle/ruby/1.9.1/gems/thor-0.18.1/CHANGELOG.md   |  139 +
 .bundle/ruby/1.9.1/gems/thor-0.18.1/LICENSE.md     |   20 +
 .bundle/ruby/1.9.1/gems/thor-0.18.1/README.md      |   35 +
 .bundle/ruby/1.9.1/gems/thor-0.18.1/Thorfile       |   30 +
 .bundle/ruby/1.9.1/gems/thor-0.18.1/bin/thor       |    6 +
 .bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor.rb    |  473 +
 .../1.9.1/gems/thor-0.18.1/lib/thor/actions.rb     |  318 +
 .../thor-0.18.1/lib/thor/actions/create_file.rb    |  105 +
 .../thor-0.18.1/lib/thor/actions/create_link.rb    |   60 +
 .../gems/thor-0.18.1/lib/thor/actions/directory.rb |  119 +
 .../lib/thor/actions/empty_directory.rb            |  137 +
 .../lib/thor/actions/file_manipulation.rb          |  314 +
 .../lib/thor/actions/inject_into_file.rb           |  109 +
 .../ruby/1.9.1/gems/thor-0.18.1/lib/thor/base.rb   |  652 ++
 .../1.9.1/gems/thor-0.18.1/lib/thor/command.rb     |  136 +
 .../thor/core_ext/hash_with_indifferent_access.rb  |   80 +
 .../lib/thor/core_ext/io_binary_read.rb            |   12 +
 .../thor-0.18.1/lib/thor/core_ext/ordered_hash.rb  |  100 +
 .../ruby/1.9.1/gems/thor-0.18.1/lib/thor/error.rb  |   28 +
 .../ruby/1.9.1/gems/thor-0.18.1/lib/thor/group.rb  |  282 +
 .../1.9.1/gems/thor-0.18.1/lib/thor/invocation.rb  |  172 +
 .../ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser.rb |    4 +
 .../gems/thor-0.18.1/lib/thor/parser/argument.rb   |   74 +
 .../gems/thor-0.18.1/lib/thor/parser/arguments.rb  |  171 +
 .../gems/thor-0.18.1/lib/thor/parser/option.rb     |  121 +
 .../gems/thor-0.18.1/lib/thor/parser/options.rb    |  218 +
 .../1.9.1/gems/thor-0.18.1/lib/thor/rake_compat.rb |   72 +
 .../ruby/1.9.1/gems/thor-0.18.1/lib/thor/runner.rb |  322 +
 .../ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell.rb  |   88 +
 .../1.9.1/gems/thor-0.18.1/lib/thor/shell/basic.rb |  393 +
 .../1.9.1/gems/thor-0.18.1/lib/thor/shell/color.rb |  148 +
 .../1.9.1/gems/thor-0.18.1/lib/thor/shell/html.rb  |  127 +
 .../ruby/1.9.1/gems/thor-0.18.1/lib/thor/util.rb   |  270 +
 .../1.9.1/gems/thor-0.18.1/lib/thor/version.rb     |    3 +
 .../thor-0.18.1/spec/actions/create_file_spec.rb   |  170 +
 .../thor-0.18.1/spec/actions/create_link_spec.rb   |   95 +
 .../thor-0.18.1/spec/actions/directory_spec.rb     |  169 +
 .../spec/actions/empty_directory_spec.rb           |  129 +
 .../spec/actions/file_manipulation_spec.rb         |  382 +
 .../spec/actions/inject_into_file_spec.rb          |  135 +
 .../1.9.1/gems/thor-0.18.1/spec/actions_spec.rb    |  331 +
 .../ruby/1.9.1/gems/thor-0.18.1/spec/base_spec.rb  |  291 +
 .../1.9.1/gems/thor-0.18.1/spec/command_spec.rb    |   80 +
 .../core_ext/hash_with_indifferent_access_spec.rb  |   48 +
 .../thor-0.18.1/spec/core_ext/ordered_hash_spec.rb |  115 +
 .../gems/thor-0.18.1/spec/exit_condition_spec.rb   |   19 +
 .../gems/thor-0.18.1/spec/fixtures/application.rb  |    2 +
 .../gems/thor-0.18.1/spec/fixtures/app{1}/README   |    3 +
 .../thor-0.18.1/spec/fixtures/bundle/execute.rb    |    6 +
 .../thor-0.18.1/spec/fixtures/bundle/main.thor     |    1 +
 .../gems/thor-0.18.1/spec/fixtures/command.thor    |   10 +
 .../spec/fixtures/doc/%file_name%.rb.tt            |    1 +
 .../gems/thor-0.18.1/spec/fixtures/doc/COMMENTER   |   11 +
 .../gems/thor-0.18.1/spec/fixtures/doc/README      |    3 +
 .../thor-0.18.1/spec/fixtures/doc/block_helper.rb  |    3 +
 .../gems/thor-0.18.1/spec/fixtures/doc/config.rb   |    1 +
 .../thor-0.18.1/spec/fixtures/doc/config.yaml.tt   |    1 +
 .../spec/fixtures/doc/excluding/%file_name%.rb.tt  |    1 +
 .../1.9.1/gems/thor-0.18.1/spec/fixtures/enum.thor |   10 +
 .../gems/thor-0.18.1/spec/fixtures/group.thor      |  128 +
 .../gems/thor-0.18.1/spec/fixtures/invoke.thor     |  112 +
 .../thor-0.18.1/spec/fixtures/path with spaces     |    0
 .../thor-0.18.1/spec/fixtures/preserve/script.sh   |    3 +
 .../gems/thor-0.18.1/spec/fixtures/script.thor     |  220 +
 .../gems/thor-0.18.1/spec/fixtures/subcommand.thor |   17 +
 .../ruby/1.9.1/gems/thor-0.18.1/spec/group_spec.rb |  216 +
 .bundle/ruby/1.9.1/gems/thor-0.18.1/spec/helper.rb |   67 +
 .../1.9.1/gems/thor-0.18.1/spec/invocation_spec.rb |  100 +
 .../gems/thor-0.18.1/spec/parser/argument_spec.rb  |   53 +
 .../gems/thor-0.18.1/spec/parser/arguments_spec.rb |   66 +
 .../gems/thor-0.18.1/spec/parser/option_spec.rb    |  202 +
 .../gems/thor-0.18.1/spec/parser/options_spec.rb   |  400 +
 .../gems/thor-0.18.1/spec/rake_compat_spec.rb      |   72 +
 .../1.9.1/gems/thor-0.18.1/spec/register_spec.rb   |  197 +
 .../1.9.1/gems/thor-0.18.1/spec/runner_spec.rb     |  241 +
 .../gems/thor-0.18.1/spec/shell/basic_spec.rb      |  311 +
 .../gems/thor-0.18.1/spec/shell/color_spec.rb      |   95 +
 .../1.9.1/gems/thor-0.18.1/spec/shell/html_spec.rb |   32 +
 .../ruby/1.9.1/gems/thor-0.18.1/spec/shell_spec.rb |   47 +
 .../1.9.1/gems/thor-0.18.1/spec/subcommand_spec.rb |   30 +
 .../ruby/1.9.1/gems/thor-0.18.1/spec/thor_spec.rb  |  491 +
 .../ruby/1.9.1/gems/thor-0.18.1/spec/util_spec.rb  |  196 +
 .bundle/ruby/1.9.1/gems/thor-0.18.1/thor.gemspec   |   24 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/CHANGELOG.md    |   44 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/COPYING         |   18 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/Gemfile         |   32 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/HACKING         |   16 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/README.md       |  232 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/Rakefile        |  104 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/TEMPLATES.md    |  516 ++
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/bin/tilt        |  112 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt.rb     |  204 +
 .../1.9.1/gems/tilt-1.4.1/lib/tilt/asciidoc.rb     |   34 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/builder.rb |   40 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/coffee.rb  |   54 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/css.rb |   80 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/csv.rb |   71 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/erb.rb |  110 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/etanni.rb  |   27 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/haml.rb    |   64 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/liquid.rb  |   45 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/markaby.rb |   52 +
 .../1.9.1/gems/tilt-1.4.1/lib/tilt/markdown.rb     |  214 +
 .../1.9.1/gems/tilt-1.4.1/lib/tilt/nokogiri.rb     |   43 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/plain.rb   |   20 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/radius.rb  |   55 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/rdoc.rb    |   47 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/string.rb  |   21 +
 .../1.9.1/gems/tilt-1.4.1/lib/tilt/template.rb     |  292 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/textile.rb |   30 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/wiki.rb    |   58 +
 .../ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/yajl.rb    |   94 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/test/contest.rb |   68 +
 .../1.9.1/gems/tilt-1.4.1/test/markaby/locals.mab  |    1 +
 .../1.9.1/gems/tilt-1.4.1/test/markaby/markaby.mab |    1 +
 .../test/markaby/markaby_other_static.mab          |    1 +
 .../gems/tilt-1.4.1/test/markaby/render_twice.mab  |    1 +
 .../1.9.1/gems/tilt-1.4.1/test/markaby/scope.mab   |    1 +
 .../gems/tilt-1.4.1/test/markaby/yielding.mab      |    2 +
 .../gems/tilt-1.4.1/test/tilt_asciidoctor_test.rb  |   44 +
 .../tilt-1.4.1/test/tilt_blueclothtemplate_test.rb |   45 +
 .../tilt-1.4.1/test/tilt_buildertemplate_test.rb   |   59 +
 .../1.9.1/gems/tilt-1.4.1/test/tilt_cache_test.rb  |   32 +
 .../test/tilt_coffeescripttemplate_test.rb         |  114 +
 .../gems/tilt-1.4.1/test/tilt_compilesite_test.rb  |   51 +
 .../tilt-1.4.1/test/tilt_creoletemplate_test.rb    |   28 +
 .../1.9.1/gems/tilt-1.4.1/test/tilt_csv_test.rb    |   69 +
 .../gems/tilt-1.4.1/test/tilt_erbtemplate_test.rb  |  239 +
 .../tilt-1.4.1/test/tilt_erubistemplate_test.rb    |  151 +
 .../tilt-1.4.1/test/tilt_etannitemplate_test.rb    |  173 +
 .../gems/tilt-1.4.1/test/tilt_fallback_test.rb     |  122 +
 .../gems/tilt-1.4.1/test/tilt_hamltemplate_test.rb |  144 +
 .../gems/tilt-1.4.1/test/tilt_kramdown_test.rb     |   42 +
 .../tilt-1.4.1/test/tilt_lesstemplate_test.less    |    1 +
 .../gems/tilt-1.4.1/test/tilt_lesstemplate_test.rb |   42 +
 .../tilt-1.4.1/test/tilt_liquidtemplate_test.rb    |   78 +
 .../gems/tilt-1.4.1/test/tilt_markaby_test.rb      |   88 +
 .../gems/tilt-1.4.1/test/tilt_markdown_test.rb     |  172 +
 .../tilt-1.4.1/test/tilt_marukutemplate_test.rb    |   48 +
 .../tilt-1.4.1/test/tilt_nokogiritemplate_test.rb  |   87 +
 .../tilt-1.4.1/test/tilt_radiustemplate_test.rb    |   75 +
 .../tilt-1.4.1/test/tilt_rdiscounttemplate_test.rb |   55 +
 .../gems/tilt-1.4.1/test/tilt_rdoctemplate_test.rb |   31 +
 .../tilt-1.4.1/test/tilt_redcarpettemplate_test.rb |   71 +
 .../tilt-1.4.1/test/tilt_redclothtemplate_test.rb  |   36 +
 .../gems/tilt-1.4.1/test/tilt_sasstemplate_test.rb |   41 +
 .../tilt-1.4.1/test/tilt_stringtemplate_test.rb    |  170 +
 .../gems/tilt-1.4.1/test/tilt_template_test.rb     |  323 +
 .../ruby/1.9.1/gems/tilt-1.4.1/test/tilt_test.rb   |   65 +
 .../tilt-1.4.1/test/tilt_wikiclothtemplate_test.rb |   32 +
 .../gems/tilt-1.4.1/test/tilt_yajltemplate_test.rb |  101 +
 .bundle/ruby/1.9.1/gems/tilt-1.4.1/tilt.gemspec    |  120 +
 .../1.9.1/specifications/fastimage-1.5.0.gemspec   |   29 +
 .../ruby/1.9.1/specifications/hike-1.2.3.gemspec   |   29 +
 .../1.9.1/specifications/hikidoc-0.0.6.gemspec     |   34 +
 .../1.9.1/specifications/multi_json-1.7.7.gemspec  |   30 +
 .../ruby/1.9.1/specifications/rack-1.5.2.gemspec   |   36 +
 .../1.9.1/specifications/rdtool-0.6.38.gemspec     |   34 +
 .../1.9.1/specifications/sprockets-2.10.0.gemspec  |   77 +
 .../ruby/1.9.1/specifications/thor-0.18.1.gemspec  |   31 +
 .../ruby/1.9.1/specifications/tilt-1.4.1.gemspec   |   98 +
 .bundle/ruby/2.0.0/bin/hikidoc                     |   23 +
 .bundle/ruby/2.0.0/bin/rackup                      |   23 +
 .bundle/ruby/2.0.0/bin/rd2                         |   25 +
 .bundle/ruby/2.0.0/bin/rdswap.rb                   |   25 +
 .bundle/ruby/2.0.0/bin/sprockets                   |   23 +
 .bundle/ruby/2.0.0/bin/thor                        |   23 +
 .bundle/ruby/2.0.0/bin/tilt                        |   23 +
 .../ruby/2.0.0/build_info/fastimage-1.5.0.info     |    0
 .../ruby/2.0.0/build_info/hike-1.2.3.info          |    0
 .../ruby/2.0.0/build_info/hikidoc-0.0.6.info       |    0
 .../ruby/2.0.0/build_info/multi_json-1.7.7.info    |    0
 .../ruby/2.0.0/build_info/rack-1.5.2.info          |    0
 .../ruby/2.0.0/build_info/rdtool-0.6.38.info       |    0
 .../ruby/2.0.0/build_info/sprockets-2.10.0.info    |    0
 .../ruby/2.0.0/build_info/thor-0.18.1.info         |    0
 .../ruby/2.0.0/build_info/tilt-1.4.1.info          |    0
 .bundle/ruby/2.0.0/cache/fastimage-1.5.0.gem       |  Bin 0 -> 2072576 bytes
 .bundle/ruby/2.0.0/cache/hike-1.2.3.gem            |  Bin 0 -> 8704 bytes
 .bundle/ruby/2.0.0/cache/hikidoc-0.0.6.gem         |  Bin 0 -> 29184 bytes
 .bundle/ruby/2.0.0/cache/multi_json-1.7.7.gem      |  Bin 0 -> 28672 bytes
 .bundle/ruby/2.0.0/cache/rack-1.5.2.gem            |  Bin 0 -> 216576 bytes
 .bundle/ruby/2.0.0/cache/rdtool-0.6.38.gem         |  Bin 0 -> 115712 bytes
 .bundle/ruby/2.0.0/cache/sprockets-2.10.0.gem      |  Bin 0 -> 42496 bytes
 .bundle/ruby/2.0.0/cache/thor-0.18.1.gem           |  Bin 0 -> 83456 bytes
 .bundle/ruby/2.0.0/cache/tilt-1.4.1.gem            |  Bin 0 -> 42496 bytes
 .../ruby/2.0.0/gems/fastimage-1.5.0/MIT-LICENSE    |   20 +
 .../ruby/2.0.0/gems/fastimage-1.5.0/README.textile |  119 +
 .../2.0.0/gems/fastimage-1.5.0/lib/fastimage.rb    |  478 +
 .../gems/fastimage-1.5.0/lib/fastimage/fbr.rb      |   67 +
 .../test/fixtures/exif_orientation.jpg             |  Bin 0 -> 1659857 bytes
 .../gems/fastimage-1.5.0/test/fixtures/faulty.jpg  |  Bin 0 -> 336 bytes
 .../test/fixtures/folder with spaces/test.bmp      |  Bin 0 -> 3296 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test.bmp    |  Bin 0 -> 3296 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test.gif    |  Bin 0 -> 258 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test.ico    |  Bin 0 -> 318 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test.jpg    |  Bin 0 -> 268118 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test.png    |  Bin 0 -> 322 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test.tiff   |  Bin 0 -> 27934 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test2.jpg   |  Bin 0 -> 40065 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test2.tiff  |  Bin 0 -> 72236 bytes
 .../gems/fastimage-1.5.0/test/fixtures/test3.jpg   |  Bin 0 -> 38668 bytes
 .../ruby/2.0.0/gems/fastimage-1.5.0/test/test.rb   |  218 +
 .bundle/ruby/2.0.0/gems/hike-1.2.3/LICENSE         |   20 +
 .bundle/ruby/2.0.0/gems/hike-1.2.3/README.md       |   52 +
 .bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike.rb     |    9 +
 .../2.0.0/gems/hike-1.2.3/lib/hike/extensions.rb   |   23 +
 .../ruby/2.0.0/gems/hike-1.2.3/lib/hike/index.rb   |  206 +
 .../gems/hike-1.2.3/lib/hike/normalized_array.rb   |   59 +
 .../ruby/2.0.0/gems/hike-1.2.3/lib/hike/paths.rb   |   27 +
 .../ruby/2.0.0/gems/hike-1.2.3/lib/hike/trail.rb   |  188 +
 .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/.gitignore   |   17 +
 .../ruby/2.0.0/gems}/hikidoc-0.0.6/COPYING         |    0
 .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/Gemfile      |    4 +
 .../ruby/2.0.0/gems}/hikidoc-0.0.6/NEWS            |    0
 .../ruby/2.0.0/gems}/hikidoc-0.0.6/NEWS.ja         |    0
 .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/README       |   87 +
 .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/README.ja    |   84 +
 .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/Rakefile     |    8 +
 .../2.0.0/gems}/hikidoc-0.0.6/TextFormattingRules  |    0
 .../gems}/hikidoc-0.0.6/TextFormattingRules.ja     |    0
 .../ruby/2.0.0/gems}/hikidoc-0.0.6/bin/hikidoc     |    0
 .../ruby/2.0.0/gems/hikidoc-0.0.6/hikidoc.gemspec  |   23 +
 .../ruby/2.0.0/gems}/hikidoc-0.0.6/lib/hikidoc.rb  |    0
 .../ruby/2.0.0/gems}/hikidoc-0.0.6/setup.rb        |    0
 .../2.0.0/gems/hikidoc-0.0.6/test/hikidoc_test.rb  |    0
 .bundle/ruby/2.0.0/gems/multi_json-1.7.7/.document |    5 +
 .bundle/ruby/2.0.0/gems/multi_json-1.7.7/.rspec    |    3 +
 .../ruby/2.0.0/gems/multi_json-1.7.7/.travis.yml   |   11 +
 .bundle/ruby/2.0.0/gems/multi_json-1.7.7/.yardopts |    6 +
 .../ruby/2.0.0/gems/multi_json-1.7.7/CHANGELOG.md  |  164 +
 .../2.0.0/gems/multi_json-1.7.7/CONTRIBUTING.md    |   46 +
 .bundle/ruby/2.0.0/gems/multi_json-1.7.7/Gemfile   |   31 +
 .../ruby/2.0.0/gems/multi_json-1.7.7/LICENSE.md    |   20 +
 .bundle/ruby/2.0.0/gems/multi_json-1.7.7/README.md |  109 +
 .bundle/ruby/2.0.0/gems/multi_json-1.7.7/Rakefile  |   12 +
 .../2.0.0/gems/multi_json-1.7.7/lib/multi_json.rb  |  160 +
 .../multi_json-1.7.7/lib/multi_json/adapter.rb     |   48 +
 .../lib/multi_json/adapters/gson.rb                |   19 +
 .../lib/multi_json/adapters/jr_jackson.rb          |   19 +
 .../lib/multi_json/adapters/json_common.rb         |   25 +
 .../lib/multi_json/adapters/json_gem.rb            |   11 +
 .../lib/multi_json/adapters/json_pure.rb           |   11 +
 .../lib/multi_json/adapters/nsjsonserialization.rb |   34 +
 .../multi_json-1.7.7/lib/multi_json/adapters/oj.rb |   24 +
 .../lib/multi_json/adapters/ok_json.rb             |   22 +
 .../lib/multi_json/adapters/yajl.rb                |   19 +
 .../lib/multi_json/convertible_hash_keys.rb        |   43 +
 .../multi_json-1.7.7/lib/multi_json/options.rb     |   48 +
 .../lib/multi_json/vendor/okjson.rb                |  600 ++
 .../multi_json-1.7.7/lib/multi_json/version.rb     |   20 +
 .../2.0.0/gems/multi_json-1.7.7/multi_json.gemspec |   22 +
 .../spec/adapter_shared_example.rb                 |  235 +
 .../gems/multi_json-1.7.7/spec/has_options.rb      |   74 +
 .../2.0.0/gems/multi_json-1.7.7/spec/helper.rb     |   35 +
 .../spec/json_common_shared_example.rb             |   30 +
 .../gems/multi_json-1.7.7/spec/multi_json_spec.rb  |  226 +
 .bundle/ruby/2.0.0/gems/rack-1.5.2/COPYING         |   18 +
 .bundle/ruby/2.0.0/gems/rack-1.5.2/KNOWN-ISSUES    |   30 +
 .bundle/ruby/2.0.0/gems/rack-1.5.2/README.rdoc     |  624 ++
 .bundle/ruby/2.0.0/gems/rack-1.5.2/Rakefile        |  125 +
 .bundle/ruby/2.0.0/gems/rack-1.5.2/SPEC            |  237 +
 .bundle/ruby/2.0.0/gems/rack-1.5.2/bin/rackup      |    4 +
 .../ruby/2.0.0/gems/rack-1.5.2/contrib/rack.png    |  Bin 0 -> 23805 bytes
 .../ruby/2.0.0/gems/rack-1.5.2/contrib/rack.svg    |  150 +
 .../2.0.0/gems/rack-1.5.2/contrib/rack_logo.svg    |  111 +
 .../ruby/2.0.0/gems/rack-1.5.2/contrib/rdoc.css    |  412 +
 .../ruby/2.0.0/gems/rack-1.5.2/example/lobster.ru  |    4 +
 .../gems/rack-1.5.2/example/protectedlobster.rb    |   14 +
 .../gems/rack-1.5.2/example/protectedlobster.ru    |    8 +
 .bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack.rb     |   87 +
 .../rack-1.5.2/lib/rack/auth/abstract/handler.rb   |   37 +
 .../rack-1.5.2/lib/rack/auth/abstract/request.rb   |   43 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/auth/basic.rb   |   58 +
 .../gems/rack-1.5.2/lib/rack/auth/digest/md5.rb    |  129 +
 .../gems/rack-1.5.2/lib/rack/auth/digest/nonce.rb  |   51 +
 .../gems/rack-1.5.2/lib/rack/auth/digest/params.rb |   53 +
 .../rack-1.5.2/lib/rack/auth/digest/request.rb     |   41 +
 .../rack-1.5.2/lib/rack/backports/uri/common_18.rb |   56 +
 .../lib/rack/backports/uri/common_192.rb           |   52 +
 .../lib/rack/backports/uri/common_193.rb           |   29 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/body_proxy.rb   |   39 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb |  149 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/cascade.rb |   52 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/chunked.rb |   58 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/commonlogger.rb |   64 +
 .../gems/rack-1.5.2/lib/rack/conditionalget.rb     |   67 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/config.rb  |   20 +
 .../gems/rack-1.5.2/lib/rack/content_length.rb     |   33 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/content_type.rb |   29 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/deflater.rb     |  116 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/directory.rb    |  161 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/etag.rb    |   64 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/file.rb    |  138 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler.rb |  107 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/handler/cgi.rb  |   61 +
 .../rack-1.5.2/lib/rack/handler/evented_mongrel.rb |    8 +
 .../gems/rack-1.5.2/lib/rack/handler/fastcgi.rb    |   98 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/handler/lsws.rb |   61 +
 .../gems/rack-1.5.2/lib/rack/handler/mongrel.rb    |  100 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/handler/scgi.rb |   67 +
 .../lib/rack/handler/swiftiplied_mongrel.rb        |    8 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/handler/thin.rb |   27 +
 .../gems/rack-1.5.2/lib/rack/handler/webrick.rb    |   81 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/head.rb    |   22 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/lint.rb    |  699 ++
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/lobster.rb |   65 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/lock.rb    |   26 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/logger.rb  |   18 +
 .../gems/rack-1.5.2/lib/rack/methodoverride.rb     |   31 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/mime.rb    |  677 ++
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/mock.rb    |  190 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/multipart.rb    |   34 +
 .../rack-1.5.2/lib/rack/multipart/generator.rb     |   93 +
 .../gems/rack-1.5.2/lib/rack/multipart/parser.rb   |  176 +
 .../rack-1.5.2/lib/rack/multipart/uploaded_file.rb |   34 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/nulllogger.rb   |   18 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/recursive.rb    |   61 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/reloader.rb     |  109 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/request.rb |  380 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/response.rb     |  155 +
 .../gems/rack-1.5.2/lib/rack/rewindable_input.rb   |  104 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/runtime.rb |   27 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/sendfile.rb     |  155 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/server.rb  |  362 +
 .../rack-1.5.2/lib/rack/session/abstract/id.rb     |  398 +
 .../gems/rack-1.5.2/lib/rack/session/cookie.rb     |  178 +
 .../gems/rack-1.5.2/lib/rack/session/memcache.rb   |   93 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/session/pool.rb |   79 +
 .../gems/rack-1.5.2/lib/rack/showexceptions.rb     |  378 +
 .../2.0.0/gems/rack-1.5.2/lib/rack/showstatus.rb   |  113 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/static.rb  |  153 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/urlmap.rb  |   76 +
 .../ruby/2.0.0/gems/rack-1.5.2/lib/rack/utils.rb   |  628 ++
 .../2.0.0/gems/rack-1.5.2/lib/rack/utils/okjson.rb |  599 ++
 .bundle/ruby/2.0.0/gems/rack-1.5.2/rack.gemspec    |   33 +
 .../2.0.0/gems/rack-1.5.2/test/builder/anything.rb |    5 +
 .../2.0.0/gems/rack-1.5.2/test/builder/comment.ru  |    4 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/builder/end.ru |    5 +
 .../2.0.0/gems/rack-1.5.2/test/builder/line.ru     |    1 +
 .../2.0.0/gems/rack-1.5.2/test/builder/options.ru  |    2 +
 .../gems/rack-1.5.2/test/cgi/assets/folder/test.js |    1 +
 .../gems/rack-1.5.2/test/cgi/assets/fonts/font.eot |    1 +
 .../rack-1.5.2/test/cgi/assets/images/image.png    |    1 +
 .../gems/rack-1.5.2/test/cgi/assets/index.html     |    1 +
 .../rack-1.5.2/test/cgi/assets/javascripts/app.js  |    1 +
 .../rack-1.5.2/test/cgi/assets/stylesheets/app.css |    1 +
 .../2.0.0/gems/rack-1.5.2/test/cgi/lighttpd.conf   |   26 +
 .../2.0.0/gems/rack-1.5.2/test/cgi/rackup_stub.rb  |    6 +
 .../gems/rack-1.5.2/test/cgi/sample_rackup.ru      |    5 +
 .bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test   |    9 +
 .../rack-1.5.2/test/cgi/test+directory/test+file   |    1 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/cgi/test.fcgi  |    8 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/cgi/test.ru    |    5 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/gemloader.rb   |   10 +
 .../gems/rack-1.5.2/test/multipart/bad_robots      |  259 +
 .../2.0.0/gems/rack-1.5.2/test/multipart/binary    |  Bin 0 -> 26667 bytes
 .../test/multipart/content_type_and_no_filename    |    6 +
 .../2.0.0/gems/rack-1.5.2/test/multipart/empty     |   10 +
 .../rack-1.5.2/test/multipart/fail_16384_nofile    |  814 ++
 .../2.0.0/gems/rack-1.5.2/test/multipart/file1.txt |    1 +
 .../test/multipart/filename_and_modification_param |    7 +
 .../test/multipart/filename_with_escaped_quotes    |    6 +
 ...name_with_escaped_quotes_and_modification_param |    7 +
 .../multipart/filename_with_percent_escaped_quotes |    6 +
 .../multipart/filename_with_unescaped_percentages  |    6 +
 .../multipart/filename_with_unescaped_percentages2 |    6 +
 .../multipart/filename_with_unescaped_percentages3 |    6 +
 .../test/multipart/filename_with_unescaped_quotes  |    6 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/multipart/ie   |    6 +
 .../gems/rack-1.5.2/test/multipart/mixed_files     |   21 +
 .../2.0.0/gems/rack-1.5.2/test/multipart/nested    |   10 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/multipart/none |    9 +
 .../2.0.0/gems/rack-1.5.2/test/multipart/semicolon |    6 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/multipart/text |   15 +
 .../2.0.0/gems/rack-1.5.2/test/multipart/webkit    |   32 +
 .../2.0.0/gems/rack-1.5.2/test/rackup/config.ru    |   31 +
 .../rack/handler/registering_myself.rb             |    8 +
 .../2.0.0/gems/rack-1.5.2/test/spec_auth_basic.rb  |   81 +
 .../2.0.0/gems/rack-1.5.2/test/spec_auth_digest.rb |  259 +
 .../2.0.0/gems/rack-1.5.2/test/spec_body_proxy.rb  |   69 +
 .../2.0.0/gems/rack-1.5.2/test/spec_builder.rb     |  214 +
 .../2.0.0/gems/rack-1.5.2/test/spec_cascade.rb     |   61 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_cgi.rb    |  102 +
 .../2.0.0/gems/rack-1.5.2/test/spec_chunked.rb     |   85 +
 .../gems/rack-1.5.2/test/spec_commonlogger.rb      |   57 +
 .../gems/rack-1.5.2/test/spec_conditionalget.rb    |  102 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_config.rb |   22 +
 .../gems/rack-1.5.2/test/spec_content_length.rb    |   83 +
 .../gems/rack-1.5.2/test/spec_content_type.rb      |   45 +
 .../2.0.0/gems/rack-1.5.2/test/spec_deflater.rb    |  204 +
 .../2.0.0/gems/rack-1.5.2/test/spec_directory.rb   |   88 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_etag.rb   |   98 +
 .../2.0.0/gems/rack-1.5.2/test/spec_fastcgi.rb     |  107 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_file.rb   |  213 +
 .../2.0.0/gems/rack-1.5.2/test/spec_handler.rb     |   59 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_head.rb   |   43 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_lint.rb   |  522 ++
 .../2.0.0/gems/rack-1.5.2/test/spec_lobster.rb     |   58 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_lock.rb   |  164 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_logger.rb |   23 +
 .../gems/rack-1.5.2/test/spec_methodoverride.rb    |   75 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_mime.rb   |   51 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_mock.rb   |  269 +
 .../2.0.0/gems/rack-1.5.2/test/spec_mongrel.rb     |  182 +
 .../2.0.0/gems/rack-1.5.2/test/spec_multipart.rb   |  445 +
 .../2.0.0/gems/rack-1.5.2/test/spec_nulllogger.rb  |   20 +
 .../2.0.0/gems/rack-1.5.2/test/spec_recursive.rb   |   72 +
 .../2.0.0/gems/rack-1.5.2/test/spec_request.rb     | 1078 +++
 .../2.0.0/gems/rack-1.5.2/test/spec_response.rb    |  313 +
 .../gems/rack-1.5.2/test/spec_rewindable_input.rb  |  118 +
 .../2.0.0/gems/rack-1.5.2/test/spec_runtime.rb     |   49 +
 .../2.0.0/gems/rack-1.5.2/test/spec_sendfile.rb    |  130 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_server.rb |  143 +
 .../rack-1.5.2/test/spec_session_abstract_id.rb    |   53 +
 .../gems/rack-1.5.2/test/spec_session_cookie.rb    |  367 +
 .../gems/rack-1.5.2/test/spec_session_memcache.rb  |  321 +
 .../gems/rack-1.5.2/test/spec_session_pool.rb      |  209 +
 .../gems/rack-1.5.2/test/spec_showexceptions.rb    |   92 +
 .../2.0.0/gems/rack-1.5.2/test/spec_showstatus.rb  |   84 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_static.rb |  145 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_thin.rb   |   91 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_urlmap.rb |  213 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/spec_utils.rb  |  573 ++
 .../2.0.0/gems/rack-1.5.2/test/spec_webrick.rb     |  143 +
 .../gems/rack-1.5.2/test/static/another/index.html |    1 +
 .../2.0.0/gems/rack-1.5.2/test/static/index.html   |    1 +
 .../ruby/2.0.0/gems/rack-1.5.2/test/testrequest.rb |   78 +
 .../rack/handler/unregistered.rb                   |    7 +
 .../rack/handler/unregistered_long_one.rb          |    7 +
 .../ruby/2.0.0/gems}/rdtool-0.6.38/COPYING.txt     |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/Gemfile         |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/HISTORY         |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/LGPL-2.1        |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/LICENSE.txt     |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/README.html     |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/README.ja.html  |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/README.rd       |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/README.rd.ja    |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/Rakefile        |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/TODO            |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/bin/rd2         |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/bin/rdswap.rb   |    0
 .../2.0.0/gems}/rdtool-0.6.38/doc/rd-draft.html    |    0
 .../2.0.0/gems}/rdtool-0.6.38/doc/rd-draft.ja.html |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/doc/rd-draft.rd |    0
 .../2.0.0/gems}/rdtool-0.6.38/doc/rd-draft.rd.ja   |    0
 .../gems}/rdtool-0.6.38/lib/rd/block-element.rb    |    0
 .../rdtool-0.6.38/lib/rd/complex-list-item.rb      |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/desclist.rb   |    0
 .../gems}/rdtool-0.6.38/lib/rd/document-struct.rb  |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/dot.rd2rc     |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/element.rb    |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/filter.rb     |    0
 .../gems}/rdtool-0.6.38/lib/rd/head-filter.rb      |    0
 .../gems}/rdtool-0.6.38/lib/rd/inline-element.rb   |    0
 .../gems}/rdtool-0.6.38/lib/rd/labeled-element.rb  |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/lib/rd/list.rb  |    0
 .../gems}/rdtool-0.6.38/lib/rd/loose-struct.rb     |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/methodlist.rb |    0
 .../rdtool-0.6.38/lib/rd/output-format-visitor.rb  |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/package.rb    |    0
 .../gems}/rdtool-0.6.38/lib/rd/parser-util.rb      |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/post-install  |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/pre-setup.rb  |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/rbl-file.rb   |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/rbl-suite.rb  |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/rd-struct.rb  |    0
 .../gems}/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb  |    0
 .../gems}/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb  |    0
 .../gems}/rdtool-0.6.38/lib/rd/rd2html-lib.rb      |    0
 .../gems}/rdtool-0.6.38/lib/rd/rd2html-opt.rb      |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/rd2man-lib.rb |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb |    0
 .../gems}/rdtool-0.6.38/lib/rd/rdblockparser.ry    |    0
 .../rdtool-0.6.38/lib/rd/rdblockparser.tab.rb      |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/lib/rd/rdfmt.rb |    0
 .../gems}/rdtool-0.6.38/lib/rd/rdinlineparser.ry   |    0
 .../rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb     |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/rdvisitor.rb  |    0
 .../rdtool-0.6.38/lib/rd/reference-resolver.rb     |    0
 .../gems}/rdtool-0.6.38/lib/rd/search-file.rb      |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/lib/rd/tree.rb  |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/version.rb    |    0
 .../2.0.0/gems}/rdtool-0.6.38/lib/rd/visitor.rb    |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/rdtool.gemspec  |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/setup.rb        |    0
 .../gems}/rdtool-0.6.38/test/data/includee1.html   |    0
 .../gems}/rdtool-0.6.38/test/data/includee2.html   |    0
 .../rdtool-0.6.38/test/data/includee3.nothtml      |    0
 .../gems/rdtool-0.6.38/test/data/includee4.xhtml   |    0
 .../2.0.0/gems}/rdtool-0.6.38/test/data/label.rbl  |    0
 .../2.0.0/gems}/rdtool-0.6.38/test/data/label2.rbl |    0
 .../rdtool-0.6.38/test/data/sub/includee2.html     |    0
 .../rdtool-0.6.38/test/data/sub/includee4.html     |    0
 .../gems}/rdtool-0.6.38/test/dummy-observer.rb     |    0
 .../ruby/2.0.0/gems}/rdtool-0.6.38/test/dummy.rb   |    0
 .../2.0.0/gems}/rdtool-0.6.38/test/temp-dir.rb     |    0
 .../gems}/rdtool-0.6.38/test/test-block-parser.rb  |    0
 .../gems}/rdtool-0.6.38/test/test-desclist-item.rb |    0
 .../rdtool-0.6.38/test/test-document-element.rb    |    0
 .../rdtool-0.6.38/test/test-document-struct.rb     |    0
 .../2.0.0/gems}/rdtool-0.6.38/test/test-element.rb |    0
 .../gems}/rdtool-0.6.38/test/test-headline.rb      |    0
 .../gems}/rdtool-0.6.38/test/test-inline-parser.rb |    0
 .../gems}/rdtool-0.6.38/test/test-list-item.rb     |    0
 .../2.0.0/gems}/rdtool-0.6.38/test/test-list.rb    |    0
 .../rdtool-0.6.38/test/test-methodlist-item.rb     |    0
 .../rdtool-0.6.38/test/test-nonterminal-element.rb |    0
 .../rdtool-0.6.38/test/test-nonterminal-inline.rb  |    0
 .../test/test-output-format-visitor.rb             |    0
 .../gems}/rdtool-0.6.38/test/test-parser-util.rb   |    0
 .../gems}/rdtool-0.6.38/test/test-rbl-file.rb      |    0
 .../gems}/rdtool-0.6.38/test/test-rbl-suite.rb     |    0
 .../gems}/rdtool-0.6.38/test/test-rd2html-lib.rb   |    0
 .../2.0.0/gems}/rdtool-0.6.38/test/test-rdtree.rb  |    0
 .../gems}/rdtool-0.6.38/test/test-rdvisitor.rb     |    0
 .../rdtool-0.6.38/test/test-reference-resolver.rb  |    0
 .../gems}/rdtool-0.6.38/test/test-reference.rb     |    0
 .../gems}/rdtool-0.6.38/test/test-search-file.rb   |    0
 .../rdtool-0.6.38/test/test-terminal-inline.rb     |    0
 .../gems}/rdtool-0.6.38/test/test-textblock.rb     |    0
 .../2.0.0/gems}/rdtool-0.6.38/test/test-tree.rb    |    0
 .../2.0.0/gems}/rdtool-0.6.38/test/test-version.rb |    0
 .../2.0.0/gems}/rdtool-0.6.38/test/test-visitor.rb |    0
 .../2.0.0/gems}/rdtool-0.6.38/utils/rd-mode.el     |    0
 .bundle/ruby/2.0.0/gems/sprockets-2.10.0/LICENSE   |   21 +
 .bundle/ruby/2.0.0/gems/sprockets-2.10.0/README.md |  507 ++
 .../ruby/2.0.0/gems/sprockets-2.10.0/bin/sprockets |   88 +
 .../sprockets-2.10.0/lib/rake/sprocketstask.rb     |  151 +
 .../2.0.0/gems/sprockets-2.10.0/lib/sprockets.rb   |  108 +
 .../gems/sprockets-2.10.0/lib/sprockets/asset.rb   |  267 +
 .../lib/sprockets/asset_attributes.rb              |  133 +
 .../gems/sprockets-2.10.0/lib/sprockets/base.rb    |  447 +
 .../lib/sprockets/bundled_asset.rb                 |   78 +
 .../lib/sprockets/cache/file_store.rb              |   32 +
 .../gems/sprockets-2.10.0/lib/sprockets/caching.rb |   96 +
 .../lib/sprockets/charset_normalizer.rb            |   41 +
 .../lib/sprockets/closure_compressor.rb            |   22 +
 .../sprockets-2.10.0/lib/sprockets/compressing.rb  |   73 +
 .../gems/sprockets-2.10.0/lib/sprockets/context.rb |  289 +
 .../lib/sprockets/directive_processor.rb           |  408 +
 .../sprockets-2.10.0/lib/sprockets/eco_template.rb |   38 +
 .../sprockets-2.10.0/lib/sprockets/ejs_template.rb |   37 +
 .../gems/sprockets-2.10.0/lib/sprockets/engines.rb |   74 +
 .../sprockets-2.10.0/lib/sprockets/environment.rb  |   88 +
 .../gems/sprockets-2.10.0/lib/sprockets/errors.rb  |   20 +
 .../gems/sprockets-2.10.0/lib/sprockets/index.rb   |  100 +
 .../lib/sprockets/jst_processor.rb                 |   29 +
 .../sprockets-2.10.0/lib/sprockets/manifest.rb     |  261 +
 .../gems/sprockets-2.10.0/lib/sprockets/mime.rb    |   49 +
 .../gems/sprockets-2.10.0/lib/sprockets/paths.rb   |   58 +
 .../lib/sprockets/processed_asset.rb               |  152 +
 .../sprockets-2.10.0/lib/sprockets/processing.rb   |  206 +
 .../sprockets-2.10.0/lib/sprockets/processor.rb    |   32 +
 .../lib/sprockets/safety_colons.rb                 |   28 +
 .../lib/sprockets/sass_cache_store.rb              |   29 +
 .../lib/sprockets/sass_compressor.rb               |   27 +
 .../lib/sprockets/sass_functions.rb                |   70 +
 .../lib/sprockets/sass_importer.rb                 |   29 +
 .../lib/sprockets/sass_template.rb                 |   60 +
 .../lib/sprockets/scss_template.rb                 |   13 +
 .../gems/sprockets-2.10.0/lib/sprockets/server.rb  |  247 +
 .../sprockets-2.10.0/lib/sprockets/static_asset.rb |   58 +
 .../lib/sprockets/uglifier_compressor.rb           |   29 +
 .../gems/sprockets-2.10.0/lib/sprockets/utils.rb   |   69 +
 .../gems/sprockets-2.10.0/lib/sprockets/version.rb |    3 +
 .../lib/sprockets/yui_compressor.rb                |   27 +
 .bundle/ruby/2.0.0/gems/thor-0.18.1/.document      |    5 +
 .bundle/ruby/2.0.0/gems/thor-0.18.1/CHANGELOG.md   |  139 +
 .bundle/ruby/2.0.0/gems/thor-0.18.1/LICENSE.md     |   20 +
 .bundle/ruby/2.0.0/gems/thor-0.18.1/README.md      |   35 +
 .bundle/ruby/2.0.0/gems/thor-0.18.1/Thorfile       |   30 +
 .bundle/ruby/2.0.0/gems/thor-0.18.1/bin/thor       |    6 +
 .bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor.rb    |  473 +
 .../2.0.0/gems/thor-0.18.1/lib/thor/actions.rb     |  318 +
 .../thor-0.18.1/lib/thor/actions/create_file.rb    |  105 +
 .../thor-0.18.1/lib/thor/actions/create_link.rb    |   60 +
 .../gems/thor-0.18.1/lib/thor/actions/directory.rb |  119 +
 .../lib/thor/actions/empty_directory.rb            |  137 +
 .../lib/thor/actions/file_manipulation.rb          |  314 +
 .../lib/thor/actions/inject_into_file.rb           |  109 +
 .../ruby/2.0.0/gems/thor-0.18.1/lib/thor/base.rb   |  652 ++
 .../2.0.0/gems/thor-0.18.1/lib/thor/command.rb     |  136 +
 .../thor/core_ext/hash_with_indifferent_access.rb  |   80 +
 .../lib/thor/core_ext/io_binary_read.rb            |   12 +
 .../thor-0.18.1/lib/thor/core_ext/ordered_hash.rb  |  100 +
 .../ruby/2.0.0/gems/thor-0.18.1/lib/thor/error.rb  |   28 +
 .../ruby/2.0.0/gems/thor-0.18.1/lib/thor/group.rb  |  282 +
 .../2.0.0/gems/thor-0.18.1/lib/thor/invocation.rb  |  172 +
 .../ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser.rb |    4 +
 .../gems/thor-0.18.1/lib/thor/parser/argument.rb   |   74 +
 .../gems/thor-0.18.1/lib/thor/parser/arguments.rb  |  171 +
 .../gems/thor-0.18.1/lib/thor/parser/option.rb     |  121 +
 .../gems/thor-0.18.1/lib/thor/parser/options.rb    |  218 +
 .../2.0.0/gems/thor-0.18.1/lib/thor/rake_compat.rb |   72 +
 .../ruby/2.0.0/gems/thor-0.18.1/lib/thor/runner.rb |  322 +
 .../ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell.rb  |   88 +
 .../2.0.0/gems/thor-0.18.1/lib/thor/shell/basic.rb |  393 +
 .../2.0.0/gems/thor-0.18.1/lib/thor/shell/color.rb |  148 +
 .../2.0.0/gems/thor-0.18.1/lib/thor/shell/html.rb  |  127 +
 .../ruby/2.0.0/gems/thor-0.18.1/lib/thor/util.rb   |  270 +
 .../2.0.0/gems/thor-0.18.1/lib/thor/version.rb     |    3 +
 .../thor-0.18.1/spec/actions/create_file_spec.rb   |  170 +
 .../thor-0.18.1/spec/actions/create_link_spec.rb   |   95 +
 .../thor-0.18.1/spec/actions/directory_spec.rb     |  169 +
 .../spec/actions/empty_directory_spec.rb           |  129 +
 .../spec/actions/file_manipulation_spec.rb         |  382 +
 .../spec/actions/inject_into_file_spec.rb          |  135 +
 .../2.0.0/gems/thor-0.18.1/spec/actions_spec.rb    |  331 +
 .../ruby/2.0.0/gems/thor-0.18.1/spec/base_spec.rb  |  291 +
 .../2.0.0/gems/thor-0.18.1/spec/command_spec.rb    |   80 +
 .../core_ext/hash_with_indifferent_access_spec.rb  |   48 +
 .../thor-0.18.1/spec/core_ext/ordered_hash_spec.rb |  115 +
 .../gems/thor-0.18.1/spec/exit_condition_spec.rb   |   19 +
 .../gems/thor-0.18.1/spec/fixtures/application.rb  |    2 +
 .../gems/thor-0.18.1/spec/fixtures/app{1}/README   |    3 +
 .../thor-0.18.1/spec/fixtures/bundle/execute.rb    |    6 +
 .../thor-0.18.1/spec/fixtures/bundle/main.thor     |    1 +
 .../gems/thor-0.18.1/spec/fixtures/command.thor    |   10 +
 .../spec/fixtures/doc/%file_name%.rb.tt            |    1 +
 .../gems/thor-0.18.1/spec/fixtures/doc/COMMENTER   |   11 +
 .../gems/thor-0.18.1/spec/fixtures/doc/README      |    3 +
 .../thor-0.18.1/spec/fixtures/doc/block_helper.rb  |    3 +
 .../gems/thor-0.18.1/spec/fixtures/doc/config.rb   |    1 +
 .../thor-0.18.1/spec/fixtures/doc/config.yaml.tt   |    1 +
 .../spec/fixtures/doc/excluding/%file_name%.rb.tt  |    1 +
 .../2.0.0/gems/thor-0.18.1/spec/fixtures/enum.thor |   10 +
 .../gems/thor-0.18.1/spec/fixtures/group.thor      |  128 +
 .../gems/thor-0.18.1/spec/fixtures/invoke.thor     |  112 +
 .../thor-0.18.1/spec/fixtures/path with spaces     |    0
 .../thor-0.18.1/spec/fixtures/preserve/script.sh   |    3 +
 .../gems/thor-0.18.1/spec/fixtures/script.thor     |  220 +
 .../gems/thor-0.18.1/spec/fixtures/subcommand.thor |   17 +
 .../ruby/2.0.0/gems/thor-0.18.1/spec/group_spec.rb |  216 +
 .bundle/ruby/2.0.0/gems/thor-0.18.1/spec/helper.rb |   67 +
 .../2.0.0/gems/thor-0.18.1/spec/invocation_spec.rb |  100 +
 .../gems/thor-0.18.1/spec/parser/argument_spec.rb  |   53 +
 .../gems/thor-0.18.1/spec/parser/arguments_spec.rb |   66 +
 .../gems/thor-0.18.1/spec/parser/option_spec.rb    |  202 +
 .../gems/thor-0.18.1/spec/parser/options_spec.rb   |  400 +
 .../gems/thor-0.18.1/spec/rake_compat_spec.rb      |   72 +
 .../2.0.0/gems/thor-0.18.1/spec/register_spec.rb   |  197 +
 .../2.0.0/gems/thor-0.18.1/spec/runner_spec.rb     |  241 +
 .../gems/thor-0.18.1/spec/shell/basic_spec.rb      |  311 +
 .../gems/thor-0.18.1/spec/shell/color_spec.rb      |   95 +
 .../2.0.0/gems/thor-0.18.1/spec/shell/html_spec.rb |   32 +
 .../ruby/2.0.0/gems/thor-0.18.1/spec/shell_spec.rb |   47 +
 .../2.0.0/gems/thor-0.18.1/spec/subcommand_spec.rb |   30 +
 .../ruby/2.0.0/gems/thor-0.18.1/spec/thor_spec.rb  |  491 +
 .../ruby/2.0.0/gems/thor-0.18.1/spec/util_spec.rb  |  196 +
 .bundle/ruby/2.0.0/gems/thor-0.18.1/thor.gemspec   |   24 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/CHANGELOG.md    |   44 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/COPYING         |   18 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/Gemfile         |   32 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/HACKING         |   16 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/README.md       |  232 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/Rakefile        |  104 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/TEMPLATES.md    |  516 ++
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/bin/tilt        |  112 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt.rb     |  204 +
 .../2.0.0/gems/tilt-1.4.1/lib/tilt/asciidoc.rb     |   34 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/builder.rb |   40 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/coffee.rb  |   54 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/css.rb |   80 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/csv.rb |   71 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/erb.rb |  110 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/etanni.rb  |   27 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/haml.rb    |   64 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/liquid.rb  |   45 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/markaby.rb |   52 +
 .../2.0.0/gems/tilt-1.4.1/lib/tilt/markdown.rb     |  214 +
 .../2.0.0/gems/tilt-1.4.1/lib/tilt/nokogiri.rb     |   43 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/plain.rb   |   20 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/radius.rb  |   55 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/rdoc.rb    |   47 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/string.rb  |   21 +
 .../2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb     |  292 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/textile.rb |   30 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/wiki.rb    |   58 +
 .../ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/yajl.rb    |   94 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/test/contest.rb |   68 +
 .../2.0.0/gems/tilt-1.4.1/test/markaby/locals.mab  |    1 +
 .../2.0.0/gems/tilt-1.4.1/test/markaby/markaby.mab |    1 +
 .../test/markaby/markaby_other_static.mab          |    1 +
 .../gems/tilt-1.4.1/test/markaby/render_twice.mab  |    1 +
 .../2.0.0/gems/tilt-1.4.1/test/markaby/scope.mab   |    1 +
 .../gems/tilt-1.4.1/test/markaby/yielding.mab      |    2 +
 .../gems/tilt-1.4.1/test/tilt_asciidoctor_test.rb  |   44 +
 .../tilt-1.4.1/test/tilt_blueclothtemplate_test.rb |   45 +
 .../tilt-1.4.1/test/tilt_buildertemplate_test.rb   |   59 +
 .../2.0.0/gems/tilt-1.4.1/test/tilt_cache_test.rb  |   32 +
 .../test/tilt_coffeescripttemplate_test.rb         |  114 +
 .../gems/tilt-1.4.1/test/tilt_compilesite_test.rb  |   51 +
 .../tilt-1.4.1/test/tilt_creoletemplate_test.rb    |   28 +
 .../2.0.0/gems/tilt-1.4.1/test/tilt_csv_test.rb    |   69 +
 .../gems/tilt-1.4.1/test/tilt_erbtemplate_test.rb  |  239 +
 .../tilt-1.4.1/test/tilt_erubistemplate_test.rb    |  151 +
 .../tilt-1.4.1/test/tilt_etannitemplate_test.rb    |  173 +
 .../gems/tilt-1.4.1/test/tilt_fallback_test.rb     |  122 +
 .../gems/tilt-1.4.1/test/tilt_hamltemplate_test.rb |  144 +
 .../gems/tilt-1.4.1/test/tilt_kramdown_test.rb     |   42 +
 .../tilt-1.4.1/test/tilt_lesstemplate_test.less    |    1 +
 .../gems/tilt-1.4.1/test/tilt_lesstemplate_test.rb |   42 +
 .../tilt-1.4.1/test/tilt_liquidtemplate_test.rb    |   78 +
 .../gems/tilt-1.4.1/test/tilt_markaby_test.rb      |   88 +
 .../gems/tilt-1.4.1/test/tilt_markdown_test.rb     |  172 +
 .../tilt-1.4.1/test/tilt_marukutemplate_test.rb    |   48 +
 .../tilt-1.4.1/test/tilt_nokogiritemplate_test.rb  |   87 +
 .../tilt-1.4.1/test/tilt_radiustemplate_test.rb    |   75 +
 .../tilt-1.4.1/test/tilt_rdiscounttemplate_test.rb |   55 +
 .../gems/tilt-1.4.1/test/tilt_rdoctemplate_test.rb |   31 +
 .../tilt-1.4.1/test/tilt_redcarpettemplate_test.rb |   71 +
 .../tilt-1.4.1/test/tilt_redclothtemplate_test.rb  |   36 +
 .../gems/tilt-1.4.1/test/tilt_sasstemplate_test.rb |   41 +
 .../tilt-1.4.1/test/tilt_stringtemplate_test.rb    |  170 +
 .../gems/tilt-1.4.1/test/tilt_template_test.rb     |  323 +
 .../ruby/2.0.0/gems/tilt-1.4.1/test/tilt_test.rb   |   65 +
 .../tilt-1.4.1/test/tilt_wikiclothtemplate_test.rb |   32 +
 .../gems/tilt-1.4.1/test/tilt_yajltemplate_test.rb |  101 +
 .bundle/ruby/2.0.0/gems/tilt-1.4.1/tilt.gemspec    |  120 +
 .../2.0.0/specifications/fastimage-1.5.0.gemspec   |   20 +
 .../ruby/2.0.0/specifications/hike-1.2.3.gemspec   |   29 +
 .../2.0.0/specifications/hikidoc-0.0.6.gemspec     |   34 +
 .../2.0.0/specifications/multi_json-1.7.7.gemspec  |   30 +
 .../ruby/2.0.0/specifications/rack-1.5.2.gemspec   |   36 +
 .../2.0.0/specifications/rdtool-0.6.38.gemspec     |   34 +
 .../2.0.0/specifications/sprockets-2.10.0.gemspec  |   77 +
 .../ruby/2.0.0/specifications/thor-0.18.1.gemspec  |   31 +
 .../ruby/2.0.0/specifications/tilt-1.4.1.gemspec   |   98 +
 .gitignore                                         |    1 +
 .travis.yml                                        |   54 +-
 Capfile                                            |    2 -
 Gemfile                                            |   59 +-
 Gemfile.lock                                       |  137 +-
 README.md                                          |    4 +-
 Rakefile                                           |    8 +-
 bin/tdiary                                         |    7 +
 config.ru                                          |   62 +-
 doc/HOWTO-testing-tDiary.html                      |    2 +-
 doc/HOWTO-testing-tDiary.md                        |    2 +-
 doc/INSTALL-cgi.html                               |   96 +
 doc/INSTALL-cgi.md                                 |   83 +
 doc/INSTALL-paas.html                              |    2 +-
 doc/INSTALL-paas.md                                |    2 +-
 doc/INSTALL-rack.html                              |   96 +
 doc/INSTALL-rack.md                                |   97 +
 doc/INSTALL.html                                   |   80 +-
 doc/INSTALL.md                                     |   88 +-
 doc/README.en.html                                 |    2 +-
 doc/README.en.md                                   |    2 +-
 doc/README.html                                    |    2 +-
 doc/README.md                                      |    2 +-
 index.rb                                           |    6 +-
 js/comment_emoji_autocomplete.js                   |  139 +
 misc/gemfiles/ruby18.gemfile                       |   35 -
 misc/gemfiles/ruby18.gemfile.lock                  |  153 -
 misc/lib/bundler-1.3.5/.gitignore                  |   25 +
 misc/lib/bundler-1.3.5/.rspec                      |    2 +
 misc/lib/bundler-1.3.5/.travis.yml                 |   72 +
 misc/lib/bundler-1.3.5/CHANGELOG.md                | 1428 +++
 misc/lib/bundler-1.3.5/CONTRIBUTE.md               |   96 +
 misc/lib/bundler-1.3.5/CONTRIBUTING.md             |   13 +
 misc/lib/bundler-1.3.5/ISSUES.md                   |   83 +
 misc/lib/bundler-1.3.5/LICENSE.md                  |   23 +
 misc/lib/bundler-1.3.5/README.md                   |   35 +
 misc/lib/bundler-1.3.5/Rakefile                    |  236 +
 misc/lib/bundler-1.3.5/UPGRADING.md                |  103 +
 misc/lib/bundler-1.3.5/bin/bundle                  |   20 +
 misc/lib/bundler-1.3.5/bin/bundle_ruby             |   56 +
 misc/lib/bundler-1.3.5/bundler.gemspec             |   28 +
 misc/lib/bundler-1.3.5/lib/bundler.rb              |  391 +
 misc/lib/bundler-1.3.5/lib/bundler/capistrano.rb   |   11 +
 misc/lib/bundler-1.3.5/lib/bundler/cli.rb          |  878 ++
 misc/lib/bundler-1.3.5/lib/bundler/definition.rb   |  575 ++
 misc/lib/bundler-1.3.5/lib/bundler/dep_proxy.rb    |   43 +
 misc/lib/bundler-1.3.5/lib/bundler/dependency.rb   |  162 +
 misc/lib/bundler-1.3.5/lib/bundler/deployment.rb   |   59 +
 misc/lib/bundler-1.3.5/lib/bundler/deprecate.rb    |   15 +
 misc/lib/bundler-1.3.5/lib/bundler/dsl.rb          |  258 +
 .../lib/bundler/endpoint_specification.rb          |   78 +
 misc/lib/bundler-1.3.5/lib/bundler/env.rb          |   56 +
 misc/lib/bundler-1.3.5/lib/bundler/environment.rb  |   42 +
 misc/lib/bundler-1.3.5/lib/bundler/fetcher.rb      |  301 +
 .../bundler-1.3.5/lib/bundler/friendly_errors.rb   |   31 +
 misc/lib/bundler-1.3.5/lib/bundler/gem_helper.rb   |  170 +
 misc/lib/bundler-1.3.5/lib/bundler/gem_helpers.rb  |   23 +
 .../lib/bundler-1.3.5/lib/bundler/gem_installer.rb |    9 +
 .../lib/bundler/gem_path_manipulation.rb           |    8 +
 misc/lib/bundler-1.3.5/lib/bundler/gem_tasks.rb    |    2 +
 misc/lib/bundler-1.3.5/lib/bundler/graph.rb        |  166 +
 misc/lib/bundler-1.3.5/lib/bundler/index.rb        |  187 +
 misc/lib/bundler-1.3.5/lib/bundler/injector.rb     |   64 +
 misc/lib/bundler-1.3.5/lib/bundler/installer.rb    |  240 +
 .../lib/bundler/lazy_specification.rb              |   82 +
 .../bundler-1.3.5/lib/bundler/lockfile_parser.rb   |  144 +
 misc/lib/bundler-1.3.5/lib/bundler/man/bundle      |  116 +
 .../bundler-1.3.5/lib/bundler/man/bundle-config    |  139 +
 .../lib/bundler/man/bundle-config.txt              |  164 +
 misc/lib/bundler-1.3.5/lib/bundler/man/bundle-exec |  122 +
 .../bundler-1.3.5/lib/bundler/man/bundle-exec.txt  |  131 +
 .../bundler-1.3.5/lib/bundler/man/bundle-install   |  317 +
 .../lib/bundler/man/bundle-install.txt             |  377 +
 .../bundler-1.3.5/lib/bundler/man/bundle-package   |   49 +
 .../lib/bundler/man/bundle-package.txt             |   67 +
 .../bundler-1.3.5/lib/bundler/man/bundle-platform  |   61 +
 .../lib/bundler/man/bundle-platform.txt            |   57 +
 .../bundler-1.3.5/lib/bundler/man/bundle-update    |  202 +
 .../lib/bundler/man/bundle-update.txt              |  207 +
 misc/lib/bundler-1.3.5/lib/bundler/man/bundle.txt  |   98 +
 misc/lib/bundler-1.3.5/lib/bundler/man/gemfile.5   |  440 +
 .../bundler-1.3.5/lib/bundler/man/gemfile.5.txt    |  411 +
 .../bundler-1.3.5/lib/bundler/match_platform.rb    |   13 +
 misc/lib/bundler-1.3.5/lib/bundler/psyched_yaml.rb |   26 +
 .../lib/bundler/remote_specification.rb            |   57 +
 misc/lib/bundler-1.3.5/lib/bundler/resolver.rb     |  530 ++
 misc/lib/bundler-1.3.5/lib/bundler/ruby_dsl.rb     |   11 +
 misc/lib/bundler-1.3.5/lib/bundler/ruby_version.rb |  100 +
 misc/lib/bundler-1.3.5/lib/bundler/rubygems_ext.rb |  154 +
 .../lib/bundler/rubygems_integration.rb            |  510 ++
 misc/lib/bundler-1.3.5/lib/bundler/runtime.rb      |  299 +
 misc/lib/bundler-1.3.5/lib/bundler/settings.rb     |  153 +
 misc/lib/bundler-1.3.5/lib/bundler/setup.rb        |   23 +
 .../bundler-1.3.5/lib/bundler/shared_helpers.rb    |   71 +
 .../lib/bundler/similarity_detector.rb             |   63 +
 misc/lib/bundler-1.3.5/lib/bundler/source.rb       |    7 +
 misc/lib/bundler-1.3.5/lib/bundler/source/git.rb   |  279 +
 .../lib/bundler/source/git/git_proxy.rb            |  145 +
 misc/lib/bundler-1.3.5/lib/bundler/source/path.rb  |  211 +
 .../lib/bundler/source/path/installer.rb           |   34 +
 .../bundler-1.3.5/lib/bundler/source/rubygems.rb   |  256 +
 misc/lib/bundler-1.3.5/lib/bundler/spec_set.rb     |  139 +
 .../bundler-1.3.5/lib/bundler/ssl_certs/.document  |    1 +
 .../bundler/ssl_certs/AddTrustExternalCARoot.pem   |   90 +
 ...t_net-Secure-Server-Certification-Authority.pem |   90 +
 .../lib/bundler/ssl_certs/GeoTrust_Global_CA.pem   |   20 +
 ...lass3PublicPrimaryCertificationAuthority-G2.pem |   57 +
 .../bundler-1.3.5/lib/bundler/templates/Executable |   16 +
 .../lib/bundler/templates/Executable.standalone    |   12 +
 .../bundler-1.3.5/lib/bundler/templates/Gemfile    |    4 +
 .../lib/bundler/templates/newgem/.travis.yml.tt    |    3 +
 .../lib/bundler/templates/newgem/Gemfile.tt        |    4 +
 .../lib/bundler/templates/newgem/LICENSE.txt.tt    |   22 +
 .../lib/bundler/templates/newgem/README.md.tt      |   29 +
 .../lib/bundler/templates/newgem/Rakefile.tt       |   16 +
 .../lib/bundler/templates/newgem/bin/newgem.tt     |    3 +
 .../lib/bundler/templates/newgem/gitignore.tt      |   17 +
 .../lib/bundler/templates/newgem/lib/newgem.rb.tt  |    9 +
 .../templates/newgem/lib/newgem/version.rb.tt      |    7 +
 .../lib/bundler/templates/newgem/newgem.gemspec.tt |   26 +
 .../lib/bundler/templates/newgem/rspec.tt          |    2 +
 .../templates/newgem/spec/newgem_spec.rb.tt        |   11 +
 .../templates/newgem/spec/spec_helper.rb.tt        |    2 +
 .../templates/newgem/test/minitest_helper.rb.tt    |    4 +
 .../templates/newgem/test/test_newgem.rb.tt        |   11 +
 misc/lib/bundler-1.3.5/lib/bundler/ui.rb           |  140 +
 .../lib/bundler-1.3.5/lib/bundler/vendor/.document |    0
 .../lib/bundler/vendor/net/http/faster.rb          |   27 +
 .../lib/bundler/vendor/net/http/persistent.rb      | 1120 +++
 .../vendor/net/http/persistent/ssl_reuse.rb        |  129 +
 misc/lib/bundler-1.3.5/lib/bundler/vendor/thor.rb  |  450 +
 .../lib/bundler/vendor/thor/actions.rb             |  318 +
 .../lib/bundler/vendor/thor/actions/create_file.rb |  105 +
 .../lib/bundler/vendor/thor/actions/create_link.rb |   57 +
 .../lib/bundler/vendor/thor/actions/directory.rb   |   99 +
 .../bundler/vendor/thor/actions/empty_directory.rb |  153 +
 .../vendor/thor/actions/file_manipulation.rb       |  314 +
 .../vendor/thor/actions/inject_into_file.rb        |  109 +
 .../bundler-1.3.5/lib/bundler/vendor/thor/base.rb  |  650 ++
 .../lib/bundler/vendor/thor/core_ext/dir_escape.rb |    0
 .../vendor/thor/core_ext/file_binary_read.rb       |    9 +
 .../thor/core_ext/hash_with_indifferent_access.rb  |   80 +
 .../bundler/vendor/thor/core_ext/ordered_hash.rb   |  100 +
 .../bundler-1.3.5/lib/bundler/vendor/thor/error.rb |   35 +
 .../bundler-1.3.5/lib/bundler/vendor/thor/group.rb |  285 +
 .../lib/bundler/vendor/thor/invocation.rb          |  170 +
 .../lib/bundler/vendor/thor/parser.rb              |    4 +
 .../lib/bundler/vendor/thor/parser/argument.rb     |   74 +
 .../lib/bundler/vendor/thor/parser/arguments.rb    |  171 +
 .../lib/bundler/vendor/thor/parser/option.rb       |  121 +
 .../lib/bundler/vendor/thor/parser/options.rb      |  216 +
 .../lib/bundler/vendor/thor/rake_compat.rb         |   71 +
 .../lib/bundler/vendor/thor/runner.rb              |  321 +
 .../bundler-1.3.5/lib/bundler/vendor/thor/shell.rb |   88 +
 .../lib/bundler/vendor/thor/shell/basic.rb         |  389 +
 .../lib/bundler/vendor/thor/shell/color.rb         |  144 +
 .../lib/bundler/vendor/thor/shell/html.rb          |  123 +
 .../bundler-1.3.5/lib/bundler/vendor/thor/task.rb  |  132 +
 .../bundler-1.3.5/lib/bundler/vendor/thor/util.rb  |  266 +
 .../lib/bundler/vendor/thor/version.rb             |    3 +
 .../lib/bundler/vendored_persistent.rb             |   10 +
 .../lib/bundler-1.3.5/lib/bundler/vendored_thor.rb |    8 +
 misc/lib/bundler-1.3.5/lib/bundler/version.rb      |    6 +
 misc/lib/bundler-1.3.5/lib/bundler/vlad.rb         |   11 +
 misc/lib/bundler-1.3.5/man/bundle-config.ronn      |  134 +
 misc/lib/bundler-1.3.5/man/bundle-exec.ronn        |  111 +
 misc/lib/bundler-1.3.5/man/bundle-install.ronn     |  350 +
 misc/lib/bundler-1.3.5/man/bundle-package.ronn     |   59 +
 misc/lib/bundler-1.3.5/man/bundle-platform.ronn    |   42 +
 misc/lib/bundler-1.3.5/man/bundle-update.ronn      |  176 +
 misc/lib/bundler-1.3.5/man/bundle.ronn             |   92 +
 misc/lib/bundler-1.3.5/man/gemfile.5.ronn          |  331 +
 misc/lib/bundler-1.3.5/man/index.txt               |    7 +
 .../lib/bundler-1.3.5/spec/bundler/bundler_spec.rb |   75 +
 misc/lib/bundler-1.3.5/spec/bundler/cli_rspec.rb   |    9 +
 .../bundler-1.3.5/spec/bundler/definition_spec.rb  |   25 +
 misc/lib/bundler-1.3.5/spec/bundler/dsl_spec.rb    |   60 +
 .../bundler-1.3.5/spec/bundler/gem_helper_spec.rb  |  199 +
 .../spec/bundler/psyched_yaml_spec.rb              |    8 +
 misc/lib/bundler-1.3.5/spec/bundler/source_spec.rb |   25 +
 misc/lib/bundler-1.3.5/spec/cache/gems_spec.rb     |  239 +
 misc/lib/bundler-1.3.5/spec/cache/git_spec.rb      |  188 +
 misc/lib/bundler-1.3.5/spec/cache/path_spec.rb     |  121 +
 misc/lib/bundler-1.3.5/spec/cache/platform_spec.rb |   57 +
 misc/lib/bundler-1.3.5/spec/install/deploy_spec.rb |  225 +
 .../bundler-1.3.5/spec/install/gems/c_ext_spec.rb  |   48 +
 .../spec/install/gems/dependency_api_spec.rb       |  492 +
 .../bundler-1.3.5/spec/install/gems/env_spec.rb    |  107 +
 .../bundler-1.3.5/spec/install/gems/flex_spec.rb   |  314 +
 .../bundler-1.3.5/spec/install/gems/groups_spec.rb |  249 +
 .../bundler-1.3.5/spec/install/gems/packed_spec.rb |   84 +
 .../spec/install/gems/platform_spec.rb             |  208 +
 .../spec/install/gems/post_install_spec.rb         |   47 +
 .../spec/install/gems/resolving_spec.rb            |   91 +
 .../spec/install/gems/simple_case_spec.rb          |  817 ++
 .../spec/install/gems/standalone_spec.rb           |  260 +
 .../bundler-1.3.5/spec/install/gems/sudo_spec.rb   |  102 +
 .../bundler-1.3.5/spec/install/gems/win32_spec.rb  |   26 +
 .../lib/bundler-1.3.5/spec/install/gemspec_spec.rb |  170 +
 misc/lib/bundler-1.3.5/spec/install/git_spec.rb    |  858 ++
 .../lib/bundler-1.3.5/spec/install/invalid_spec.rb |   35 +
 misc/lib/bundler-1.3.5/spec/install/path_spec.rb   |  468 +
 .../spec/install/post_bundle_message_spec.rb       |  142 +
 .../spec/install/security_policy_spec.rb           |   78 +
 .../lib/bundler-1.3.5/spec/install/upgrade_spec.rb |   26 +
 misc/lib/bundler-1.3.5/spec/integration/inject.rb  |   78 +
 misc/lib/bundler-1.3.5/spec/lock/git_spec.rb       |   35 +
 misc/lib/bundler-1.3.5/spec/lock/lockfile_spec.rb  |  836 ++
 misc/lib/bundler-1.3.5/spec/other/binstubs_spec.rb |  169 +
 .../bundler-1.3.5/spec/other/bundle_ruby_spec.rb   |  112 +
 misc/lib/bundler-1.3.5/spec/other/check_spec.rb    |  278 +
 misc/lib/bundler-1.3.5/spec/other/clean_spec.rb    |  592 ++
 misc/lib/bundler-1.3.5/spec/other/config_spec.rb   |  181 +
 misc/lib/bundler-1.3.5/spec/other/console_spec.rb  |   54 +
 misc/lib/bundler-1.3.5/spec/other/exec_spec.rb     |  249 +
 misc/lib/bundler-1.3.5/spec/other/ext_spec.rb      |   37 +
 misc/lib/bundler-1.3.5/spec/other/help_spec.rb     |   39 +
 misc/lib/bundler-1.3.5/spec/other/init_spec.rb     |   40 +
 misc/lib/bundler-1.3.5/spec/other/licenses_spec.rb |   18 +
 misc/lib/bundler-1.3.5/spec/other/newgem_spec.rb   |  403 +
 misc/lib/bundler-1.3.5/spec/other/open_spec.rb     |   55 +
 misc/lib/bundler-1.3.5/spec/other/outdated_spec.rb |  118 +
 misc/lib/bundler-1.3.5/spec/other/platform_spec.rb | 1058 +++
 misc/lib/bundler-1.3.5/spec/other/show_spec.rb     |  102 +
 misc/lib/bundler-1.3.5/spec/quality_spec.rb        |   62 +
 .../spec/realworld/dependency_api_spec.rb          |   61 +
 .../bundler-1.3.5/spec/realworld/edgecases_spec.rb |  177 +
 misc/lib/bundler-1.3.5/spec/resolver/basic_spec.rb |   26 +
 .../bundler-1.3.5/spec/resolver/platform_spec.rb   |   82 +
 .../bundler-1.3.5/spec/runtime/executable_spec.rb  |  149 +
 misc/lib/bundler-1.3.5/spec/runtime/load_spec.rb   |  107 +
 .../bundler-1.3.5/spec/runtime/platform_spec.rb    |   90 +
 .../lib/bundler-1.3.5/spec/runtime/require_spec.rb |  323 +
 misc/lib/bundler-1.3.5/spec/runtime/setup_spec.rb  |  855 ++
 .../spec/runtime/with_clean_env_spec.rb            |   92 +
 misc/lib/bundler-1.3.5/spec/spec_helper.rb         |  107 +
 .../endopint_marshal_fail_basic_authentication.rb  |   13 +
 .../spec/support/artifice/endpoint.rb              |   71 +
 .../spec/support/artifice/endpoint_500.rb          |   37 +
 .../spec/support/artifice/endpoint_api_missing.rb  |   16 +
 .../artifice/endpoint_basic_authentication.rb      |   13 +
 .../support/artifice/endpoint_creds_diff_host.rb   |   38 +
 .../spec/support/artifice/endpoint_extra.rb        |   31 +
 .../support/artifice/endpoint_extra_missing.rb     |   15 +
 .../spec/support/artifice/endpoint_fallback.rb     |   17 +
 .../spec/support/artifice/endpoint_marshal_fail.rb |   11 +
 .../spec/support/artifice/endpoint_redirect.rb     |   15 +
 .../spec/support/artifice/endpoint_timeout.rb      |   13 +
 misc/lib/bundler-1.3.5/spec/support/builders.rb    |  674 ++
 .../spec/support/fakeweb/rack-1.0.0.marshal        |    2 +
 .../bundler-1.3.5/spec/support/fakeweb/windows.rb  |   23 +
 misc/lib/bundler-1.3.5/spec/support/helpers.rb     |  336 +
 misc/lib/bundler-1.3.5/spec/support/indexes.rb     |  134 +
 misc/lib/bundler-1.3.5/spec/support/matchers.rb    |   77 +
 misc/lib/bundler-1.3.5/spec/support/path.rb        |   77 +
 misc/lib/bundler-1.3.5/spec/support/platforms.rb   |   86 +
 misc/lib/bundler-1.3.5/spec/support/ruby_ext.rb    |   20 +
 .../lib/bundler-1.3.5/spec/support/rubygems_ext.rb |   39 +
 .../spec/support/rubygems_hax/platform.rb          |   22 +
 misc/lib/bundler-1.3.5/spec/support/sudo.rb        |   20 +
 misc/lib/bundler-1.3.5/spec/update/gems_spec.rb    |  153 +
 misc/lib/bundler-1.3.5/spec/update/git_spec.rb     |  213 +
 misc/lib/bundler-1.3.5/spec/update/source_spec.rb  |   51 +
 misc/migrate.rb                                    |    1 -
 misc/paas/cloudfoundry/Gemfile                     |    5 +-
 misc/paas/cloudfoundry/Gemfile.lock                |   13 +
 misc/paas/cloudfoundry/tdiary.conf                 |    6 +-
 misc/plugin/category.rb                            |    5 +-
 misc/plugin/comment_emoji_autocomplete.rb          |   27 +
 misc/plugin/image.rb                               |   23 +-
 misc/plugin/makerss.rb                             |   12 +-
 misc/plugin/xmlrpc/xmlrpc.rb                       |    1 -
 misc/style/gfm/gfm_style.rb                        |   23 +-
 misc/style/rd/rd_style.rb                          |    4 +-
 plugin/00default.rb                                |   14 +-
 plugin/50sp.rb                                     |    4 +
 spec/acceptance/save_conf_default_spec.rb          |   30 +-
 spec/acceptance/save_conf_plugin_spec.rb           |   20 +-
 spec/acceptance/view_comment_spec.rb               |   54 +-
 spec/acceptance_helper.rb                          |   10 +-
 spec/core/compatible_spec.rb                       |   70 +-
 spec/core/rack/assets/precompile_spec.rb           |   81 +-
 spec/core/rack/static_spec.rb                      |   27 +
 spec/core/style/gfm_style_spec.rb                  |   48 +
 spec/core/style/rd_style_spec.rb                   |   22 +
 spec/fixtures/tdiary.conf.gem                      |  212 +
 spec/javascripts/helpers/jasmine-jquery.js         |  659 ++
 spec/javascripts/jquery.js                         | 9472 ++++++++++++++++++++
 spec/javascripts/support/jasmine.yml               |   72 +-
 spec/plugin/plugin_helper.rb                       |    2 +-
 spec/rcov.opts                                     |    3 -
 spec/spec_helper.rb                                |   16 +-
 tdiary.gemspec                                     |   25 +
 tdiary.rb                                          |   23 +-
 tdiary/admin.rb                                    |    4 +-
 tdiary/application.rb                              |   78 +-
 tdiary/application/configuration.rb                |   36 +
 tdiary/application/extensions/omniauth.rb          |   23 +
 tdiary/base.rb                                     |    6 +-
 tdiary/cli.rb                                      |  184 +
 tdiary/compatible.rb                               |  110 +-
 tdiary/config.rb                                   |   50 +-
 tdiary/core_ext.rb                                 |   11 +-
 tdiary/deploy.rb                                   |   50 -
 tdiary/dispatcher.rb                               |   44 +-
 tdiary/environment.rb                              |    1 -
 tdiary/io/base.rb                                  |    9 +-
 tdiary/lang/ja.rb                                  |   27 +-
 tdiary/rack.rb                                     |   26 +
 tdiary/rack/static.rb                              |   29 +
 tdiary/referer_manager.rb                          |    4 +-
 tdiary/request.rb                                  |  268 +-
 tdiary/response.rb                                 |   19 +-
 tdiary/style/wiki_style.rb                         |    9 +-
 tdiary/tasks.rb                                    |    1 +
 tdiary/tasks/release.rake                          |   78 +-
 tdiary/tasks/rspec.rake                            |   18 +-
 tdiary/tasks/test.rake                             |    1 -
 tdiary/version.rb                                  |    3 +
 tdiary/view.rb                                     |    4 +-
 update.rb                                          |    6 +-
 {public/images => vendor}/.gitkeep                 |    0
 vendor/hikidoc-0.0.6/README                        |   86 -
 vendor/hikidoc-0.0.6/README.ja                     |   83 -
 vendor/hikidoc-0.0.6/Rakefile                      |   68 -
 vendor/hikidoc-0.0.6/test/run-test.rb              |   13 -
 vendor/imagesize-0.1.1/Manifest.txt                |   19 -
 vendor/imagesize-0.1.1/README.txt                  |   49 -
 vendor/imagesize-0.1.1/lib/image_size.rb           |  305 -
 vendor/imagesize-0.1.1/lib/image_size/version.rb   |    9 -
 vendor/imagesize-0.1.1/setup.rb                    | 1585 ----
 vendor/imagesize-0.1.1/test/2-4-7.png              |  Bin 11639 -> 0 bytes
 vendor/imagesize-0.1.1/test/4_1_2.gif              |  Bin 10794 -> 0 bytes
 vendor/imagesize-0.1.1/test/bmp.bmp                |  Bin 7654 -> 0 bytes
 vendor/imagesize-0.1.1/test/cursor.xbm             |    6 -
 vendor/imagesize-0.1.1/test/detect.swf             |  Bin 4544 -> 0 bytes
 vendor/imagesize-0.1.1/test/pbm.pbm                |  Bin 637 -> 0 bytes
 vendor/imagesize-0.1.1/test/pcx.pcx                |  Bin 3009 -> 0 bytes
 vendor/imagesize-0.1.1/test/pgm.pgm                |    5 -
 vendor/imagesize-0.1.1/test/test.xpm               |   38 -
 vendor/imagesize-0.1.1/test/test_helper.rb         |    2 -
 vendor/imagesize-0.1.1/test/test_image_size.rb     |   71 -
 vendor/imagesize-0.1.1/test/tiff.tiff              |  Bin 12564 -> 0 bytes
 vendor/imagesize-0.1.1/test/tokyo_tower.jpg        |  Bin 32458 -> 0 bytes
 vendor/imagesize-0.1.1/test/tower_e.gif.psd        |  Bin 5588 -> 0 bytes
 vendor/jasmine-jquery-1.4.2/jasmine-jquery.js      |  548 --
 vendor/jquery-1.8/jquery.js                        | 9227 -------------------
 vendor/json_pure-1.7.7/.gitignore                  |   12 -
 vendor/json_pure-1.7.7/.travis.yml                 |   19 -
 vendor/json_pure-1.7.7/CHANGES                     |  272 -
 vendor/json_pure-1.7.7/COPYING                     |   58 -
 vendor/json_pure-1.7.7/COPYING-json-jruby          |   57 -
 vendor/json_pure-1.7.7/GPL                         |  340 -
 vendor/json_pure-1.7.7/Gemfile                     |   11 -
 vendor/json_pure-1.7.7/README-json-jruby.markdown  |   33 -
 vendor/json_pure-1.7.7/README.rdoc                 |  358 -
 vendor/json_pure-1.7.7/Rakefile                    |  412 -
 vendor/json_pure-1.7.7/VERSION                     |    1 -
 vendor/json_pure-1.7.7/data/example.json           |    1 -
 vendor/json_pure-1.7.7/data/index.html             |   38 -
 vendor/json_pure-1.7.7/data/prototype.js           | 4184 ---------
 .../json_pure-1.7.7/ext/json/ext/fbuffer/fbuffer.h |  181 -
 .../json_pure-1.7.7/ext/json/ext/generator/depend  |    1 -
 .../ext/json/ext/generator/extconf.rb              |   14 -
 .../ext/json/ext/generator/generator.c             | 1427 ---
 .../ext/json/ext/generator/generator.h             |  148 -
 vendor/json_pure-1.7.7/ext/json/ext/parser/depend  |    1 -
 .../json_pure-1.7.7/ext/json/ext/parser/extconf.rb |   13 -
 .../json_pure-1.7.7/ext/json/ext/parser/parser.c   | 2204 -----
 .../json_pure-1.7.7/ext/json/ext/parser/parser.h   |   77 -
 .../json_pure-1.7.7/ext/json/ext/parser/parser.rl  |  927 --
 vendor/json_pure-1.7.7/install.rb                  |   23 -
 .../java/src/json/ext/ByteListTranscoder.java      |  167 -
 .../java/src/json/ext/Generator.java               |  444 -
 .../java/src/json/ext/GeneratorMethods.java        |  232 -
 .../java/src/json/ext/GeneratorService.java        |   43 -
 .../java/src/json/ext/GeneratorState.java          |  543 --
 .../java/src/json/ext/OptionsReader.java           |  113 -
 .../json_pure-1.7.7/java/src/json/ext/Parser.java  | 2644 ------
 vendor/json_pure-1.7.7/java/src/json/ext/Parser.rl |  968 --
 .../java/src/json/ext/ParserService.java           |   35 -
 .../java/src/json/ext/RuntimeInfo.java             |  121 -
 .../java/src/json/ext/StringDecoder.java           |  167 -
 .../java/src/json/ext/StringEncoder.java           |  106 -
 .../json_pure-1.7.7/java/src/json/ext/Utils.java   |   89 -
 vendor/json_pure-1.7.7/json-java.gemspec           |   23 -
 vendor/json_pure-1.7.7/json.gemspec                |   37 -
 vendor/json_pure-1.7.7/json_pure.gemspec           |   39 -
 vendor/json_pure-1.7.7/lib/json.rb                 |   62 -
 vendor/json_pure-1.7.7/lib/json/add/bigdecimal.rb  |   28 -
 vendor/json_pure-1.7.7/lib/json/add/complex.rb     |   22 -
 vendor/json_pure-1.7.7/lib/json/add/core.rb        |   11 -
 vendor/json_pure-1.7.7/lib/json/add/date.rb        |   34 -
 vendor/json_pure-1.7.7/lib/json/add/date_time.rb   |   50 -
 vendor/json_pure-1.7.7/lib/json/add/exception.rb   |   31 -
 vendor/json_pure-1.7.7/lib/json/add/ostruct.rb     |   31 -
 vendor/json_pure-1.7.7/lib/json/add/range.rb       |   29 -
 vendor/json_pure-1.7.7/lib/json/add/rational.rb    |   22 -
 vendor/json_pure-1.7.7/lib/json/add/regexp.rb      |   30 -
 vendor/json_pure-1.7.7/lib/json/add/struct.rb      |   30 -
 vendor/json_pure-1.7.7/lib/json/add/symbol.rb      |   25 -
 vendor/json_pure-1.7.7/lib/json/add/time.rb        |   38 -
 vendor/json_pure-1.7.7/lib/json/common.rb          |  487 -
 vendor/json_pure-1.7.7/lib/json/ext.rb             |   21 -
 vendor/json_pure-1.7.7/lib/json/generic_object.rb  |   61 -
 vendor/json_pure-1.7.7/lib/json/pure.rb            |   21 -
 vendor/json_pure-1.7.7/lib/json/pure/generator.rb  |  492 -
 vendor/json_pure-1.7.7/lib/json/pure/parser.rb     |  359 -
 vendor/json_pure-1.7.7/lib/json/version.rb         |    8 -
 vendor/json_pure-1.7.7/tests/fixtures/fail1.json   |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail10.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail11.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail12.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail13.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail14.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail18.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail19.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail2.json   |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail20.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail21.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail22.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail23.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail24.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail25.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail27.json  |    2 -
 vendor/json_pure-1.7.7/tests/fixtures/fail28.json  |    2 -
 vendor/json_pure-1.7.7/tests/fixtures/fail3.json   |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail4.json   |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail5.json   |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail6.json   |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail7.json   |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail8.json   |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/fail9.json   |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/pass1.json   |   56 -
 vendor/json_pure-1.7.7/tests/fixtures/pass15.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/pass16.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/pass17.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/pass2.json   |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/pass26.json  |    1 -
 vendor/json_pure-1.7.7/tests/fixtures/pass3.json   |    6 -
 vendor/json_pure-1.7.7/tests/setup_variant.rb      |   11 -
 vendor/json_pure-1.7.7/tests/test_json.rb          |  545 --
 vendor/json_pure-1.7.7/tests/test_json_addition.rb |  196 -
 vendor/json_pure-1.7.7/tests/test_json_encoding.rb |   65 -
 vendor/json_pure-1.7.7/tests/test_json_fixtures.rb |   35 -
 vendor/json_pure-1.7.7/tests/test_json_generate.rb |  300 -
 .../tests/test_json_generic_object.rb              |   60 -
 .../tests/test_json_string_matching.rb             |   39 -
 vendor/json_pure-1.7.7/tests/test_json_unicode.rb  |   72 -
 vendor/json_pure-1.7.7/tools/fuzz.rb               |  139 -
 vendor/json_pure-1.7.7/tools/server.rb             |   62 -
 1584 files changed, 137391 insertions(+), 33386 deletions(-)

diff --git a/.bundle/config b/.bundle/config
new file mode 100644
index 0000000..80038e7
--- /dev/null
+++ b/.bundle/config
@@ -0,0 +1,4 @@
+---
+BUNDLE_PATH: .bundle
+BUNDLE_WITHOUT: coffee:memcached:redis:gfm:server:development:test
+BUNDLE_DISABLE_SHARED_GEMS: '1'
diff --git a/.bundle/ruby/1.9.1/bin/hikidoc b/.bundle/ruby/1.9.1/bin/hikidoc
new file mode 100755
index 0000000..bca09c9
--- /dev/null
+++ b/.bundle/ruby/1.9.1/bin/hikidoc
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'hikidoc' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'hikidoc', version
+load Gem.bin_path('hikidoc', 'hikidoc', version)
diff --git a/.bundle/ruby/1.9.1/bin/rackup b/.bundle/ruby/1.9.1/bin/rackup
new file mode 100755
index 0000000..9e6b53a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/bin/rackup
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'rack' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'rack', version
+load Gem.bin_path('rack', 'rackup', version)
diff --git a/.bundle/ruby/1.9.1/bin/rd2 b/.bundle/ruby/1.9.1/bin/rd2
new file mode 100755
index 0000000..7261eaf
--- /dev/null
+++ b/.bundle/ruby/1.9.1/bin/rd2
@@ -0,0 +1,25 @@
+#!/bin/sh
+'exec' "ruby" '-x' "$0" "$@"
+#!/Users/machu/.rbenv/versions/1.9.3-p362/bin/ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'rdtool' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'rdtool', version
+load Gem.bin_path('rdtool', 'rd2', version)
diff --git a/.bundle/ruby/1.9.1/bin/rdswap.rb b/.bundle/ruby/1.9.1/bin/rdswap.rb
new file mode 100755
index 0000000..097d928
--- /dev/null
+++ b/.bundle/ruby/1.9.1/bin/rdswap.rb
@@ -0,0 +1,25 @@
+#!/bin/sh
+'exec' "ruby" '-x' "$0" "$@"
+#!/Users/machu/.rbenv/versions/1.9.3-p362/bin/ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'rdtool' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'rdtool', version
+load Gem.bin_path('rdtool', 'rdswap.rb', version)
diff --git a/.bundle/ruby/1.9.1/bin/sprockets b/.bundle/ruby/1.9.1/bin/sprockets
new file mode 100755
index 0000000..046b12e
--- /dev/null
+++ b/.bundle/ruby/1.9.1/bin/sprockets
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'sprockets' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'sprockets', version
+load Gem.bin_path('sprockets', 'sprockets', version)
diff --git a/.bundle/ruby/1.9.1/bin/tdiary b/.bundle/ruby/1.9.1/bin/tdiary
new file mode 100755
index 0000000..86aa008
--- /dev/null
+++ b/.bundle/ruby/1.9.1/bin/tdiary
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'tdiary' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'tdiary', version
+load Gem.bin_path('tdiary', 'tdiary', version)
diff --git a/.bundle/ruby/1.9.1/bin/thor b/.bundle/ruby/1.9.1/bin/thor
new file mode 100755
index 0000000..d3446b1
--- /dev/null
+++ b/.bundle/ruby/1.9.1/bin/thor
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'thor' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'thor', version
+load Gem.bin_path('thor', 'thor', version)
diff --git a/.bundle/ruby/1.9.1/bin/tilt b/.bundle/ruby/1.9.1/bin/tilt
new file mode 100755
index 0000000..c1db0bc
--- /dev/null
+++ b/.bundle/ruby/1.9.1/bin/tilt
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'tilt' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'tilt', version
+load Gem.bin_path('tilt', 'tilt', version)
diff --git a/.bundle/ruby/1.9.1/cache/fastimage-1.5.0.gem b/.bundle/ruby/1.9.1/cache/fastimage-1.5.0.gem
new file mode 100644
index 0000000..5dbf441
Binary files /dev/null and b/.bundle/ruby/1.9.1/cache/fastimage-1.5.0.gem differ
diff --git a/.bundle/ruby/1.9.1/cache/hike-1.2.3.gem b/.bundle/ruby/1.9.1/cache/hike-1.2.3.gem
new file mode 100644
index 0000000..3dd8fe7
Binary files /dev/null and b/.bundle/ruby/1.9.1/cache/hike-1.2.3.gem differ
diff --git a/.bundle/ruby/1.9.1/cache/hikidoc-0.0.6.gem b/.bundle/ruby/1.9.1/cache/hikidoc-0.0.6.gem
new file mode 100644
index 0000000..d9723c1
Binary files /dev/null and b/.bundle/ruby/1.9.1/cache/hikidoc-0.0.6.gem differ
diff --git a/.bundle/ruby/1.9.1/cache/multi_json-1.7.7.gem b/.bundle/ruby/1.9.1/cache/multi_json-1.7.7.gem
new file mode 100644
index 0000000..ca25c16
Binary files /dev/null and b/.bundle/ruby/1.9.1/cache/multi_json-1.7.7.gem differ
diff --git a/.bundle/ruby/1.9.1/cache/rack-1.5.2.gem b/.bundle/ruby/1.9.1/cache/rack-1.5.2.gem
new file mode 100644
index 0000000..e1f7bfd
Binary files /dev/null and b/.bundle/ruby/1.9.1/cache/rack-1.5.2.gem differ
diff --git a/.bundle/ruby/1.9.1/cache/rdtool-0.6.38.gem b/.bundle/ruby/1.9.1/cache/rdtool-0.6.38.gem
new file mode 100644
index 0000000..f2da176
Binary files /dev/null and b/.bundle/ruby/1.9.1/cache/rdtool-0.6.38.gem differ
diff --git a/.bundle/ruby/1.9.1/cache/sprockets-2.10.0.gem b/.bundle/ruby/1.9.1/cache/sprockets-2.10.0.gem
new file mode 100644
index 0000000..c15b00c
Binary files /dev/null and b/.bundle/ruby/1.9.1/cache/sprockets-2.10.0.gem differ
diff --git a/.bundle/ruby/1.9.1/cache/thor-0.18.1.gem b/.bundle/ruby/1.9.1/cache/thor-0.18.1.gem
new file mode 100644
index 0000000..9fd0308
Binary files /dev/null and b/.bundle/ruby/1.9.1/cache/thor-0.18.1.gem differ
diff --git a/.bundle/ruby/1.9.1/cache/tilt-1.4.1.gem b/.bundle/ruby/1.9.1/cache/tilt-1.4.1.gem
new file mode 100644
index 0000000..3ad79a9
Binary files /dev/null and b/.bundle/ruby/1.9.1/cache/tilt-1.4.1.gem differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/MIT-LICENSE b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/MIT-LICENSE
new file mode 100644
index 0000000..24a670f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/MIT-LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2008-2013 Stephen Sykes
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/README.textile b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/README.textile
new file mode 100644
index 0000000..3cc072f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/README.textile
@@ -0,0 +1,119 @@
+h1. FastImage
+
+h4. FastImage finds the size or type of an image given its uri by fetching as little as needed
+
+h2. The problem
+
+Your app needs to find the size or type of an image.  This could be for adding width and height attributes to an image tag, for adjusting layouts or overlays to fit an image or any other of dozens of reasons.
+
+But the image is not locally stored - it's on another asset server, or in the cloud - at Amazon S3 for example.
+
+You don't want to download the entire image to your app server - it could be many tens of kilobytes, or even megabytes just to get this information.  For most common image types (GIF, PNG, BMP), the size of the image is simply stored at the start of the file.  For JPEG files it's a little bit more complex, but even so you do not need to fetch much of the image to find the size.
+
+FastImage does this minimal fetch for image types GIF, JPEG, PNG, TIFF and BMP.  And it doesn't rely on installing external libraries such as RMagick (which relies on ImageMagick or GraphicsMagick) or ImageScience (which relies on FreeImage).
+
+You only need supply the uri, and FastImage will do the rest.
+
+h2. Features
+
+Fastimage can also read local (and other) files, and uses the open-uri library to do so.
+
+FastImage will automatically read from any object that responds to :read - for
+instance an IO object if that is passed instead of a URI.
+
+FastImage will follow up to 4 HTTP redirects to get the image.
+
+FastImage will obey the http_proxy setting in your environment to route requests via a proxy.
+
+You can add a timeout to the request which will limit the request time by passing :timeout => number_of_seconds.
+
+FastImage normally replies will nil if it encounters an error, but you can pass :raise_on_failure => true to get an exception.
+
+h2. Examples
+
+<pre lang="ruby"><code>
+require 'fastimage'
+
+FastImage.size("http://stephensykes.com/images/ss.com_x.gif")
+=> [266, 56]  # width, height
+FastImage.type("http://stephensykes.com/images/pngimage")
+=> :png
+FastImage.type("/some/local/file.gif")
+=> :gif
+FastImage.size("http://upload.wikimedia.org/wikipedia/commons/b/b4/Mardin_1350660_1350692_33_images.jpg", :raise_on_failure=>true, :timeout=>0.1)
+=> FastImage::ImageFetchFailure: FastImage::ImageFetchFailure
+FastImage.size("http://upload.wikimedia.org/wikipedia/commons/b/b4/Mardin_1350660_1350692_33_images.jpg", :raise_on_failure=>true, :timeout=>2.0)
+=> [9545, 6623]
+</code></pre>
+
+h2. Installation
+
+h4. Gem
+
+bc. gem install fastimage
+
+h4. Rails
+
+Install the gem as above, and add it to your Gemfile.
+
+Then you're off - just use @FastImage.size()@ and @FastImage.type()@ in your code as in the examples.
+
+h2. Documentation
+
+"http://sdsykes.github.io/fastimage/rdoc/FastImage.html":http://sdsykes.github.io/fastimage/rdoc/FastImage.html
+
+h2. Benchmark
+
+It's way faster than conventional methods (for example the image_size gem) for most types of file when fetching over the wire.
+
+<pre lang="ruby"><code>
+irb> uri = "http://upload.wikimedia.org/wikipedia/commons/b/b4/Mardin_1350660_1350692_33_images.jpg"
+irb> puts Benchmark.measure {open(uri, 'rb') {|fh| p ImageSize.new(fh).size}}
+[9545, 6623]
+  0.680000   0.250000   0.930000 (  7.571887)
+  
+irb> puts Benchmark.measure {p FastImage.size(uri)}
+[9545, 6623]
+  0.010000   0.000000   0.010000 (  0.090640)
+</code></pre>
+
+The file is fetched in about 7.5 seconds in this test (the number in brackets is the total time taken), but as FastImage doesn't need to fetch the whole thing, it completes in less than 0.1s.
+
+You'll see similar excellent results for the other file types, except for TIFF. Unfortunately TIFFs tend to have their
+metadata towards the end of the file, so it makes little difference to do a minimal fetch. The result shown below is
+mostly dependent on the exact internet conditions during the test, and little to do with the library used.
+
+<pre lang="ruby"><code>
+irb> uri = "http://upload.wikimedia.org/wikipedia/commons/1/11/Shinbutsureijoushuincho.tiff"
+irb> puts Benchmark.measure {open(uri, 'rb') {|fh| p ImageSize.new(fh).size}}
+[1120, 1559]
+  1.080000   0.370000   1.450000 ( 13.766962)
+  
+irb> puts Benchmark.measure {p FastImage.size(uri)}
+[1120, 1559]
+  3.490000   3.810000   7.300000 ( 11.754315)
+</code></pre>
+
+h2. Tests
+
+You'll need to @gem install fakeweb@ to be able to run the tests.
+
+bc.. $ ruby test.rb 
+Run options: 
+
+# Running tests:
+
+Finished tests in 1.033640s, 23.2189 tests/s, 82.2337 assertions/s.             
+24 tests, 85 assertions, 0 failures, 0 errors, 0 skips
+
+h2. References
+
+* "Pennysmalls - Find jpeg dimensions fast in pure Ruby, no image library needed":http://pennysmalls.wordpress.com/2008/08/19/find-jpeg-dimensions-fast-in-pure-ruby-no-ima/
+* "DZone - Determine Image Size":http://snippets.dzone.com/posts/show/805
+* "Antti Kupila - Getting JPG dimensions with AS3 without loading the entire file":http://www.anttikupila.com/flash/getting-jpg-dimensions-with-as3-without-loading-the-entire-file/
+* "imagesize gem documentation":http://imagesize.rubyforge.org/
+* "EXIF Reader":https://github.com/remvee/exifr
+
+h2. Licence
+
+MIT, see file "MIT-LICENSE":MIT-LICENSE
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/lib/fastimage.rb b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/lib/fastimage.rb
new file mode 100644
index 0000000..2c0838c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/lib/fastimage.rb
@@ -0,0 +1,478 @@
+# coding: ASCII-8BIT
+
+# FastImage finds the size or type of an image given its uri.
+# It is careful to only fetch and parse as much of the image as is needed to determine the result.
+# It does this by using a feature of Net::HTTP that yields strings from the resource being fetched
+# as soon as the packets arrive.
+#
+# No external libraries such as ImageMagick are used here, this is a very lightweight solution to 
+# finding image information.
+#
+# FastImage knows about GIF, JPEG, BMP, TIFF and PNG files.
+#
+# FastImage can also read files from the local filesystem by supplying the path instead of a uri.
+# In this case FastImage uses the open-uri library to read the file in chunks of 256 bytes until
+# it has enough. This is possibly a useful bandwidth-saving feature if the file is on a network
+# attached disk rather than truly local.
+#
+# New in v1.2.9, FastImage will automatically read from any object that responds to :read - for 
+# instance an IO object if that is passed instead of a URI.
+#
+# New in v1.2.10 FastImage will follow up to 4 HTTP redirects to get the image.
+#
+# === Examples
+#   require 'fastimage'
+#
+#   FastImage.size("http://stephensykes.com/images/ss.com_x.gif")
+#   => [266, 56]
+#   FastImage.type("http://stephensykes.com/images/pngimage")
+#   => :png
+#   FastImage.type("/some/local/file.gif")
+#   => :gif
+#   File.open("/some/local/file.gif", "r") {|io| FastImage.type(io)}
+#   => :gif
+#
+# === References
+# * http://snippets.dzone.com/posts/show/805
+# * http://www.anttikupila.com/flash/getting-jpg-dimensions-with-as3-without-loading-the-entire-file/
+# * http://pennysmalls.wordpress.com/2008/08/19/find-jpeg-dimensions-fast-in-pure-ruby-no-ima/
+# * http://imagesize.rubyforge.org/
+# * https://github.com/remvee/exifr
+#
+
+require 'net/https'
+require 'open-uri'
+require 'fastimage/fbr.rb'
+
+class FastImage
+  attr_reader :size, :type
+  
+  attr_reader :bytes_read
+
+  class FastImageException < StandardError # :nodoc:
+  end
+  class MoreCharsNeeded < FastImageException # :nodoc:
+  end
+  class UnknownImageType < FastImageException # :nodoc:
+  end
+  class ImageFetchFailure < FastImageException # :nodoc:
+  end
+  class SizeNotFound < FastImageException # :nodoc:
+  end
+  class CannotParseImage < FastImageException # :nodoc:
+  end
+
+  DefaultTimeout = 2
+  
+  LocalFileChunkSize = 256
+
+  # Returns an array containing the width and height of the image.
+  # It will return nil if the image could not be fetched, or if the image type was not recognised.
+  #
+  # By default there is a timeout of 2 seconds for opening and reading from a remote server.
+  # This can be changed by passing a :timeout => number_of_seconds in the options.
+  #
+  # If you wish FastImage to raise if it cannot size the image for any reason, then pass
+  # :raise_on_failure => true in the options.
+  #
+  # FastImage knows about GIF, JPEG, BMP, TIFF and PNG files.
+  #
+  # === Example
+  #
+  #   require 'fastimage'
+  #
+  #   FastImage.size("http://stephensykes.com/images/ss.com_x.gif")
+  #   => [266, 56]
+  #   FastImage.size("http://stephensykes.com/images/pngimage")
+  #   => [16, 16]
+  #   FastImage.size("http://farm4.static.flickr.com/3023/3047236863_9dce98b836.jpg")
+  #   => [500, 375]
+  #   FastImage.size("http://www-ece.rice.edu/~wakin/images/lena512.bmp")
+  #   => [512, 512]
+  #   FastImage.size("test/fixtures/test.jpg")
+  #   => [882, 470]
+  #   FastImage.size("http://pennysmalls.com/does_not_exist")
+  #   => nil
+  #   FastImage.size("http://pennysmalls.com/does_not_exist", :raise_on_failure=>true)
+  #   => raises FastImage::ImageFetchFailure
+  #   FastImage.size("http://stephensykes.com/favicon.ico", :raise_on_failure=>true)
+  #   => raises FastImage::UnknownImageType
+  #   FastImage.size("http://stephensykes.com/favicon.ico", :raise_on_failure=>true, :timeout=>0.01)
+  #   => raises FastImage::ImageFetchFailure
+  #   FastImage.size("http://stephensykes.com/images/faulty.jpg", :raise_on_failure=>true)
+  #   => raises FastImage::SizeNotFound
+  #
+  # === Supported options
+  # [:timeout]
+  #   Overrides the default timeout of 2 seconds.  Applies both to reading from and opening the http connection.
+  # [:raise_on_failure]
+  #   If set to true causes an exception to be raised if the image size cannot be found for any reason.
+  #
+  def self.size(uri, options={})
+    new(uri, options).size
+  end
+
+  # Returns an symbol indicating the image type fetched from a uri.
+  # It will return nil if the image could not be fetched, or if the image type was not recognised.
+  #
+  # By default there is a timeout of 2 seconds for opening and reading from a remote server.
+  # This can be changed by passing a :timeout => number_of_seconds in the options.
+  #
+  # If you wish FastImage to raise if it cannot find the type of the image for any reason, then pass
+  # :raise_on_failure => true in the options.
+  #
+  # === Example
+  #
+  #   require 'fastimage'
+  #
+  #   FastImage.type("http://stephensykes.com/images/ss.com_x.gif")
+  #   => :gif
+  #   FastImage.type("http://stephensykes.com/images/pngimage")
+  #   => :png
+  #   FastImage.type("http://farm4.static.flickr.com/3023/3047236863_9dce98b836.jpg")
+  #   => :jpeg
+  #   FastImage.type("http://www-ece.rice.edu/~wakin/images/lena512.bmp")
+  #   => :bmp
+  #   FastImage.type("test/fixtures/test.jpg")
+  #   => :jpeg
+  #   FastImage.type("http://pennysmalls.com/does_not_exist")
+  #   => nil
+  #   File.open("/some/local/file.gif", "r") {|io| FastImage.type(io)}
+  #   => :gif
+  #   FastImage.type("test/fixtures/test.tiff")
+  #   => :tiff
+  #
+  # === Supported options
+  # [:timeout]
+  #   Overrides the default timeout of 2 seconds.  Applies both to reading from and opening the http connection.
+  # [:raise_on_failure]
+  #   If set to true causes an exception to be raised if the image type cannot be found for any reason.
+  #
+  def self.type(uri, options={})
+    new(uri, options.merge(:type_only=>true)).type
+  end
+
+  def initialize(uri, options={})
+    @property = options[:type_only] ? :type : :size
+    @timeout = options[:timeout] || DefaultTimeout
+    @uri = uri
+
+    if uri.respond_to?(:read)
+      fetch_using_read(uri)
+    else
+      begin
+        @parsed_uri = URI.parse(uri)
+      rescue URI::InvalidURIError
+        fetch_using_open_uri
+      else
+        if @parsed_uri.scheme == "http" || @parsed_uri.scheme == "https"
+          fetch_using_http
+        else
+          fetch_using_open_uri
+        end
+      end
+    end
+    
+    uri.rewind if uri.respond_to?(:rewind)
+    
+    raise SizeNotFound if options[:raise_on_failure] && @property == :size && !@size
+  
+  rescue Timeout::Error, SocketError, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ECONNRESET, 
+    ImageFetchFailure, Net::HTTPBadResponse, EOFError, Errno::ENOENT
+    raise ImageFetchFailure if options[:raise_on_failure]
+  rescue NoMethodError  # 1.8.7p248 can raise this due to a net/http bug
+    raise ImageFetchFailure if options[:raise_on_failure]
+  rescue UnknownImageType
+    raise UnknownImageType if options[:raise_on_failure]
+  rescue CannotParseImage
+    if options[:raise_on_failure]
+      if @property == :size
+        raise SizeNotFound
+      else
+        raise ImageFetchFailure
+      end
+    end
+    
+  end
+
+  private
+
+  def fetch_using_http
+    @redirect_count = 0
+
+    fetch_using_http_from_parsed_uri
+  end
+  
+  def fetch_using_http_from_parsed_uri
+    setup_http
+    @http.request_get(@parsed_uri.request_uri, 'Accept-Encoding' => 'identity') do |res|
+      if res.is_a?(Net::HTTPRedirection) && @redirect_count < 4
+        @redirect_count += 1
+        begin
+          @parsed_uri = URI.parse(res['Location'])
+        rescue URI::InvalidURIError
+        else
+          fetch_using_http_from_parsed_uri
+          break
+        end
+      end
+
+      raise ImageFetchFailure unless res.is_a?(Net::HTTPSuccess)
+
+      @read_fiber = Fiber.new do
+        res.read_body do |str|
+          Fiber.yield str
+        end
+      end
+      
+      parse_packets
+      
+      break  # needed to actively quit out of the fetch
+    end
+  end
+
+  def proxy_uri
+    begin
+      proxy = ENV['http_proxy'] && ENV['http_proxy'] != "" ? URI.parse(ENV['http_proxy']) : nil
+    rescue URI::InvalidURIError
+      proxy = nil
+    end
+    proxy
+  end
+
+  def setup_http
+    proxy = proxy_uri
+
+    if proxy
+      @http = Net::HTTP::Proxy(proxy.host, proxy.port).new(@parsed_uri.host, @parsed_uri.port)
+    else
+      @http = Net::HTTP.new(@parsed_uri.host, @parsed_uri.port)
+    end
+    
+    @http.use_ssl = (@parsed_uri.scheme == "https")
+    @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
+    @http.open_timeout = @timeout
+    @http.read_timeout = @timeout
+  end
+
+  def fetch_using_read(readable)
+    @read_fiber = Fiber.new do
+      while str = readable.read(LocalFileChunkSize)
+        Fiber.yield str
+      end
+    end
+    
+    parse_packets
+  end
+
+  def fetch_using_open_uri
+    open(@uri) do |s|
+      fetch_using_read(s)
+    end
+  end
+
+  def parse_packets
+    @str = ""
+    @str.force_encoding("ASCII-8BIT") if has_encoding?
+    @strpos = 0
+    @bytes_read = 0
+    @bytes_delivered = 0
+    
+    begin
+      result = send("parse_#{@property}")
+      if result 
+        instance_variable_set("@#{@property}", result)
+      else
+        raise CannotParseImage
+      end
+    rescue FiberError
+      raise CannotParseImage
+    end
+  end
+
+  def parse_size
+    @type = parse_type unless @type
+    @strpos = 0
+    @bytes_delivered = 0
+    send("parse_size_for_#{@type}")
+  end
+
+  def has_encoding?
+    if @has_encoding.nil?
+      @has_encoding = String.new.respond_to? :force_encoding
+    else
+      @has_encoding
+    end
+  end
+
+  def get_chars(n)
+    while @strpos + n - 1 >= @str.size
+      unused_str = @str[@strpos..-1]
+      new_string = @read_fiber.resume
+      raise CannotParseImage if !new_string
+
+      # we are dealing with bytes here, so force the encoding
+      if has_encoding?
+        new_string.force_encoding("ASCII-8BIT")
+      end
+
+      @bytes_read += new_string.size
+      
+      @str = unused_str + new_string
+      @strpos = 0
+    end
+    
+    result = @str[@strpos..(@strpos + n - 1)]
+    @strpos += n
+    @bytes_delivered += n
+    result
+  end
+
+  def get_byte
+    get_chars(1).unpack("C")[0]
+  end
+
+  def read_int(str)
+    size_bytes = str.unpack("CC")
+    (size_bytes[0] << 8) + size_bytes[1]
+  end
+
+  def parse_type
+    case get_chars(2)
+    when "BM"
+      :bmp
+    when "GI"
+      :gif
+    when 0xff.chr + 0xd8.chr
+      :jpeg
+    when 0x89.chr + "P"
+      :png
+    when "II"
+      :tiff
+    when "MM"
+      :tiff
+    else
+      raise UnknownImageType
+    end
+  end
+
+  def parse_size_for_gif
+    get_chars(11)[6..10].unpack('SS')
+  end
+
+  def parse_size_for_png
+    get_chars(25)[16..24].unpack('NN')
+  end
+
+  def parse_size_for_jpeg
+    loop do
+      @state = case @state
+      when nil
+        get_chars(2)
+        :started
+      when :started
+        get_byte == 0xFF ? :sof : :started
+      when :sof
+        case get_byte
+        when 0xe1 # APP1
+          skip_chars = read_int(get_chars(2)) - 2
+          skip_from = @bytes_delivered
+          if get_chars(4) == "Exif"
+            get_chars(2)
+            parse_exif
+          end
+          get_chars(skip_chars - (@bytes_delivered - skip_from))
+          :started
+        when 0xe0..0xef
+          :skipframe
+        when 0xC0..0xC3, 0xC5..0xC7, 0xC9..0xCB, 0xCD..0xCF
+          :readsize
+        when 0xFF
+          :sof
+        else
+          :skipframe
+        end
+      when :skipframe
+        skip_chars = read_int(get_chars(2)) - 2
+        get_chars(skip_chars)
+        :started
+      when :readsize
+        s = get_chars(7)
+        if @exif_orientation && @exif_orientation >= 5
+          return [read_int(s[3..4]), read_int(s[5..6])]
+        else
+          return [read_int(s[5..6]), read_int(s[3..4])]
+        end          
+      end
+    end
+  end
+
+  def parse_size_for_bmp
+    d = get_chars(29)[14..28]
+    d.unpack("C")[0] == 40 ? d[4..-1].unpack('LL') : d[4..8].unpack('SS')
+  end
+
+  def get_exif_byte_order
+    byte_order = get_chars(2)
+    case byte_order
+    when 'II'
+      @short, @long = 'v', 'V'
+    when 'MM'
+      @short, @long = 'n', 'N'
+    else
+      raise CannotParseImage
+    end
+  end
+
+  def parse_exif_ifd
+    tag_count = get_chars(2).unpack(@short)[0]
+    tag_count.downto(1) do
+      type = get_chars(2).unpack(@short)[0]
+      get_chars(6)
+      data = get_chars(2).unpack(@short)[0]
+      case type
+      when 0x0100 # image width
+        @exif_width = data
+      when 0x0101 # image height
+        @exif_height = data
+      when 0x0112 # orientation
+        @exif_orientation = data
+      end
+      if @type == :tiff && @exif_width && @exif_height && @exif_orientation
+        return # no need to parse more
+      end
+      get_chars(2)
+    end
+
+    next_offset = get_chars(4).unpack(@long)[0]
+    if next_offset > 0
+      get_chars(next_offset - (@bytes_delivered - @exif_start_byte))
+      parse_exif_ifd
+    end
+  end
+
+  def parse_exif
+    @exif_start_byte = @bytes_delivered
+    
+    get_exif_byte_order
+    
+    get_chars(2) # 42
+
+    offset = get_chars(4).unpack(@long)[0]
+    get_chars(offset - 8)
+
+    parse_exif_ifd
+  end
+
+  def parse_size_for_tiff
+    parse_exif
+
+    if @exif_orientation && @exif_orientation >= 5
+      return [@exif_height, @exif_width]
+    else
+      return [@exif_width, @exif_height]
+    end
+
+    raise CannotParseImage
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/lib/fastimage/fbr.rb b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/lib/fastimage/fbr.rb
new file mode 100644
index 0000000..cbb0efc
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/lib/fastimage/fbr.rb
@@ -0,0 +1,67 @@
+# Poor Man's Fiber (API compatible Thread based Fiber implementation for Ruby 1.8)
+# (c) 2008 Aman Gupta (tmm1)
+
+unless defined? Fiber
+  require 'thread'
+
+  class FiberError < StandardError; # :nodoc:
+  end
+
+  class Fiber # :nodoc:
+    def initialize
+      raise ArgumentError, 'new Fiber requires a block' unless block_given?
+
+      @yield = Queue.new
+      @resume = Queue.new
+
+      @thread = Thread.new{ @yield.push [yield(*@resume.pop)] }
+      @thread.abort_on_exception = true
+      @thread[:fiber] = self
+    end
+    attr_reader :thread
+
+    def resume *args
+      raise FiberError, 'dead fiber called' unless @thread.alive?
+      @resume.push(args)
+      result = @yield.pop
+      result.size > 1 ? result : result.first
+    end
+
+    def yield *args
+      @yield.push(args)
+      result = @resume.pop
+      result.size > 1 ? result : result.first
+    end
+
+    def self.yield *args
+      if fiber = Thread.current[:fiber]
+        fiber.yield(*args)
+      else
+        raise FiberError, 'not inside a fiber'
+      end
+    end
+
+    def self.current
+      if Thread.current == Thread.main
+        return Thread.main[:fiber] ||= RootFiber.new
+      end
+
+      Thread.current[:fiber] or raise FiberError, 'not inside a fiber'
+    end
+
+    def inspect
+      "#<#{self.class}:0x#{self.object_id.to_s(16)}>"
+    end
+  end
+
+  class RootFiber < Fiber # :nodoc:
+    def initialize
+      # XXX: what is a root fiber anyway?
+    end
+
+    def self.yield *args
+      raise FiberError, "can't yield from root fiber"
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/exif_orientation.jpg b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/exif_orientation.jpg
new file mode 100644
index 0000000..55bb114
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/exif_orientation.jpg differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/faulty.jpg b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/faulty.jpg
new file mode 100644
index 0000000..d7f6db0
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/faulty.jpg differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/folder with spaces/test.bmp b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/folder with spaces/test.bmp
new file mode 100644
index 0000000..0e1da1b
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/folder with spaces/test.bmp differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.bmp b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.bmp
new file mode 100644
index 0000000..0e1da1b
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.bmp differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.gif b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.gif
new file mode 100644
index 0000000..f775284
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.gif differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.ico b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.ico
new file mode 100644
index 0000000..e08bf55
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.ico differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.jpg b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.jpg
new file mode 100644
index 0000000..77b3171
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.jpg differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.png b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.png
new file mode 100644
index 0000000..202d468
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.png differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.tiff b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.tiff
new file mode 100644
index 0000000..bd70832
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test.tiff differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test2.jpg b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test2.jpg
new file mode 100644
index 0000000..467a0a2
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test2.jpg differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test2.tiff b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test2.tiff
new file mode 100644
index 0000000..730d10f
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test2.tiff differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test3.jpg b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test3.jpg
new file mode 100644
index 0000000..7325d67
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/fixtures/test3.jpg differ
diff --git a/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/test.rb b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/test.rb
new file mode 100644
index 0000000..fa9e53b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/fastimage-1.5.0/test/test.rb
@@ -0,0 +1,218 @@
+require 'rubygems'
+
+require 'test/unit'
+
+PathHere = File.dirname(__FILE__)
+$LOAD_PATH.unshift File.join(PathHere, "..", "lib")
+
+require 'fastimage'
+require 'fakeweb'
+
+FixturePath = File.join(PathHere, "fixtures")
+
+GoodFixtures = {
+  "test.bmp"=>[:bmp, [40, 27]],
+  "test.gif"=>[:gif, [17, 32]],
+  "test.jpg"=>[:jpeg, [882, 470]],
+  "test.png"=>[:png, [30, 20]],
+  "test2.jpg"=>[:jpeg, [250, 188]],
+  "test3.jpg"=>[:jpeg, [630, 367]],
+  "test.tiff"=>[:tiff, [85, 67]],
+  "test2.tiff"=>[:tiff, [333, 225]],
+  "exif_orientation.jpg"=>[:jpeg, [2448, 3264]]
+  }
+
+BadFixtures = [
+  "faulty.jpg",
+  "test.ico"
+]
+
+TestUrl = "http://example.nowhere/"
+
+# this image fetch allows me to really test that fastimage is truly fast
+# but it's not ideal relying on external resources and connectivity speed
+LargeImage = "http://upload.wikimedia.org/wikipedia/commons/b/b4/Mardin_1350660_1350692_33_images.jpg"
+LargeImageInfo = [:jpeg, [9545, 6623]]
+LargeImageFetchLimit = 2  # seconds
+
+GoodFixtures.each do |fn, info|
+  FakeWeb.register_uri(:get, "#{TestUrl}#{fn}", :body => File.join(FixturePath, fn))
+end
+BadFixtures.each do |fn|
+  FakeWeb.register_uri(:get, "#{TestUrl}#{fn}", :body => File.join(FixturePath, fn))
+end
+
+class FastImageTest < Test::Unit::TestCase
+  def test_should_report_type_correctly
+    GoodFixtures.each do |fn, info|
+      assert_equal info[0], FastImage.type(TestUrl + fn)
+      assert_equal info[0], FastImage.type(TestUrl + fn, :raise_on_failure=>true)
+    end
+  end
+
+  def test_should_report_size_correctly
+    GoodFixtures.each do |fn, info|
+      assert_equal info[1], FastImage.size(TestUrl + fn)
+      assert_equal info[1], FastImage.size(TestUrl + fn, :raise_on_failure=>true)
+    end    
+  end
+
+  def test_should_return_nil_on_fetch_failure
+    assert_nil FastImage.size(TestUrl + "does_not_exist")
+  end
+  
+  def test_should_return_nil_for_faulty_jpeg_where_size_cannot_be_found
+    assert_nil FastImage.size(TestUrl + "faulty.jpg")
+  end
+
+  def test_should_return_nil_when_image_type_not_known
+    assert_nil FastImage.size(TestUrl + "test.ico")
+  end
+  
+  def test_should_return_nil_if_timeout_occurs
+    assert_nil FastImage.size("http://example.com/does_not_exist", :timeout=>0.001)
+  end
+  
+  def test_should_raise_when_asked_to_when_size_cannot_be_found
+    assert_raises(FastImage::SizeNotFound) do
+      FastImage.size(TestUrl + "faulty.jpg", :raise_on_failure=>true)
+    end
+  end
+
+  def test_should_raise_when_asked_to_when_timeout_occurs
+    assert_raises(FastImage::ImageFetchFailure) do
+      FastImage.size("http://example.com/does_not_exist", :timeout=>0.001, :raise_on_failure=>true)
+    end
+  end
+
+  def test_should_raise_when_asked_to_when_file_does_not_exist
+    assert_raises(FastImage::ImageFetchFailure) do
+      FastImage.size("http://www.google.com/does_not_exist_at_all", :raise_on_failure=>true)
+    end
+  end
+
+  def test_should_raise_when_asked_when_image_type_not_known
+    assert_raises(FastImage::UnknownImageType) do
+      FastImage.size(TestUrl + "test.ico", :raise_on_failure=>true)
+    end
+  end
+  
+  def test_should_report_type_correctly_for_local_files
+    GoodFixtures.each do |fn, info|
+      assert_equal info[0], FastImage.type(File.join(FixturePath, fn))
+    end    
+  end
+  
+  def test_should_report_size_correctly_for_local_files
+    GoodFixtures.each do |fn, info|
+      assert_equal info[1], FastImage.size(File.join(FixturePath, fn))
+    end    
+  end
+
+  def test_should_report_type_correctly_for_ios
+    GoodFixtures.each do |fn, info|
+      File.open(File.join(FixturePath, fn), "r") do |io|
+        assert_equal info[0], FastImage.type(io)
+      end
+    end
+  end
+  
+  def test_should_report_size_correctly_for_ios
+    GoodFixtures.each do |fn, info|
+      File.open(File.join(FixturePath, fn), "r") do |io|
+        assert_equal info[1], FastImage.size(io)
+      end
+    end
+  end
+  
+  def test_should_report_size_correctly_on_io_object_twice
+    GoodFixtures.each do |fn, info|
+      File.open(File.join(FixturePath, fn), "r") do |io|
+        assert_equal info[1], FastImage.size(io)
+        assert_equal info[1], FastImage.size(io)
+      end
+    end
+  end
+
+  def test_should_report_size_correctly_for_local_files_with_path_that_has_spaces
+    Dir.chdir(PathHere) do
+      assert_equal GoodFixtures["test.bmp"][1], FastImage.size(File.join("fixtures", "folder with spaces", "test.bmp"))
+    end
+  end
+  
+  def test_should_return_nil_on_fetch_failure_for_local_path
+    assert_nil FastImage.size("does_not_exist")
+  end
+  
+  def test_should_return_nil_for_faulty_jpeg_where_size_cannot_be_found_for_local_file
+    assert_nil FastImage.size(File.join(FixturePath, "faulty.jpg"))
+  end
+
+  def test_should_return_nil_when_image_type_not_known_for_local_file
+    assert_nil FastImage.size(File.join(FixturePath, "test.ico"))
+  end
+  
+  def test_should_raise_when_asked_to_when_size_cannot_be_found_for_local_file
+    assert_raises(FastImage::SizeNotFound) do
+      FastImage.size(File.join(FixturePath, "faulty.jpg"), :raise_on_failure=>true)
+    end
+  end
+  
+  def test_should_handle_permanent_redirect
+    url = "http://example.com/foo.jpeg"
+    register_redirect(url, TestUrl + GoodFixtures.keys.first)
+    assert_equal GoodFixtures[GoodFixtures.keys.first][1], FastImage.size(url, :raise_on_failure=>true)
+  end
+
+  def test_should_handle_permanent_redirect_4_times
+    first_url = "http://example.com/foo.jpeg"
+    register_redirect(first_url, "http://example.com/foo2.jpeg")
+    register_redirect("http://example.com/foo2.jpeg", "http://example.com/foo3.jpeg")
+    register_redirect("http://example.com/foo3.jpeg", "http://example.com/foo4.jpeg")
+    register_redirect("http://example.com/foo4.jpeg", TestUrl + GoodFixtures.keys.first)
+    assert_equal GoodFixtures[GoodFixtures.keys.first][1], FastImage.size(first_url, :raise_on_failure=>true)
+  end
+
+  def test_should_raise_on_permanent_redirect_5_times
+    first_url = "http://example.com/foo.jpeg"
+    register_redirect(first_url, "http://example.com/foo2.jpeg")
+    register_redirect("http://example.com/foo2.jpeg", "http://example.com/foo3.jpeg")
+    register_redirect("http://example.com/foo3.jpeg", "http://example.com/foo4.jpeg")
+    register_redirect("http://example.com/foo4.jpeg", "http://example.com/foo5.jpeg")
+    register_redirect("http://example.com/foo5.jpeg", TestUrl + GoodFixtures.keys.first)
+    assert_raises(FastImage::ImageFetchFailure) do
+      FastImage.size(first_url, :raise_on_failure=>true)
+    end
+  end
+  
+  def register_redirect(from, to)
+    resp = Net::HTTPMovedPermanently.new(1.0, 302, "Moved")
+    resp['Location'] = to
+    FakeWeb.register_uri(:get, from, :response=>resp)
+  end
+  
+  def test_should_fetch_info_of_large_image_faster_than_downloading_the_whole_thing
+    time = Time.now
+    size = FastImage.size(LargeImage)
+    size_time = Time.now
+    assert size_time - time < LargeImageFetchLimit
+    assert_equal LargeImageInfo[1], size
+    time = Time.now
+    type = FastImage.type(LargeImage)
+    type_time = Time.now
+    assert type_time - time < LargeImageFetchLimit
+    assert_equal LargeImageInfo[0], type
+  end
+  
+  # This test doesn't actually test the proxy function, but at least
+  # it excercises the code. You could put anything in the http_proxy and it would still pass.
+  # Any ideas on how to actually test this?
+  def test_should_fetch_via_proxy
+    file = "test.gif"
+    actual_size = GoodFixtures[file][1]
+    ENV['http_proxy'] = "http://my.proxy.host:8080"
+    size = FastImage.size(TestUrl + file)
+    ENV['http_proxy'] = nil
+    assert_equal actual_size, size
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/hike-1.2.3/LICENSE b/.bundle/ruby/1.9.1/gems/hike-1.2.3/LICENSE
new file mode 100644
index 0000000..63c11cb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hike-1.2.3/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2011 Sam Stephenson
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/1.9.1/gems/hike-1.2.3/README.md b/.bundle/ruby/1.9.1/gems/hike-1.2.3/README.md
new file mode 100644
index 0000000..f2c2f24
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hike-1.2.3/README.md
@@ -0,0 +1,52 @@
+Hike
+====
+
+Hike is a Ruby library for finding files in a set of paths. Use it to
+implement search paths, load paths, and the like.
+
+# Examples
+
+Find Ruby files in this project:
+
+    trail = Hike::Trail.new "/Users/sam/Projects/hike"
+    trail.append_extension ".rb"
+    trail.append_paths "lib", "test"
+
+    trail.find "hike/trail"
+    # => "/Users/sam/Projects/hike/lib/hike/trail.rb"
+
+    trail.find "test_trail"
+    # => "/Users/sam/Projects/hike/test/test_trail.rb"
+
+Explore your Ruby load path:
+
+    trail = Hike::Trail.new "/"
+    trail.append_extensions ".rb", ".bundle"
+    trail.append_paths *$:
+
+    trail.find "net/http"
+    # => "/Users/sam/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/net/http.rb"
+
+    trail.find "strscan"
+    # => "/Users/sam/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/i686-darwin10.4.0/strscan.bundle"
+
+Explore your shell path:
+
+    trail = Hike::Trail.new "/"
+    trail.append_paths *ENV["PATH"].split(":")
+
+    trail.find "ls"
+    # => "/bin/ls"
+
+    trail.find "gem"
+    # => "/Users/sam/.rvm/rubies/ree-1.8.7-2010.02/bin/gem"
+
+# Installation
+
+    $ gem install hike
+
+# License
+
+Copyright (c) 2011 Sam Stephenson.
+
+Released under the MIT license. See `LICENSE` for details.
diff --git a/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike.rb b/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike.rb
new file mode 100644
index 0000000..48d46e8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike.rb
@@ -0,0 +1,9 @@
+module Hike
+  VERSION = "1.2.0"
+
+  autoload :Extensions,      "hike/extensions"
+  autoload :Index,           "hike/index"
+  autoload :NormalizedArray, "hike/normalized_array"
+  autoload :Paths,           "hike/paths"
+  autoload :Trail,           "hike/trail"
+end
diff --git a/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/extensions.rb b/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/extensions.rb
new file mode 100644
index 0000000..f32bfd8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/extensions.rb
@@ -0,0 +1,23 @@
+require 'hike/normalized_array'
+
+module Hike
+  # `Extensions` is an internal collection for tracking extension names.
+  class Extensions < NormalizedArray
+    # Extensions added to this array are normalized with a leading
+    # `.`.
+    #
+    #     extensions << "js"
+    #     extensions << ".css"
+    #
+    #     extensions
+    #     # => [".js", ".css"]
+    #
+    def normalize_element(extension)
+      if extension[/^\./]
+        extension
+      else
+        ".#{extension}"
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/index.rb b/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/index.rb
new file mode 100644
index 0000000..3838c6f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/index.rb
@@ -0,0 +1,206 @@
+require 'pathname'
+
+module Hike
+  # `Index` is an internal cached variant of `Trail`. It assumes the
+  # file system does not change between `find` calls. All `stat` and
+  # `entries` calls are cached for the lifetime of the `Index` object.
+  class Index
+    # `Index#paths` is an immutable `Paths` collection.
+    attr_reader :paths
+
+    # `Index#extensions` is an immutable `Extensions` collection.
+    attr_reader :extensions
+
+    # `Index#aliases` is an immutable `Hash` mapping an extension to
+    # an `Array` of aliases.
+    attr_reader :aliases
+
+    # `Index.new` is an internal method. Instead of constructing it
+    # directly, create a `Trail` and call `Trail#index`.
+    def initialize(root, paths, extensions, aliases)
+      @root = root
+
+      # Freeze is used here so an error is throw if a mutator method
+      # is called on the array. Mutating `@paths`, `@extensions`, or
+      # `@aliases` would have unpredictable results.
+      @paths      = paths.dup.freeze
+      @extensions = extensions.dup.freeze
+      @aliases    = aliases.inject({}) { |h, (k, a)|
+                      h[k] = a.dup.freeze; h
+                   }.freeze
+      @pathnames  = paths.map { |path| Pathname.new(path) }
+
+      @stats    = {}
+      @entries  = {}
+      @patterns = {}
+    end
+
+    # `Index#root` returns root path as a `String`. This attribute is immutable.
+    def root
+      @root.to_s
+    end
+
+    # `Index#index` returns `self` to be compatable with the `Trail` interface.
+    def index
+      self
+    end
+
+    # The real implementation of `find`. `Trail#find` generates a one
+    # time index and delegates here.
+    #
+    # See `Trail#find` for usage.
+    def find(*logical_paths, &block)
+      if block_given?
+        options = extract_options!(logical_paths)
+        base_path = Pathname.new(options[:base_path] || @root)
+
+        logical_paths.each do |logical_path|
+          logical_path = Pathname.new(logical_path.sub(/^\//, ''))
+
+          if relative?(logical_path)
+            find_in_base_path(logical_path, base_path, &block)
+          else
+            find_in_paths(logical_path, &block)
+          end
+        end
+
+        nil
+      else
+        find(*logical_paths) do |path|
+          return path
+        end
+      end
+    end
+
+    # A cached version of `Dir.entries` that filters out `.` files and
+    # `~` swap files. Returns an empty `Array` if the directory does
+    # not exist.
+    def entries(path)
+      @entries[path.to_s] ||= begin
+        pathname = Pathname.new(path)
+        if pathname.directory?
+          pathname.entries.reject { |entry| entry.to_s =~ /^\.|~$|^\#.*\#$/ }.sort
+        else
+          []
+        end
+      end
+    end
+
+    # A cached version of `File.stat`. Returns nil if the file does
+    # not exist.
+    def stat(path)
+      key = path.to_s
+      if @stats.key?(key)
+        @stats[key]
+      elsif File.exist?(path)
+        @stats[key] = File.stat(path)
+      else
+        @stats[key] = nil
+      end
+    end
+
+    protected
+      def extract_options!(arguments)
+        arguments.last.is_a?(Hash) ? arguments.pop.dup : {}
+      end
+
+      def relative?(logical_path)
+        logical_path.to_s =~ /^\.\.?\//
+      end
+
+      # Finds logical path across all `paths`
+      def find_in_paths(logical_path, &block)
+        dirname, basename = logical_path.split
+        @pathnames.each do |base_path|
+          match(base_path.join(dirname), basename, &block)
+        end
+      end
+
+      # Finds relative logical path, `../test/test_trail`. Requires a
+      # `base_path` for reference.
+      def find_in_base_path(logical_path, base_path, &block)
+        candidate = base_path.join(logical_path)
+        dirname, basename = candidate.split
+        match(dirname, basename, &block) if paths_contain?(dirname)
+      end
+
+      # Checks if the path is actually on the file system and performs
+      # any syscalls if necessary.
+      def match(dirname, basename)
+        # Potential `entries` syscall
+        matches = entries(dirname)
+
+        pattern = pattern_for(basename)
+        matches = matches.select { |m| m.to_s =~ pattern }
+
+        sort_matches(matches, basename).each do |path|
+          pathname = dirname.join(path)
+
+          # Potential `stat` syscall
+          stat = stat(pathname)
+
+          # Exclude directories
+          if stat && stat.file?
+            yield pathname.to_s
+          end
+        end
+      end
+
+      # Returns true if `dirname` is a subdirectory of any of the `paths`
+      def paths_contain?(dirname)
+        paths.any? { |path| dirname.to_s[0, path.length] == path }
+      end
+
+      # Cache results of `build_pattern_for`
+      def pattern_for(basename)
+        @patterns[basename] ||= build_pattern_for(basename)
+      end
+
+      # Returns a `Regexp` that matches the allowed extensions.
+      #
+      #     pattern_for("index.html") #=> /^index(.html|.htm)(.builder|.erb)*$/
+      def build_pattern_for(basename)
+        extname = basename.extname
+        aliases = find_aliases_for(extname)
+
+        if aliases.any?
+          basename = basename.basename(extname)
+          aliases  = [extname] + aliases
+          aliases_pattern = aliases.map { |e| Regexp.escape(e) }.join("|")
+          basename_re = Regexp.escape(basename.to_s) + "(?:#{aliases_pattern})"
+        else
+          basename_re = Regexp.escape(basename.to_s)
+        end
+
+        extension_pattern = extensions.map { |e| Regexp.escape(e) }.join("|")
+        /^#{basename_re}(?:#{extension_pattern})*$/
+      end
+
+      # Sorts candidate matches by their extension
+      # priority. Extensions in the front of the `extensions` carry
+      # more weight.
+      def sort_matches(matches, basename)
+        aliases = find_aliases_for(basename.extname)
+
+        matches.sort_by do |match|
+          extnames = match.sub(basename.to_s, '').to_s.scan(/\.[^.]+/)
+          extnames.inject(0) do |sum, ext|
+            if i = extensions.index(ext)
+              sum + i + 1
+            elsif i = aliases.index(ext)
+              sum + i + 11
+            else
+              sum
+            end
+          end
+        end
+      end
+
+      def find_aliases_for(extension)
+        @aliases.inject([]) do |aliases, (key, value)|
+          aliases.push(key) if value == extension
+          aliases
+        end
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/normalized_array.rb b/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/normalized_array.rb
new file mode 100644
index 0000000..3ba2d47
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/normalized_array.rb
@@ -0,0 +1,59 @@
+module Hike
+  # `NormalizedArray` is an internal abstract wrapper class that calls
+  # a callback `normalize_element` anytime an element is added to the
+  # Array.
+  #
+  # `Extensions` and `Paths` are subclasses of `NormalizedArray`.
+  class NormalizedArray < Array
+    def initialize
+      super()
+    end
+
+    def []=(*args)
+      value = args.pop
+
+      if value.respond_to?(:to_ary)
+        value = normalize_elements(value)
+      else
+        value = normalize_element(value)
+      end
+
+      super(*args.concat([value]))
+    end
+
+    def <<(element)
+      super normalize_element(element)
+    end
+
+    def collect!
+      super do |element|
+        result = yield element
+        normalize_element(result)
+      end
+    end
+
+    alias_method :map!, :collect!
+
+    def insert(index, *elements)
+      super index, *normalize_elements(elements)
+    end
+
+    def push(*elements)
+      super(*normalize_elements(elements))
+    end
+
+    def replace(elements)
+      super normalize_elements(elements)
+    end
+
+    def unshift(*elements)
+      super(*normalize_elements(elements))
+    end
+
+    def normalize_elements(elements)
+      elements.map do |element|
+        normalize_element(element)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/paths.rb b/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/paths.rb
new file mode 100644
index 0000000..0dad9ab
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/paths.rb
@@ -0,0 +1,27 @@
+require 'pathname'
+require 'hike/normalized_array'
+
+module Hike
+  # `Paths` is an internal collection for tracking path strings.
+  class Paths < NormalizedArray
+    def initialize(root = ".")
+      @root = Pathname.new(root)
+      super()
+    end
+
+    # Relative paths added to this array are expanded relative to `@root`.
+    #
+    #     paths = Paths.new("/usr/local")
+    #     paths << "tmp"
+    #     paths << "/tmp"
+    #
+    #     paths
+    #     # => ["/usr/local/tmp", "/tmp"]
+    #
+    def normalize_element(path)
+      path = Pathname.new(path)
+      path = @root.join(path) if path.relative?
+      path.expand_path.to_s
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/trail.rb b/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/trail.rb
new file mode 100644
index 0000000..6908491
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hike-1.2.3/lib/hike/trail.rb
@@ -0,0 +1,188 @@
+require 'pathname'
+require 'hike/extensions'
+require 'hike/index'
+require 'hike/paths'
+
+module Hike
+  # `Trail` is the public container class for holding paths and extensions.
+  class Trail
+    # `Trail#paths` is a mutable `Paths` collection.
+    #
+    #     trail = Hike::Trail.new
+    #     trail.paths.push "~/Projects/hike/lib", "~/Projects/hike/test"
+    #
+    # The order of the paths is significant. Paths in the beginning of
+    # the collection will be checked first. In the example above,
+    # `~/Projects/hike/lib/hike.rb` would shadow the existent of
+    # `~/Projects/hike/test/hike.rb`.
+    attr_reader :paths
+
+    # `Trail#extensions` is a mutable `Extensions` collection.
+    #
+    #     trail = Hike::Trail.new
+    #     trail.paths.push "~/Projects/hike/lib"
+    #     trail.extensions.push ".rb"
+    #
+    # Extensions allow you to find files by just their name omitting
+    # their extension. Is similar to Ruby's require mechanism that
+    # allows you to require files with specifiying `foo.rb`.
+    attr_reader :extensions
+
+    # `Index#aliases` is a mutable `Hash` mapping an extension to
+    # an `Array` of aliases.
+    #
+    #   trail = Hike::Trail.new
+    #   trail.paths.push "~/Projects/hike/site"
+    #   trail.aliases['.htm']   = 'html'
+    #   trail.aliases['.xhtml'] = 'html'
+    #   trail.aliases['.php']   = 'html'
+    #
+    # Aliases provide a fallback when the primary extension is not
+    # matched. In the example above, a lookup for "foo.html" will
+    # check for the existence of "foo.htm", "foo.xhtml", or "foo.php".
+    attr_reader :aliases
+
+    # A Trail accepts an optional root path that defaults to your
+    # current working directory. Any relative paths added to
+    # `Trail#paths` will expanded relative to the root.
+    def initialize(root = ".")
+      @root       = Pathname.new(root).expand_path
+      @paths      = Paths.new(@root)
+      @extensions = Extensions.new
+      @aliases    = Hash.new { |h, k| h[k] = Extensions.new }
+    end
+
+    # `Trail#root` returns root path as a `String`. This attribute is immutable.
+    def root
+      @root.to_s
+    end
+
+    # Prepend `path` to `Paths` collection
+    def prepend_paths(*paths)
+      self.paths.unshift(*paths)
+    end
+    alias_method :prepend_path, :prepend_paths
+
+    # Append `path` to `Paths` collection
+    def append_paths(*paths)
+      self.paths.push(*paths)
+    end
+    alias_method :append_path, :append_paths
+
+    # Remove `path` from `Paths` collection
+    def remove_path(path)
+      self.paths.delete(path)
+    end
+
+    # Prepend `extension` to `Extensions` collection
+    def prepend_extensions(*extensions)
+      self.extensions.unshift(*extensions)
+    end
+    alias_method :prepend_extension, :prepend_extensions
+
+    # Append `extension` to `Extensions` collection
+    def append_extensions(*extensions)
+      self.extensions.push(*extensions)
+    end
+    alias_method :append_extension, :append_extensions
+
+    # Remove `extension` from `Extensions` collection
+    def remove_extension(extension)
+      self.extensions.delete(extension)
+    end
+
+    # Alias `new_extension` to `old_extension`
+    def alias_extension(new_extension, old_extension)
+      aliases[normalize_extension(new_extension)] = normalize_extension(old_extension)
+    end
+
+    # Remove the alias for `extension`
+    def unalias_extension(extension)
+      aliases.delete(normalize_extension(extension))
+    end
+
+    # `Trail#find` returns a the expand path for a logical path in the
+    # path collection.
+    #
+    #     trail = Hike::Trail.new "~/Projects/hike"
+    #     trail.extensions.push ".rb"
+    #     trail.paths.push "lib", "test"
+    #
+    #     trail.find "hike/trail"
+    #     # => "~/Projects/hike/lib/hike/trail.rb"
+    #
+    #     trail.find "test_trail"
+    #     # => "~/Projects/hike/test/test_trail.rb"
+    #
+    # `find` accepts multiple fallback logical paths that returns the
+    # first match.
+    #
+    #     trail.find "hike", "hike/index"
+    #
+    # is equivalent to
+    #
+    #     trail.find("hike") || trail.find("hike/index")
+    #
+    # Though `find` always returns the first match, it is possible
+    # to iterate over all shadowed matches and fallbacks by supplying
+    # a block.
+    #
+    #     trail.find("hike", "hike/index") { |path| warn path }
+    #
+    # This allows you to filter your matches by any condition.
+    #
+    #     trail.find("application") do |path|
+    #       return path if mime_type_for(path) == "text/css"
+    #     end
+    #
+    def find(*args, &block)
+      index.find(*args, &block)
+    end
+
+    # `Trail#index` returns an `Index` object that has the same
+    # interface as `Trail`. An `Index` is a cached `Trail` object that
+    # does not update when the file system changes. If you are
+    # confident that you are not making changes the paths you are
+    # searching, `index` will avoid excess system calls.
+    #
+    #     index = trail.index
+    #     index.find "hike/trail"
+    #     index.find "test_trail"
+    #
+    def index
+      Index.new(root, paths, extensions, aliases)
+    end
+
+    # `Trail#entries` is equivalent to `Dir#entries`. It is not
+    # recommend to use this method for general purposes. It exists for
+    # parity with `Index#entries`.
+    def entries(path)
+      pathname = Pathname.new(path)
+      if pathname.directory?
+        pathname.entries.reject { |entry| entry.to_s =~ /^\.|~$|^\#.*\#$/ }.sort
+      else
+        []
+      end
+    end
+
+    # `Trail#stat` is equivalent to `File#stat`. It is not
+    # recommend to use this method for general purposes. It exists for
+    # parity with `Index#stat`.
+    def stat(path)
+      if File.exist?(path)
+        File.stat(path.to_s)
+      else
+        nil
+      end
+    end
+
+    private
+      def normalize_extension(extension)
+        if extension[/^\./]
+          extension
+        else
+          ".#{extension}"
+        end
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/.gitignore b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/.gitignore
new file mode 100644
index 0000000..d87d4be
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/.gitignore
@@ -0,0 +1,17 @@
+*.gem
+*.rbc
+.bundle
+.config
+.yardoc
+Gemfile.lock
+InstalledFiles
+_yardoc
+coverage
+doc/
+lib/bundler/man
+pkg
+rdoc
+spec/reports
+test/tmp
+test/version_tmp
+tmp
diff --git a/vendor/hikidoc-0.0.6/COPYING b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/COPYING
similarity index 100%
copy from vendor/hikidoc-0.0.6/COPYING
copy to .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/COPYING
diff --git a/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/Gemfile b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/Gemfile
new file mode 100644
index 0000000..1a18baa
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/Gemfile
@@ -0,0 +1,4 @@
+source 'https://rubygems.org'
+
+# Specify your gem's dependencies in hikidoc.gemspec
+gemspec
diff --git a/vendor/hikidoc-0.0.6/NEWS b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/NEWS
similarity index 100%
copy from vendor/hikidoc-0.0.6/NEWS
copy to .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/NEWS
diff --git a/vendor/hikidoc-0.0.6/NEWS.ja b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/NEWS.ja
similarity index 100%
copy from vendor/hikidoc-0.0.6/NEWS.ja
copy to .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/NEWS.ja
diff --git a/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/README b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/README
new file mode 100644
index 0000000..0b16a84
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/README
@@ -0,0 +1,87 @@
+! HikiDoc
+
+!! Introduction
+
+'HikiDoc' is a text-to-HTML conversion tool for web writers. HikiDoc
+allows you to write using an easy-to-read, easy-to-write plain text
+format, then convert it to structurally valid HTML (or XHTML).
+
+!! Requirements
+
+HikiDoc requires Ruby 1.8.2 or later.
+
+!! Download
+
+Get from the subversion repository http://hikidoc.rubyforge.org/svn/ .
+
+ (eg.)
+ svn co http://hikidoc.rubyforge.org/svn/trunk/ hikidoc
+
+!! Installation
+
+Run the 'setup.rb' script like so:
+
+ $ ruby setup.rb config
+ $ ruby setup.rb setup
+ # ruby setup.rb install
+
+!! Syntax
+
+See [[TextFormattingRules]].
+
+!! Mailing list
+
+To subscribe the HikiDoc ML, please send the following mail. English
+posts are also welcome.
+
+ To: hikidoc at ml.fdiary.net
+ Cc: kazuhiko at fdiary.net
+ Subject: subscribe        <- any subject
+ 
+ Hello.                    <- any body
+
+HikiDoc ML's archive is available at http://www.fdiary.net/ml/hikidoc/ .
+
+!! Related softwares
+
+The following softwares use the HikiDoc library or the HikiDoc format.
+
+:[[tDiary|http://www.tdiary.org/]]:a Weblog/Web-diary software
+:[[Hiki|http://hikiwiki.org/]]:a powerful and fast wiki clone
+:[[lily|http://lily.sourceforge.jp/]]:a simple CMS
+:[[Text::HikiDoc|http://search.cpan.org/perldoc?Text::HikiDoc]]:HikiDoc by Perl
+:[[PikiDoc|http://github.com/moro/piki_doc/]]:a library that you can add plugin functions on HikiDoc
+:[[mail2weblog|http://sourceforge.jp/projects/mail2weblog/wiki/FrontPage]]:a blog system via mobile phone email
+
+!! License
+
+HikiDoc's license is the 'Modified BSD License'.
+
+ Copyright (c) 2005, Kazuhiko <kazuhiko at fdiary.net>
+ 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 the HikiDoc 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
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/README.ja b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/README.ja
new file mode 100644
index 0000000..94fb2d6
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/README.ja
@@ -0,0 +1,84 @@
+! HikiDoc
+
+!! �Ϥ����
+
+'HikiDoc' �ϡ֥ƥ����Ȣ� HTML���Ѵ��ġ���Ǥ����񤭤䤹���ɤߤ䤹��ʸˡ��
+�ƥ����Ȥ�ޤȤ�� HTML (�� XHTML) ���Ѵ����ޤ���
+
+!! ɬ�פʤ��
+
+HikiDoc �μ¹Ԥˤ� Ruby 1.8.2 �ʹߤ�ɬ�פǤ���
+
+!! ���������
+
+Subversion ��ݥ��ȥ� http://hikidoc.rubyforge.org/svn/ �����������
+����������
+
+ (��)
+ svn co http://hikidoc.rubyforge.org/svn/trunk/ hikidoc
+
+!! ���󥹥ȡ���
+
+�ʲ��Τ褦�� 'setup.rb' ������ץȤ��Ѥ��ƥ��󥹥ȡ��뤷�ޤ���
+
+ $ ruby setup.rb config
+ $ ruby setup.rb setup
+ # ruby setup.rb install
+
+!! ʸˡ
+
+[[TextFormattingRules.ja]] ��������������
+
+!! �᡼��󥰥ꥹ��
+
+���ä��˾��������ϡ��ʲ��Τ褦�ʥ᡼����������Ƥ���������
+ To: hikidoc at ml.fdiary.net
+ Cc: kazuhiko at fdiary.net
+ 
+ ��ʸ�˼��ʾҲ�ʤ�
+
+���Υ᡼��� http://www.fdiary.net/ml/hikidoc/ �Ǹ������Ƥ��ޤ���
+
+!! ��Ϣ���륽�եȥ�����
+
+�ʲ��Υ��եȥ������� HikiDoc �饤�֥�ꡢ�ޤ��� HikiDoc �ե����ޥåȤ��Ѥ����Ƥ��ޤ���
+
+:[[tDiary|http://www.tdiary.org/]]:�������������եȥ�����
+:[[Hiki|http://hikiwiki.org/]]:¿��ǽ���Ĺ�®�� Wiki ������
+:[[lily|http://lily.sourceforge.jp/]]:����ץ�� CMS (Web �����ȹ��ۥ����ƥ�)
+:[[Text::HikiDoc|http://search.cpan.org/perldoc?Text::HikiDoc]]:Perl �ˤ�� HikiDoc �μ���
+:[[PikiDoc|http://github.com/moro/piki_doc/]]:HikiDoc�Ρ֥ץ饰����׵�ǽ���ɲäǤ���饤�֥��Ǥ�
+:[[mail2weblog|http://sourceforge.jp/projects/mail2weblog/wiki/FrontPage]]:�ⵡǽ�᡼����Ʒ���֥�
+
+!! �饤����
+
+Modified BSD �饤���󥹤Ǥ���
+
+ Copyright (c) 2005, Kazuhiko <kazuhiko at fdiary.net>
+ 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 the HikiDoc 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
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/Rakefile b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/Rakefile
new file mode 100644
index 0000000..2e5241a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/Rakefile
@@ -0,0 +1,8 @@
+require "bundler/gem_tasks"
+require 'rake/testtask'
+
+Rake::TestTask.new do |t|
+  t.libs << "test"
+  t.test_files = FileList['test/**/*_test.rb']
+  t.verbose = true
+end
diff --git a/vendor/hikidoc-0.0.6/TextFormattingRules b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/TextFormattingRules
similarity index 100%
copy from vendor/hikidoc-0.0.6/TextFormattingRules
copy to .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/TextFormattingRules
diff --git a/vendor/hikidoc-0.0.6/TextFormattingRules.ja b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/TextFormattingRules.ja
similarity index 100%
copy from vendor/hikidoc-0.0.6/TextFormattingRules.ja
copy to .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/TextFormattingRules.ja
diff --git a/vendor/hikidoc-0.0.6/bin/hikidoc b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/bin/hikidoc
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/hikidoc-0.0.6/bin/hikidoc
copy to .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/bin/hikidoc
diff --git a/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/hikidoc.gemspec b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/hikidoc.gemspec
new file mode 100644
index 0000000..28839bb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/hikidoc.gemspec
@@ -0,0 +1,23 @@
+# coding: utf-8
+lib = File.expand_path('../lib', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+require 'hikidoc'
+
+Gem::Specification.new do |spec|
+  spec.name          = "hikidoc"
+  spec.version       = HikiDoc::VERSION
+  spec.authors       = ['Kazuhiko', "SHIBATA Hiroshi"]
+  spec.email         = ['kazuhiko at fdiary.net', "shibata.hiroshi at gmail.com"]
+  spec.description   = %q{'HikiDoc' is a text-to-HTML conversion tool for web writers.}
+  spec.summary       = %q{'HikiDoc' is a text-to-HTML conversion tool for web writers. HikiDoc allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid HTML (or XHTML).}
+  spec.homepage      = "https://github.com/hiki/hikidoc"
+  spec.license       = "MIT"
+
+  spec.files         = `git ls-files`.split($/)
+  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
+  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
+  spec.require_paths = ["lib"]
+
+  spec.add_development_dependency "bundler"
+  spec.add_development_dependency "rake"
+end
diff --git a/vendor/hikidoc-0.0.6/lib/hikidoc.rb b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/lib/hikidoc.rb
similarity index 100%
copy from vendor/hikidoc-0.0.6/lib/hikidoc.rb
copy to .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/lib/hikidoc.rb
diff --git a/vendor/hikidoc-0.0.6/setup.rb b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/setup.rb
similarity index 100%
copy from vendor/hikidoc-0.0.6/setup.rb
copy to .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/setup.rb
diff --git a/vendor/hikidoc-0.0.6/test/test_hikidoc.rb b/.bundle/ruby/1.9.1/gems/hikidoc-0.0.6/test/hikidoc_test.rb
similarity index 100%
copy from vendor/hikidoc-0.0.6/test/test_hikidoc.rb
copy to .bundle/ruby/1.9.1/gems/hikidoc-0.0.6/test/hikidoc_test.rb
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/.document b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/.document
new file mode 100644
index 0000000..3b0c733
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/.document
@@ -0,0 +1,5 @@
+LICENSE.md
+README.md
+bin/*
+features/**/*.feature
+lib/**/*.rb
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/.rspec b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/.rspec
new file mode 100644
index 0000000..0ea59b0
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/.rspec
@@ -0,0 +1,3 @@
+--color
+--fail-fast
+--order random
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/.travis.yml b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/.travis.yml
new file mode 100644
index 0000000..72df94b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/.travis.yml
@@ -0,0 +1,11 @@
+bundler_args: --without development
+language: ruby
+rvm:
+  - rbx-18mode
+  - rbx-19mode
+  - jruby-18mode
+  - jruby-19mode
+  - 1.8.7
+  - 1.9.2
+  - 1.9.3
+  - 2.0.0
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/.yardopts b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/.yardopts
new file mode 100644
index 0000000..884b083
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/.yardopts
@@ -0,0 +1,6 @@
+--markup markdown
+-
+CHANGELOG.md
+CONTRIBUTING.md
+LICENSE.md
+README.md
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/CHANGELOG.md b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/CHANGELOG.md
new file mode 100644
index 0000000..744d918
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/CHANGELOG.md
@@ -0,0 +1,164 @@
+1.7.7
+-----
+* [Fix options caching issues](https://github.com/intridea/multi_json/commit/a3f14c3661688c5927638fa6088c7b46a67e875e)
+
+1.7.6
+-----
+* [Bring back MultiJson::VERSION constant](https://github.com/intridea/multi_json/commit/31b990c2725e6673bf8ce57540fe66b57a751a72)
+
+1.7.5
+-----
+* [Fix warning '*' interpreted as argument prefix](https://github.com/intridea/multi_json/commit/b698962c7f64430222a1f06430669706a47aff89)
+* [Remove stdlib warning](https://github.com/intridea/multi_json/commit/d06eec6b7996ac8b4ff0e2229efd835379b0c30f)
+
+1.7.4
+-----
+* [Cache options for better performance](https://github.com/intridea/multi_json/commit/8a26ee93140c4bed36194ed9fb887a1b6919257b)
+
+1.7.3
+-----
+* [Require json/ext to ensure extension version gets loaded for json_gem](https://github.com/intridea/multi_json/commit/942686f7e8597418c6f90ee69e1d45242fac07b1)
+* [Rename JrJackson](https://github.com/intridea/multi_json/commit/078de7ba8b6035343c3e96b4767549e9ec43369a)
+* [Prefer JrJackson to JSON gem if present](https://github.com/intridea/multi_json/commit/af8bd9799a66855f04b3aff1c488485950cec7bf)
+* [Print a warning if outdated gem versions are used](https://github.com/intridea/multi_json/commit/e7438e7ba2be0236cfa24c2bb9ad40ee821286d1)
+* [Loosen required_rubygems_version for compatibility with Ubuntu 10.04](https://github.com/intridea/multi_json/commit/59fad014e8fe41dbc6f09485ea0dc21fc42fd7a7)
+
+1.7.2
+-----
+* [Rename Jrjackson adapter to JrJackson](https://github.com/intridea/multi_json/commit/b36dc915fc0e6548cbad06b5db6f520e040c9c8b)
+* [Implement jrjackson -> jr_jackson alias for back-compatability](https://github.com/intridea/multi_json/commit/aa50ab8b7bb646b8b75d5d65dfeadae8248a4f10)
+* [Update vendored OkJson module](https://github.com/intridea/multi_json/commit/30a3f474e17dd86a697c3fab04f468d1a4fd69d7)
+
+1.7.1
+-----
+* [Fix capitalization of JrJackson class](https://github.com/intridea/multi_json/commit/5373a5e38c647f02427a0477cb8e0e0dafad1b8d)
+
+1.7.0
+-----
+* [Add load_options/dump_options to MultiJson](https://github.com/intridea/multi_json/commit/a153956be6b0df06ea1705ce3c1ff0b5b0e27ea5)
+* [MultiJson does not modify arguments](https://github.com/intridea/multi_json/commit/58525b01c4c2f6635ba2ac13d6fd987b79f3962f)
+* [Enable quirks_mode by default for json_gem/json_pure adapters](https://github.com/intridea/multi_json/commit/1fd4e6635c436515b7d7d5a0bee4548de8571520)
+* [Add JrJackson adapter](https://github.com/intridea/multi_json/commit/4dd86fa96300aaaf6d762578b9b31ea82adb056d)
+* [Raise ArgumentError on bad adapter input](https://github.com/intridea/multi_json/commit/911a3756bdff2cb5ac06497da3fa3e72199cb7ad)
+
+1.6.1
+-----
+* [Revert "Use JSON.generate instead of #to_json"](https://github.com/intridea/multi_json/issues/86)
+
+1.6.0
+-----
+* [Add gson.rb support](https://github.com/intridea/multi_json/pull/71)
+* [Add MultiJson.default_options](https://github.com/intridea/multi_json/pull/70)
+* [Add MultiJson.with_adapter](https://github.com/intridea/multi_json/pull/67)
+* [Stringify all possible keys for ok_json](https://github.com/intridea/multi_json/pull/66)
+* [Use JSON.generate instead of #to_json](https://github.com/intridea/multi_json/issues/73)
+* [Alias `MultiJson::DecodeError` to `MultiJson::LoadError`](https://github.com/intridea/multi_json/pull/79)
+
+1.5.1
+-----
+* [Do not allow Oj or JSON to create symbols by searching for classes](https://github.com/intridea/multi_json/commit/193e28cf4dc61b6e7b7b7d80f06f74c76df65c41)
+
+1.5.0
+-----
+* [Add `MultiJson.with_adapter` method](https://github.com/intridea/multi_json/commit/d14c5d28cae96557a0421298621b9499e1f28104)
+* [Stringify all possible keys for `ok_json`](https://github.com/intridea/multi_json/commit/73998074058e1e58c557ffa7b9541d486d6041fa)
+
+1.4.0
+-----
+* [Allow `load`/`dump` of JSON fragments](https://github.com/intridea/multi_json/commit/707aae7d48d39c85b38febbd2c210ba87f6e4a36)
+
+1.3.7
+-----
+* [Fix rescue clause for MagLev](https://github.com/intridea/multi_json/commit/39abdf50199828c50e85b2ce8f8ba31fcbbc9332)
+* [Remove unnecessary check for string version of options key](https://github.com/intridea/multi_json/commit/660101b70e962b3c007d0b90d45944fa47d13ec4)
+* [Explicitly set default adapter when adapter is set to `nil` or `false`](https://github.com/intridea/multi_json/commit/a9e587d5a63eafb4baee9fb211265e4dd96a26bc)
+* [Fix Oj `ParseError` mapping for Oj 1.4.0](https://github.com/intridea/multi_json/commit/7d9045338cc9029401c16f3c409d54ce97f275e2)
+
+1.3.6
+-----
+* [Allow adapter-specific options to be passed through to Oj](https://github.com/intridea/multi_json/commit/d0e5feeebcba0bc69400dd203a295f5c30971223)
+
+1.3.5
+-----
+* [Add pretty support to Oj adapter](https://github.com/intridea/multi_json/commit/0c8f75f03020c53bcf4c6be258faf433d24b2c2b)
+
+1.3.4
+-----
+* [Use `class << self` instead of `module_function` to create aliases](https://github.com/intridea/multi_json/commit/ba1451c4c48baa297e049889be241a424cb05980)
+
+1.3.3
+-----
+* [Remove deprecation warnings](https://github.com/intridea/multi_json/commit/36b524e71544eb0186826a891bcc03b2820a008f)
+
+1.3.2
+-----
+* [Add ability to use adapter per call](https://github.com/intridea/multi_json/commit/106bbec469d5d0a832bfa31fffcb8c0f0cdc9bd3)
+* [Add and deprecate `default_engine` method](https://github.com/intridea/multi_json/commit/fc3df0c7a3e2ab9ce0c2c7e7617a4da97dd13f6e)
+
+1.3.1
+-----
+* [Only warn once for each instance a deprecated method is called](https://github.com/intridea/multi_json/commit/e21d6eb7da74b3f283995c1d27d5880e75f0ae84)
+
+1.3.0
+-----
+* [Implement `load`/`dump`; deprecate `decode`/`encode`](https://github.com/intridea/multi_json/commit/e90fd6cb1b0293eb0c73c2f4eb0f7a1764370216)
+* [Rename engines to adapters](https://github.com/intridea/multi_json/commit/ae7fd144a7949a9c221dcaa446196ec23db908df)
+
+1.2.0
+-----
+* [Add support for Oj](https://github.com/intridea/multi_json/commit/acd06b233edabe6c44f226873db7b49dab560c60)
+
+1.1.0
+-----
+* [`NSJSONSerialization` support for MacRuby](https://github.com/intridea/multi_json/commit/f862e2fc966cac8867fe7da3997fc76e8a6cf5d4)
+
+1.0.4
+-----
+* [Set data context to `DecodeError` exception](https://github.com/intridea/multi_json/commit/19ddafd44029c6681f66fae2a0f6eabfd0f85176)
+* [Allow `ok_json` to fallback to `to_json`](https://github.com/intridea/multi_json/commit/c157240b1193b283d06d1bd4d4b5b06bcf3761f8)
+* [Add warning when using `ok_json`](https://github.com/intridea/multi_json/commit/dd4b68810c84f826fb98f9713bfb29ab96888d57)
+* [Options can be passed to an engine on encode](https://github.com/intridea/multi_json/commit/e0a7ff5d5ff621ffccc61617ed8aeec5816e81f7)
+
+1.0.3
+-----
+* [`Array` support for `stringify_keys`](https://github.com/intridea/multi_json/commit/644d1c5c7c7f6a27663b11668527b346094e38b9)
+* [`Array` support for `symbolize_keys`](https://github.com/intridea/multi_json/commit/c885377d47a2aa39cb0d971fea78db2d2fa479a7)
+
+1.0.2
+-----
+* [Allow encoding of rootless JSON when `ok_json` is used](https://github.com/intridea/multi_json/commit/d1cde7de97cb0f6152aef8daf14037521cdce8c6)
+
+1.0.1
+-----
+* [Correct an issue with `ok_json` not being returned as the default engine](https://github.com/intridea/multi_json/commit/d33c141619c54cccd770199694da8fd1bd8f449d)
+
+1.0.0
+-----
+* [Remove `ActiveSupport::JSON` support](https://github.com/intridea/multi_json/commit/c2f4140141d785a24b3f56e58811b0e561b37f6a)
+* [Fix `@engine` ivar warning](https://github.com/intridea/multi_json/commit/3b978a8995721a8dffedc3b75a7f49e5494ec553)
+* [Only `rescue` from parsing errors during decoding, not any `StandardError`](https://github.com/intridea/multi_json/commit/391d00b5e85294d42d41347605d8d46b4a7f66cc)
+* [Rename `okjson` engine and vendored lib to `ok_json`](https://github.com/intridea/multi_json/commit/5bd1afc977a8208ddb0443e1d57cb79665c019f1)
+* [Add `StringIO` support to `json` gem and `ok_json`](https://github.com/intridea/multi_json/commit/1706b11568db7f50af451fce5f4d679aeb3bbe8f)
+
+0.0.5
+-----
+* [Trap all JSON decoding errors; raise `MultiJson::DecodeError`](https://github.com/intridea/multi_json/commit/dea9a1aef6dd1212aa1e5a37ab1669f9b045b732)
+
+0.0.4
+-----
+* [Fix default_engine check for `json` gem](https://github.com/intridea/multi_json/commit/caced0c4e8c795922a109ebc00c3c4fa8635bed8)
+* [Make requirement mapper an `Array` to preserve order in Ruby versions < 1.9](https://github.com/intridea/multi_json/commit/526f5f29a42131574a088ad9bbb43d7f48439b2c)
+
+0.0.3
+-----
+* [Improve defaulting and documentation](https://github.com/sferik/twitter/commit/3a0e41b9e4b0909201045fa47704b78c9d949b73)
+
+0.0.2
+-----
+
+* [Rename to `multi_json`](https://github.com/sferik/twitter/commit/461ab89ce071c8c9fabfc183581e0ec523788b62)
+
+0.0.1
+-----
+
+* [Initial commit](https://github.com/sferik/twitter/commit/518c21ab299c500527491e6c049ab2229e22a805)
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/CONTRIBUTING.md b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/CONTRIBUTING.md
new file mode 100644
index 0000000..3e8bfd5
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/CONTRIBUTING.md
@@ -0,0 +1,46 @@
+## Contributing
+In the spirit of [free software][free-sw], **everyone** is encouraged to help
+improve this project.
+
+[free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
+
+Here are some ways *you* can contribute:
+
+* by using alpha, beta, and prerelease versions
+* by reporting bugs
+* by suggesting new features
+* by writing or editing documentation
+* by writing specifications
+* by writing code (**no patch is too small**: fix typos, add comments, clean up
+  inconsistent whitespace)
+* by refactoring code
+* by closing [issues][]
+* by reviewing patches
+
+[issues]: https://github.com/intridea/multi_json/issues
+
+## Submitting an Issue
+We use the [GitHub issue tracker][issues] to track bugs and features. Before
+submitting a bug report or feature request, check to make sure it hasn't
+already been submitted. When submitting a bug report, please include a [Gist][]
+that includes a stack trace and any details that may be necessary to reproduce
+the bug, including your gem version, Ruby version, and operating system.
+Ideally, a bug report should include a pull request with failing specs.
+
+[gist]: https://gist.github.com/
+
+## Submitting a Pull Request
+1. [Fork the repository.][fork]
+2. [Create a topic branch.][branch]
+3. Add specs for your unimplemented feature or bug fix.
+4. Run `bundle exec rake spec`. If your specs pass, return to step 3.
+5. Implement your feature or bug fix.
+6. Run `bundle exec rake spec`. If your specs fail, return to step 5.
+7. Run `open coverage/index.html`. If your changes are not completely covered
+   by your tests, return to step 3.
+8. Add, commit, and push your changes.
+9. [Submit a pull request.][pr]
+
+[fork]: http://help.github.com/fork-a-repo/
+[branch]: http://learn.github.com/p/branching.html
+[pr]: http://help.github.com/send-pull-requests/
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/Gemfile b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/Gemfile
new file mode 100644
index 0000000..af0eec5
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/Gemfile
@@ -0,0 +1,31 @@
+source 'https://rubygems.org'
+
+gem 'rake', '>= 0.9'
+gem 'yard', '>= 0.8'
+
+gem 'json',      '~> 1.4', :require => nil
+gem 'json_pure', '~> 1.4', :require => nil
+
+platforms :ruby, :mswin, :mingw do
+  gem 'oj', '~> 2.0', :require => nil
+  gem 'yajl-ruby', '~> 1.0', :require => nil
+end
+
+platforms :jruby do
+  gem 'gson', '>= 0.6', :require => nil
+  gem 'jrjackson', '~> 0.1.1', :require => nil
+end
+
+group :development do
+  gem 'kramdown', '>= 0.14'
+  gem 'pry'
+  gem 'pry-debugger', :platforms => :mri_19
+end
+
+group :test do
+  gem 'coveralls', :require => false
+  gem 'rspec', '>= 2.11'
+  gem 'simplecov', :require => false
+end
+
+gemspec
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/LICENSE.md b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/LICENSE.md
new file mode 100644
index 0000000..1768f37
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/LICENSE.md
@@ -0,0 +1,20 @@
+Copyright (c) 2010-2013 Michael Bleigh, Josh Kalderimis, Erik Michaels-Ober, Pavel Pravosud
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/README.md b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/README.md
new file mode 100644
index 0000000..57cca4b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/README.md
@@ -0,0 +1,109 @@
+# MultiJSON
+
+[![Gem Version](https://badge.fury.io/rb/multi_json.png)][gem]
+[![Build Status](https://secure.travis-ci.org/intridea/multi_json.png?branch=master)][travis]
+[![Dependency Status](https://gemnasium.com/intridea/multi_json.png?travis)][gemnasium]
+[![Code Climate](https://codeclimate.com/github/intridea/multi_json.png)][codeclimate]
+[![Coverage Status](https://coveralls.io/repos/intridea/multi_json/badge.png?branch=master)][coveralls]
+
+[gem]: https://rubygems.org/gems/multi_json
+[travis]: http://travis-ci.org/intridea/multi_json
+[gemnasium]: https://gemnasium.com/intridea/multi_json
+[codeclimate]: https://codeclimate.com/github/intridea/multi_json
+[coveralls]: https://coveralls.io/r/intridea/multi_json
+
+Lots of Ruby libraries parse JSON and everyone has their favorite JSON coder.
+Instead of choosing a single JSON coder and forcing users of your library to be
+stuck with it, you can use MultiJSON instead, which will simply choose the
+fastest available JSON coder. Here's how to use it:
+
+```ruby
+require 'multi_json'
+
+MultiJson.load('{"abc":"def"}') #=> {"abc" => "def"}
+MultiJson.load('{"abc":"def"}', :symbolize_keys => true) #=> {:abc => "def"}
+MultiJson.dump({:abc => 'def'}) # convert Ruby back to JSON
+MultiJson.dump({:abc => 'def'}, :pretty => true) # encoded in a pretty form (if supported by the coder)
+```
+
+When loading invalid JSON, multiJSON will throw a `MultiJson::LoadError`. `MultiJson::DecodeError` is an alias for backwards compatibility.
+
+```ruby
+MultiJson.load('invalid json') #=> MultiJson::LoadError
+```
+
+The `use` method, which sets the MultiJson adapter, takes either a symbol or a
+class (to allow for custom JSON parsers) that responds to both `.load` and `.dump`
+at the class level.
+
+MultiJSON tries to have intelligent defaulting. That is, if you have any of the
+supported engines already loaded, it will utilize them before attempting to
+load any. When loading, libraries are ordered by speed. First Oj, then Yajl,
+then the JSON gem, then JSON pure. If no other JSON library is available,
+MultiJSON falls back to [OkJson][], a simple, vendorable JSON parser.
+
+[okjson]: https://github.com/kr/okjson
+
+## Supported JSON Engines
+
+* [Oj](https://github.com/ohler55/oj) Optimized JSON by Peter Ohler
+* [Yajl](https://github.com/brianmario/yajl-ruby) Yet Another JSON Library by Brian Lopez
+* [JSON](https://github.com/flori/json) The default JSON gem with C-extensions (ships with Ruby 1.9)
+* [JSON Pure](https://github.com/flori/json) A Ruby variant of the JSON gem
+* [NSJSONSerialization](https://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html) Wrapper for Apple's NSJSONSerialization in the Cocoa Framework (MacRuby only)
+* [gson.rb](https://github.com/avsej/gson.rb) A Ruby wrapper for google-gson library (JRuby only)
+* [JrJackson](https://github.com/guyboertje/jrjackson) JRuby wrapper for Jackson (JRuby only)
+* [OkJson][okjson] A simple, vendorable JSON parser
+
+## Supported Ruby Versions
+This library aims to support and is [tested against][travis] the following Ruby
+implementations:
+
+* Ruby 1.8.7
+* Ruby 1.9.2
+* Ruby 1.9.3
+* Ruby 2.0.0
+* [JRuby][]
+* [Rubinius][]
+* [MacRuby][] (not tested on Travis CI)
+
+[jruby]: http://www.jruby.org/
+[rubinius]: http://rubini.us/
+[macruby]: http://www.macruby.org/
+
+If something doesn't work on one of these interpreters, it's a bug.
+
+This library may inadvertently work (or seem to work) on other Ruby
+implementations, however support will only be provided for the versions listed
+above.
+
+If you would like this library to support another Ruby version, you may
+volunteer to be a maintainer. Being a maintainer entails making sure all tests
+run and pass on that implementation. When something breaks on your
+implementation, you will be responsible for providing patches in a timely
+fashion. If critical issues for a particular implementation exist at the time
+of a major release, support for that Ruby version may be dropped.
+
+## Versioning
+
+This library aims to adhere to [Semantic Versioning 2.0.0][semver]. Violations
+of this scheme should be reported as bugs. Specifically, if a minor or patch
+version is released that breaks backward compatibility, that version should be
+immediately yanked and/or a new version should be immediately released that
+restores compatibility. Breaking changes to the public API will only be
+introduced with new major versions. As a result of this policy, you can (and
+should) specify a dependency on this gem using the [Pessimistic Version
+Constraint][pvc] with two digits of precision. For example:
+
+```ruby
+spec.add_dependency 'multi_json', '~> 1.0'
+```
+
+[semver]: http://semver.org/
+[pvc]: http://docs.rubygems.org/read/chapter/16#page74
+
+## Copyright
+Copyright (c) 2010-2013 Michael Bleigh, Josh Kalderimis, Erik Michaels-Ober,
+and Pavel Pravosud. See [LICENSE][] for details.
+
+[license]: LICENSE.md
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/Rakefile b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/Rakefile
new file mode 100644
index 0000000..7f64120
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/Rakefile
@@ -0,0 +1,12 @@
+require 'bundler'
+Bundler::GemHelper.install_tasks
+
+require 'rspec/core/rake_task'
+desc "Run all examples"
+RSpec::Core::RakeTask.new(:spec)
+
+task :default => :spec
+task :test => :spec
+
+require 'yard'
+YARD::Rake::YardocTask.new
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json.rb
new file mode 100644
index 0000000..6588a84
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json.rb
@@ -0,0 +1,160 @@
+require 'multi_json/options'
+require 'multi_json/version'
+
+module MultiJson
+  include Options
+  extend self
+
+  class << self
+    def cached_options
+      @cached_options || reset_cached_options!
+    end
+
+    def reset_cached_options!
+      @cached_options = {}
+    end
+  end
+
+  class LoadError < StandardError
+    attr_reader :data
+    def initialize(message='', backtrace=[], data='')
+      super(message)
+      self.set_backtrace(backtrace)
+      @data = data
+    end
+  end
+  DecodeError = LoadError # Legacy support
+
+  # Since `default_options` is deprecated, the
+  # reader is aliased to `dump_options` and the
+  # writer sets both `dump_options` and `load_options`
+  alias default_options dump_options
+
+  def default_options=(value)
+    Kernel.warn "MultiJson.default_options setter is deprecated\n" +
+      "Use MultiJson.load_options and MultiJson.dump_options instead"
+
+    self.load_options = self.dump_options = value
+  end
+
+  ALIASES = { 'jrjackson' => :jr_jackson }
+
+  REQUIREMENT_MAP = [
+    ['oj',           :oj],
+    ['yajl',         :yajl],
+    ['json/ext',     :json_gem],
+    ['gson',         :gson],
+    ['jrjackson',    :jr_jackson],
+    ['json/pure',    :json_pure]
+  ]
+
+  # The default adapter based on what you currently
+  # have loaded and installed. First checks to see
+  # if any adapters are already loaded, then checks
+  # to see which are installed if none are loaded.
+  def default_adapter
+    return :oj if defined?(::Oj)
+    return :yajl if defined?(::Yajl)
+    return :json_gem if defined?(::JSON)
+    return :gson if defined?(::Gson)
+    return :jr_jackson if defined?(::JrJackson)
+
+    REQUIREMENT_MAP.each do |library, adapter|
+      begin
+        require library
+        return adapter
+      rescue ::LoadError
+        next
+      end
+    end
+
+    Kernel.warn '[WARNING] MultiJson is using the default adapter (ok_json). We recommend loading a different JSON library to improve performance.'
+    :ok_json
+  end
+  alias default_engine default_adapter
+
+  # Get the current adapter class.
+  def adapter
+    return @adapter if defined?(@adapter) && @adapter
+
+    self.use nil # load default adapter
+
+    @adapter
+  end
+  alias engine adapter
+
+  # Set the JSON parser utilizing a symbol, string, or class.
+  # Supported by default are:
+  #
+  # * <tt>:oj</tt>
+  # * <tt>:json_gem</tt>
+  # * <tt>:json_pure</tt>
+  # * <tt>:ok_json</tt>
+  # * <tt>:yajl</tt>
+  # * <tt>:nsjsonserialization</tt> (MacRuby only)
+  # * <tt>:gson</tt> (JRuby only)
+  # * <tt>:jr_jackson</tt> (JRuby only)
+  def use(new_adapter)
+    @adapter = load_adapter(new_adapter)
+  end
+  alias adapter= use
+  alias engine= use
+
+  def load_adapter(new_adapter)
+    case new_adapter
+    when String, Symbol
+      new_adapter = ALIASES.fetch(new_adapter.to_s, new_adapter)
+      require "multi_json/adapters/#{new_adapter}"
+      klass_name = new_adapter.to_s.split('_').map(&:capitalize) * ''
+      MultiJson::Adapters.const_get(klass_name)
+    when NilClass, FalseClass
+      load_adapter default_adapter
+    when Class, Module
+      new_adapter
+    else
+      raise NameError
+    end
+  rescue NameError, ::LoadError
+    raise ArgumentError, 'Did not recognize your adapter specification.'
+  end
+
+  # Decode a JSON string into Ruby.
+  #
+  # <b>Options</b>
+  #
+  # <tt>:symbolize_keys</tt> :: If true, will use symbols instead of strings for the keys.
+  # <tt>:adapter</tt> :: If set, the selected adapter will be used for this call.
+  def load(string, options={})
+    adapter = current_adapter(options)
+    begin
+      adapter.load(string, options)
+    rescue adapter::ParseError => exception
+      raise LoadError.new(exception.message, exception.backtrace, string)
+    end
+  end
+  alias decode load
+
+  def current_adapter(options={})
+    if new_adapter = options[:adapter]
+      load_adapter(new_adapter)
+    else
+      adapter
+    end
+  end
+
+  # Encodes a Ruby object as JSON.
+  def dump(object, options={})
+    current_adapter(options).dump(object, options)
+  end
+  alias encode dump
+
+  #  Executes passed block using specified adapter.
+  def with_adapter(new_adapter)
+    old_adapter, self.adapter = adapter, new_adapter
+    yield
+  ensure
+    self.adapter = old_adapter
+  end
+  alias with_engine with_adapter
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapter.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapter.rb
new file mode 100644
index 0000000..f6bcbb8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapter.rb
@@ -0,0 +1,48 @@
+require 'singleton'
+require 'multi_json/options'
+
+module MultiJson
+  class Adapter
+    extend Options
+    include Singleton
+    class << self
+
+      def defaults(action, value)
+        metaclass = class << self; self; end
+
+        metaclass.instance_eval do
+          define_method("default_#{action}_options"){ value }
+        end
+      end
+
+      def load(string, options={})
+        instance.load(string, collect_load_options(options).clone)
+      end
+
+      def dump(object, options={})
+        instance.dump(object, collect_dump_options(options).clone)
+      end
+
+    protected
+
+      def collect_load_options(options)
+        cache('load', options){ collect_options(:load_options, options).merge(options) }
+      end
+
+      def collect_dump_options(options)
+        cache('dump', options){ collect_options(:dump_options, options).merge(options) }
+      end
+
+      def collect_options(method, *args)
+        global, local = *[MultiJson, self].map{ |r| r.send(method, *args) }
+        local.merge(global)
+      end
+
+      def cache(method, options)
+        cache_key = [self, options].map(&:hash).join + method
+        MultiJson.cached_options[cache_key] ||= yield
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/gson.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/gson.rb
new file mode 100644
index 0000000..bc80ce4
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/gson.rb
@@ -0,0 +1,19 @@
+require 'gson' unless defined?(::Gson)
+require 'multi_json/adapter'
+
+module MultiJson
+  module Adapters
+    # Use the gson.rb library to dump/load.
+    class Gson < Adapter
+      ParseError = ::Gson::DecodeError
+
+      def load(string, options={})
+        ::Gson::Decoder.new(options).decode(string)
+      end
+
+      def dump(object, options={})
+        ::Gson::Encoder.new(options).encode(object)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/jr_jackson.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/jr_jackson.rb
new file mode 100644
index 0000000..ab70dfa
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/jr_jackson.rb
@@ -0,0 +1,19 @@
+require 'jrjackson' unless defined?(::JrJackson)
+require 'multi_json/adapter'
+
+module MultiJson
+  module Adapters
+    # Use the jrjackson.rb library to dump/load.
+    class JrJackson < Adapter
+      ParseError = ::JrJackson::ParseError
+
+      def load(string, options={}) #:nodoc:
+        ::JrJackson::Json.load(string, options)
+      end
+
+      def dump(object, options={}) #:nodoc:
+        ::JrJackson::Json.dump(object)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/json_common.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/json_common.rb
new file mode 100644
index 0000000..e48cca2
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/json_common.rb
@@ -0,0 +1,25 @@
+require 'multi_json/adapter'
+
+module MultiJson
+  module Adapters
+    class JsonCommon < Adapter
+      defaults :load, :create_additions => false, :quirks_mode => true
+
+      def load(string, options={})
+        string = string.read if string.respond_to?(:read)
+
+        if string.respond_to?(:force_encoding)
+          string = string.dup.force_encoding(::Encoding::ASCII_8BIT)
+        end
+
+        options[:symbolize_names] = true if options.delete(:symbolize_keys)
+        ::JSON.parse(string, options)
+      end
+
+      def dump(object, options={})
+        options.merge!(::JSON::PRETTY_STATE_PROTOTYPE.to_h) if options.delete(:pretty)
+        object.to_json(options)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/json_gem.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/json_gem.rb
new file mode 100644
index 0000000..6fd5cbc
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/json_gem.rb
@@ -0,0 +1,11 @@
+require 'json' unless defined?(::JSON)
+require 'multi_json/adapters/json_common'
+
+module MultiJson
+  module Adapters
+    # Use the JSON gem to dump/load.
+    class JsonGem < JsonCommon
+      ParseError = ::JSON::ParserError
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/json_pure.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/json_pure.rb
new file mode 100644
index 0000000..9f8ad8d
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/json_pure.rb
@@ -0,0 +1,11 @@
+require 'json/pure' unless defined?(::JSON)
+require 'multi_json/adapters/json_common'
+
+module MultiJson
+  module Adapters
+    # Use JSON pure to dump/load.
+    class JsonPure < JsonCommon
+      ParseError = ::JSON::ParserError
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/nsjsonserialization.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/nsjsonserialization.rb
new file mode 100644
index 0000000..a50d596
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/nsjsonserialization.rb
@@ -0,0 +1,34 @@
+framework 'Foundation'
+require 'multi_json/adapters/ok_json'
+
+module MultiJson
+  module Adapters
+    class Nsjsonserialization < MultiJson::Adapters::OkJson
+      ParseError = ::MultiJson::OkJson::Error
+
+      def load(string, options={})
+        string = string.read if string.respond_to?(:read)
+        data = string.dataUsingEncoding(NSUTF8StringEncoding)
+        object = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves, error: nil)
+        if object
+          object = symbolize_keys(object) if options[:symbolize_keys]
+          object
+        else
+          super(string, options={})
+        end
+      end
+
+      def dump(object, options={})
+        pretty = options[:pretty] ? NSJSONWritingPrettyPrinted : 0
+        object = object.as_json if object.respond_to?(:as_json)
+        if NSJSONSerialization.isValidJSONObject(object)
+          data = NSJSONSerialization.dataWithJSONObject(object, options: pretty, error: nil)
+          NSMutableString.alloc.initWithData(data, encoding: NSUTF8StringEncoding)
+        else
+          super(object, options)
+        end
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/oj.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/oj.rb
new file mode 100644
index 0000000..30b4306
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/oj.rb
@@ -0,0 +1,24 @@
+require 'oj' unless defined?(::Oj)
+require 'multi_json/adapter'
+
+module MultiJson
+  module Adapters
+    # Use the Oj library to dump/load.
+    class Oj < Adapter
+      defaults :load, :mode => :strict, :symbolize_keys => false
+      defaults :dump, :mode => :compat, :time_format => :ruby
+
+      ParseError = defined?(::Oj::ParseError) ? ::Oj::ParseError : SyntaxError
+
+      def load(string, options={})
+        options[:symbol_keys] = options.delete(:symbolize_keys)
+        ::Oj.load(string, options)
+      end
+
+      def dump(object, options={})
+        options.merge!(:indent => 2) if options[:pretty]
+        ::Oj.dump(object, options)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/ok_json.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/ok_json.rb
new file mode 100644
index 0000000..c8432ba
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/ok_json.rb
@@ -0,0 +1,22 @@
+require 'multi_json/adapter'
+require 'multi_json/convertible_hash_keys'
+require 'multi_json/vendor/okjson'
+
+module MultiJson
+  module Adapters
+    class OkJson < Adapter
+      include ConvertibleHashKeys
+      ParseError = ::MultiJson::OkJson::Error
+
+      def load(string, options={})
+        string = string.read if string.respond_to?(:read)
+        result = ::MultiJson::OkJson.decode("[#{string}]").first
+        options[:symbolize_keys] ? symbolize_keys(result) : result
+      end
+
+      def dump(object, options={})
+        ::MultiJson::OkJson.valenc(stringify_keys(object))
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/yajl.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/yajl.rb
new file mode 100644
index 0000000..21f67d5
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/adapters/yajl.rb
@@ -0,0 +1,19 @@
+require 'yajl' unless defined?(::Yajl)
+require 'multi_json/adapter'
+
+module MultiJson
+  module Adapters
+    # Use the Yajl-Ruby library to dump/load.
+    class Yajl < Adapter
+      ParseError = ::Yajl::ParseError
+
+      def load(string, options={})
+        ::Yajl::Parser.new(:symbolize_keys => options[:symbolize_keys]).parse(string)
+      end
+
+      def dump(object, options={})
+        ::Yajl::Encoder.encode(object, options)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/convertible_hash_keys.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/convertible_hash_keys.rb
new file mode 100644
index 0000000..184425f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/convertible_hash_keys.rb
@@ -0,0 +1,43 @@
+module MultiJson
+  module ConvertibleHashKeys
+    private
+
+    def symbolize_keys(object)
+      prepare_object(object) do |key|
+        key.respond_to?(:to_sym) ? key.to_sym : key
+      end
+    end
+
+    def stringify_keys(object)
+      prepare_object(object) do |key|
+        key.respond_to?(:to_s) ? key.to_s : key
+      end
+    end
+
+    def prepare_object(object, &key_modifier)
+      return object unless block_given?
+      case object
+      when Array
+        object.map do |value|
+          prepare_object(value, &key_modifier)
+        end
+      when Hash
+        object.inject({}) do |result, (key, value)|
+          new_key   = key_modifier.call(key)
+          new_value = prepare_object(value, &key_modifier)
+          result.merge! new_key => new_value
+        end
+      when String, Numeric, true, false, nil
+        object
+      else
+        if object.respond_to?(:to_json)
+          object
+        elsif object.respond_to?(:to_s)
+          object.to_s
+        else
+          object
+        end
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/options.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/options.rb
new file mode 100644
index 0000000..78fefb1
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/options.rb
@@ -0,0 +1,48 @@
+module MultiJson
+  module Options
+
+    def load_options=(options)
+      MultiJson.reset_cached_options!
+      @load_options = options
+    end
+
+    def dump_options=(options)
+      MultiJson.reset_cached_options!
+      @dump_options = options
+    end
+
+    def load_options(*args)
+      get_options :load_options, *args
+    end
+
+    def dump_options(*args)
+      get_options :dump_options, *args
+    end
+
+    def default_load_options
+      @default_load_options ||= {}
+    end
+
+    def default_dump_options
+      @default_dump_options ||= {}
+    end
+
+    private
+
+    def get_options(ivar, *args)
+      defaults = send("default_#{ivar}")
+
+      return defaults unless instance_variable_defined?("@#{ivar}")
+
+      value = instance_variable_get("@#{ivar}")
+
+      if value.respond_to?(:call) and value.arity
+        value.arity == 0 ? value[] : value[*args]
+      elsif Hash === value or value.respond_to?(:to_hash)
+        value.to_hash
+      else
+        defaults
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/vendor/okjson.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/vendor/okjson.rb
new file mode 100644
index 0000000..9969ab2
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/vendor/okjson.rb
@@ -0,0 +1,600 @@
+# encoding: UTF-8
+#
+# Copyright 2011, 2012 Keith Rarick
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+# See https://github.com/kr/okjson for updates.
+
+require 'stringio'
+
+# Some parts adapted from
+# http://golang.org/src/pkg/json/decode.go and
+# http://golang.org/src/pkg/utf8/utf8.go
+module MultiJson
+  module OkJson
+    Upstream = '42'
+    extend self
+
+
+    # Decodes a json document in string s and
+    # returns the corresponding ruby value.
+    # String s must be valid UTF-8. If you have
+    # a string in some other encoding, convert
+    # it first.
+    #
+    # String values in the resulting structure
+    # will be UTF-8.
+    def decode(s)
+      ts = lex(s)
+      v, ts = textparse(ts)
+      if ts.length > 0
+        raise Error, 'trailing garbage'
+      end
+      v
+    end
+
+
+    # Encodes x into a json text. It may contain only
+    # Array, Hash, String, Numeric, true, false, nil.
+    # (Note, this list excludes Symbol.)
+    # X itself must be an Array or a Hash.
+    # No other value can be encoded, and an error will
+    # be raised if x contains any other value, such as
+    # Nan, Infinity, Symbol, and Proc, or if a Hash key
+    # is not a String.
+    # Strings contained in x must be valid UTF-8.
+    def encode(x)
+      case x
+      when Hash    then objenc(x)
+      when Array   then arrenc(x)
+      else valenc(x)
+      end
+    end
+
+
+    def valenc(x)
+      case x
+      when Hash    then objenc(x)
+      when Array   then arrenc(x)
+      when String  then strenc(x)
+      when Numeric then numenc(x)
+      when true    then "true"
+      when false   then "false"
+      when nil     then "null"
+      else
+        if x.respond_to?(:to_json)
+          x.to_json
+        else
+          raise Error, "cannot encode #{x.class}: #{x.inspect}"
+        end
+      end
+    end
+
+
+  private
+
+
+    # Parses a "json text" in the sense of RFC 4627.
+    # Returns the parsed value and any trailing tokens.
+    # Note: this is almost the same as valparse,
+    # except that it does not accept atomic values.
+    def textparse(ts)
+      if ts.length <= 0
+        raise Error, 'empty'
+      end
+
+      typ, _, val = ts[0]
+      case typ
+      when '{' then objparse(ts)
+      when '[' then arrparse(ts)
+      else
+        raise Error, "unexpected #{val.inspect}"
+      end
+    end
+
+
+    # Parses a "value" in the sense of RFC 4627.
+    # Returns the parsed value and any trailing tokens.
+    def valparse(ts)
+      if ts.length <= 0
+        raise Error, 'empty'
+      end
+
+      typ, _, val = ts[0]
+      case typ
+      when '{' then objparse(ts)
+      when '[' then arrparse(ts)
+      when :val,:str then [val, ts[1..-1]]
+      else
+        raise Error, "unexpected #{val.inspect}"
+      end
+    end
+
+
+    # Parses an "object" in the sense of RFC 4627.
+    # Returns the parsed value and any trailing tokens.
+    def objparse(ts)
+      ts = eat('{', ts)
+      obj = {}
+
+      if ts[0][0] == '}'
+        return obj, ts[1..-1]
+      end
+
+      k, v, ts = pairparse(ts)
+      obj[k] = v
+
+      if ts[0][0] == '}'
+        return obj, ts[1..-1]
+      end
+
+      loop do
+        ts = eat(',', ts)
+
+        k, v, ts = pairparse(ts)
+        obj[k] = v
+
+        if ts[0][0] == '}'
+          return obj, ts[1..-1]
+        end
+      end
+    end
+
+
+    # Parses a "member" in the sense of RFC 4627.
+    # Returns the parsed values and any trailing tokens.
+    def pairparse(ts)
+      (typ, _, k), ts = ts[0], ts[1..-1]
+      if typ != :str
+        raise Error, "unexpected #{k.inspect}"
+      end
+      ts = eat(':', ts)
+      v, ts = valparse(ts)
+      [k, v, ts]
+    end
+
+
+    # Parses an "array" in the sense of RFC 4627.
+    # Returns the parsed value and any trailing tokens.
+    def arrparse(ts)
+      ts = eat('[', ts)
+      arr = []
+
+      if ts[0][0] == ']'
+        return arr, ts[1..-1]
+      end
+
+      v, ts = valparse(ts)
+      arr << v
+
+      if ts[0][0] == ']'
+        return arr, ts[1..-1]
+      end
+
+      loop do
+        ts = eat(',', ts)
+
+        v, ts = valparse(ts)
+        arr << v
+
+        if ts[0][0] == ']'
+          return arr, ts[1..-1]
+        end
+      end
+    end
+
+
+    def eat(typ, ts)
+      if ts[0][0] != typ
+        raise Error, "expected #{typ} (got #{ts[0].inspect})"
+      end
+      ts[1..-1]
+    end
+
+
+    # Scans s and returns a list of json tokens,
+    # excluding white space (as defined in RFC 4627).
+    def lex(s)
+      ts = []
+      while s.length > 0
+        typ, lexeme, val = tok(s)
+        if typ == nil
+          raise Error, "invalid character at #{s[0,10].inspect}"
+        end
+        if typ != :space
+          ts << [typ, lexeme, val]
+        end
+        s = s[lexeme.length..-1]
+      end
+      ts
+    end
+
+
+    # Scans the first token in s and
+    # returns a 3-element list, or nil
+    # if s does not begin with a valid token.
+    #
+    # The first list element is one of
+    # '{', '}', ':', ',', '[', ']',
+    # :val, :str, and :space.
+    #
+    # The second element is the lexeme.
+    #
+    # The third element is the value of the
+    # token for :val and :str, otherwise
+    # it is the lexeme.
+    def tok(s)
+      case s[0]
+      when ?{ then ['{', s[0,1], s[0,1]]
+      when ?} then ['}', s[0,1], s[0,1]]
+      when ?: then [':', s[0,1], s[0,1]]
+      when ?, then [',', s[0,1], s[0,1]]
+      when ?[ then ['[', s[0,1], s[0,1]]
+      when ?] then [']', s[0,1], s[0,1]]
+      when ?n then nulltok(s)
+      when ?t then truetok(s)
+      when ?f then falsetok(s)
+      when ?" then strtok(s)
+      when Spc, ?\t, ?\n, ?\r then [:space, s[0,1], s[0,1]]
+      else
+        numtok(s)
+      end
+    end
+
+
+    def nulltok(s);  s[0,4] == 'null'  ? [:val, 'null',  nil]   : [] end
+    def truetok(s);  s[0,4] == 'true'  ? [:val, 'true',  true]  : [] end
+    def falsetok(s); s[0,5] == 'false' ? [:val, 'false', false] : [] end
+
+
+    def numtok(s)
+      m = /-?([1-9][0-9]+|[0-9])([.][0-9]+)?([eE][+-]?[0-9]+)?/.match(s)
+      if m && m.begin(0) == 0
+        if !m[2] && !m[3]
+          [:val, m[0], Integer(m[0])]
+        elsif m[2]
+          [:val, m[0], Float(m[0])]
+        else
+          [:val, m[0], Integer(m[1])*(10**Integer(m[3][1..-1]))]
+        end
+      else
+        []
+      end
+    end
+
+
+    def strtok(s)
+      m = /"([^"\\]|\\["\/\\bfnrt]|\\u[0-9a-fA-F]{4})*"/.match(s)
+      if ! m
+        raise Error, "invalid string literal at #{abbrev(s)}"
+      end
+      [:str, m[0], unquote(m[0])]
+    end
+
+
+    def abbrev(s)
+      t = s[0,10]
+      p = t['`']
+      t = t[0,p] if p
+      t = t + '...' if t.length < s.length
+      '`' + t + '`'
+    end
+
+
+    # Converts a quoted json string literal q into a UTF-8-encoded string.
+    # The rules are different than for Ruby, so we cannot use eval.
+    # Unquote will raise an error if q contains control characters.
+    def unquote(q)
+      q = q[1...-1]
+      a = q.dup # allocate a big enough string
+      # In ruby >= 1.9, a[w] is a codepoint, not a byte.
+      if rubydoesenc?
+        a.force_encoding('UTF-8')
+      end
+      r, w = 0, 0
+      while r < q.length
+        c = q[r]
+        if c == ?\\
+          r += 1
+          if r >= q.length
+            raise Error, "string literal ends with a \"\\\": \"#{q}\""
+          end
+
+          case q[r]
+          when ?",?\\,?/,?'
+            a[w] = q[r]
+            r += 1
+            w += 1
+          when ?b,?f,?n,?r,?t
+            a[w] = Unesc[q[r]]
+            r += 1
+            w += 1
+          when ?u
+            r += 1
+            uchar = begin
+              hexdec4(q[r,4])
+            rescue RuntimeError => e
+              raise Error, "invalid escape sequence \\u#{q[r,4]}: #{e}"
+            end
+            r += 4
+            if surrogate? uchar
+              if q.length >= r+6
+                uchar1 = hexdec4(q[r+2,4])
+                uchar = subst(uchar, uchar1)
+                if uchar != Ucharerr
+                  # A valid pair; consume.
+                  r += 6
+                end
+              end
+            end
+            if rubydoesenc?
+              a[w] = '' << uchar
+              w += 1
+            else
+              w += ucharenc(a, w, uchar)
+            end
+          else
+            raise Error, "invalid escape char #{q[r]} in \"#{q}\""
+          end
+        elsif c == ?" || c < Spc
+          raise Error, "invalid character in string literal \"#{q}\""
+        else
+          # Copy anything else byte-for-byte.
+          # Valid UTF-8 will remain valid UTF-8.
+          # Invalid UTF-8 will remain invalid UTF-8.
+          # In ruby >= 1.9, c is a codepoint, not a byte,
+          # in which case this is still what we want.
+          a[w] = c
+          r += 1
+          w += 1
+        end
+      end
+      a[0,w]
+    end
+
+
+    # Encodes unicode character u as UTF-8
+    # bytes in string a at position i.
+    # Returns the number of bytes written.
+    def ucharenc(a, i, u)
+      if u <= Uchar1max
+        a[i] = (u & 0xff).chr
+        1
+      elsif u <= Uchar2max
+        a[i+0] = (Utag2 | ((u>>6)&0xff)).chr
+        a[i+1] = (Utagx | (u&Umaskx)).chr
+        2
+      elsif u <= Uchar3max
+        a[i+0] = (Utag3 | ((u>>12)&0xff)).chr
+        a[i+1] = (Utagx | ((u>>6)&Umaskx)).chr
+        a[i+2] = (Utagx | (u&Umaskx)).chr
+        3
+      else
+        a[i+0] = (Utag4 | ((u>>18)&0xff)).chr
+        a[i+1] = (Utagx | ((u>>12)&Umaskx)).chr
+        a[i+2] = (Utagx | ((u>>6)&Umaskx)).chr
+        a[i+3] = (Utagx | (u&Umaskx)).chr
+        4
+      end
+    end
+
+
+    def hexdec4(s)
+      if s.length != 4
+        raise Error, 'short'
+      end
+      (nibble(s[0])<<12) | (nibble(s[1])<<8) | (nibble(s[2])<<4) | nibble(s[3])
+    end
+
+
+    def subst(u1, u2)
+      if Usurr1 <= u1 && u1 < Usurr2 && Usurr2 <= u2 && u2 < Usurr3
+        return ((u1-Usurr1)<<10) | (u2-Usurr2) + Usurrself
+      end
+      return Ucharerr
+    end
+
+
+    def surrogate?(u)
+      Usurr1 <= u && u < Usurr3
+    end
+
+
+    def nibble(c)
+      if ?0 <= c && c <= ?9 then c.ord - ?0.ord
+      elsif ?a <= c && c <= ?z then c.ord - ?a.ord + 10
+      elsif ?A <= c && c <= ?Z then c.ord - ?A.ord + 10
+      else
+        raise Error, "invalid hex code #{c}"
+      end
+    end
+
+
+    def objenc(x)
+      '{' + x.map{|k,v| keyenc(k) + ':' + valenc(v)}.join(',') + '}'
+    end
+
+
+    def arrenc(a)
+      '[' + a.map{|x| valenc(x)}.join(',') + ']'
+    end
+
+
+    def keyenc(k)
+      case k
+      when String then strenc(k)
+      else
+        raise Error, "Hash key is not a string: #{k.inspect}"
+      end
+    end
+
+
+    def strenc(s)
+      t = StringIO.new
+      t.putc(?")
+      r = 0
+
+      while r < s.length
+        case s[r]
+        when ?"  then t.print('\\"')
+        when ?\\ then t.print('\\\\')
+        when ?\b then t.print('\\b')
+        when ?\f then t.print('\\f')
+        when ?\n then t.print('\\n')
+        when ?\r then t.print('\\r')
+        when ?\t then t.print('\\t')
+        else
+          c = s[r]
+          # In ruby >= 1.9, s[r] is a codepoint, not a byte.
+          if rubydoesenc?
+            begin
+              c.ord # will raise an error if c is invalid UTF-8
+              t.write(c)
+            rescue
+              t.write(Ustrerr)
+            end
+          elsif Spc <= c && c <= ?~
+            t.putc(c)
+          else
+            n = ucharcopy(t, s, r) # ensure valid UTF-8 output
+            r += n - 1 # r is incremented below
+          end
+        end
+        r += 1
+      end
+      t.putc(?")
+      t.string
+    end
+
+
+    def numenc(x)
+      if ((x.nan? || x.infinite?) rescue false)
+        raise Error, "Numeric cannot be represented: #{x}"
+      end
+      "#{x}"
+    end
+
+
+    # Copies the valid UTF-8 bytes of a single character
+    # from string s at position i to I/O object t, and
+    # returns the number of bytes copied.
+    # If no valid UTF-8 char exists at position i,
+    # ucharcopy writes Ustrerr and returns 1.
+    def ucharcopy(t, s, i)
+      n = s.length - i
+      raise Utf8Error if n < 1
+
+      c0 = s[i].ord
+
+      # 1-byte, 7-bit sequence?
+      if c0 < Utagx
+        t.putc(c0)
+        return 1
+      end
+
+      raise Utf8Error if c0 < Utag2 # unexpected continuation byte?
+
+      raise Utf8Error if n < 2 # need continuation byte
+      c1 = s[i+1].ord
+      raise Utf8Error if c1 < Utagx || Utag2 <= c1
+
+      # 2-byte, 11-bit sequence?
+      if c0 < Utag3
+        raise Utf8Error if ((c0&Umask2)<<6 | (c1&Umaskx)) <= Uchar1max
+        t.putc(c0)
+        t.putc(c1)
+        return 2
+      end
+
+      # need second continuation byte
+      raise Utf8Error if n < 3
+
+      c2 = s[i+2].ord
+      raise Utf8Error if c2 < Utagx || Utag2 <= c2
+
+      # 3-byte, 16-bit sequence?
+      if c0 < Utag4
+        u = (c0&Umask3)<<12 | (c1&Umaskx)<<6 | (c2&Umaskx)
+        raise Utf8Error if u <= Uchar2max
+        t.putc(c0)
+        t.putc(c1)
+        t.putc(c2)
+        return 3
+      end
+
+      # need third continuation byte
+      raise Utf8Error if n < 4
+      c3 = s[i+3].ord
+      raise Utf8Error if c3 < Utagx || Utag2 <= c3
+
+      # 4-byte, 21-bit sequence?
+      if c0 < Utag5
+        u = (c0&Umask4)<<18 | (c1&Umaskx)<<12 | (c2&Umaskx)<<6 | (c3&Umaskx)
+        raise Utf8Error if u <= Uchar3max
+        t.putc(c0)
+        t.putc(c1)
+        t.putc(c2)
+        t.putc(c3)
+        return 4
+      end
+
+      raise Utf8Error
+    rescue Utf8Error
+      t.write(Ustrerr)
+      return 1
+    end
+
+
+    def rubydoesenc?
+      ::String.method_defined?(:force_encoding)
+    end
+
+
+    class Utf8Error < ::StandardError
+    end
+
+
+    class Error < ::StandardError
+    end
+
+
+    Utagx = 0b1000_0000
+    Utag2 = 0b1100_0000
+    Utag3 = 0b1110_0000
+    Utag4 = 0b1111_0000
+    Utag5 = 0b1111_1000
+    Umaskx = 0b0011_1111
+    Umask2 = 0b0001_1111
+    Umask3 = 0b0000_1111
+    Umask4 = 0b0000_0111
+    Uchar1max = (1<<7) - 1
+    Uchar2max = (1<<11) - 1
+    Uchar3max = (1<<16) - 1
+    Ucharerr = 0xFFFD # unicode "replacement char"
+    Ustrerr = "\xef\xbf\xbd" # unicode "replacement char"
+    Usurrself = 0x10000
+    Usurr1 = 0xd800
+    Usurr2 = 0xdc00
+    Usurr3 = 0xe000
+
+    Spc = ' '[0]
+    Unesc = {?b=>?\b, ?f=>?\f, ?n=>?\n, ?r=>?\r, ?t=>?\t}
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/version.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/version.rb
new file mode 100644
index 0000000..ad81c90
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/lib/multi_json/version.rb
@@ -0,0 +1,20 @@
+module MultiJson
+  class Version
+    MAJOR = 1 unless defined? MultiJson::Version::MAJOR
+    MINOR = 7 unless defined? MultiJson::Version::MINOR
+    PATCH = 7 unless defined? MultiJson::Version::PATCH
+    PRE = nil unless defined? MultiJson::Version::PRE
+
+    class << self
+
+      # @return [String]
+      def to_s
+        [MAJOR, MINOR, PATCH, PRE].compact.join('.')
+      end
+
+    end
+
+  end
+
+  VERSION = Version.to_s.freeze
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/multi_json.gemspec b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/multi_json.gemspec
new file mode 100644
index 0000000..6f1b1f8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/multi_json.gemspec
@@ -0,0 +1,22 @@
+# coding: utf-8
+lib = File.expand_path('../lib', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+require 'multi_json/version'
+
+Gem::Specification.new do |spec|
+  spec.add_development_dependency 'bundler', '~> 1.0'
+  spec.authors       = ["Michael Bleigh", "Josh Kalderimis", "Erik Michaels-Ober", "Pavel Pravosud"]
+  spec.cert_chain    = %w(certs/sferik.pem)
+  spec.description   = %q{A common interface to multiple JSON libraries, including Oj, Yajl, the JSON gem (with C-extensions), the pure-Ruby JSON gem, NSJSONSerialization, gson.rb, JrJackson, and OkJson.}
+  spec.email         = ['michael at intridea.com', 'josh.kalderimis at gmail.com', 'sferik at gmail.com']
+  spec.files         = Dir['.yardopts', 'CHANGELOG.md', 'CONTRIBUTING.md', 'LICENSE.md', 'README.md', 'Rakefile', 'multi_json.gemspec', 'Gemfile', '.document', '.rspec', '.travis.yml' ,'spec/**/*', 'lib/**/*']
+  spec.homepage      = 'http://github.com/intridea/multi_json'
+  spec.licenses      = ['MIT']
+  spec.name          = 'multi_json'
+  spec.require_paths = ['lib']
+  spec.required_rubygems_version = '>= 1.3.5'
+  spec.signing_key   = File.expand_path("~/.gem/private_key.pem") if $0 =~ /gem\z/
+  spec.summary       = %q{A common interface to multiple JSON libraries.}
+  spec.test_files    = Dir['spec/**/*']
+  spec.version       = MultiJson::Version
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/adapter_shared_example.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/adapter_shared_example.rb
new file mode 100644
index 0000000..4df9387
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/adapter_shared_example.rb
@@ -0,0 +1,235 @@
+# encoding: UTF-8
+
+shared_examples_for 'an adapter' do |adapter|
+
+  before do
+    begin
+      MultiJson.use adapter
+    rescue LoadError
+      pending "Adapter #{adapter} couldn't be loaded (not installed?)"
+    end
+  end
+
+  it_behaves_like 'has options', lambda{ MultiJson.adapter }
+
+  it 'does not modify argument hashes' do
+    options = { :symbolize_keys => true, :pretty => false, :adapter => :json_pure }
+    expect{MultiJson.load('{}', options)}.to_not change{options}
+    expect{MultiJson.dump([42], options)}.to_not change{options}
+  end
+
+  describe '.dump' do
+    describe '#dump_options' do
+      before{ MultiJson.dump_options = MultiJson.adapter.dump_options = {} }
+
+      after do
+        MultiJson.adapter.instance.should_receive(:dump).with(1, :foo=>'bar', :fizz=>'buzz')
+        MultiJson.dump(1, :fizz => 'buzz')
+        MultiJson.dump_options = MultiJson.adapter.dump_options = nil
+      end
+
+      it 'respects global dump options' do
+        MultiJson.dump_options = {:foo => 'bar'}
+      end
+
+      it 'respects per-adapter dump options' do
+        MultiJson.adapter.dump_options = {:foo => 'bar'}
+      end
+
+      it 'adapter-specific are overridden by global options' do
+        MultiJson.adapter.dump_options = {:foo => 'foo'}
+        MultiJson.dump_options = {:foo => 'bar'}
+      end
+    end
+
+    it 'writes decodable JSON' do
+      [
+        {'abc' => 'def'},
+        [1, 2, 3, '4', true, false, nil]
+      ].each do |example|
+        expect(MultiJson.load(MultiJson.dump(example))).to eq example
+      end
+    end
+
+    unless 'json_pure' == adapter || 'json_gem' == adapter
+      it 'dumps time in correct format' do
+        time = Time.at(1355218745).utc
+
+        # time does not respond to to_json method
+        class << time
+          undef_method :to_json
+        end
+
+        dumped_json = MultiJson.dump(time)
+        expected = if RUBY_VERSION > '1.9'
+          '2012-12-11 09:39:05 UTC'
+        else
+          'Tue Dec 11 09:39:05 UTC 2012'
+        end
+        expect(MultiJson.load(dumped_json)).to eq expected
+      end
+    end
+
+    it 'dumps symbol and fixnum keys as strings' do
+      [
+        [
+          {:foo => {:bar => 'baz'}},
+          {'foo' => {'bar' => 'baz'}},
+        ],
+        [
+          [{:foo => {:bar => 'baz'}}],
+          [{'foo' => {'bar' => 'baz'}}],
+        ],
+        [
+          {:foo => [{:bar => 'baz'}]},
+          {'foo' => [{'bar' => 'baz'}]},
+        ],
+        [
+          {1 => {2 => {3 => 'bar'}}},
+          {'1' => {'2' => {'3' => 'bar'}}}
+        ]
+      ].each do |example, expected|
+        dumped_json = MultiJson.dump(example)
+        expect(MultiJson.load(dumped_json)).to eq expected
+      end
+    end
+
+    it 'dumps rootless JSON' do
+      expect(MultiJson.dump('random rootless string')).to eq '"random rootless string"'
+      expect(MultiJson.dump(123)).to eq '123'
+    end
+
+    it 'passes options to the adapter' do
+      MultiJson.adapter.should_receive(:dump).with('foo', {:bar => :baz})
+      MultiJson.dump('foo', :bar => :baz)
+    end
+
+    # This behavior is currently not supported by gson.rb
+    # See discussion at https://github.com/intridea/multi_json/pull/71
+    unless %w(gson jr_jackson).include?(adapter)
+      it 'dumps custom objects that implement to_json' do
+        klass = Class.new do
+          def to_json(*)
+            '"foobar"'
+          end
+        end
+        expect(MultiJson.dump(klass.new)).to eq '"foobar"'
+      end
+    end
+
+    it 'allows to dump JSON values' do
+      expect(MultiJson.dump(42)).to eq '42'
+    end
+
+    it 'allows to dump JSON with UTF-8 characters' do
+      expect(MultiJson.dump({'color' => 'żółć'})).to eq('{"color":"żółć"}')
+    end
+  end
+
+  describe '.load' do
+    describe '#load_options' do
+      before{ MultiJson.load_options = MultiJson.adapter.load_options = {} }
+
+      after do
+        MultiJson.adapter.instance.should_receive(:load).with('1', :foo => 'bar', :fizz => 'buzz')
+        MultiJson.load('1', :fizz => 'buzz')
+        MultiJson.load_options = MultiJson.adapter.load_options = nil
+      end
+
+      it 'respects global load options' do
+        MultiJson.load_options = {:foo => 'bar'}
+      end
+
+      it 'respects per-adapter load options' do
+        MultiJson.adapter.load_options = {:foo => 'bar'}
+      end
+
+      it 'adapter-specific are overridden by global options' do
+        MultiJson.adapter.load_options = {:foo => 'foo'}
+        MultiJson.load_options = {:foo => 'bar'}
+      end
+    end
+
+    it 'does not modify input' do
+      input = %Q{\n\n  {"foo":"bar"} \n\n\t}
+      expect{
+        MultiJson.load(input)
+      }.to_not change{ input }
+    end
+
+    it 'does not modify input encoding' do
+      pending 'only in 1.9' unless RUBY_VERSION > '1.9'
+
+      input = '[123]'
+      input.force_encoding('iso-8859-1')
+
+      expect{
+        MultiJson.load(input)
+      }.to_not change{ input.encoding }
+    end
+
+    it 'properly loads valid JSON' do
+      expect(MultiJson.load('{"abc":"def"}')).to eq({'abc' => 'def'})
+    end
+
+    it 'raises MultiJson::LoadError on invalid JSON' do
+      expect{MultiJson.load('{"abc"}')}.to raise_error(MultiJson::LoadError)
+    end
+
+    it 'raises MultiJson::LoadError with data on invalid JSON' do
+      data = '{invalid}'
+      begin
+        MultiJson.load(data)
+      rescue MultiJson::LoadError => le
+        expect(le.data).to eq data
+      end
+    end
+
+    it 'catches MultiJson::DecodeError for legacy support' do
+      data = '{invalid}'
+      begin
+        MultiJson.load(data)
+      rescue MultiJson::DecodeError => de
+        expect(de.data).to eq data
+      end
+    end
+
+    it 'stringifys symbol keys when encoding' do
+      dumped_json = MultiJson.dump(:a => 1, :b => {:c => 2})
+      loaded_json = MultiJson.load(dumped_json)
+      expect(loaded_json).to eq({'a' => 1, 'b' => {'c' => 2}})
+    end
+
+    it 'properly loads valid JSON in StringIOs' do
+      json = StringIO.new('{"abc":"def"}')
+      expect(MultiJson.load(json)).to eq({'abc' => 'def'})
+    end
+
+    it 'allows for symbolization of keys' do
+      [
+        [
+          '{"abc":{"def":"hgi"}}',
+          {:abc => {:def => 'hgi'}},
+        ],
+        [
+          '[{"abc":{"def":"hgi"}}]',
+          [{:abc => {:def => 'hgi'}}],
+        ],
+        [
+          '{"abc":[{"def":"hgi"}]}',
+          {:abc => [{:def => 'hgi'}]},
+        ],
+      ].each do |example, expected|
+        expect(MultiJson.load(example, :symbolize_keys => true)).to eq expected
+      end
+    end
+
+    it 'allows to load JSON values' do
+      expect(MultiJson.load('42')).to eq 42
+    end
+
+    it 'allows to load JSON with UTF-8 characters' do
+      expect(MultiJson.load('{"color":"żółć"}')).to eq({'color' => 'żółć'})
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/has_options.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/has_options.rb
new file mode 100644
index 0000000..45f7ee0
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/has_options.rb
@@ -0,0 +1,74 @@
+shared_examples_for 'has options' do |object|
+
+  if object.respond_to?(:call)
+    subject{ object.call }
+  else
+    subject{ object }
+  end
+
+  %w(dump_options load_options).each do |getter|
+
+    let(:getter){ getter }
+    let(:default_getter){ "default_#{getter}" }
+    let(:setter){ "#{getter}=" }
+    let(:defaults){ subject.send(default_getter) }
+    let(:ivar){ "@#{getter}" }
+
+    describe getter.tr('_', ' ') do
+      before{ set nil }
+      after{ set nil }
+
+      def get(*args)
+        subject.send(getter, *args)
+      end
+
+      def set(value)
+        subject.send(setter, value)
+      end
+
+      it 'returns default options if not set' do
+        expect(get).to eq(defaults)
+      end
+
+      it 'allows hashes' do
+        set :foo => 'bar'
+        expect(get).to eq(:foo => 'bar')
+      end
+
+      it 'allows objects that implement #to_hash' do
+        value = Class.new do
+          def to_hash
+            {:foo=>'bar'}
+          end
+        end.new
+
+        set value
+        expect(get).to eq(:foo => 'bar')
+      end
+
+      it 'evaluates lambda returning options (with args)' do
+        set lambda{ |a1, a2| { a1 => a2 }}
+        expect(get('1', '2')).to eq('1' => '2')
+      end
+
+      it 'evaluates lambda returning options (with no args)' do
+        set lambda{{:foo => 'bar'}}
+        expect(get).to eq(:foo => 'bar')
+      end
+
+      it 'returns empty hash in all other cases' do
+        set true
+        expect(get).to eq(defaults)
+
+        set false
+        expect(get).to eq(defaults)
+
+        set 10
+        expect(get).to eq(defaults)
+
+        set nil
+        expect(get).to eq(defaults)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/helper.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/helper.rb
new file mode 100644
index 0000000..b5edfaf
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/helper.rb
@@ -0,0 +1,35 @@
+require 'simplecov'
+require 'coveralls'
+
+SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
+  SimpleCov::Formatter::HTMLFormatter,
+  Coveralls::SimpleCov::Formatter
+]
+SimpleCov.start do
+  add_filter 'spec'
+  add_filter 'vendor'
+end
+
+require 'multi_json'
+require 'rspec'
+
+RSpec.configure do |config|
+  config.expect_with :rspec do |c|
+    c.syntax = :expect
+  end
+end
+
+def silence_warnings
+  old_verbose, $VERBOSE = $VERBOSE, nil
+  yield
+ensure
+  $VERBOSE = old_verbose
+end
+
+def macruby?
+  defined?(RUBY_ENGINE) && RUBY_ENGINE == 'macruby'
+end
+
+def jruby?
+  defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/json_common_shared_example.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/json_common_shared_example.rb
new file mode 100644
index 0000000..d8c9d7c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/json_common_shared_example.rb
@@ -0,0 +1,30 @@
+shared_examples_for 'JSON-like adapter' do |adapter|
+  before{ MultiJson.use adapter }
+
+  describe '.dump' do
+    before{ MultiJson.dump_options = MultiJson.adapter.dump_options = nil }
+
+    describe 'with :pretty option set to true' do
+      it 'passes default pretty options' do
+        object = 'foo'
+        object.should_receive(:to_json).with(JSON::PRETTY_STATE_PROTOTYPE.to_h)
+        MultiJson.dump(object, :pretty => true)
+      end
+    end
+
+    describe 'with :indent option' do
+      it 'passes it on dump' do
+        object = 'foo'
+        object.should_receive(:to_json).with(:indent => "\t")
+        MultiJson.dump(object, :indent => "\t")
+      end
+    end
+  end
+
+  describe '.load' do
+    it 'passes :quirks_mode option' do
+      ::JSON.should_receive(:parse).with('[123]', {:quirks_mode => false, :create_additions => false})
+      MultiJson.load('[123]', :quirks_mode => false)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/multi_json_spec.rb b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/multi_json_spec.rb
new file mode 100644
index 0000000..e855d17
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/multi_json-1.7.7/spec/multi_json_spec.rb
@@ -0,0 +1,226 @@
+require 'helper'
+require 'adapter_shared_example'
+require 'json_common_shared_example'
+require 'has_options'
+require 'stringio'
+
+describe 'MultiJson' do
+  context 'adapters' do
+    before{ MultiJson.use nil }
+
+    context 'when no other json implementations are available' do
+      before do
+        @old_map = MultiJson::REQUIREMENT_MAP
+        @old_json = Object.const_get :JSON if Object.const_defined?(:JSON)
+        @old_oj = Object.const_get :Oj if Object.const_defined?(:Oj)
+        @old_yajl = Object.const_get :Yajl if Object.const_defined?(:Yajl)
+        @old_gson = Object.const_get :Gson if Object.const_defined?(:Gson)
+        @old_jrjackson = Object.const_get :JrJackson if Object.const_defined?(:JrJackson)
+
+        MultiJson::REQUIREMENT_MAP.each_with_index do |(library, adapter), index|
+          MultiJson::REQUIREMENT_MAP[index] = ["foo/#{library}", adapter]
+        end
+        Object.send :remove_const, :JSON if @old_json
+        Object.send :remove_const, :Oj if @old_oj
+        Object.send :remove_const, :Yajl if @old_yajl
+        Object.send :remove_const, :Gson if @old_gson
+        Object.send :remove_const, :JrJackson if @old_jrjackson
+      end
+
+      after do
+        @old_map.each_with_index do |(library, adapter), index|
+          MultiJson::REQUIREMENT_MAP[index] = [library, adapter]
+        end
+        Object.const_set :JSON, @old_json if @old_json
+        Object.const_set :Oj, @old_oj if @old_oj
+        Object.const_set :Yajl, @old_yajl if @old_yajl
+        Object.const_set :Gson, @old_gson if @old_gson
+        Object.const_set :JrJackson, @old_jrjackson if @old_jrjackson
+      end
+
+      it 'defaults to ok_json if no other json implementions are available' do
+        silence_warnings do
+          expect(MultiJson.default_adapter).to eq :ok_json
+        end
+      end
+
+      it 'prints a warning' do
+        Kernel.should_receive(:warn).with(/warning/i)
+        MultiJson.default_adapter
+      end
+    end
+
+    context 'caching' do
+      before{ MultiJson.use adapter }
+      let(:adapter){ MultiJson::Adapters::JsonGem }
+      let(:json_string){ '{"abc":"def"}' }
+
+      it 'busts caches on global options change' do
+        MultiJson.load_options = { :symbolize_keys => true }
+        expect(MultiJson.load(json_string)).to eq(:abc => 'def')
+        MultiJson.load_options = nil
+        expect(MultiJson.load(json_string)).to eq('abc' => 'def')
+      end
+
+      it 'busts caches on per-adapter options change' do
+        adapter.load_options = { :symbolize_keys => true }
+        expect(MultiJson.load(json_string)).to eq(:abc => 'def')
+        adapter.load_options = nil
+        expect(MultiJson.load(json_string)).to eq('abc' => 'def')
+      end
+
+    end
+
+    it 'defaults to the best available gem' do
+      # Clear cache variable already set by previous tests
+      MultiJson.send(:remove_instance_variable, :@adapter)
+      unless jruby?
+        expect(MultiJson.adapter).to eq MultiJson::Adapters::Oj
+      else
+        expect(MultiJson.adapter).to eq MultiJson::Adapters::JsonGem
+      end
+    end
+
+    it 'looks for adapter even if @adapter variable is nil' do
+      MultiJson.send(:instance_variable_set, :@adapter, nil)
+      MultiJson.should_receive(:default_adapter).and_return(:ok_json)
+      expect(MultiJson.adapter).to eq MultiJson::Adapters::OkJson
+    end
+
+    it 'is settable via a symbol' do
+      MultiJson.use :json_gem
+      expect(MultiJson.adapter).to eq MultiJson::Adapters::JsonGem
+    end
+
+    it 'is settable via a class' do
+      adapter = Class.new
+      MultiJson.use adapter
+      expect(MultiJson.adapter).to eq adapter
+    end
+
+    it 'is settable via a module' do
+      adapter = Module.new
+      MultiJson.use adapter
+      expect(MultiJson.adapter).to eq adapter
+    end
+
+    it 'throws ArgumentError on bad input' do
+      expect{ MultiJson.use 'bad adapter' }.to raise_error(ArgumentError)
+    end
+
+    context 'using one-shot parser' do
+      before do
+        MultiJson::Adapters::JsonPure.should_receive(:dump).once.and_return('dump_something')
+        MultiJson::Adapters::JsonPure.should_receive(:load).once.and_return('load_something')
+      end
+
+      it 'should use the defined parser just for the call' do
+        MultiJson.use :json_gem
+        expect(MultiJson.dump('', :adapter => :json_pure)).to eq 'dump_something'
+        expect(MultiJson.load('', :adapter => :json_pure)).to eq 'load_something'
+        expect(MultiJson.adapter).to eq MultiJson::Adapters::JsonGem
+      end
+    end
+  end
+
+  it 'can set adapter for a block' do
+    MultiJson.use :ok_json
+    MultiJson.with_adapter(:json_pure) do
+      MultiJson.with_engine(:json_gem) do
+        expect(MultiJson.adapter).to eq MultiJson::Adapters::JsonGem
+      end
+      expect(MultiJson.adapter).to eq MultiJson::Adapters::JsonPure
+    end
+    expect(MultiJson.adapter).to eq MultiJson::Adapters::OkJson
+  end
+
+  it 'JSON gem does not create symbols on parse' do
+    MultiJson.with_engine(:json_gem) do
+      MultiJson.load('{"json_class":"ZOMG"}') rescue nil
+
+      expect{
+        MultiJson.load('{"json_class":"OMG"}') rescue nil
+      }.to_not change{Symbol.all_symbols.count}
+    end
+  end
+
+  unless jruby?
+    it 'Oj does not create symbols on parse' do
+      MultiJson.with_engine(:oj) do
+        MultiJson.load('{"json_class":"ZOMG"}') rescue nil
+
+        expect{
+          MultiJson.load('{"json_class":"OMG"}') rescue nil
+        }.to_not change{Symbol.all_symbols.count}
+      end
+    end
+
+    context 'with Oj.default_settings' do
+
+      around do |example|
+        options = Oj.default_options
+        Oj.default_options = { :symbol_keys => true }
+        MultiJson.with_engine(:oj){ example.call }
+        Oj.default_options = options
+      end
+
+      it 'ignores global settings' do
+        MultiJson.with_engine(:oj) do
+          example = '{"a": 1, "b": 2}'
+          expected = { 'a' => 1, 'b' => 2 }
+          expect(MultiJson.load(example)).to eq expected
+        end
+      end
+    end
+  end
+
+  describe 'default options' do
+    after(:all){ MultiJson.load_options = MultiJson.dump_options = nil }
+
+    it 'is deprecated' do
+      Kernel.should_receive(:warn).with(/deprecated/i)
+      silence_warnings{ MultiJson.default_options = {:foo => 'bar'} }
+    end
+
+    it 'sets both load and dump options' do
+      MultiJson.should_receive(:dump_options=).with(:foo => 'bar')
+      MultiJson.should_receive(:load_options=).with(:foo => 'bar')
+      silence_warnings{ MultiJson.default_options = {:foo => 'bar'} }
+    end
+  end
+
+  it_behaves_like 'has options', MultiJson
+
+  %w(gson jr_jackson json_gem json_pure nsjsonserialization oj ok_json yajl).each do |adapter|
+    next if !jruby? && %w(gson jr_jackson).include?(adapter)
+    next if !macruby? && adapter == 'nsjsonserialization'
+    next if jruby? && %w(oj yajl).include?(adapter)
+
+    context adapter do
+      it_behaves_like 'an adapter', adapter
+    end
+  end
+
+  %w(json_gem json_pure).each do |adapter|
+    context adapter do
+      it_behaves_like 'JSON-like adapter', adapter
+    end
+  end
+
+  describe 'aliases' do
+    if jruby?
+      describe 'jrjackson' do
+        after{ expect(MultiJson.adapter).to eq(MultiJson::Adapters::JrJackson) }
+
+        it 'allows jrjackson alias as symbol' do
+          expect{ MultiJson.use :jrjackson }.not_to raise_error
+        end
+
+        it 'allows jrjackson alias as string' do
+          expect{ MultiJson.use 'jrjackson' }.not_to raise_error
+        end
+
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/COPYING b/.bundle/ruby/1.9.1/gems/rack-1.5.2/COPYING
new file mode 100644
index 0000000..a4fe222
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/COPYING
@@ -0,0 +1,18 @@
+Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012 Christian Neukirchen <purl.org/net/chneukirchen>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/KNOWN-ISSUES b/.bundle/ruby/1.9.1/gems/rack-1.5.2/KNOWN-ISSUES
new file mode 100644
index 0000000..e0373b2
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/KNOWN-ISSUES
@@ -0,0 +1,30 @@
+= Known issues with Rack and ECMA-262
+
+* Many users expect the escape() function defined in ECMA-262 to be compatible
+  with URI. Confusion is especially strong because the documentation for the
+  escape function includes a reference to the URI specifications. ECMA-262
+  escape is not however a URI escape function, it is a javascript escape
+  function, and is not fully compatible. Most notably, for characters outside of
+  the BMP. Users should use the more correct encodeURI functions.
+
+= Known issues with Rack and Web servers
+
+* Lighttpd sets wrong SCRIPT_NAME and PATH_INFO if you mount your
+  FastCGI app at "/".  This can be fixed by using this middleware:
+
+    class LighttpdScriptNameFix
+      def initialize(app)
+        @app = app
+      end
+
+      def call(env)
+        env["PATH_INFO"] = env["SCRIPT_NAME"].to_s + env["PATH_INFO"].to_s
+        env["SCRIPT_NAME"] = ""
+        @app.call(env)
+      end
+    end
+
+  Of course, use this only when your app runs at "/".
+
+  Since lighttpd 1.4.23, you also can use the "fix-root-scriptname" flag
+  in fastcgi.server.
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/README.rdoc b/.bundle/ruby/1.9.1/gems/rack-1.5.2/README.rdoc
new file mode 100644
index 0000000..02c1193
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/README.rdoc
@@ -0,0 +1,624 @@
+= Rack, a modular Ruby webserver interface {<img src="https://secure.travis-ci.org/rack/rack.png" alt="Build Status" />}[http://travis-ci.org/rack/rack] {<img src="https://gemnasium.com/rack/rack.png" alt="Dependency Status" />}[https://gemnasium.com/rack/rack]
+
+Rack provides a minimal, modular and adaptable interface for developing
+web applications in Ruby.  By wrapping HTTP requests and responses in
+the simplest way possible, it unifies and distills the API for web
+servers, web frameworks, and software in between (the so-called
+middleware) into a single method call.
+
+The exact details of this are described in the Rack specification,
+which all Rack applications should conform to.
+
+== Supported web servers
+
+The included *handlers* connect all kinds of web servers to Rack:
+* Mongrel
+* EventedMongrel
+* SwiftipliedMongrel
+* WEBrick
+* FCGI
+* CGI
+* SCGI
+* LiteSpeed
+* Thin
+
+These web servers include Rack handlers in their distributions:
+* Ebb
+* Fuzed
+* Glassfish v3
+* Phusion Passenger (which is mod_rack for Apache and for nginx)
+* Puma
+* Rainbows!
+* Reel
+* Unicorn
+* unixrack
+* uWSGI
+* Zbatery
+
+Any valid Rack app will run the same on all these handlers, without
+changing anything.
+
+== Supported web frameworks
+
+These frameworks include Rack adapters in their distributions:
+* Camping
+* Coset
+* Espresso
+* Halcyon
+* Mack
+* Maveric
+* Merb
+* Racktools::SimpleApplication
+* Ramaze
+* Ruby on Rails
+* Rum
+* Sinatra
+* Sin
+* Vintage
+* Waves
+* Wee
+* ... and many others.
+
+== Available middleware
+
+Between the server and the framework, Rack can be customized to your
+applications needs using middleware, for example:
+* Rack::URLMap, to route to multiple applications inside the same process.
+* Rack::CommonLogger, for creating Apache-style logfiles.
+* Rack::ShowException, for catching unhandled exceptions and
+  presenting them in a nice and helpful way with clickable backtrace.
+* Rack::File, for serving static files.
+* ...many others!
+
+All these components use the same interface, which is described in
+detail in the Rack specification.  These optional components can be
+used in any way you wish.
+
+== Convenience
+
+If you want to develop outside of existing frameworks, implement your
+own ones, or develop middleware, Rack provides many helpers to create
+Rack applications quickly and without doing the same web stuff all
+over:
+* Rack::Request, which also provides query string parsing and
+  multipart handling.
+* Rack::Response, for convenient generation of HTTP replies and
+  cookie handling.
+* Rack::MockRequest and Rack::MockResponse for efficient and quick
+  testing of Rack application without real HTTP round-trips.
+
+== rack-contrib
+
+The plethora of useful middleware created the need for a project that
+collects fresh Rack middleware.  rack-contrib includes a variety of
+add-on components for Rack and it is easy to contribute new modules.
+
+* http://github.com/rack/rack-contrib
+
+== rackup
+
+rackup is a useful tool for running Rack applications, which uses the
+Rack::Builder DSL to configure middleware and build up applications
+easily.
+
+rackup automatically figures out the environment it is run in, and
+runs your application as FastCGI, CGI, or standalone with Mongrel or
+WEBrick---all from the same configuration.
+
+== Quick start
+
+Try the lobster!
+
+Either with the embedded WEBrick starter:
+
+    ruby -Ilib lib/rack/lobster.rb
+
+Or with rackup:
+
+    bin/rackup -Ilib example/lobster.ru
+
+By default, the lobster is found at http://localhost:9292.
+
+== Installing with RubyGems
+
+A Gem of Rack is available at rubygems.org.  You can install it with:
+
+    gem install rack
+
+I also provide a local mirror of the gems (and development snapshots)
+at my site:
+
+    gem install rack --source http://chneukirchen.org/releases/gems/
+
+== Running the tests
+
+Testing Rack requires the bacon testing framework:
+
+    bundle install --without extra # to be able to run the fast tests
+
+Or:
+
+    bundle install # this assumes that you have installed native extensions!
+
+There are two rake-based test tasks:
+
+    rake test       tests all the fast tests (no Handlers or Adapters)
+    rake fulltest   runs all the tests
+
+The fast testsuite has no dependencies outside of the core Ruby
+installation and bacon.
+
+To run the test suite completely, you need:
+
+  * fcgi
+  * memcache-client
+  * mongrel
+  * thin
+
+The full set of tests test FCGI access with lighttpd (on port
+9203) so you will need lighttpd installed as well as the FCGI
+libraries and the fcgi gem:
+
+Download and install lighttpd:
+
+    http://www.lighttpd.net/download
+
+Installing the FCGI libraries:
+
+    curl -O http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz
+    tar xzvf fcgi-2.4.0.tar.gz
+    cd fcgi-2.4.0
+    ./configure --prefix=/usr/local
+    make
+    sudo make install
+    cd ..
+
+Installing the Ruby fcgi gem:
+
+    gem install fcgi
+
+Furthermore, to test Memcache sessions, you need memcached (will be
+run on port 11211) and memcache-client installed.
+
+== History
+
+* March 3rd, 2007: First public release 0.1.
+
+* May 16th, 2007: Second public release 0.2.
+  * HTTP Basic authentication.
+  * Cookie Sessions.
+  * Static file handler.
+  * Improved Rack::Request.
+  * Improved Rack::Response.
+  * Added Rack::ShowStatus, for better default error messages.
+  * Bug fixes in the Camping adapter.
+  * Removed Rails adapter, was too alpha.
+
+* February 26th, 2008: Third public release 0.3.
+  * LiteSpeed handler, by Adrian Madrid.
+  * SCGI handler, by Jeremy Evans.
+  * Pool sessions, by blink.
+  * OpenID authentication, by blink.
+  * :Port and :File options for opening FastCGI sockets, by blink.
+  * Last-Modified HTTP header for Rack::File, by blink.
+  * Rack::Builder#use now accepts blocks, by Corey Jewett.
+    (See example/protectedlobster.ru)
+  * HTTP status 201 can contain a Content-Type and a body now.
+  * Many bugfixes, especially related to Cookie handling.
+
+* August 21st, 2008: Fourth public release 0.4.
+  * New middleware, Rack::Deflater, by Christoffer Sawicki.
+  * OpenID authentication now needs ruby-openid 2.
+  * New Memcache sessions, by blink.
+  * Explicit EventedMongrel handler, by Joshua Peek <josh at joshpeek.com>
+  * Rack::Reloader is not loaded in rackup development mode.
+  * rackup can daemonize with -D.
+  * Many bugfixes, especially for pool sessions, URLMap, thread safety
+    and tempfile handling.
+  * Improved tests.
+  * Rack moved to Git.
+
+* January 6th, 2009: Fifth public release 0.9.
+  * Rack is now managed by the Rack Core Team.
+  * Rack::Lint is stricter and follows the HTTP RFCs more closely.
+  * Added ConditionalGet middleware.
+  * Added ContentLength middleware.
+  * Added Deflater middleware.
+  * Added Head middleware.
+  * Added MethodOverride middleware.
+  * Rack::Mime now provides popular MIME-types and their extension.
+  * Mongrel Header now streams.
+  * Added Thin handler.
+  * Official support for swiftiplied Mongrel.
+  * Secure cookies.
+  * Made HeaderHash case-preserving.
+  * Many bugfixes and small improvements.
+
+* January 9th, 2009: Sixth public release 0.9.1.
+  * Fix directory traversal exploits in Rack::File and Rack::Directory.
+
+* April 25th, 2009: Seventh public release 1.0.0.
+  * SPEC change: Rack::VERSION has been pushed to [1,0].
+  * SPEC change: header values must be Strings now, split on "\n".
+  * SPEC change: Content-Length can be missing, in this case chunked transfer
+    encoding is used.
+  * SPEC change: rack.input must be rewindable and support reading into
+    a buffer, wrap with Rack::RewindableInput if it isn't.
+  * SPEC change: rack.session is now specified.
+  * SPEC change: Bodies can now additionally respond to #to_path with
+    a filename to be served.
+  * NOTE: String bodies break in 1.9, use an Array consisting of a
+    single String instead.
+  * New middleware Rack::Lock.
+  * New middleware Rack::ContentType.
+  * Rack::Reloader has been rewritten.
+  * Major update to Rack::Auth::OpenID.
+  * Support for nested parameter parsing in Rack::Response.
+  * Support for redirects in Rack::Response.
+  * HttpOnly cookie support in Rack::Response.
+  * The Rakefile has been rewritten.
+  * Many bugfixes and small improvements.
+
+* October 18th, 2009: Eighth public release 1.0.1.
+  * Bump remainder of rack.versions.
+  * Support the pure Ruby FCGI implementation.
+  * Fix for form names containing "=": split first then unescape components
+  * Fixes the handling of the filename parameter with semicolons in names.
+  * Add anchor to nested params parsing regexp to prevent stack overflows
+  * Use more compatible gzip write api instead of "<<".
+  * Make sure that Reloader doesn't break when executed via ruby -e
+  * Make sure WEBrick respects the :Host option
+  * Many Ruby 1.9 fixes.
+
+* January 3rd, 2010: Ninth public release 1.1.0.
+  * Moved Auth::OpenID to rack-contrib.
+  * SPEC change that relaxes Lint slightly to allow subclasses of the
+    required types
+  * SPEC change to document rack.input binary mode in greator detail
+  * SPEC define optional rack.logger specification
+  * File servers support X-Cascade header
+  * Imported Config middleware
+  * Imported ETag middleware
+  * Imported Runtime middleware
+  * Imported Sendfile middleware
+  * New Logger and NullLogger middlewares
+  * Added mime type for .ogv and .manifest.
+  * Don't squeeze PATH_INFO slashes
+  * Use Content-Type to determine POST params parsing
+  * Update Rack::Utils::HTTP_STATUS_CODES hash
+  * Add status code lookup utility
+  * Response should call #to_i on the status
+  * Add Request#user_agent
+  * Request#host knows about forwared host
+  * Return an empty string for Request#host if HTTP_HOST and
+    SERVER_NAME are both missing
+  * Allow MockRequest to accept hash params
+  * Optimizations to HeaderHash
+  * Refactored rackup into Rack::Server
+  * Added Utils.build_nested_query to complement Utils.parse_nested_query
+  * Added Utils::Multipart.build_multipart to complement
+    Utils::Multipart.parse_multipart
+  * Extracted set and delete cookie helpers into Utils so they can be
+    used outside Response
+  * Extract parse_query and parse_multipart in Request so subclasses
+    can change their behavior
+  * Enforce binary encoding in RewindableInput
+  * Set correct external_encoding for handlers that don't use RewindableInput
+
+* June 13th, 2010: Tenth public release 1.2.0.
+  * Removed Camping adapter: Camping 2.0 supports Rack as-is
+  * Removed parsing of quoted values
+  * Add Request.trace? and Request.options?
+  * Add mime-type for .webm and .htc
+  * Fix HTTP_X_FORWARDED_FOR
+  * Various multipart fixes
+  * Switch test suite to bacon
+
+* June 15th, 2010: Eleventh public release 1.2.1.
+  * Make CGI handler rewindable
+  * Rename spec/ to test/ to not conflict with SPEC on lesser
+    operating systems
+
+* March 13th, 2011: Twelfth public release 1.2.2/1.1.2.
+  * Security fix in Rack::Auth::Digest::MD5: when authenticator
+    returned nil, permission was granted on empty password.
+
+* May 22nd, 2011: Thirteenth public release 1.3.0
+  * Various performance optimizations
+  * Various multipart fixes
+  * Various multipart refactors
+  * Infinite loop fix for multipart
+  * Test coverage for Rack::Server returns
+  * Allow files with '..', but not path components that are '..'
+  * rackup accepts handler-specific options on the command line
+  * Request#params no longer merges POST into GET (but returns the same)
+  * Use URI.encode_www_form_component instead. Use core methods for escaping.
+  * Allow multi-line comments in the config file
+  * Bug L#94 reported by Nikolai Lugovoi, query parameter unescaping.
+  * Rack::Response now deletes Content-Length when appropriate
+  * Rack::Deflater now supports streaming
+  * Improved Rack::Handler loading and searching
+  * Support for the PATCH verb
+  * env['rack.session.options'] now contains session options
+  * Cookies respect renew
+  * Session middleware uses SecureRandom.hex
+
+* May 22nd, 2011: Fourteenth public release 1.2.3
+  * Pulled in relevant bug fixes from 1.3
+  * Fixed 1.8.6 support
+
+* July 13, 2011: Fifteenth public release 1.3.1
+  * Fix 1.9.1 support
+  * Fix JRuby support
+  * Properly handle $KCODE in Rack::Utils.escape
+  * Make method_missing/respond_to behavior consistent for Rack::Lock,
+    Rack::Auth::Digest::Request and Rack::Multipart::UploadedFile
+  * Reenable passing rack.session to session middleware
+  * Rack::CommonLogger handles streaming responses correctly
+  * Rack::MockResponse calls close on the body object
+  * Fix a DOS vector from MRI stdlib backport
+
+* July 16, 2011: Sixteenth public release 1.3.2
+  * Fix for Rails and rack-test, Rack::Utils#escape calls to_s
+
+* September 16, 2011: Seventeenth public release 1.3.3
+  * Fix bug with broken query parameters in Rack::ShowExceptions
+  * Rack::Request#cookies no longer swallows exceptions on broken input
+  * Prevents XSS attacks enabled by bug in Ruby 1.8's regexp engine
+  * Rack::ConditionalGet handles broken If-Modified-Since helpers
+
+* September 16, 2011: Eighteenth public release 1.2.4
+  * Fix a bug with MRI regex engine to prevent XSS by malformed unicode
+
+* October 1, 2011: Nineteenth public release 1.3.4
+  * Backport security fix from 1.9.3, also fixes some roundtrip issues in URI
+  * Small documentation update
+  * Fix an issue where BodyProxy could cause an infinite recursion
+  * Add some supporting files for travis-ci
+
+* October 17, 2011: Twentieth public release 1.3.5
+  * Fix annoying warnings caused by the backport in 1.3.4
+
+* December 28th, 2011: Twenty first public release: 1.1.3.
+  * Security fix. http://www.ocert.org/advisories/ocert-2011-003.html
+    Further information here: http://jruby.org/2011/12/27/jruby-1-6-5-1
+
+* December 28th, 2011: Twenty fourth public release 1.4.0
+  * Ruby 1.8.6 support has officially been dropped. Not all tests pass.
+  * Raise sane error messages for broken config.ru
+  * Allow combining run and map in a config.ru
+  * Rack::ContentType will not set Content-Type for responses without a body
+  * Status code 205 does not send a response body
+  * Rack::Response::Helpers will not rely on instance variables
+  * Rack::Utils.build_query no longer outputs '=' for nil query values
+  * Various mime types added
+  * Rack::MockRequest now supports HEAD
+  * Rack::Directory now supports files that contain RFC3986 reserved chars
+  * Rack::File now only supports GET and HEAD requests
+  * Rack::Server#start now passes the block to Rack::Handler::<h>#run
+  * Rack::Static now supports an index option
+  * Added the Teapot status code
+  * rackup now defaults to Thin instead of Mongrel (if installed)
+  * Support added for HTTP_X_FORWARDED_SCHEME
+  * Numerous bug fixes, including many fixes for new and alternate rubies
+
+* January 22nd, 2012: Twenty fifth public release 1.4.1
+  * Alter the keyspace limit calculations to reduce issues with nested params
+  * Add a workaround for multipart parsing where files contain unescaped "%"
+  * Added Rack::Response::Helpers#method_not_allowed? (code 405)
+  * Rack::File now returns 404 for illegal directory traversals
+  * Rack::File now returns 405 for illegal methods (non HEAD/GET)
+  * Rack::Cascade now catches 405 by default, as well as 404
+  * Cookies missing '--' no longer cause an exception to be raised
+  * Various style changes and documentation spelling errors
+  * Rack::BodyProxy always ensures to execute its block
+  * Additional test coverage around cookies and secrets
+  * Rack::Session::Cookie can now be supplied either secret or old_secret
+  * Tests are no longer dependent on set order
+  * Rack::Static no longer defaults to serving index files
+  * Rack.release was fixed
+
+* January 6th, 2013: Twenty sixth public release 1.1.4
+  * Add warnings when users do not provide a session secret
+
+* January 6th, 2013: Twenty seventh public release 1.2.6
+  * Add warnings when users do not provide a session secret
+  * Fix parsing performance for unquoted filenames
+
+* January 6th, 2013: Twenty eighth public release 1.3.7
+  * Add warnings when users do not provide a session secret
+  * Fix parsing performance for unquoted filenames
+  * Updated URI backports
+  * Fix URI backport version matching, and silence constant warnings
+  * Correct parameter parsing with empty values
+  * Correct rackup '-I' flag, to allow multiple uses
+  * Correct rackup pidfile handling
+  * Report rackup line numbers correctly
+  * Fix request loops caused by non-stale nonces with time limits
+  * Fix reloader on Windows
+  * Prevent infinite recursions from Response#to_ary
+  * Various middleware better conforms to the body close specification
+  * Updated language for the body close specification
+  * Additional notes regarding ECMA escape compatibility issues
+  * Fix the parsing of multiple ranges in range headers
+
+* January 6th, 2013: Twenty ninth public release 1.4.2
+  * Add warnings when users do not provide a session secret
+  * Fix parsing performance for unquoted filenames
+  * Updated URI backports
+  * Fix URI backport version matching, and silence constant warnings
+  * Correct parameter parsing with empty values
+  * Correct rackup '-I' flag, to allow multiple uses
+  * Correct rackup pidfile handling
+  * Report rackup line numbers correctly
+  * Fix request loops caused by non-stale nonces with time limits
+  * Fix reloader on Windows
+  * Prevent infinite recursions from Response#to_ary
+  * Various middleware better conforms to the body close specification
+  * Updated language for the body close specification
+  * Additional notes regarding ECMA escape compatibility issues
+  * Fix the parsing of multiple ranges in range headers
+  * Prevent errors from empty parameter keys
+  * Added PATCH verb to Rack::Request
+  * Various documentation updates
+  * Fix session merge semantics (fixes rack-test)
+  * Rack::Static :index can now handle multiple directories
+  * All tests now utilize Rack::Lint (special thanks to Lars Gierth)
+  * Rack::File cache_control parameter is now deprecated, and removed by 1.5
+  * Correct Rack::Directory script name escaping
+  * Rack::Static supports header rules for sophisticated configurations
+  * Multipart parsing now works without a Content-Length header
+  * New logos courtesy of Zachary Scott!
+  * Rack::BodyProxy now explicitly defines #each, useful for C extensions
+  * Cookies that are not URI escaped no longer cause exceptions
+
+* January 7th, 2013: Thirtieth public release 1.3.8
+  * Security: Prevent unbounded reads in large multipart boundaries
+
+* January 7th, 2013: Thirty first public release 1.4.3
+  * Security: Prevent unbounded reads in large multipart boundaries
+
+* January 13th, 2013: Thirty second public release 1.4.4, 1.3.9, 1.2.7, 1.1.5
+  * [SEC] Rack::Auth::AbstractRequest no longer symbolizes arbitrary strings
+  * Fixed erroneous test case in the 1.3.x series
+
+* January 21st, 2013: Thirty third public release 1.5.0
+  * Introduced hijack SPEC, for before-response and after-response hijacking
+  * SessionHash is no longer a Hash subclass
+  * Rack::File cache_control parameter is removed, in place of headers options
+  * Rack::Auth::AbstractRequest#scheme now yields strings, not symbols
+  * Rack::Utils cookie functions now format expires in RFC 2822 format
+  * Rack::File now has a default mime type
+  * rackup -b 'run Rack::File.new(".")', option provides command line configs
+  * Rack::Deflater will no longer double encode bodies
+  * Rack::Mime#match? provides convenience for Accept header matching
+  * Rack::Utils#q_values provides splitting for Accept headers
+  * Rack::Utils#best_q_match provides a helper for Accept headers
+  * Rack::Handler.pick provides convenience for finding available servers
+  * Puma added to the list of default servers (preferred over Webrick)
+  * Various middleware now correctly close body when replacing it
+  * Rack::Request#params is no longer persistent with only GET params
+  * Rack::Request#update_param and #delete_param provide persistent operations
+  * Rack::Request#trusted_proxy? now returns true for local unix sockets
+  * Rack::Response no longer forces Content-Types
+  * Rack::Sendfile provides local mapping configuration options
+  * Rack::Utils#rfc2109 provides old netscape style time output
+  * Updated HTTP status codes
+  * Ruby 1.8.6 likely no longer passes tests, and is no longer fully supported
+
+* January 28th, 2013: Thirty fourth public release 1.5.1
+  * Rack::Lint check_hijack now conforms to other parts of SPEC
+  * Added hash-like methods to Abstract::ID::SessionHash for compatibility
+  * Various documentation corrections
+
+* February 7th, Thirty fifth public release 1.1.6, 1.2.8, 1.3.10
+  * Fix CVE-2013-0263, timing attack against Rack::Session::Cookie
+
+* February 7th, Thirty fifth public release 1.4.5
+  * Fix CVE-2013-0263, timing attack against Rack::Session::Cookie
+  * Fix CVE-2013-0262, symlink path traversal in Rack::File
+
+* February 7th, Thirty fifth public release 1.5.2
+  * Fix CVE-2013-0263, timing attack against Rack::Session::Cookie
+  * Fix CVE-2013-0262, symlink path traversal in Rack::File
+  * Add various methods to Session for enhanced Rails compatibility
+  * Request#trusted_proxy? now only matches whole stirngs
+  * Add JSON cookie coder, to be default in Rack 1.6+ due to security concerns
+  * URLMap host matching in environments that don't set the Host header fixed
+  * Fix a race condition that could result in overwritten pidfiles
+  * Various documentation additions
+
+== Contact
+
+Please post bugs, suggestions and patches to
+the bug tracker at <http://github.com/rack/rack/issues>.
+
+Please post security related bugs and suggestions to the core team at
+<https://groups.google.com/group/rack-core> or rack-core at googlegroups.com. This
+list is not public. Due to wide usage of the library, it is strongly preferred
+that we manage timing in order to provide viable patches at the time of
+disclosure. Your assistance in this matter is greatly appreciated.
+
+Mailing list archives are available at
+<http://groups.google.com/group/rack-devel>.
+
+Git repository (send Git patches to the mailing list):
+* http://github.com/rack/rack
+* http://git.vuxu.org/cgi-bin/gitweb.cgi?p=rack-github.git
+
+You are also welcome to join the #rack channel on irc.freenode.net.
+
+== Thanks
+
+The Rack Core Team, consisting of
+
+* Christian Neukirchen (chneukirchen)
+* James Tucker (raggi)
+* Josh Peek (josh)
+* Michael Fellinger (manveru)
+* Ryan Tomayko (rtomayko)
+* Scytrin dai Kinthra (scytrin)
+* Aaron Patterson (tenderlove)
+* Konstantin Haase (rkh)
+
+would like to thank:
+
+* Adrian Madrid, for the LiteSpeed handler.
+* Christoffer Sawicki, for the first Rails adapter and Rack::Deflater.
+* Tim Fletcher, for the HTTP authentication code.
+* Luc Heinrich for the Cookie sessions, the static file handler and bugfixes.
+* Armin Ronacher, for the logo and racktools.
+* Alex Beregszaszi, Alexander Kahn, Anil Wadghule, Aredridel, Ben
+  Alpert, Dan Kubb, Daniel Roethlisberger, Matt Todd, Tom Robinson,
+  Phil Hagelberg, S. Brent Faulkner, Bosko Milekic, Daniel Rodríguez
+  Troitiño, Genki Takiuchi, Geoffrey Grosenbach, Julien Sanchez, Kamal
+  Fariz Mahyuddin, Masayoshi Takahashi, Patrick Aljordm, Mig, Kazuhiro
+  Nishiyama, Jon Bardin, Konstantin Haase, Larry Siden, Matias
+  Korhonen, Sam Ruby, Simon Chiang, Tim Connor, Timur Batyrshin, and
+  Zach Brock for bug fixing and other improvements.
+* Eric Wong, Hongli Lai, Jeremy Kemper for their continuous support
+  and API improvements.
+* Yehuda Katz and Carl Lerche for refactoring rackup.
+* Brian Candler, for Rack::ContentType.
+* Graham Batty, for improved handler loading.
+* Stephen Bannasch, for bug reports and documentation.
+* Gary Wright, for proposing a better Rack::Response interface.
+* Jonathan Buch, for improvements regarding Rack::Response.
+* Armin Röhrl, for tracking down bugs in the Cookie generator.
+* Alexander Kellett for testing the Gem and reviewing the announcement.
+* Marcus Rückert, for help with configuring and debugging lighttpd.
+* The WSGI team for the well-done and documented work they've done and
+  Rack builds up on.
+* All bug reporters and patch contributors not mentioned above.
+
+== Copyright
+
+Copyright (C) 2007, 2008, 2009, 2010 Christian Neukirchen <http://purl.org/net/chneukirchen>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+== Links
+
+Rack:: <http://rack.github.com/>
+Official Rack repositories:: <http://github.com/rack>
+Rack Bug Tracking:: <http://github.com/rack/rack/issues>
+rack-devel mailing list:: <http://groups.google.com/group/rack-devel>
+Rack's Rubyforge project:: <http://rubyforge.org/projects/rack>
+
+Christian Neukirchen:: <http://chneukirchen.org/>
+
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/Rakefile b/.bundle/ruby/1.9.1/gems/rack-1.5.2/Rakefile
new file mode 100644
index 0000000..dcd253d
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/Rakefile
@@ -0,0 +1,125 @@
+# Rakefile for Rack.  -*-ruby-*-
+
+desc "Run all the tests"
+task :default => [:test]
+
+desc "Install gem dependencies"
+task :deps do
+  require 'rubygems'
+  require 'rbconfig'
+  spec = Gem::Specification.load('rack.gemspec')
+  spec.dependencies.each do |dep|
+    reqs = dep.requirements_list
+    reqs = (["-v"] * reqs.size).zip(reqs).flatten
+    # Use system over sh, because we want to ignore errors!
+    system Gem.ruby, "-S", "gem", "install", '--conservative', dep.name, *reqs
+  end
+end
+
+desc "Make an archive as .tar.gz"
+task :dist => %w[chmod ChangeLog SPEC rdoc] do
+  sh "git archive --format=tar --prefix=#{release}/ HEAD^{tree} >#{release}.tar"
+  sh "pax -waf #{release}.tar -s ':^:#{release}/:' SPEC ChangeLog doc rack.gemspec"
+  sh "gzip -f -9 #{release}.tar"
+end
+
+desc "Make an official release"
+task :officialrelease do
+  puts "Official build for #{release}..."
+  sh "rm -rf stage"
+  sh "git clone --shared . stage"
+  sh "cd stage && rake officialrelease_really"
+  sh "mv stage/#{release}.tar.gz stage/#{release}.gem ."
+end
+
+task :officialrelease_really => %w[SPEC dist gem] do
+  sh "sha1sum #{release}.tar.gz #{release}.gem"
+end
+
+def release
+  "rack-#{File.read("rack.gemspec")[/s.version *= *"(.*?)"/, 1]}"
+end
+
+desc "Make binaries executable"
+task :chmod do
+  Dir["bin/*"].each { |binary| File.chmod(0775, binary) }
+  Dir["test/cgi/test*"].each { |binary| File.chmod(0775, binary) }
+end
+
+desc "Generate a ChangeLog"
+task :changelog => %w[ChangeLog]
+
+file '.git/index'
+file "ChangeLog" => '.git/index' do
+  File.open("ChangeLog", "w") { |out|
+    log = `git log -z`
+    log.force_encoding(Encoding::BINARY) if log.respond_to?(:force_encoding)
+    log.split("\0").map { |chunk|
+      author = chunk[/Author: (.*)/, 1].strip
+      date = chunk[/Date: (.*)/, 1].strip
+      desc, detail = $'.strip.split("\n", 2)
+      detail ||= ""
+      detail = detail.gsub(/.*darcs-hash:.*/, '')
+      detail.rstrip!
+      out.puts "#{date}  #{author}"
+      out.puts "  * #{desc.strip}"
+      out.puts detail  unless detail.empty?
+      out.puts
+    }
+  }
+end
+
+file 'lib/rack/lint.rb'
+desc "Generate Rack Specification"
+file "SPEC" => 'lib/rack/lint.rb' do
+  File.open("SPEC", "wb") { |file|
+    IO.foreach("lib/rack/lint.rb") { |line|
+      if line =~ /## (.*)/
+        file.puts $1
+      end
+    }
+  }
+end
+
+desc "Run all the fast + platform agnostic tests"
+task :test => 'SPEC' do
+  opts     = ENV['TEST'] || '-a'
+  specopts = ENV['TESTOPTS'] ||
+    "-q -t '^(?!Rack::Adapter|Rack::Session::Memcache|Rack::Server|Rack::Handler)'"
+
+  sh "bacon -w -I./lib:./test #{opts} #{specopts}"
+end
+
+desc "Run all the tests we run on CI"
+task :ci => :test
+
+desc "Run all the tests"
+task :fulltest => %w[SPEC chmod] do
+  opts     = ENV['TEST'] || '-a'
+  specopts = ENV['TESTOPTS'] || '-q'
+  sh "bacon -r./test/gemloader -I./lib:./test -w #{opts} #{specopts}"
+end
+
+task :gem => ["SPEC"] do
+  sh "gem build rack.gemspec"
+end
+
+task :doc => :rdoc
+desc "Generate RDoc documentation"
+task :rdoc => %w[ChangeLog SPEC] do
+  sh(*%w{rdoc --line-numbers --main README.rdoc
+              --title 'Rack\ Documentation' --charset utf-8 -U -o doc} +
+              %w{README.rdoc KNOWN-ISSUES SPEC ChangeLog} +
+              `git ls-files lib/\*\*/\*.rb`.strip.split)
+  cp "contrib/rdoc.css", "doc/rdoc.css"
+end
+
+task :pushdoc => %w[rdoc] do
+  sh "rsync -avz doc/ rack.rubyforge.org:/var/www/gforge-projects/rack/doc/"
+end
+
+task :pushsite => %w[pushdoc] do
+  sh "cd site && git gc"
+  sh "rsync -avz site/ rack.rubyforge.org:/var/www/gforge-projects/rack/"
+  sh "cd site && git push"
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/SPEC b/.bundle/ruby/1.9.1/gems/rack-1.5.2/SPEC
new file mode 100644
index 0000000..9b28627
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/SPEC
@@ -0,0 +1,237 @@
+This specification aims to formalize the Rack protocol.  You
+can (and should) use Rack::Lint to enforce it.
+When you develop middleware, be sure to add a Lint before and
+after to catch all mistakes.
+= Rack applications
+A Rack application is a Ruby object (not a class) that
+responds to +call+.
+It takes exactly one argument, the *environment*
+and returns an Array of exactly three values:
+The *status*,
+the *headers*,
+and the *body*.
+== The Environment
+The environment must be an instance of Hash that includes
+CGI-like headers.  The application is free to modify the
+environment.
+The environment is required to include these variables
+(adopted from PEP333), except when they'd be empty, but see
+below.
+<tt>REQUEST_METHOD</tt>:: The HTTP request method, such as
+                          "GET" or "POST". This cannot ever
+                          be an empty string, and so is
+                          always required.
+<tt>SCRIPT_NAME</tt>:: The initial portion of the request
+                       URL's "path" that corresponds to the
+                       application object, so that the
+                       application knows its virtual
+                       "location". This may be an empty
+                       string, if the application corresponds
+                       to the "root" of the server.
+<tt>PATH_INFO</tt>:: The remainder of the request URL's
+                     "path", designating the virtual
+                     "location" of the request's target
+                     within the application. This may be an
+                     empty string, if the request URL targets
+                     the application root and does not have a
+                     trailing slash. This value may be
+                     percent-encoded when I originating from
+                     a URL.
+<tt>QUERY_STRING</tt>:: The portion of the request URL that
+                        follows the <tt>?</tt>, if any. May be
+                        empty, but is always required!
+<tt>SERVER_NAME</tt>, <tt>SERVER_PORT</tt>:: When combined with <tt>SCRIPT_NAME</tt> and <tt>PATH_INFO</tt>, these variables can be used to complete the URL. Note, however, that <tt>HTTP_HOST</tt>, if present, should be used in preference to <tt>SERVER_NAME</tt> for reconstructing the request URL.  <tt>SERVER_NAME</tt> and <tt>SERVER_PORT</tt> can never be empty strings, and so are always required.
+<tt>HTTP_</tt> Variables:: Variables corresponding to the
+                           client-supplied HTTP request
+                           headers (i.e., variables whose
+                           names begin with <tt>HTTP_</tt>). The
+                           presence or absence of these
+                           variables should correspond with
+                           the presence or absence of the
+                           appropriate HTTP header in the
+                           request. See <a href="https://tools.ietf.org/html/rfc3875#section-4.1.18">
+                           RFC3875 section 4.1.18</a> for specific behavior.
+In addition to this, the Rack environment must include these
+Rack-specific variables:
+<tt>rack.version</tt>:: The Array representing this version of Rack. See Rack::VERSION, that corresponds to the version of this SPEC.
+<tt>rack.url_scheme</tt>:: +http+ or +https+, depending on the request URL.
+<tt>rack.input</tt>:: See below, the input stream.
+<tt>rack.errors</tt>:: See below, the error stream.
+<tt>rack.multithread</tt>:: true if the application object may be simultaneously invoked by another thread in the same process, false otherwise.
+<tt>rack.multiprocess</tt>:: true if an equivalent application object may be simultaneously invoked by another process, false otherwise.
+<tt>rack.run_once</tt>:: true if the server expects (but does not guarantee!) that the application will only be invoked this one time during the life of its containing process. Normally, this will only be true for a server based on CGI (or something similar).
+<tt>rack.hijack?</tt>:: present and true if the server supports connection hijacking. See below, hijacking.
+<tt>rack.hijack</tt>:: an object responding to #call that must be called at least once before using rack.hijack_io. It is recommended #call return rack.hijack_io as well as setting it in env if necessary.
+<tt>rack.hijack_io</tt>:: if rack.hijack? is true, and rack.hijack has received #call, this will contain an object resembling an IO. See hijacking.
+Additional environment specifications have approved to
+standardized middleware APIs.  None of these are required to
+be implemented by the server.
+<tt>rack.session</tt>:: A hash like interface for storing request session data.
+                        The store must implement:
+                        store(key, value)         (aliased as []=);
+                        fetch(key, default = nil) (aliased as []);
+                        delete(key);
+                        clear;
+<tt>rack.logger</tt>:: A common object interface for logging messages.
+                       The object must implement:
+                        info(message, &block)
+                        debug(message, &block)
+                        warn(message, &block)
+                        error(message, &block)
+                        fatal(message, &block)
+The server or the application can store their own data in the
+environment, too.  The keys must contain at least one dot,
+and should be prefixed uniquely.  The prefix <tt>rack.</tt>
+is reserved for use with the Rack core distribution and other
+accepted specifications and must not be used otherwise.
+The environment must not contain the keys
+<tt>HTTP_CONTENT_TYPE</tt> or <tt>HTTP_CONTENT_LENGTH</tt>
+(use the versions without <tt>HTTP_</tt>).
+The CGI keys (named without a period) must have String values.
+There are the following restrictions:
+* <tt>rack.version</tt> must be an array of Integers.
+* <tt>rack.url_scheme</tt> must either be +http+ or +https+.
+* There must be a valid input stream in <tt>rack.input</tt>.
+* There must be a valid error stream in <tt>rack.errors</tt>.
+* There may be a valid hijack stream in <tt>rack.hijack_io</tt>
+* The <tt>REQUEST_METHOD</tt> must be a valid token.
+* The <tt>SCRIPT_NAME</tt>, if non-empty, must start with <tt>/</tt>
+* The <tt>PATH_INFO</tt>, if non-empty, must start with <tt>/</tt>
+* The <tt>CONTENT_LENGTH</tt>, if given, must consist of digits only.
+* One of <tt>SCRIPT_NAME</tt> or <tt>PATH_INFO</tt> must be
+  set.  <tt>PATH_INFO</tt> should be <tt>/</tt> if
+  <tt>SCRIPT_NAME</tt> is empty.
+  <tt>SCRIPT_NAME</tt> never should be <tt>/</tt>, but instead be empty.
+=== The Input Stream
+The input stream is an IO-like object which contains the raw HTTP
+POST data.
+When applicable, its external encoding must be "ASCII-8BIT" and it
+must be opened in binary mode, for Ruby 1.9 compatibility.
+The input stream must respond to +gets+, +each+, +read+ and +rewind+.
+* +gets+ must be called without arguments and return a string,
+  or +nil+ on EOF.
+* +read+ behaves like IO#read. Its signature is <tt>read([length, [buffer]])</tt>.
+  If given, +length+ must be a non-negative Integer (>= 0) or +nil+, and +buffer+ must
+  be a String and may not be nil. If +length+ is given and not nil, then this method
+  reads at most +length+ bytes from the input stream. If +length+ is not given or nil,
+  then this method reads all data until EOF.
+  When EOF is reached, this method returns nil if +length+ is given and not nil, or ""
+  if +length+ is not given or is nil.
+  If +buffer+ is given, then the read data will be placed into +buffer+ instead of a
+  newly created String object.
+* +each+ must be called without arguments and only yield Strings.
+* +rewind+ must be called without arguments. It rewinds the input
+  stream back to the beginning. It must not raise Errno::ESPIPE:
+  that is, it may not be a pipe or a socket. Therefore, handler
+  developers must buffer the input data into some rewindable object
+  if the underlying input stream is not rewindable.
+* +close+ must never be called on the input stream.
+=== The Error Stream
+The error stream must respond to +puts+, +write+ and +flush+.
+* +puts+ must be called with a single argument that responds to +to_s+.
+* +write+ must be called with a single argument that is a String.
+* +flush+ must be called without arguments and must be called
+  in order to make the error appear for sure.
+* +close+ must never be called on the error stream.
+=== Hijacking
+==== Request (before status)
+If rack.hijack? is true then rack.hijack must respond to #call.
+rack.hijack must return the io that will also be assigned (or is
+already present, in rack.hijack_io.
+
+rack.hijack_io must respond to:
+<tt>read, write, read_nonblock, write_nonblock, flush, close,
+close_read, close_write, closed?</tt>
+
+The semantics of these IO methods must be a best effort match to
+those of a normal ruby IO or Socket object, using standard
+arguments and raising standard exceptions. Servers are encouraged
+to simply pass on real IO objects, although it is recognized that
+this approach is not directly compatible with SPDY and HTTP 2.0.
+
+IO provided in rack.hijack_io should preference the
+IO::WaitReadable and IO::WaitWritable APIs wherever supported.
+
+There is a deliberate lack of full specification around
+rack.hijack_io, as semantics will change from server to server.
+Users are encouraged to utilize this API with a knowledge of their
+server choice, and servers may extend the functionality of
+hijack_io to provide additional features to users. The purpose of
+rack.hijack is for Rack to "get out of the way", as such, Rack only
+provides the minimum of specification and support.
+
+If rack.hijack? is false, then rack.hijack should not be set.
+
+If rack.hijack? is false, then rack.hijack_io should not be set.
+==== Response (after headers)
+It is also possible to hijack a response after the status and headers
+have been sent.
+In order to do this, an application may set the special header
+<tt>rack.hijack</tt> to an object that responds to <tt>call</tt>
+accepting an argument that conforms to the <tt>rack.hijack_io</tt>
+protocol.
+
+After the headers have been sent, and this hijack callback has been
+called, the application is now responsible for the remaining lifecycle
+of the IO. The application is also responsible for maintaining HTTP
+semantics. Of specific note, in almost all cases in the current SPEC,
+applications will have wanted to specify the header Connection:close in
+HTTP/1.1, and not Connection:keep-alive, as there is no protocol for
+returning hijacked sockets to the web server. For that purpose, use the
+body streaming API instead (progressively yielding strings via each).
+
+Servers must ignore the <tt>body</tt> part of the response tuple when
+the <tt>rack.hijack</tt> response API is in use.
+
+The special response header <tt>rack.hijack</tt> must only be set
+if the request env has <tt>rack.hijack?</tt> <tt>true</tt>.
+==== Conventions
+* Middleware should not use hijack unless it is handling the whole
+  response.
+* Middleware may wrap the IO object for the response pattern.
+* Middleware should not wrap the IO object for the request pattern. The
+  request pattern is intended to provide the hijacker with "raw tcp".
+== The Response
+=== The Status
+This is an HTTP status. When parsed as integer (+to_i+), it must be
+greater than or equal to 100.
+=== The Headers
+The header must respond to +each+, and yield values of key and value.
+Special headers starting "rack." are for communicating with the
+server, and must not be sent back to the client.
+The header keys must be Strings.
+The header must not contain a +Status+ key,
+contain keys with <tt>:</tt> or newlines in their name,
+contain keys names that end in <tt>-</tt> or <tt>_</tt>,
+but only contain keys that consist of
+letters, digits, <tt>_</tt> or <tt>-</tt> and start with a letter.
+The values of the header must be Strings,
+consisting of lines (for multiple header values, e.g. multiple
+<tt>Set-Cookie</tt> values) seperated by "\n".
+The lines must not contain characters below 037.
+=== The Content-Type
+There must not be a <tt>Content-Type</tt>, when the +Status+ is 1xx,
+204, 205 or 304.
+=== The Content-Length
+There must not be a <tt>Content-Length</tt> header when the
++Status+ is 1xx, 204, 205 or 304.
+=== The Body
+The Body must respond to +each+
+and must only yield String values.
+The Body itself should not be an instance of String, as this will
+break in Ruby 1.9.
+If the Body responds to +close+, it will be called after iteration. If
+the body is replaced by a middleware after action, the original body
+must be closed first, if it repsonds to close.
+If the Body responds to +to_path+, it must return a String
+identifying the location of a file whose contents are identical
+to that produced by calling +each+; this may be used by the
+server as an alternative, possibly more efficient way to
+transport the response.
+The Body commonly is an Array of Strings, the application
+instance itself, or a File-like object.
+== Thanks
+Some parts of this specification are adopted from PEP333: Python
+Web Server Gateway Interface
+v1.0 (http://www.python.org/dev/peps/pep-0333/). I'd like to thank
+everyone involved in that effort.
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/bin/rackup b/.bundle/ruby/1.9.1/gems/rack-1.5.2/bin/rackup
new file mode 100755
index 0000000..ad94af4
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/bin/rackup
@@ -0,0 +1,4 @@
+#!/usr/bin/env ruby
+
+require "rack"
+Rack::Server.start
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/contrib/rack.png b/.bundle/ruby/1.9.1/gems/rack-1.5.2/contrib/rack.png
new file mode 100644
index 0000000..0920c4f
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/rack-1.5.2/contrib/rack.png differ
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/contrib/rack.svg b/.bundle/ruby/1.9.1/gems/rack-1.5.2/contrib/rack.svg
new file mode 100644
index 0000000..0d3f961
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/contrib/rack.svg
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="rack.svg">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3837"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3839" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="230.49849"
+     inkscape:cy="656.46253"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="false"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1056"
+     inkscape:window-x="1920"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1">
+    <sodipodi:guide
+       orientation="1,0"
+       position="645.99255,757.10933"
+       id="guide2995" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="488.40876,686.90373"
+       id="guide2997" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="176.7767,748.52304"
+       id="guide2999" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="355.71429,782.85714"
+       id="guide3005" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="527.14286,642.85714"
+       id="guide3007" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="431.42857,507.85714"
+       id="guide3009" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="488.40876,783.57143"
+       id="guide3011" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="505,372.85714"
+       id="guide3013" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 176.28125,201.03125 0,0.625 0,395.125 0,0.375 0.34375,0.0937 312.34375,91.6875 0.625,0.1875 0,-0.65625 0.125,-419.09375 0,-0.40625 -0.40625,-0.0937 -312.4375,-67.71875 -0.59375,-0.125 z m 1,1.21875 311.4375,67.5 -0.125,418.0625 -311.3125,-91.375 0,-394.1875 z"
+       id="path2985"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 647.21875,206.59375 -0.6875,0.28125 -157.59375,62.21875 -0.3125,0.125 0,0.34375 0.1875,419.125 0,0.75 0.6875,-0.28125 156.0625,-63.1875 0.3125,-0.125 0,-0.34375 1.34375,-418.15625 0,-0.75 z m -1,1.4375 -1.34375,417.125 -155.0625,62.78125 -0.1875,-418.03125 156.59375,-61.875 z"
+       id="path2993"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.6875,137.40625 -0.15625,0.0625 L 176.96875,201.0625 177.3125,202 355.75,138.4375 646.78125,207.53125 647,206.5625 l -291.15625,-69.125 -0.15625,-0.0312 z"
+       id="path3003"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.71875,277.53125 -0.125,0.0312 -178.9375,47.96875 -1.8125,0.46875 1.8125,0.5 311.625,83.5 0.15625,0.0312 0.125,-0.0625 157.59375,-53.65625 1.5625,-0.53125 -1.59375,-0.4375 -290.28125,-77.78125 -0.125,-0.0312 z m 0,1.03125 L 644.3125,355.90625 488.375,409 178.71875,326 l 177,-47.4375 z"
+       id="path3015"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.21875,240.9375 0,37.125 1,0 0,-37.125 -1,0 z"
+       id="path3017"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 176.28125,202.65625 0,393.28125 1,0 0,-393.28125 -1,0 z"
+       id="path3019"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.71875,409 -0.125,0.0312 L 177,455.8125 l -1.78125,0.46875 1.78125,0.5 L 488.28125,545 l 0.15625,0.0312 0.125,-0.0625 156.71875,-56.25 1.46875,-0.53125 -1.53125,-0.40625 -289.375,-78.75 -0.125,-0.0312 z m 0,1.03125 287.6875,78.28125 L 488.375,544 179.03125,456.3125 355.71875,410.03125 z"
+       id="path3021"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.71875,544 -0.15625,0.0312 -178.5625,52.3125 0.28125,0.96875 178.4375,-52.28125 289.59375,80.25 0.28125,-0.96875 -289.75,-80.28125 -0.125,-0.0312 z"
+       id="path3023"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.21875,374.34375 0,35.15625 1,0 0,-35.15625 -1,0 z"
+       id="path3025"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.1875,507.03125 0,37.4375 1.03125,0 0,-37.4375 -1.03125,0 z"
+       id="path3027"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/contrib/rack_logo.svg b/.bundle/ruby/1.9.1/gems/rack-1.5.2/contrib/rack_logo.svg
new file mode 100644
index 0000000..434175a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/contrib/rack_logo.svg
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/)
+  by Armin Ronacher (mitsuhiko), MIT-licensed.
+-->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="100"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.44"
+   version="1.0"
+   inkscape:export-filename="/home/blackbird/Desktop/rack_logo_final.png"
+   inkscape:export-xdpi="360"
+   inkscape:export-ydpi="360"
+   sodipodi:docbase="/home/blackbird/Desktop"
+   sodipodi:docname="rack_logo.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.959798"
+     inkscape:cx="148.56163"
+     inkscape:cy="67.007749"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     width="200px"
+     height="100px"
+     inkscape:window-width="1400"
+     inkscape:window-height="975"
+     inkscape:window-x="0"
+     inkscape:window-y="24" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="font-size:33.17043304px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Frutiger"
+       d="M 102.28876,57.97848 L 102.28876,64.972684 C 101.77662,64.784857 101.19214,64.690938 100.5353,64.690927 C 99.767107,64.690938 99.026757,64.873251 98.314248,65.237867 C 97.612848,65.591455 97.056197,66.050001 96.644288,66.613505 C 96.343688,67.022337 96.121018,67.541654 95.976308,68.171455 C 95.876091,68.558187 95.826008,69.094078 95.826016,69.779128 L 95.826016,75.861765 L 87.125504,75.861765 L 87.125504,58.144219 L 95.274924,58.144219 L 95.274924,62.105392 C 95.987422,60.56955 [...]
+       id="text2980" />
+    <path
+       style="font-size:9.72235012px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Frutiger45-Light"
+       d="M 87.460353,88.057465 L 88.081744,88.057465 L 88.081744,85.211201 L 88.101471,85.211201 C 88.259282,85.530647 88.463124,85.770232 88.712998,85.929955 C 88.962867,86.083288 89.281782,86.159955 89.669743,86.159955 C 90.33387,86.159955 90.843476,85.923565 91.198561,85.450785 C 91.560211,84.971618 91.741039,84.355087 91.741044,83.601194 C 91.741039,82.815359 91.579938,82.202023 91.25774,81.761184 C 91.086772,81.531188 90.869779,81.355493 90.60676,81.234098 C 90.343734,81.106325 90. [...]
+       id="text2985" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95839429;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 12.925286,86.778391 L 13.286986,19.159668 L 58.155285,26.942569 L 57.772633,93.67717 L 12.925286,86.778391 z "
+       id="path2990" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+       d="M 13.488233,19.049404 L 37.172883,11.162464 L 77.786022,19.420245 L 57.107048,26.22552 L 13.488233,19.049404 z "
+       id="path3877" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 57.997556,93.629361 L 77.486975,86.74764 L 77.759697,19.547174 L 58.5016,26.445081 L 57.997556,93.629361 z "
+       id="path3879"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 14.330613,38.606641 L 36.912066,32.135194 L 76.635736,40.056811 L 58.346077,46.531185 L 14.330613,38.606641 z "
+       id="path3881"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 14.150271,65.640082 L 36.731724,59.168636 L 77.314157,65.640929 L 57.787539,72.680481 L 14.150271,65.640082 z "
+       id="path3883"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 13.820355,86.361841 L 35.130498,79.541609 L 76.834867,85.878963"
+       id="path3887" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 34.866065,79.042658 L 35.146638,69.563169"
+       id="path3889" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 36.154699,58.803397 L 36.535174,42.88001"
+       id="path3891" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 36.776858,31.759485 L 36.855284,23.494878"
+       id="path3893"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/contrib/rdoc.css b/.bundle/ruby/1.9.1/gems/rack-1.5.2/contrib/rdoc.css
new file mode 100644
index 0000000..f1e342f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/contrib/rdoc.css
@@ -0,0 +1,412 @@
+/* Forked from the Darkfish templates rdoc.css file, much hacked, probably
+ * imperfect */
+
+html { max-width: 960px; margin: 0 auto; }
+body {
+  font: 14px "Helvetica Neue", Helvetica, Tahoma, sans-serif;
+}
+body.file-popup {
+  font-size: 90%;
+  margin-left: 0;
+}
+
+h1 {
+  color: #4183C4;
+}
+
+:link,
+:visited {
+  color: #4183C4;
+  text-decoration: none;
+}
+:link:hover,
+:visited:hover {
+  border-bottom: 1px dotted #4183C4;
+}
+
+pre, pre.description {
+  font: 12px Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
+  padding: 1em;
+  overflow: auto;
+  line-height: 1.4;
+}
+
+/* @group Generic Classes */
+
+.initially-hidden {
+  display: none;
+}
+
+#search-field {
+  width: 98%;
+}
+
+.missing-docs {
+  font-size: 120%;
+  background: white url(images/wrench_orange.png) no-repeat 4px center;
+  color: #ccc;
+  line-height: 2em;
+  border: 1px solid #d00;
+  opacity: 1;
+  text-indent: 24px;
+  letter-spacing: 3px;
+  font-weight: bold;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+}
+
+.target-section {
+  border: 2px solid #dcce90;
+  border-left-width: 8px;
+  background: #fff3c2;
+}
+
+/* @end */
+
+/* @group Index Page, Standalone file pages */
+.indexpage ul {
+  line-height: 160%;
+  list-style: none;
+}
+.indexpage ul :link,
+.indexpage ul :visited {
+  font-size: 16px;
+}
+
+.indexpage li {
+  padding-left: 20px;
+}
+
+.indexpage ul > li {
+  background: url(images/bullet_black.png) no-repeat left 4px;
+}
+.indexpage li.method {
+  background: url(images/plugin.png) no-repeat left 4px;
+}
+.indexpage li.module {
+  background: url(images/package.png) no-repeat left 4px;
+}
+.indexpage li.class {
+  background: url(images/ruby.png) no-repeat left 4px;
+}
+.indexpage li.file {
+  background: url(images/page_white_text.png) no-repeat left 4px;
+}
+.indexpage li li {
+  background: url(images/tag_blue.png) no-repeat left 4px;
+}
+.indexpage li .toc-toggle {
+  width: 16px;
+  height: 16px;
+  background: url(images/add.png) no-repeat;
+}
+
+.indexpage li .toc-toggle.open {
+  background: url(images/delete.png) no-repeat;
+}
+
+/* @end */
+
+/* @group Top-Level Structure */
+
+.project-section, #file-metadata, #class-metadata {
+  display: block;
+  background: #f5f5f5;
+  margin-bottom: 1em;
+  padding: 0.5em;
+}
+.project-section h3, #file-metadata h3, #class-metadata h3 {
+  margin: 0;
+}
+
+#metadata {
+  float: left;
+  width: 280px;
+}
+
+#documentation {
+  margin: 2em 1em 2em 300px;
+}
+
+#validator-badges {
+  clear: both;
+  margin: 1em 1em 2em;
+  font-size: smaller;
+}
+
+/* @end */
+
+/* @group Metadata Section */
+
+#metadata ul,
+#metadata dl,
+#metadata p {
+  padding: 0px;
+  list-style: none;
+}
+
+dl.svninfo {
+  color: #666;
+  margin: 0;
+}
+dl.svninfo dt {
+  font-weight: bold;
+}
+
+ul.link-list li {
+  white-space: nowrap;
+}
+ul.link-list .type {
+  font-size: 8px;
+  text-transform: uppercase;
+  color: white;
+  background: #969696;
+}
+
+/* @end */
+
+/* @group Documentation Section */
+
+.note-list {
+  margin: 8px 0;
+}
+
+.label-list {
+  margin: 8px 1.5em;
+  border: 1px solid #ccc;
+}
+.description .label-list {
+  font-size: 14px;
+}
+
+.note-list dt {
+  font-weight: bold;
+}
+.note-list dd {
+}
+
+.label-list dt {
+  font-weight: bold;
+  background: #ddd;
+}
+.label-list dd {
+}
+.label-list dd + dt,
+.note-list dd + dt {
+  margin-top: 0.7em;
+}
+
+#documentation .section {
+  font-size: 90%;
+}
+
+#documentation h2.section-header {
+  color: #333;
+  font-size: 175%;
+}
+
+.documentation-section-title {
+  position: relative;
+}
+.documentation-section-title .section-click-top {
+  position: absolute;
+  top: 6px;
+  right: 12px;
+  font-size: 10px;
+  visibility: hidden;
+}
+
+.documentation-section-title:hover .section-click-top {
+  visibility: visible;
+}
+
+#documentation h3.section-header {
+  color: #333;
+  font-size: 150%;
+}
+
+#constants-list > dl,
+#attributes-list > dl {
+  margin: 1em 0 2em;
+  border: 0;
+}
+#constants-list > dl dt,
+#attributes-list > dl dt {
+  font-weight: bold;
+  font-family: Monaco, "Andale Mono";
+  background: inherit;
+}
+#constants-list > dl dt a,
+#attributes-list > dl dt a {
+  color: inherit;
+}
+#constants-list > dl dd,
+#attributes-list > dl dd {
+  margin: 0 0 1em 0;
+  color: #666;
+}
+
+.documentation-section h2 {
+  position: relative;
+}
+
+.documentation-section h2 a {
+  position: absolute;
+  top: 8px;
+  right: 10px;
+  font-size: 12px;
+  color: #9b9877;
+  visibility: hidden;
+}
+
+.documentation-section h2:hover a {
+  visibility: visible;
+}
+
+/* @group Method Details */
+
+#documentation .method-source-code {
+  display: none;
+}
+
+#documentation .method-detail {
+  margin: 0.2em 0.2em;
+  padding: 0.5em;
+}
+#documentation .method-detail:hover {
+  background-color: #f5f5f5;
+}
+#documentation .method-heading {
+  cursor: pointer;
+  position: relative;
+  font-size: 125%;
+  line-height: 125%;
+  font-weight: bold;
+  color: #333;
+  background: url(images/brick.png) no-repeat left bottom;
+  padding-left: 20px;
+}
+#documentation .method-heading :link,
+#documentation .method-heading :visited {
+  color: inherit;
+}
+#documentation .method-click-advice {
+  position: absolute;
+  right: 5px;
+  font-size: 10px;
+  color: #aaa;
+  visibility: hidden;
+  background: url(images/zoom.png) no-repeat right 5px;
+  padding-right: 20px;
+  overflow: show;
+}
+#documentation .method-heading:hover .method-click-advice {
+  visibility: visible;
+}
+
+#documentation .method-alias .method-heading {
+  color: #666;
+  background: url(images/brick_link.png) no-repeat left bottom;
+}
+
+#documentation .method-description,
+#documentation .aliases {
+  margin: 0 20px;
+  color: #666;
+}
+
+#documentation .method-description p,
+#documentation .aliases p {
+  line-height: 1.2em;
+}
+
+#documentation .aliases {
+  font-style: italic;
+  cursor: default;
+}
+#documentation .method-description p {
+  margin-bottom: 0.5em;
+}
+#documentation .method-description ul {
+  margin-left: 1.5em;
+}
+
+#documentation .attribute-method-heading {
+  background: url(images/tag_green.png) no-repeat left bottom;
+}
+#documentation #attribute-method-details .method-detail:hover {
+  background-color: transparent;
+  cursor: default;
+}
+#documentation .attribute-access-type {
+  font-size: 60%;
+  text-transform: uppercase;
+  vertical-align: super;
+}
+
+.method-section .method-source-code {
+  background: white;
+}
+
+/* @group Source Code */
+
+.ruby-constant .ruby-keyword .ruby-ivar .ruby-operator .ruby-identifier
+.ruby-node .ruby-comment .ruby-regexp .ruby-value {
+  background: transparent;
+}
+
+/* Thanks GitHub!!! */
+.ruby-constant   { color: #458; font-weight: bold; }
+.ruby-keyword    { color: black; font-weight: bold; }
+.ruby-ivar       { color: teal; }
+.ruby-operator   { color: #000; }
+.ruby-identifier { color: black; }
+.ruby-node       { color: red; }
+.ruby-comment    { color: #998; font-weight: bold; }
+.ruby-regexp     { color: #009926; }
+.ruby-value      { color: #099; }
+.ruby-string     { color: red; }
+
+/* @group search results */
+
+#search-section .section-header {
+  margin: 0;
+  padding: 0;
+}
+
+#search-results {
+  width: 100%;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+
+#search-results h1 {
+  font-size: 1em;
+  font-weight: normal;
+  text-shadow: none;
+}
+
+#search-results .current {
+  background: #eee;
+}
+
+#search-results li {
+  list-style: none;
+  line-height: 1em;
+  padding: 0.5em;
+  border-bottom: 1px solid black;
+}
+
+#search-results .search-namespace {
+  font-weight: bold;
+}
+
+#search-results li em {
+  background: yellow;
+  font-style: normal;
+}
+
+#search-results pre {
+  margin: 0.5em;
+}
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/example/lobster.ru b/.bundle/ruby/1.9.1/gems/rack-1.5.2/example/lobster.ru
new file mode 100644
index 0000000..cc7ffca
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/example/lobster.ru
@@ -0,0 +1,4 @@
+require 'rack/lobster'
+
+use Rack::ShowExceptions
+run Rack::Lobster.new
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/example/protectedlobster.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/example/protectedlobster.rb
new file mode 100644
index 0000000..d904b4c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/example/protectedlobster.rb
@@ -0,0 +1,14 @@
+require 'rack'
+require 'rack/lobster'
+
+lobster = Rack::Lobster.new
+
+protected_lobster = Rack::Auth::Basic.new(lobster) do |username, password|
+  'secret' == password
+end
+
+protected_lobster.realm = 'Lobster 2.0'
+
+pretty_protected_lobster = Rack::ShowStatus.new(Rack::ShowExceptions.new(protected_lobster))
+
+Rack::Server.start :app => pretty_protected_lobster, :Port => 9292
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/example/protectedlobster.ru b/.bundle/ruby/1.9.1/gems/rack-1.5.2/example/protectedlobster.ru
new file mode 100644
index 0000000..b0da62f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/example/protectedlobster.ru
@@ -0,0 +1,8 @@
+require 'rack/lobster'
+
+use Rack::ShowExceptions
+use Rack::Auth::Basic, "Lobster 2.0" do |username, password|
+  'secret' == password
+end
+
+run Rack::Lobster.new
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack.rb
new file mode 100644
index 0000000..57119df
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack.rb
@@ -0,0 +1,87 @@
+# Copyright (C) 2007, 2008, 2009, 2010 Christian Neukirchen <purl.org/net/chneukirchen>
+#
+# Rack is freely distributable under the terms of an MIT-style license.
+# See COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+# The Rack main module, serving as a namespace for all core Rack
+# modules and classes.
+#
+# All modules meant for use in your application are <tt>autoload</tt>ed here,
+# so it should be enough just to <tt>require rack.rb</tt> in your code.
+
+module Rack
+  # The Rack protocol version number implemented.
+  VERSION = [1,2]
+
+  # Return the Rack protocol version as a dotted string.
+  def self.version
+    VERSION.join(".")
+  end
+
+  # Return the Rack release as a dotted string.
+  def self.release
+    "1.5"
+  end
+
+  autoload :Builder, "rack/builder"
+  autoload :BodyProxy, "rack/body_proxy"
+  autoload :Cascade, "rack/cascade"
+  autoload :Chunked, "rack/chunked"
+  autoload :CommonLogger, "rack/commonlogger"
+  autoload :ConditionalGet, "rack/conditionalget"
+  autoload :Config, "rack/config"
+  autoload :ContentLength, "rack/content_length"
+  autoload :ContentType, "rack/content_type"
+  autoload :ETag, "rack/etag"
+  autoload :File, "rack/file"
+  autoload :Deflater, "rack/deflater"
+  autoload :Directory, "rack/directory"
+  autoload :ForwardRequest, "rack/recursive"
+  autoload :Handler, "rack/handler"
+  autoload :Head, "rack/head"
+  autoload :Lint, "rack/lint"
+  autoload :Lock, "rack/lock"
+  autoload :Logger, "rack/logger"
+  autoload :MethodOverride, "rack/methodoverride"
+  autoload :Mime, "rack/mime"
+  autoload :NullLogger, "rack/nulllogger"
+  autoload :Recursive, "rack/recursive"
+  autoload :Reloader, "rack/reloader"
+  autoload :Runtime, "rack/runtime"
+  autoload :Sendfile, "rack/sendfile"
+  autoload :Server, "rack/server"
+  autoload :ShowExceptions, "rack/showexceptions"
+  autoload :ShowStatus, "rack/showstatus"
+  autoload :Static, "rack/static"
+  autoload :URLMap, "rack/urlmap"
+  autoload :Utils, "rack/utils"
+  autoload :Multipart, "rack/multipart"
+
+  autoload :MockRequest, "rack/mock"
+  autoload :MockResponse, "rack/mock"
+
+  autoload :Request, "rack/request"
+  autoload :Response, "rack/response"
+
+  module Auth
+    autoload :Basic, "rack/auth/basic"
+    autoload :AbstractRequest, "rack/auth/abstract/request"
+    autoload :AbstractHandler, "rack/auth/abstract/handler"
+    module Digest
+      autoload :MD5, "rack/auth/digest/md5"
+      autoload :Nonce, "rack/auth/digest/nonce"
+      autoload :Params, "rack/auth/digest/params"
+      autoload :Request, "rack/auth/digest/request"
+    end
+  end
+
+  module Session
+    autoload :Cookie, "rack/session/cookie"
+    autoload :Pool, "rack/session/pool"
+    autoload :Memcache, "rack/session/memcache"
+  end
+
+  module Utils
+    autoload :OkJson, "rack/utils/okjson"
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/abstract/handler.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/abstract/handler.rb
new file mode 100644
index 0000000..214df62
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/abstract/handler.rb
@@ -0,0 +1,37 @@
+module Rack
+  module Auth
+    # Rack::Auth::AbstractHandler implements common authentication functionality.
+    #
+    # +realm+ should be set for all handlers.
+
+    class AbstractHandler
+
+      attr_accessor :realm
+
+      def initialize(app, realm=nil, &authenticator)
+        @app, @realm, @authenticator = app, realm, authenticator
+      end
+
+
+      private
+
+      def unauthorized(www_authenticate = challenge)
+        return [ 401,
+          { 'Content-Type' => 'text/plain',
+            'Content-Length' => '0',
+            'WWW-Authenticate' => www_authenticate.to_s },
+          []
+        ]
+      end
+
+      def bad_request
+        return [ 400,
+          { 'Content-Type' => 'text/plain',
+            'Content-Length' => '0' },
+          []
+        ]
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/abstract/request.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/abstract/request.rb
new file mode 100644
index 0000000..aa6bf8e
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/abstract/request.rb
@@ -0,0 +1,43 @@
+require 'rack/request'
+
+module Rack
+  module Auth
+    class AbstractRequest
+
+      def initialize(env)
+        @env = env
+      end
+
+      def request
+        @request ||= Request.new(@env)
+      end
+
+      def provided?
+        !authorization_key.nil?
+      end
+
+      def parts
+        @parts ||= @env[authorization_key].split(' ', 2)
+      end
+
+      def scheme
+        @scheme ||= parts.first.downcase
+      end
+
+      def params
+        @params ||= parts.last
+      end
+
+
+      private
+
+      AUTHORIZATION_KEYS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION']
+
+      def authorization_key
+        @authorization_key ||= AUTHORIZATION_KEYS.detect { |key| @env.has_key?(key) }
+      end
+
+    end
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/basic.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/basic.rb
new file mode 100644
index 0000000..7dd9a99
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/basic.rb
@@ -0,0 +1,58 @@
+require 'rack/auth/abstract/handler'
+require 'rack/auth/abstract/request'
+
+module Rack
+  module Auth
+    # Rack::Auth::Basic implements HTTP Basic Authentication, as per RFC 2617.
+    #
+    # Initialize with the Rack application that you want protecting,
+    # and a block that checks if a username and password pair are valid.
+    #
+    # See also: <tt>example/protectedlobster.rb</tt>
+
+    class Basic < AbstractHandler
+
+      def call(env)
+        auth = Basic::Request.new(env)
+
+        return unauthorized unless auth.provided?
+
+        return bad_request unless auth.basic?
+
+        if valid?(auth)
+          env['REMOTE_USER'] = auth.username
+
+          return @app.call(env)
+        end
+
+        unauthorized
+      end
+
+
+      private
+
+      def challenge
+        'Basic realm="%s"' % realm
+      end
+
+      def valid?(auth)
+        @authenticator.call(*auth.credentials)
+      end
+
+      class Request < Auth::AbstractRequest
+        def basic?
+          !parts.first.nil? && "basic" == scheme
+        end
+
+        def credentials
+          @credentials ||= params.unpack("m*").first.split(/:/, 2)
+        end
+
+        def username
+          credentials.first
+        end
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/digest/md5.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/digest/md5.rb
new file mode 100644
index 0000000..b5871d7
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/digest/md5.rb
@@ -0,0 +1,129 @@
+require 'rack/auth/abstract/handler'
+require 'rack/auth/digest/request'
+require 'rack/auth/digest/params'
+require 'rack/auth/digest/nonce'
+require 'digest/md5'
+
+module Rack
+  module Auth
+    module Digest
+      # Rack::Auth::Digest::MD5 implements the MD5 algorithm version of
+      # HTTP Digest Authentication, as per RFC 2617.
+      #
+      # Initialize with the [Rack] application that you want protecting,
+      # and a block that looks up a plaintext password for a given username.
+      #
+      # +opaque+ needs to be set to a constant base64/hexadecimal string.
+      #
+      class MD5 < AbstractHandler
+
+        attr_accessor :opaque
+
+        attr_writer :passwords_hashed
+
+        def initialize(app, realm=nil, opaque=nil, &authenticator)
+          @passwords_hashed = nil
+          if opaque.nil? and realm.respond_to? :values_at
+            realm, opaque, @passwords_hashed = realm.values_at :realm, :opaque, :passwords_hashed
+          end
+          super(app, realm, &authenticator)
+          @opaque = opaque
+        end
+
+        def passwords_hashed?
+          !!@passwords_hashed
+        end
+
+        def call(env)
+          auth = Request.new(env)
+
+          unless auth.provided?
+            return unauthorized
+          end
+
+          if !auth.digest? || !auth.correct_uri? || !valid_qop?(auth)
+            return bad_request
+          end
+
+          if valid?(auth)
+            if auth.nonce.stale?
+              return unauthorized(challenge(:stale => true))
+            else
+              env['REMOTE_USER'] = auth.username
+
+              return @app.call(env)
+            end
+          end
+
+          unauthorized
+        end
+
+
+        private
+
+        QOP = 'auth'.freeze
+
+        def params(hash = {})
+          Params.new do |params|
+            params['realm'] = realm
+            params['nonce'] = Nonce.new.to_s
+            params['opaque'] = H(opaque)
+            params['qop'] = QOP
+
+            hash.each { |k, v| params[k] = v }
+          end
+        end
+
+        def challenge(hash = {})
+          "Digest #{params(hash)}"
+        end
+
+        def valid?(auth)
+          valid_opaque?(auth) && valid_nonce?(auth) && valid_digest?(auth)
+        end
+
+        def valid_qop?(auth)
+          QOP == auth.qop
+        end
+
+        def valid_opaque?(auth)
+          H(opaque) == auth.opaque
+        end
+
+        def valid_nonce?(auth)
+          auth.nonce.valid?
+        end
+
+        def valid_digest?(auth)
+          pw = @authenticator.call(auth.username)
+          pw && digest(auth, pw) == auth.response
+        end
+
+        def md5(data)
+          ::Digest::MD5.hexdigest(data)
+        end
+
+        alias :H :md5
+
+        def KD(secret, data)
+          H([secret, data] * ':')
+        end
+
+        def A1(auth, password)
+          [ auth.username, auth.realm, password ] * ':'
+        end
+
+        def A2(auth)
+          [ auth.method, auth.uri ] * ':'
+        end
+
+        def digest(auth, password)
+          password_hash = passwords_hashed? ? password : H(A1(auth, password))
+
+          KD(password_hash, [ auth.nonce, auth.nc, auth.cnonce, QOP, H(A2(auth)) ] * ':')
+        end
+
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/digest/nonce.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/digest/nonce.rb
new file mode 100644
index 0000000..57089cb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/digest/nonce.rb
@@ -0,0 +1,51 @@
+require 'digest/md5'
+
+module Rack
+  module Auth
+    module Digest
+      # Rack::Auth::Digest::Nonce is the default nonce generator for the
+      # Rack::Auth::Digest::MD5 authentication handler.
+      #
+      # +private_key+ needs to set to a constant string.
+      #
+      # +time_limit+ can be optionally set to an integer (number of seconds),
+      # to limit the validity of the generated nonces.
+
+      class Nonce
+
+        class << self
+          attr_accessor :private_key, :time_limit
+        end
+
+        def self.parse(string)
+          new(*string.unpack("m*").first.split(' ', 2))
+        end
+
+        def initialize(timestamp = Time.now, given_digest = nil)
+          @timestamp, @given_digest = timestamp.to_i, given_digest
+        end
+
+        def to_s
+          [([ @timestamp, digest ] * ' ')].pack("m*").strip
+        end
+
+        def digest
+          ::Digest::MD5.hexdigest([ @timestamp, self.class.private_key ] * ':')
+        end
+
+        def valid?
+          digest == @given_digest
+        end
+
+        def stale?
+          !self.class.time_limit.nil? && (Time.now.to_i - @timestamp) > self.class.time_limit
+        end
+
+        def fresh?
+          !stale?
+        end
+
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/digest/params.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/digest/params.rb
new file mode 100644
index 0000000..f35a7ba
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/digest/params.rb
@@ -0,0 +1,53 @@
+module Rack
+  module Auth
+    module Digest
+      class Params < Hash
+
+        def self.parse(str)
+          Params[*split_header_value(str).map do |param|
+            k, v = param.split('=', 2)
+            [k, dequote(v)]
+          end.flatten]
+        end
+
+        def self.dequote(str) # From WEBrick::HTTPUtils
+          ret = (/\A"(.*)"\Z/ =~ str) ? $1 : str.dup
+          ret.gsub!(/\\(.)/, "\\1")
+          ret
+        end
+
+        def self.split_header_value(str)
+          str.scan( /(\w+\=(?:"[^\"]+"|[^,]+))/n ).collect{ |v| v[0] }
+        end
+
+        def initialize
+          super()
+
+          yield self if block_given?
+        end
+
+        def [](k)
+          super k.to_s
+        end
+
+        def []=(k, v)
+          super k.to_s, v.to_s
+        end
+
+        UNQUOTED = ['nc', 'stale']
+
+        def to_s
+          map do |k, v|
+            "#{k}=" + (UNQUOTED.include?(k) ? v.to_s : quote(v))
+          end.join(', ')
+        end
+
+        def quote(str) # From WEBrick::HTTPUtils
+          '"' << str.gsub(/[\\\"]/o, "\\\1") << '"'
+        end
+
+      end
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/digest/request.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/digest/request.rb
new file mode 100644
index 0000000..706c651
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/auth/digest/request.rb
@@ -0,0 +1,41 @@
+require 'rack/auth/abstract/request'
+require 'rack/auth/digest/params'
+require 'rack/auth/digest/nonce'
+
+module Rack
+  module Auth
+    module Digest
+      class Request < Auth::AbstractRequest
+        def method
+          @env['rack.methodoverride.original_method'] || @env['REQUEST_METHOD']
+        end
+
+        def digest?
+          "digest" == scheme
+        end
+
+        def correct_uri?
+          request.fullpath == uri
+        end
+
+        def nonce
+          @nonce ||= Nonce.parse(params['nonce'])
+        end
+
+        def params
+          @params ||= Params.parse(parts.last)
+        end
+
+        def respond_to?(sym, *)
+          super or params.has_key? sym.to_s
+        end
+
+        def method_missing(sym, *args)
+          return super unless params.has_key?(key = sym.to_s)
+          return params[key] if args.size == 0
+          raise ArgumentError, "wrong number of arguments (#{args.size} for 0)"
+        end
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/backports/uri/common_18.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/backports/uri/common_18.rb
new file mode 100644
index 0000000..0ea1998
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/backports/uri/common_18.rb
@@ -0,0 +1,56 @@
+# :stopdoc:
+
+# Stolen from ruby core's uri/common.rb, with modifications to support 1.8.x
+#
+# https://github.com/ruby/ruby/blob/trunk/lib/uri/common.rb
+#
+#
+
+module URI
+  TBLENCWWWCOMP_ = {} # :nodoc:
+  256.times do |i|
+    TBLENCWWWCOMP_[i.chr] = '%%%02X' % i
+  end
+  TBLENCWWWCOMP_[' '] = '+'
+  TBLENCWWWCOMP_.freeze
+  TBLDECWWWCOMP_ = {} # :nodoc:
+  256.times do |i|
+    h, l = i>>4, i&15
+    TBLDECWWWCOMP_['%%%X%X' % [h, l]] = i.chr
+    TBLDECWWWCOMP_['%%%x%X' % [h, l]] = i.chr
+    TBLDECWWWCOMP_['%%%X%x' % [h, l]] = i.chr
+    TBLDECWWWCOMP_['%%%x%x' % [h, l]] = i.chr
+  end
+  TBLDECWWWCOMP_['+'] = ' '
+  TBLDECWWWCOMP_.freeze
+
+  # Encode given +s+ to URL-encoded form data.
+  #
+  # This method doesn't convert *, -, ., 0-9, A-Z, _, a-z, but does convert SP
+  # (ASCII space) to + and converts others to %XX.
+  #
+  # This is an implementation of
+  # http://www.w3.org/TR/html5/forms.html#url-encoded-form-data
+  #
+  # See URI.decode_www_form_component, URI.encode_www_form
+  def self.encode_www_form_component(s)
+    str = s.to_s
+    if RUBY_VERSION < "1.9" && $KCODE =~ /u/i
+      str.gsub(/([^ a-zA-Z0-9_.-]+)/) do
+        '%' + $1.unpack('H2' * Rack::Utils.bytesize($1)).join('%').upcase
+      end.tr(' ', '+')
+    else
+      str.gsub(/[^*\-.0-9A-Z_a-z]/) {|m| TBLENCWWWCOMP_[m]}
+    end
+  end
+
+  # Decode given +str+ of URL-encoded form data.
+  #
+  # This decods + to SP.
+  #
+  # See URI.encode_www_form_component, URI.decode_www_form
+  def self.decode_www_form_component(str, enc=nil)
+    raise ArgumentError, "invalid %-encoding (#{str})" unless /\A(?:%[0-9a-fA-F]{2}|[^%])*\z/ =~ str
+    str.gsub(/\+|%[0-9a-fA-F]{2}/) {|m| TBLDECWWWCOMP_[m]}
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/backports/uri/common_192.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/backports/uri/common_192.rb
new file mode 100644
index 0000000..1a0522b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/backports/uri/common_192.rb
@@ -0,0 +1,52 @@
+# :stopdoc:
+
+# Stolen from ruby core's uri/common.rb @32618ba to fix DoS issues in 1.9.2
+#
+# https://github.com/ruby/ruby/blob/32618ba7438a2247042bba9b5d85b5d49070f5e5/lib/uri/common.rb
+#
+# Issue:
+# http://redmine.ruby-lang.org/issues/5149
+#
+# Relevant Fixes:
+# https://github.com/ruby/ruby/commit/b5f91deee04aa6ccbe07c23c8222b937c22a799b
+# https://github.com/ruby/ruby/commit/93177c1e5c3906abf14472ae0b905d8b5c72ce1b
+#
+# This should probably be removed once there is a Ruby 1.9.2 patch level that
+# includes this fix.
+
+require 'uri/common'
+
+module URI
+  TBLDECWWWCOMP_ = {} unless const_defined?(:TBLDECWWWCOMP_)  #:nodoc:
+  if TBLDECWWWCOMP_.empty?
+    256.times do |i|
+      h, l = i>>4, i&15
+      TBLDECWWWCOMP_['%%%X%X' % [h, l]] = i.chr
+      TBLDECWWWCOMP_['%%%x%X' % [h, l]] = i.chr
+      TBLDECWWWCOMP_['%%%X%x' % [h, l]] = i.chr
+      TBLDECWWWCOMP_['%%%x%x' % [h, l]] = i.chr
+    end
+    TBLDECWWWCOMP_['+'] = ' '
+    TBLDECWWWCOMP_.freeze
+  end
+
+  def self.decode_www_form(str, enc=Encoding::UTF_8)
+    return [] if str.empty?
+    unless /\A#{WFKV_}=#{WFKV_}(?:[;&]#{WFKV_}=#{WFKV_})*\z/o =~ str
+      raise ArgumentError, "invalid data of application/x-www-form-urlencoded (#{str})"
+    end
+    ary = []
+    $&.scan(/([^=;&]+)=([^;&]*)/) do
+      ary << [decode_www_form_component($1, enc), decode_www_form_component($2, enc)]
+    end
+    ary
+  end
+
+  def self.decode_www_form_component(str, enc=Encoding::UTF_8)
+    raise ArgumentError, "invalid %-encoding (#{str})" unless /\A[^%]*(?:%\h\h[^%]*)*\z/ =~ str
+    str.gsub(/\+|%\h\h/, TBLDECWWWCOMP_).force_encoding(enc)
+  end
+
+  remove_const :WFKV_ if const_defined?(:WFKV_)
+  WFKV_ = '(?:[^%#=;&]*(?:%\h\h[^%#=;&]*)*)' # :nodoc:
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/backports/uri/common_193.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/backports/uri/common_193.rb
new file mode 100644
index 0000000..2e58203
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/backports/uri/common_193.rb
@@ -0,0 +1,29 @@
+# :stopdoc:
+
+require 'uri/common'
+
+# Issue:
+# http://bugs.ruby-lang.org/issues/5925
+#
+# Relevant commit:
+# https://github.com/ruby/ruby/commit/edb7cdf1eabaff78dfa5ffedfbc2e91b29fa9ca1
+
+module URI
+  256.times do |i|
+    TBLENCWWWCOMP_[i.chr] = '%%%02X' % i
+  end
+  TBLENCWWWCOMP_[' '] = '+'
+  TBLENCWWWCOMP_.freeze
+
+  256.times do |i|
+    h, l = i>>4, i&15
+    TBLDECWWWCOMP_['%%%X%X' % [h, l]] = i.chr
+    TBLDECWWWCOMP_['%%%x%X' % [h, l]] = i.chr
+    TBLDECWWWCOMP_['%%%X%x' % [h, l]] = i.chr
+    TBLDECWWWCOMP_['%%%x%x' % [h, l]] = i.chr
+  end
+  TBLDECWWWCOMP_['+'] = ' '
+  TBLDECWWWCOMP_.freeze
+end
+
+# :startdoc:
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/body_proxy.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/body_proxy.rb
new file mode 100644
index 0000000..95a7462
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/body_proxy.rb
@@ -0,0 +1,39 @@
+module Rack
+  class BodyProxy
+    def initialize(body, &block)
+      @body, @block, @closed = body, block, false
+    end
+
+    def respond_to?(*args)
+      return false if args.first.to_s =~ /^to_ary$/
+      super or @body.respond_to?(*args)
+    end
+
+    def close
+      return if @closed
+      @closed = true
+      begin
+        @body.close if @body.respond_to? :close
+      ensure
+        @block.call
+      end
+    end
+
+    def closed?
+      @closed
+    end
+
+    # N.B. This method is a special case to address the bug described by #434.
+    # We are applying this special case for #each only. Future bugs of this
+    # class will be handled by requesting users to patch their ruby
+    # implementation, to save adding too many methods in this class.
+    def each(*args, &block)
+      @body.each(*args, &block)
+    end
+
+    def method_missing(*args, &block)
+      super if args.first.to_s =~ /^to_ary$/
+      @body.__send__(*args, &block)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/builder.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/builder.rb
new file mode 100644
index 0000000..66dc7bd
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/builder.rb
@@ -0,0 +1,149 @@
+module Rack
+  # Rack::Builder implements a small DSL to iteratively construct Rack
+  # applications.
+  #
+  # Example:
+  #
+  #  require 'rack/lobster'
+  #  app = Rack::Builder.new do
+  #    use Rack::CommonLogger
+  #    use Rack::ShowExceptions
+  #    map "/lobster" do
+  #      use Rack::Lint
+  #      run Rack::Lobster.new
+  #    end
+  #  end
+  #
+  #  run app
+  #
+  # Or
+  #
+  #  app = Rack::Builder.app do
+  #    use Rack::CommonLogger
+  #    run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] }
+  #  end
+  #
+  #  run app
+  #
+  # +use+ adds middleware to the stack, +run+ dispatches to an application.
+  # You can use +map+ to construct a Rack::URLMap in a convenient way.
+
+  class Builder
+    def self.parse_file(config, opts = Server::Options.new)
+      options = {}
+      if config =~ /\.ru$/
+        cfgfile = ::File.read(config)
+        if cfgfile[/^#\\(.*)/] && opts
+          options = opts.parse! $1.split(/\s+/)
+        end
+        cfgfile.sub!(/^__END__\n.*\Z/m, '')
+        app = new_from_string cfgfile, config
+      else
+        require config
+        app = Object.const_get(::File.basename(config, '.rb').capitalize)
+      end
+      return app, options
+    end
+
+    def self.new_from_string(builder_script, file="(rackup)")
+      eval "Rack::Builder.new {\n" + builder_script + "\n}.to_app",
+        TOPLEVEL_BINDING, file, 0
+    end
+
+    def initialize(default_app = nil,&block)
+      @use, @map, @run = [], nil, default_app
+      instance_eval(&block) if block_given?
+    end
+
+    def self.app(default_app = nil, &block)
+      self.new(default_app, &block).to_app
+    end
+
+    # Specifies middleware to use in a stack.
+    #
+    #   class Middleware
+    #     def initialize(app)
+    #       @app = app
+    #     end
+    #
+    #     def call(env)
+    #       env["rack.some_header"] = "setting an example"
+    #       @app.call(env)
+    #     end
+    #   end
+    #
+    #   use Middleware
+    #   run lambda { |env| [200, { "Content-Type => "text/plain" }, ["OK"]] }
+    #
+    # All requests through to this application will first be processed by the middleware class.
+    # The +call+ method in this example sets an additional environment key which then can be
+    # referenced in the application if required.
+    def use(middleware, *args, &block)
+      if @map
+        mapping, @map = @map, nil
+        @use << proc { |app| generate_map app, mapping }
+      end
+      @use << proc { |app| middleware.new(app, *args, &block) }
+    end
+
+    # Takes an argument that is an object that responds to #call and returns a Rack response.
+    # The simplest form of this is a lambda object:
+    #
+    #   run lambda { |env| [200, { "Content-Type" => "text/plain" }, ["OK"]] }
+    #
+    # However this could also be a class:
+    #
+    #   class Heartbeat
+    #     def self.call(env)
+    #      [200, { "Content-Type" => "text/plain" }, ["OK"]]
+    #    end
+    #   end
+    #
+    #   run Heartbeat
+    def run(app)
+      @run = app
+    end
+
+    # Creates a route within the application.
+    #
+    #   Rack::Builder.app do
+    #     map '/' do
+    #       run Heartbeat
+    #     end
+    #   end
+    #
+    # The +use+ method can also be used here to specify middleware to run under a specific path:
+    #
+    #   Rack::Builder.app do
+    #     map '/' do
+    #       use Middleware
+    #       run Heartbeat
+    #     end
+    #   end
+    #
+    # This example includes a piece of middleware which will run before requests hit +Heartbeat+.
+    #
+    def map(path, &block)
+      @map ||= {}
+      @map[path] = block
+    end
+
+    def to_app
+      app = @map ? generate_map(@run, @map) : @run
+      fail "missing run or map statement" unless app
+      @use.reverse.inject(app) { |a,e| e[a] }
+    end
+
+    def call(env)
+      to_app.call(env)
+    end
+
+    private
+
+    def generate_map(default_app, mapping)
+      mapped = default_app ? {'/' => default_app} : {}
+      mapping.each { |r,b| mapped[r] = self.class.new(default_app, &b) }
+      URLMap.new(mapped)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/cascade.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/cascade.rb
new file mode 100644
index 0000000..d104a4b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/cascade.rb
@@ -0,0 +1,52 @@
+module Rack
+  # Rack::Cascade tries a request on several apps, and returns the
+  # first response that is not 404 or 405 (or in a list of configurable
+  # status codes).
+
+  class Cascade
+    NotFound = [404, {"Content-Type" => "text/plain"}, []]
+
+    attr_reader :apps
+
+    def initialize(apps, catch=[404, 405])
+      @apps = []; @has_app = {}
+      apps.each { |app| add app }
+
+      @catch = {}
+      [*catch].each { |status| @catch[status] = true }
+    end
+
+    def call(env)
+      result = NotFound
+
+      last_body = nil
+
+      @apps.each do |app|
+        # The SPEC says that the body must be closed after it has been iterated
+        # by the server, or if it is replaced by a middleware action. Cascade
+        # replaces the body each time a cascade happens. It is assumed that nil
+        # does not respond to close, otherwise the previous application body
+        # will be closed. The final application body will not be closed, as it
+        # will be passed to the server as a result.
+        last_body.close if last_body.respond_to? :close
+
+        result = app.call(env)
+        last_body = result[2]
+        break unless @catch.include?(result[0].to_i)
+      end
+
+      result
+    end
+
+    def add app
+      @has_app[app] = true
+      @apps << app
+    end
+
+    def include? app
+      @has_app.include? app
+    end
+
+    alias_method :<<, :add
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/chunked.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/chunked.rb
new file mode 100644
index 0000000..a400756
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/chunked.rb
@@ -0,0 +1,58 @@
+require 'rack/utils'
+
+module Rack
+
+  # Middleware that applies chunked transfer encoding to response bodies
+  # when the response does not include a Content-Length header.
+  class Chunked
+    include Rack::Utils
+
+    # A body wrapper that emits chunked responses
+    class Body
+      TERM = "\r\n"
+      TAIL = "0#{TERM}#{TERM}"
+
+      include Rack::Utils
+
+      def initialize(body)
+        @body = body
+      end
+
+      def each
+        term = TERM
+        @body.each do |chunk|
+          size = bytesize(chunk)
+          next if size == 0
+
+          chunk = chunk.dup.force_encoding(Encoding::BINARY) if chunk.respond_to?(:force_encoding)
+          yield [size.to_s(16), term, chunk, term].join
+        end
+        yield TAIL
+      end
+
+      def close
+        @body.close if @body.respond_to?(:close)
+      end
+    end
+
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+      headers = HeaderHash.new(headers)
+
+      if env['HTTP_VERSION'] == 'HTTP/1.0' ||
+         STATUS_WITH_NO_ENTITY_BODY.include?(status) ||
+         headers['Content-Length'] ||
+         headers['Transfer-Encoding']
+        [status, headers, body]
+      else
+        headers.delete('Content-Length')
+        headers['Transfer-Encoding'] = 'chunked'
+        [status, headers, Body.new(body)]
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/commonlogger.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/commonlogger.rb
new file mode 100644
index 0000000..7028615
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/commonlogger.rb
@@ -0,0 +1,64 @@
+require 'rack/body_proxy'
+
+module Rack
+  # Rack::CommonLogger forwards every request to the given +app+, and
+  # logs a line in the
+  # {Apache common log format}[http://httpd.apache.org/docs/1.3/logs.html#common]
+  # to the +logger+.
+  #
+  # If +logger+ is nil, CommonLogger will fall back +rack.errors+, which is
+  # an instance of Rack::NullLogger.
+  #
+  # +logger+ can be any class, including the standard library Logger, and is
+  # expected to have a +write+ method, which accepts the CommonLogger::FORMAT.
+  # According to the SPEC, the error stream must also respond to +puts+
+  # (which takes a single argument that responds to +to_s+), and +flush+
+  # (which is called without arguments in order to make the error appear for
+  # sure)
+  class CommonLogger
+    # Common Log Format: http://httpd.apache.org/docs/1.3/logs.html#common
+    #
+    #   lilith.local - - [07/Aug/2006 23:58:02] "GET / HTTP/1.1" 500 -
+    #
+    #   %{%s - %s [%s] "%s %s%s %s" %d %s\n} %
+    FORMAT = %{%s - %s [%s] "%s %s%s %s" %d %s %0.4f\n}
+
+    def initialize(app, logger=nil)
+      @app = app
+      @logger = logger
+    end
+
+    def call(env)
+      began_at = Time.now
+      status, header, body = @app.call(env)
+      header = Utils::HeaderHash.new(header)
+      body = BodyProxy.new(body) { log(env, status, header, began_at) }
+      [status, header, body]
+    end
+
+    private
+
+    def log(env, status, header, began_at)
+      now = Time.now
+      length = extract_content_length(header)
+
+      logger = @logger || env['rack.errors']
+      logger.write FORMAT % [
+        env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-",
+        env["REMOTE_USER"] || "-",
+        now.strftime("%d/%b/%Y %H:%M:%S"),
+        env["REQUEST_METHOD"],
+        env["PATH_INFO"],
+        env["QUERY_STRING"].empty? ? "" : "?"+env["QUERY_STRING"],
+        env["HTTP_VERSION"],
+        status.to_s[0..3],
+        length,
+        now - began_at ]
+    end
+
+    def extract_content_length(headers)
+      value = headers['Content-Length'] or return '-'
+      value.to_s == '0' ? '-' : value
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/conditionalget.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/conditionalget.rb
new file mode 100644
index 0000000..014e22f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/conditionalget.rb
@@ -0,0 +1,67 @@
+require 'rack/utils'
+
+module Rack
+
+  # Middleware that enables conditional GET using If-None-Match and
+  # If-Modified-Since. The application should set either or both of the
+  # Last-Modified or Etag response headers according to RFC 2616. When
+  # either of the conditions is met, the response body is set to be zero
+  # length and the response status is set to 304 Not Modified.
+  #
+  # Applications that defer response body generation until the body's each
+  # message is received will avoid response body generation completely when
+  # a conditional GET matches.
+  #
+  # Adapted from Michael Klishin's Merb implementation:
+  # https://github.com/wycats/merb/blob/master/merb-core/lib/merb-core/rack/middleware/conditional_get.rb
+  class ConditionalGet
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      case env['REQUEST_METHOD']
+      when "GET", "HEAD"
+        status, headers, body = @app.call(env)
+        headers = Utils::HeaderHash.new(headers)
+        if status == 200 && fresh?(env, headers)
+          status = 304
+          headers.delete('Content-Type')
+          headers.delete('Content-Length')
+          body = []
+        end
+        [status, headers, body]
+      else
+        @app.call(env)
+      end
+    end
+
+  private
+
+    def fresh?(env, headers)
+      modified_since = env['HTTP_IF_MODIFIED_SINCE']
+      none_match     = env['HTTP_IF_NONE_MATCH']
+
+      return false unless modified_since || none_match
+
+      success = true
+      success &&= modified_since?(to_rfc2822(modified_since), headers) if modified_since
+      success &&= etag_matches?(none_match, headers) if none_match
+      success
+    end
+
+    def etag_matches?(none_match, headers)
+      etag = headers['ETag'] and etag == none_match
+    end
+
+    def modified_since?(modified_since, headers)
+      last_modified = to_rfc2822(headers['Last-Modified']) and
+        modified_since and
+        modified_since >= last_modified
+    end
+
+    def to_rfc2822(since)
+      Time.rfc2822(since) rescue nil
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/config.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/config.rb
new file mode 100644
index 0000000..dc255d2
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/config.rb
@@ -0,0 +1,20 @@
+module Rack
+  # Rack::Config modifies the environment using the block given during
+  # initialization.
+  #
+  # Example:
+  #     use Rack::Config do |env|
+  #       env['my-key'] = 'some-value'
+  #     end
+  class Config
+    def initialize(app, &block)
+      @app = app
+      @block = block
+    end
+
+    def call(env)
+      @block.call(env)
+      @app.call(env)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/content_length.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/content_length.rb
new file mode 100644
index 0000000..634bdc4
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/content_length.rb
@@ -0,0 +1,33 @@
+require 'rack/utils'
+
+module Rack
+
+  # Sets the Content-Length header on responses with fixed-length bodies.
+  class ContentLength
+    include Rack::Utils
+
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+      headers = HeaderHash.new(headers)
+
+      if !STATUS_WITH_NO_ENTITY_BODY.include?(status.to_i) &&
+         !headers['Content-Length'] &&
+         !headers['Transfer-Encoding'] &&
+         body.respond_to?(:to_ary)
+
+        obody = body
+        body, length = [], 0
+        obody.each { |part| body << part; length += bytesize(part) }
+        obody.close if obody.respond_to?(:close)
+
+        headers['Content-Length'] = length.to_s
+      end
+
+      [status, headers, body]
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/content_type.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/content_type.rb
new file mode 100644
index 0000000..dd96e95
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/content_type.rb
@@ -0,0 +1,29 @@
+require 'rack/utils'
+
+module Rack
+
+  # Sets the Content-Type header on responses which don't have one.
+  #
+  # Builder Usage:
+  #   use Rack::ContentType, "text/plain"
+  #
+  # When no content type argument is provided, "text/html" is assumed.
+  class ContentType
+    include Rack::Utils
+
+    def initialize(app, content_type = "text/html")
+      @app, @content_type = app, content_type
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+      headers = Utils::HeaderHash.new(headers)
+
+      unless STATUS_WITH_NO_ENTITY_BODY.include?(status)
+        headers['Content-Type'] ||= @content_type
+      end
+
+      [status, headers, body]
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/deflater.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/deflater.rb
new file mode 100644
index 0000000..2f219f0
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/deflater.rb
@@ -0,0 +1,116 @@
+require "zlib"
+require "stringio"
+require "time"  # for Time.httpdate
+require 'rack/utils'
+
+module Rack
+  # This middleware enables compression of http responses.
+  #
+  # Currently supported compression algorithms:
+  #
+  #   * gzip
+  #   * deflate
+  #   * identity (no transformation)
+  #
+  # The middleware automatically detects when compression is supported
+  # and allowed. For example no transformation is made when a cache
+  # directive of 'no-transform' is present, or when the response status
+  # code is one that doesn't allow an entity body.
+  class Deflater
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+      headers = Utils::HeaderHash.new(headers)
+
+      # Skip compressing empty entity body responses and responses with
+      # no-transform set.
+      if Utils::STATUS_WITH_NO_ENTITY_BODY.include?(status) ||
+          headers['Cache-Control'].to_s =~ /\bno-transform\b/ ||
+         (headers['Content-Encoding'] && headers['Content-Encoding'] !~ /\bidentity\b/)
+        return [status, headers, body]
+      end
+
+      request = Request.new(env)
+
+      encoding = Utils.select_best_encoding(%w(gzip deflate identity),
+                                            request.accept_encoding)
+
+      # Set the Vary HTTP header.
+      vary = headers["Vary"].to_s.split(",").map { |v| v.strip }
+      unless vary.include?("*") || vary.include?("Accept-Encoding")
+        headers["Vary"] = vary.push("Accept-Encoding").join(",")
+      end
+
+      case encoding
+      when "gzip"
+        headers['Content-Encoding'] = "gzip"
+        headers.delete('Content-Length')
+        mtime = headers.key?("Last-Modified") ?
+          Time.httpdate(headers["Last-Modified"]) : Time.now
+        [status, headers, GzipStream.new(body, mtime)]
+      when "deflate"
+        headers['Content-Encoding'] = "deflate"
+        headers.delete('Content-Length')
+        [status, headers, DeflateStream.new(body)]
+      when "identity"
+        [status, headers, body]
+      when nil
+        body.close if body.respond_to?(:close)
+        message = "An acceptable encoding for the requested resource #{request.fullpath} could not be found."
+        [406, {"Content-Type" => "text/plain", "Content-Length" => message.length.to_s}, [message]]
+      end
+    end
+
+    class GzipStream
+      def initialize(body, mtime)
+        @body = body
+        @mtime = mtime
+      end
+
+      def each(&block)
+        @writer = block
+        gzip  =::Zlib::GzipWriter.new(self)
+        gzip.mtime = @mtime
+        @body.each { |part|
+          gzip.write(part)
+          gzip.flush
+        }
+      ensure
+        @body.close if @body.respond_to?(:close)
+        gzip.close
+        @writer = nil
+      end
+
+      def write(data)
+        @writer.call(data)
+      end
+    end
+
+    class DeflateStream
+      DEFLATE_ARGS = [
+        Zlib::DEFAULT_COMPRESSION,
+        # drop the zlib header which causes both Safari and IE to choke
+        -Zlib::MAX_WBITS,
+        Zlib::DEF_MEM_LEVEL,
+        Zlib::DEFAULT_STRATEGY
+      ]
+
+      def initialize(body)
+        @body = body
+      end
+
+      def each
+        deflater = ::Zlib::Deflate.new(*DEFLATE_ARGS)
+        @body.each { |part| yield deflater.deflate(part, Zlib::SYNC_FLUSH) }
+        yield deflater.finish
+        nil
+      ensure
+        @body.close if @body.respond_to?(:close)
+        deflater.close
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/directory.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/directory.rb
new file mode 100644
index 0000000..e90ee08
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/directory.rb
@@ -0,0 +1,161 @@
+require 'time'
+require 'rack/utils'
+require 'rack/mime'
+
+module Rack
+  # Rack::Directory serves entries below the +root+ given, according to the
+  # path info of the Rack request. If a directory is found, the file's contents
+  # will be presented in an html based index. If a file is found, the env will
+  # be passed to the specified +app+.
+  #
+  # If +app+ is not specified, a Rack::File of the same +root+ will be used.
+
+  class Directory
+    DIR_FILE = "<tr><td class='name'><a href='%s'>%s</a></td><td class='size'>%s</td><td class='type'>%s</td><td class='mtime'>%s</td></tr>"
+    DIR_PAGE = <<-PAGE
+<html><head>
+  <title>%s</title>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <style type='text/css'>
+table { width:100%%; }
+.name { text-align:left; }
+.size, .mtime { text-align:right; }
+.type { width:11em; }
+.mtime { width:15em; }
+  </style>
+</head><body>
+<h1>%s</h1>
+<hr />
+<table>
+  <tr>
+    <th class='name'>Name</th>
+    <th class='size'>Size</th>
+    <th class='type'>Type</th>
+    <th class='mtime'>Last Modified</th>
+  </tr>
+%s
+</table>
+<hr />
+</body></html>
+    PAGE
+
+    attr_reader :files
+    attr_accessor :root, :path
+
+    def initialize(root, app=nil)
+      @root = F.expand_path(root)
+      @app = app || Rack::File.new(@root)
+    end
+
+    def call(env)
+      dup._call(env)
+    end
+
+    F = ::File
+
+    def _call(env)
+      @env = env
+      @script_name = env['SCRIPT_NAME']
+      @path_info = Utils.unescape(env['PATH_INFO'])
+
+      if forbidden = check_forbidden
+        forbidden
+      else
+        @path = F.join(@root, @path_info)
+        list_path
+      end
+    end
+
+    def check_forbidden
+      return unless @path_info.include? ".."
+
+      body = "Forbidden\n"
+      size = Rack::Utils.bytesize(body)
+      return [403, {"Content-Type" => "text/plain",
+        "Content-Length" => size.to_s,
+        "X-Cascade" => "pass"}, [body]]
+    end
+
+    def list_directory
+      @files = [['../','Parent Directory','','','']]
+      glob = F.join(@path, '*')
+
+      url_head = (@script_name.split('/') + @path_info.split('/')).map do |part|
+        Rack::Utils.escape part
+      end
+
+      Dir[glob].sort.each do |node|
+        stat = stat(node)
+        next  unless stat
+        basename = F.basename(node)
+        ext = F.extname(node)
+
+        url = F.join(*url_head + [Rack::Utils.escape(basename)])
+        size = stat.size
+        type = stat.directory? ? 'directory' : Mime.mime_type(ext)
+        size = stat.directory? ? '-' : filesize_format(size)
+        mtime = stat.mtime.httpdate
+        url << '/'  if stat.directory?
+        basename << '/'  if stat.directory?
+
+        @files << [ url, basename, size, type, mtime ]
+      end
+
+      return [ 200, {'Content-Type'=>'text/html; charset=utf-8'}, self ]
+    end
+
+    def stat(node, max = 10)
+      F.stat(node)
+    rescue Errno::ENOENT, Errno::ELOOP
+      return nil
+    end
+
+    # TODO: add correct response if not readable, not sure if 404 is the best
+    #       option
+    def list_path
+      @stat = F.stat(@path)
+
+      if @stat.readable?
+        return @app.call(@env) if @stat.file?
+        return list_directory if @stat.directory?
+      else
+        raise Errno::ENOENT, 'No such file or directory'
+      end
+
+    rescue Errno::ENOENT, Errno::ELOOP
+      return entity_not_found
+    end
+
+    def entity_not_found
+      body = "Entity not found: #{@path_info}\n"
+      size = Rack::Utils.bytesize(body)
+      return [404, {"Content-Type" => "text/plain",
+        "Content-Length" => size.to_s,
+        "X-Cascade" => "pass"}, [body]]
+    end
+
+    def each
+      show_path = @path.sub(/^#{@root}/,'')
+      files = @files.map{|f| DIR_FILE % f }*"\n"
+      page  = DIR_PAGE % [ show_path, show_path , files ]
+      page.each_line{|l| yield l }
+    end
+
+    # Stolen from Ramaze
+
+    FILESIZE_FORMAT = [
+      ['%.1fT', 1 << 40],
+      ['%.1fG', 1 << 30],
+      ['%.1fM', 1 << 20],
+      ['%.1fK', 1 << 10],
+    ]
+
+    def filesize_format(int)
+      FILESIZE_FORMAT.each do |format, size|
+        return format % (int.to_f / size) if int >= size
+      end
+
+      int.to_s + 'B'
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/etag.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/etag.rb
new file mode 100644
index 0000000..3f5006a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/etag.rb
@@ -0,0 +1,64 @@
+require 'digest/md5'
+
+module Rack
+  # Automatically sets the ETag header on all String bodies.
+  #
+  # The ETag header is skipped if ETag or Last-Modified headers are sent or if
+  # a sendfile body (body.responds_to :to_path) is given (since such cases
+  # should be handled by apache/nginx).
+  #
+  # On initialization, you can pass two parameters: a Cache-Control directive
+  # used when Etag is absent and a directive when it is present. The first
+  # defaults to nil, while the second defaults to "max-age=0, private, must-revalidate"
+  class ETag
+    DEFAULT_CACHE_CONTROL = "max-age=0, private, must-revalidate".freeze
+
+    def initialize(app, no_cache_control = nil, cache_control = DEFAULT_CACHE_CONTROL)
+      @app = app
+      @cache_control = cache_control
+      @no_cache_control = no_cache_control
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+
+      if etag_status?(status) && etag_body?(body) && !skip_caching?(headers)
+        digest, body = digest_body(body)
+        headers['ETag'] = %("#{digest}") if digest
+      end
+
+      unless headers['Cache-Control']
+        if digest
+          headers['Cache-Control'] = @cache_control if @cache_control
+        else
+          headers['Cache-Control'] = @no_cache_control if @no_cache_control
+        end
+      end
+
+      [status, headers, body]
+    end
+
+    private
+
+      def etag_status?(status)
+        status == 200 || status == 201
+      end
+
+      def etag_body?(body)
+        !body.respond_to?(:to_path)
+      end
+
+      def skip_caching?(headers)
+        (headers['Cache-Control'] && headers['Cache-Control'].include?('no-cache')) ||
+          headers.key?('ETag') || headers.key?('Last-Modified')
+      end
+
+      def digest_body(body)
+        parts = []
+        body.each { |part| parts << part }
+        string_body = parts.join
+        digest = Digest::MD5.hexdigest(string_body) unless string_body.empty?
+        [digest, parts]
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/file.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/file.rb
new file mode 100644
index 0000000..ee58a1a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/file.rb
@@ -0,0 +1,138 @@
+require 'time'
+require 'rack/utils'
+require 'rack/mime'
+
+module Rack
+  # Rack::File serves files below the +root+ directory given, according to the
+  # path info of the Rack request.
+  # e.g. when Rack::File.new("/etc") is used, you can access 'passwd' file
+  # as http://localhost:9292/passwd
+  #
+  # Handlers can detect if bodies are a Rack::File, and use mechanisms
+  # like sendfile on the +path+.
+
+  class File
+    SEPS = Regexp.union(*[::File::SEPARATOR, ::File::ALT_SEPARATOR].compact)
+    ALLOWED_VERBS = %w[GET HEAD]
+
+    attr_accessor :root
+    attr_accessor :path
+    attr_accessor :cache_control
+
+    alias :to_path :path
+
+    def initialize(root, headers={}, default_mime = 'text/plain')
+      @root = root
+      @headers = headers
+      @default_mime = default_mime
+    end
+
+    def call(env)
+      dup._call(env)
+    end
+
+    F = ::File
+
+    def _call(env)
+      unless ALLOWED_VERBS.include? env["REQUEST_METHOD"]
+        return fail(405, "Method Not Allowed")
+      end
+
+      path_info = Utils.unescape(env["PATH_INFO"])
+      parts = path_info.split SEPS
+
+      clean = []
+
+      parts.each do |part|
+        next if part.empty? || part == '.'
+        part == '..' ? clean.pop : clean << part
+      end
+
+      @path = F.join(@root, *clean)
+
+      available = begin
+        F.file?(@path) && F.readable?(@path)
+      rescue SystemCallError
+        false
+      end
+
+      if available
+        serving(env)
+      else
+        fail(404, "File not found: #{path_info}")
+      end
+    end
+
+    def serving(env)
+      last_modified = F.mtime(@path).httpdate
+      return [304, {}, []] if env['HTTP_IF_MODIFIED_SINCE'] == last_modified
+
+      headers = { "Last-Modified" => last_modified }
+      mime = Mime.mime_type(F.extname(@path), @default_mime)
+      headers["Content-Type"] = mime if mime
+
+      # Set custom headers
+      @headers.each { |field, content| headers[field] = content } if @headers
+
+      response = [ 200, headers, env["REQUEST_METHOD"] == "HEAD" ? [] : self ]
+
+      # NOTE:
+      #   We check via File::size? whether this file provides size info
+      #   via stat (e.g. /proc files often don't), otherwise we have to
+      #   figure it out by reading the whole file into memory.
+      size = F.size?(@path) || Utils.bytesize(F.read(@path))
+
+      ranges = Rack::Utils.byte_ranges(env, size)
+      if ranges.nil? || ranges.length > 1
+        # No ranges, or multiple ranges (which we don't support):
+        # TODO: Support multiple byte-ranges
+        response[0] = 200
+        @range = 0..size-1
+      elsif ranges.empty?
+        # Unsatisfiable. Return error, and file size:
+        response = fail(416, "Byte range unsatisfiable")
+        response[1]["Content-Range"] = "bytes */#{size}"
+        return response
+      else
+        # Partial content:
+        @range = ranges[0]
+        response[0] = 206
+        response[1]["Content-Range"] = "bytes #{@range.begin}-#{@range.end}/#{size}"
+        size = @range.end - @range.begin + 1
+      end
+
+      response[1]["Content-Length"] = size.to_s
+      response
+    end
+
+    def each
+      F.open(@path, "rb") do |file|
+        file.seek(@range.begin)
+        remaining_len = @range.end- at range.begin+1
+        while remaining_len > 0
+          part = file.read([8192, remaining_len].min)
+          break unless part
+          remaining_len -= part.length
+
+          yield part
+        end
+      end
+    end
+
+    private
+
+    def fail(status, body)
+      body += "\n"
+      [
+        status,
+        {
+          "Content-Type" => "text/plain",
+          "Content-Length" => body.size.to_s,
+          "X-Cascade" => "pass"
+        },
+        [body]
+      ]
+    end
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler.rb
new file mode 100644
index 0000000..155dbfa
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler.rb
@@ -0,0 +1,107 @@
+module Rack
+  # *Handlers* connect web servers with Rack.
+  #
+  # Rack includes Handlers for Thin, WEBrick, FastCGI, CGI, SCGI
+  # and LiteSpeed.
+  #
+  # Handlers usually are activated by calling <tt>MyHandler.run(myapp)</tt>.
+  # A second optional hash can be passed to include server-specific
+  # configuration.
+  module Handler
+    def self.get(server)
+      return unless server
+      server = server.to_s
+
+      unless @handlers.include? server
+        load_error = try_require('rack/handler', server)
+      end
+
+      if klass = @handlers[server]
+        klass.split("::").inject(Object) { |o, x| o.const_get(x) }
+      else
+        const_get(server)
+      end
+
+    rescue NameError => name_error
+      raise load_error || name_error
+    end
+
+    # Select first available Rack handler given an `Array` of server names.
+    # Raises `LoadError` if no handler was found.
+    #
+    #   > pick ['thin', 'webrick']
+    #   => Rack::Handler::WEBrick
+    def self.pick(server_names)
+      server_names = Array(server_names)
+      server_names.each do |server_name|
+        begin
+          return get(server_name.to_s)
+        rescue LoadError, NameError
+        end
+      end
+
+      raise LoadError, "Couldn't find handler for: #{server_names.join(', ')}."
+    end
+
+    def self.default(options = {})
+      # Guess.
+      if ENV.include?("PHP_FCGI_CHILDREN")
+        # We already speak FastCGI
+        options.delete :File
+        options.delete :Port
+
+        Rack::Handler::FastCGI
+      elsif ENV.include?("REQUEST_METHOD")
+        Rack::Handler::CGI
+      else
+        pick ['thin', 'puma', 'webrick']
+      end
+    end
+
+    # Transforms server-name constants to their canonical form as filenames,
+    # then tries to require them but silences the LoadError if not found
+    #
+    # Naming convention:
+    #
+    #   Foo # => 'foo'
+    #   FooBar # => 'foo_bar.rb'
+    #   FooBAR # => 'foobar.rb'
+    #   FOObar # => 'foobar.rb'
+    #   FOOBAR # => 'foobar.rb'
+    #   FooBarBaz # => 'foo_bar_baz.rb'
+    def self.try_require(prefix, const_name)
+      file = const_name.gsub(/^[A-Z]+/) { |pre| pre.downcase }.
+        gsub(/[A-Z]+[^A-Z]/, '_\&').downcase
+
+      require(::File.join(prefix, file))
+      nil
+    rescue LoadError => error
+      error
+    end
+
+    def self.register(server, klass)
+      @handlers ||= {}
+      @handlers[server.to_s] = klass.to_s
+    end
+
+    autoload :CGI, "rack/handler/cgi"
+    autoload :FastCGI, "rack/handler/fastcgi"
+    autoload :Mongrel, "rack/handler/mongrel"
+    autoload :EventedMongrel, "rack/handler/evented_mongrel"
+    autoload :SwiftipliedMongrel, "rack/handler/swiftiplied_mongrel"
+    autoload :WEBrick, "rack/handler/webrick"
+    autoload :LSWS, "rack/handler/lsws"
+    autoload :SCGI, "rack/handler/scgi"
+    autoload :Thin, "rack/handler/thin"
+
+    register 'cgi', 'Rack::Handler::CGI'
+    register 'fastcgi', 'Rack::Handler::FastCGI'
+    register 'mongrel', 'Rack::Handler::Mongrel'
+    register 'emongrel', 'Rack::Handler::EventedMongrel'
+    register 'smongrel', 'Rack::Handler::SwiftipliedMongrel'
+    register 'webrick', 'Rack::Handler::WEBrick'
+    register 'lsws', 'Rack::Handler::LSWS'
+    register 'scgi', 'Rack::Handler::SCGI'
+    register 'thin', 'Rack::Handler::Thin'
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/cgi.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/cgi.rb
new file mode 100644
index 0000000..15af1ac
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/cgi.rb
@@ -0,0 +1,61 @@
+require 'rack/content_length'
+require 'rack/rewindable_input'
+
+module Rack
+  module Handler
+    class CGI
+      def self.run(app, options=nil)
+        $stdin.binmode
+        serve app
+      end
+
+      def self.serve(app)
+        env = ENV.to_hash
+        env.delete "HTTP_CONTENT_LENGTH"
+
+        env["SCRIPT_NAME"] = ""  if env["SCRIPT_NAME"] == "/"
+
+        env.update({"rack.version" => Rack::VERSION,
+                     "rack.input" => Rack::RewindableInput.new($stdin),
+                     "rack.errors" => $stderr,
+
+                     "rack.multithread" => false,
+                     "rack.multiprocess" => true,
+                     "rack.run_once" => true,
+
+                     "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
+                   })
+
+        env["QUERY_STRING"] ||= ""
+        env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
+        env["REQUEST_PATH"] ||= "/"
+
+        status, headers, body = app.call(env)
+        begin
+          send_headers status, headers
+          send_body body
+        ensure
+          body.close  if body.respond_to? :close
+        end
+      end
+
+      def self.send_headers(status, headers)
+        $stdout.print "Status: #{status}\r\n"
+        headers.each { |k, vs|
+          vs.split("\n").each { |v|
+            $stdout.print "#{k}: #{v}\r\n"
+          }
+        }
+        $stdout.print "\r\n"
+        $stdout.flush
+      end
+
+      def self.send_body(body)
+        body.each { |part|
+          $stdout.print part
+          $stdout.flush
+        }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/evented_mongrel.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/evented_mongrel.rb
new file mode 100644
index 0000000..0f5cbf7
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/evented_mongrel.rb
@@ -0,0 +1,8 @@
+require 'swiftcore/evented_mongrel'
+
+module Rack
+  module Handler
+    class EventedMongrel < Handler::Mongrel
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/fastcgi.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/fastcgi.rb
new file mode 100644
index 0000000..340e361
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/fastcgi.rb
@@ -0,0 +1,98 @@
+require 'fcgi'
+require 'socket'
+require 'rack/content_length'
+require 'rack/rewindable_input'
+
+if defined? FCGI::Stream
+  class FCGI::Stream
+    alias _rack_read_without_buffer read
+
+    def read(n, buffer=nil)
+      buf = _rack_read_without_buffer n
+      buffer.replace(buf.to_s)  if buffer
+      buf
+    end
+  end
+end
+
+module Rack
+  module Handler
+    class FastCGI
+      def self.run(app, options={})
+        if options[:File]
+          STDIN.reopen(UNIXServer.new(options[:File]))
+        elsif options[:Port]
+          STDIN.reopen(TCPServer.new(options[:Host], options[:Port]))
+        end
+        FCGI.each { |request|
+          serve request, app
+        }
+      end
+
+      def self.valid_options
+        {
+          "Host=HOST" => "Hostname to listen on (default: localhost)",
+          "Port=PORT" => "Port to listen on (default: 8080)",
+          "File=PATH" => "Creates a Domain socket at PATH instead of a TCP socket. Ignores Host and Port if set.",
+        }
+      end
+
+      def self.serve(request, app)
+        env = request.env
+        env.delete "HTTP_CONTENT_LENGTH"
+
+        env["SCRIPT_NAME"] = ""  if env["SCRIPT_NAME"] == "/"
+
+        rack_input = RewindableInput.new(request.in)
+
+        env.update({"rack.version" => Rack::VERSION,
+                     "rack.input" => rack_input,
+                     "rack.errors" => request.err,
+
+                     "rack.multithread" => false,
+                     "rack.multiprocess" => true,
+                     "rack.run_once" => false,
+
+                     "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
+                   })
+
+        env["QUERY_STRING"] ||= ""
+        env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
+        env["REQUEST_PATH"] ||= "/"
+        env.delete "CONTENT_TYPE"  if env["CONTENT_TYPE"] == ""
+        env.delete "CONTENT_LENGTH"  if env["CONTENT_LENGTH"] == ""
+
+        begin
+          status, headers, body = app.call(env)
+          begin
+            send_headers request.out, status, headers
+            send_body request.out, body
+          ensure
+            body.close  if body.respond_to? :close
+          end
+        ensure
+          rack_input.close
+          request.finish
+        end
+      end
+
+      def self.send_headers(out, status, headers)
+        out.print "Status: #{status}\r\n"
+        headers.each { |k, vs|
+          vs.split("\n").each { |v|
+            out.print "#{k}: #{v}\r\n"
+          }
+        }
+        out.print "\r\n"
+        out.flush
+      end
+
+      def self.send_body(out, body)
+        body.each { |part|
+          out.print part
+          out.flush
+        }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/lsws.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/lsws.rb
new file mode 100644
index 0000000..1dee78a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/lsws.rb
@@ -0,0 +1,61 @@
+require 'lsapi'
+require 'rack/content_length'
+require 'rack/rewindable_input'
+
+module Rack
+  module Handler
+    class LSWS
+      def self.run(app, options=nil)
+        while LSAPI.accept != nil
+          serve app
+        end
+      end
+      def self.serve(app)
+        env = ENV.to_hash
+        env.delete "HTTP_CONTENT_LENGTH"
+        env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
+
+        rack_input = RewindableInput.new($stdin.read.to_s)
+
+        env.update(
+          "rack.version" => Rack::VERSION,
+          "rack.input" => rack_input,
+          "rack.errors" => $stderr,
+          "rack.multithread" => false,
+          "rack.multiprocess" => true,
+          "rack.run_once" => false,
+          "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
+        )
+
+        env["QUERY_STRING"] ||= ""
+        env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
+        env["REQUEST_PATH"] ||= "/"
+        status, headers, body = app.call(env)
+        begin
+          send_headers status, headers
+          send_body body
+        ensure
+          body.close if body.respond_to? :close
+        end
+      ensure
+        rack_input.close
+      end
+      def self.send_headers(status, headers)
+        print "Status: #{status}\r\n"
+        headers.each { |k, vs|
+          vs.split("\n").each { |v|
+            print "#{k}: #{v}\r\n"
+          }
+        }
+        print "\r\n"
+        STDOUT.flush
+      end
+      def self.send_body(body)
+        body.each { |part|
+          print part
+          STDOUT.flush
+        }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/mongrel.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/mongrel.rb
new file mode 100644
index 0000000..1a702fd
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/mongrel.rb
@@ -0,0 +1,100 @@
+require 'mongrel'
+require 'stringio'
+require 'rack/content_length'
+require 'rack/chunked'
+
+module Rack
+  module Handler
+    class Mongrel < ::Mongrel::HttpHandler
+      def self.run(app, options={})
+        server = ::Mongrel::HttpServer.new(
+          options[:Host]           || '0.0.0.0',
+          options[:Port]           || 8080,
+          options[:num_processors] || 950,
+          options[:throttle]       || 0,
+          options[:timeout]        || 60)
+        # Acts like Rack::URLMap, utilizing Mongrel's own path finding methods.
+        # Use is similar to #run, replacing the app argument with a hash of
+        # { path=>app, ... } or an instance of Rack::URLMap.
+        if options[:map]
+          if app.is_a? Hash
+            app.each do |path, appl|
+              path = '/'+path unless path[0] == ?/
+              server.register(path, Rack::Handler::Mongrel.new(appl))
+            end
+          elsif app.is_a? URLMap
+            app.instance_variable_get(:@mapping).each do |(host, path, appl)|
+             next if !host.nil? && !options[:Host].nil? && options[:Host] != host
+             path = '/'+path unless path[0] == ?/
+             server.register(path, Rack::Handler::Mongrel.new(appl))
+            end
+          else
+            raise ArgumentError, "first argument should be a Hash or URLMap"
+          end
+        else
+          server.register('/', Rack::Handler::Mongrel.new(app))
+        end
+        yield server  if block_given?
+        server.run.join
+      end
+
+      def self.valid_options
+        {
+          "Host=HOST" => "Hostname to listen on (default: localhost)",
+          "Port=PORT" => "Port to listen on (default: 8080)",
+          "Processors=N" => "Number of concurrent processors to accept (default: 950)",
+          "Timeout=N" => "Time before a request is dropped for inactivity (default: 60)",
+          "Throttle=N" => "Throttle time between socket.accept calls in hundredths of a second (default: 0)",
+        }
+      end
+
+      def initialize(app)
+        @app = app
+      end
+
+      def process(request, response)
+        env = Hash[request.params]
+        env.delete "HTTP_CONTENT_TYPE"
+        env.delete "HTTP_CONTENT_LENGTH"
+
+        env["SCRIPT_NAME"] = ""  if env["SCRIPT_NAME"] == "/"
+
+        rack_input = request.body || StringIO.new('')
+        rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)
+
+        env.update({"rack.version" => Rack::VERSION,
+                     "rack.input" => rack_input,
+                     "rack.errors" => $stderr,
+
+                     "rack.multithread" => true,
+                     "rack.multiprocess" => false, # ???
+                     "rack.run_once" => false,
+
+                     "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
+                   })
+        env["QUERY_STRING"] ||= ""
+
+        status, headers, body = @app.call(env)
+
+        begin
+          response.status = status.to_i
+          response.send_status(nil)
+
+          headers.each { |k, vs|
+            vs.split("\n").each { |v|
+              response.header[k] = v
+            }
+          }
+          response.send_header
+
+          body.each { |part|
+            response.write part
+            response.socket.flush
+          }
+        ensure
+          body.close  if body.respond_to? :close
+        end
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/scgi.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/scgi.rb
new file mode 100644
index 0000000..a4fe6ce
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/scgi.rb
@@ -0,0 +1,67 @@
+require 'scgi'
+require 'stringio'
+require 'rack/content_length'
+require 'rack/chunked'
+
+module Rack
+  module Handler
+    class SCGI < ::SCGI::Processor
+      attr_accessor :app
+
+      def self.run(app, options=nil)
+        options[:Socket] = UNIXServer.new(options[:File]) if options[:File]
+        new(options.merge(:app=>app,
+                          :host=>options[:Host],
+                          :port=>options[:Port],
+                          :socket=>options[:Socket])).listen
+      end
+
+      def self.valid_options
+        {
+          "Host=HOST" => "Hostname to listen on (default: localhost)",
+          "Port=PORT" => "Port to listen on (default: 8080)",
+        }
+      end
+
+      def initialize(settings = {})
+        @app = settings[:app]
+        super(settings)
+      end
+
+      def process_request(request, input_body, socket)
+        env = Hash[request]
+        env.delete "HTTP_CONTENT_TYPE"
+        env.delete "HTTP_CONTENT_LENGTH"
+        env["REQUEST_PATH"], env["QUERY_STRING"] = env["REQUEST_URI"].split('?', 2)
+        env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
+        env["PATH_INFO"] = env["REQUEST_PATH"]
+        env["QUERY_STRING"] ||= ""
+        env["SCRIPT_NAME"] = ""
+
+        rack_input = StringIO.new(input_body)
+        rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)
+
+        env.update({"rack.version" => Rack::VERSION,
+                     "rack.input" => rack_input,
+                     "rack.errors" => $stderr,
+                     "rack.multithread" => true,
+                     "rack.multiprocess" => true,
+                     "rack.run_once" => false,
+
+                     "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
+                   })
+        status, headers, body = app.call(env)
+        begin
+          socket.write("Status: #{status}\r\n")
+          headers.each do |k, vs|
+            vs.split("\n").each { |v| socket.write("#{k}: #{v}\r\n")}
+          end
+          socket.write("\r\n")
+          body.each {|s| socket.write(s)}
+        ensure
+          body.close if body.respond_to? :close
+        end
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/swiftiplied_mongrel.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/swiftiplied_mongrel.rb
new file mode 100644
index 0000000..4bafd0b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/swiftiplied_mongrel.rb
@@ -0,0 +1,8 @@
+require 'swiftcore/swiftiplied_mongrel'
+
+module Rack
+  module Handler
+    class SwiftipliedMongrel < Handler::Mongrel
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/thin.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/thin.rb
new file mode 100644
index 0000000..dc26972
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/thin.rb
@@ -0,0 +1,27 @@
+require "thin"
+require "rack/content_length"
+require "rack/chunked"
+
+module Rack
+  module Handler
+    class Thin
+      def self.run(app, options={})
+        host = options.delete(:Host) || '0.0.0.0'
+        port = options.delete(:Port) || 8080
+        args = [host, port, app, options]
+        # Thin versions below 0.8.0 do not support additional options
+        args.pop if ::Thin::VERSION::MAJOR < 1 && ::Thin::VERSION::MINOR < 8
+        server = ::Thin::Server.new(*args)
+        yield server if block_given?
+        server.start
+      end
+
+      def self.valid_options
+        {
+          "Host=HOST" => "Hostname to listen on (default: localhost)",
+          "Port=PORT" => "Port to listen on (default: 8080)",
+        }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/webrick.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/webrick.rb
new file mode 100644
index 0000000..487a0ea
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/handler/webrick.rb
@@ -0,0 +1,81 @@
+require 'webrick'
+require 'stringio'
+require 'rack/content_length'
+
+module Rack
+  module Handler
+    class WEBrick < ::WEBrick::HTTPServlet::AbstractServlet
+      def self.run(app, options={})
+        options[:BindAddress] = options.delete(:Host) if options[:Host]
+        options[:Port] ||= 8080
+        @server = ::WEBrick::HTTPServer.new(options)
+        @server.mount "/", Rack::Handler::WEBrick, app
+        yield @server  if block_given?
+        @server.start
+      end
+
+      def self.valid_options
+        {
+          "Host=HOST" => "Hostname to listen on (default: localhost)",
+          "Port=PORT" => "Port to listen on (default: 8080)",
+        }
+      end
+
+      def self.shutdown
+        @server.shutdown
+        @server = nil
+      end
+
+      def initialize(server, app)
+        super server
+        @app = app
+      end
+
+      def service(req, res)
+        env = req.meta_vars
+        env.delete_if { |k, v| v.nil? }
+
+        rack_input = StringIO.new(req.body.to_s)
+        rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)
+
+        env.update({"rack.version" => Rack::VERSION,
+                     "rack.input" => rack_input,
+                     "rack.errors" => $stderr,
+
+                     "rack.multithread" => true,
+                     "rack.multiprocess" => false,
+                     "rack.run_once" => false,
+
+                     "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
+                   })
+
+        env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
+        env["QUERY_STRING"] ||= ""
+        unless env["PATH_INFO"] == ""
+          path, n = req.request_uri.path, env["SCRIPT_NAME"].length
+          env["PATH_INFO"] = path[n, path.length-n]
+        end
+        env["REQUEST_PATH"] ||= [env["SCRIPT_NAME"], env["PATH_INFO"]].join
+
+        status, headers, body = @app.call(env)
+        begin
+          res.status = status.to_i
+          headers.each { |k, vs|
+            if k.downcase == "set-cookie"
+              res.cookies.concat vs.split("\n")
+            else
+              # Since WEBrick won't accept repeated headers,
+              # merge the values per RFC 1945 section 4.2.
+              res[k] = vs.split("\n").join(", ")
+            end
+          }
+          body.each { |part|
+            res.body << part
+          }
+        ensure
+          body.close  if body.respond_to? :close
+        end
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/head.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/head.rb
new file mode 100644
index 0000000..7ffead6
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/head.rb
@@ -0,0 +1,22 @@
+module Rack
+
+class Head
+  # Rack::Head returns an empty body for all HEAD requests. It leaves
+  # all other requests unchanged.
+  def initialize(app)
+    @app = app
+  end
+
+  def call(env)
+    status, headers, body = @app.call(env)
+
+    if env["REQUEST_METHOD"] == "HEAD"
+      body.close if body.respond_to? :close
+      [status, headers, []]
+    else
+      [status, headers, body]
+    end
+  end
+end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/lint.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/lint.rb
new file mode 100644
index 0000000..fd21f77
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/lint.rb
@@ -0,0 +1,699 @@
+require 'rack/utils'
+require 'forwardable'
+
+module Rack
+  # Rack::Lint validates your application and the requests and
+  # responses according to the Rack spec.
+
+  class Lint
+    def initialize(app)
+      @app = app
+      @content_length = nil
+    end
+
+    # :stopdoc:
+
+    class LintError < RuntimeError; end
+    module Assertion
+      def assert(message, &block)
+        unless block.call
+          raise LintError, message
+        end
+      end
+    end
+    include Assertion
+
+    ## This specification aims to formalize the Rack protocol.  You
+    ## can (and should) use Rack::Lint to enforce it.
+    ##
+    ## When you develop middleware, be sure to add a Lint before and
+    ## after to catch all mistakes.
+
+    ## = Rack applications
+
+    ## A Rack application is a Ruby object (not a class) that
+    ## responds to +call+.
+    def call(env=nil)
+      dup._call(env)
+    end
+
+    def _call(env)
+      ## It takes exactly one argument, the *environment*
+      assert("No env given") { env }
+      check_env env
+
+      env['rack.input'] = InputWrapper.new(env['rack.input'])
+      env['rack.errors'] = ErrorWrapper.new(env['rack.errors'])
+
+      ## and returns an Array of exactly three values:
+      status, headers, @body = @app.call(env)
+      ## The *status*,
+      check_status status
+      ## the *headers*,
+      check_headers headers
+
+      check_hijack_response headers, env
+
+      ## and the *body*.
+      check_content_type status, headers
+      check_content_length status, headers
+      @head_request = env["REQUEST_METHOD"] == "HEAD"
+      [status, headers, self]
+    end
+
+    ## == The Environment
+    def check_env(env)
+      ## The environment must be an instance of Hash that includes
+      ## CGI-like headers.  The application is free to modify the
+      ## environment.
+      assert("env #{env.inspect} is not a Hash, but #{env.class}") {
+        env.kind_of? Hash
+      }
+
+      ##
+      ## The environment is required to include these variables
+      ## (adopted from PEP333), except when they'd be empty, but see
+      ## below.
+
+      ## <tt>REQUEST_METHOD</tt>:: The HTTP request method, such as
+      ##                           "GET" or "POST". This cannot ever
+      ##                           be an empty string, and so is
+      ##                           always required.
+
+      ## <tt>SCRIPT_NAME</tt>:: The initial portion of the request
+      ##                        URL's "path" that corresponds to the
+      ##                        application object, so that the
+      ##                        application knows its virtual
+      ##                        "location". This may be an empty
+      ##                        string, if the application corresponds
+      ##                        to the "root" of the server.
+
+      ## <tt>PATH_INFO</tt>:: The remainder of the request URL's
+      ##                      "path", designating the virtual
+      ##                      "location" of the request's target
+      ##                      within the application. This may be an
+      ##                      empty string, if the request URL targets
+      ##                      the application root and does not have a
+      ##                      trailing slash. This value may be
+      ##                      percent-encoded when I originating from
+      ##                      a URL.
+
+      ## <tt>QUERY_STRING</tt>:: The portion of the request URL that
+      ##                         follows the <tt>?</tt>, if any. May be
+      ##                         empty, but is always required!
+
+      ## <tt>SERVER_NAME</tt>, <tt>SERVER_PORT</tt>:: When combined with <tt>SCRIPT_NAME</tt> and <tt>PATH_INFO</tt>, these variables can be used to complete the URL. Note, however, that <tt>HTTP_HOST</tt>, if present, should be used in preference to <tt>SERVER_NAME</tt> for reconstructing the request URL.  <tt>SERVER_NAME</tt> and <tt>SERVER_PORT</tt> can never be empty strings, and so are always required.
+
+      ## <tt>HTTP_</tt> Variables:: Variables corresponding to the
+      ##                            client-supplied HTTP request
+      ##                            headers (i.e., variables whose
+      ##                            names begin with <tt>HTTP_</tt>). The
+      ##                            presence or absence of these
+      ##                            variables should correspond with
+      ##                            the presence or absence of the
+      ##                            appropriate HTTP header in the
+      ##                            request. See <a href="https://tools.ietf.org/html/rfc3875#section-4.1.18">
+      ##                            RFC3875 section 4.1.18</a> for specific behavior.
+
+      ## In addition to this, the Rack environment must include these
+      ## Rack-specific variables:
+
+      ## <tt>rack.version</tt>:: The Array representing this version of Rack. See Rack::VERSION, that corresponds to the version of this SPEC.
+      ## <tt>rack.url_scheme</tt>:: +http+ or +https+, depending on the request URL.
+      ## <tt>rack.input</tt>:: See below, the input stream.
+      ## <tt>rack.errors</tt>:: See below, the error stream.
+      ## <tt>rack.multithread</tt>:: true if the application object may be simultaneously invoked by another thread in the same process, false otherwise.
+      ## <tt>rack.multiprocess</tt>:: true if an equivalent application object may be simultaneously invoked by another process, false otherwise.
+      ## <tt>rack.run_once</tt>:: true if the server expects (but does not guarantee!) that the application will only be invoked this one time during the life of its containing process. Normally, this will only be true for a server based on CGI (or something similar).
+      ## <tt>rack.hijack?</tt>:: present and true if the server supports connection hijacking. See below, hijacking.
+      ## <tt>rack.hijack</tt>:: an object responding to #call that must be called at least once before using rack.hijack_io. It is recommended #call return rack.hijack_io as well as setting it in env if necessary.
+      ## <tt>rack.hijack_io</tt>:: if rack.hijack? is true, and rack.hijack has received #call, this will contain an object resembling an IO. See hijacking.
+      ##
+
+      ## Additional environment specifications have approved to
+      ## standardized middleware APIs.  None of these are required to
+      ## be implemented by the server.
+
+      ## <tt>rack.session</tt>:: A hash like interface for storing request session data.
+      ##                         The store must implement:
+      if session = env['rack.session']
+        ##                         store(key, value)         (aliased as []=);
+        assert("session #{session.inspect} must respond to store and []=") {
+          session.respond_to?(:store) && session.respond_to?(:[]=)
+        }
+
+        ##                         fetch(key, default = nil) (aliased as []);
+        assert("session #{session.inspect} must respond to fetch and []") {
+          session.respond_to?(:fetch) && session.respond_to?(:[])
+        }
+
+        ##                         delete(key);
+        assert("session #{session.inspect} must respond to delete") {
+          session.respond_to?(:delete)
+        }
+
+        ##                         clear;
+        assert("session #{session.inspect} must respond to clear") {
+          session.respond_to?(:clear)
+        }
+      end
+
+      ## <tt>rack.logger</tt>:: A common object interface for logging messages.
+      ##                        The object must implement:
+      if logger = env['rack.logger']
+        ##                         info(message, &block)
+        assert("logger #{logger.inspect} must respond to info") {
+          logger.respond_to?(:info)
+        }
+
+        ##                         debug(message, &block)
+        assert("logger #{logger.inspect} must respond to debug") {
+          logger.respond_to?(:debug)
+        }
+
+        ##                         warn(message, &block)
+        assert("logger #{logger.inspect} must respond to warn") {
+          logger.respond_to?(:warn)
+        }
+
+        ##                         error(message, &block)
+        assert("logger #{logger.inspect} must respond to error") {
+          logger.respond_to?(:error)
+        }
+
+        ##                         fatal(message, &block)
+        assert("logger #{logger.inspect} must respond to fatal") {
+          logger.respond_to?(:fatal)
+        }
+      end
+
+      ## The server or the application can store their own data in the
+      ## environment, too.  The keys must contain at least one dot,
+      ## and should be prefixed uniquely.  The prefix <tt>rack.</tt>
+      ## is reserved for use with the Rack core distribution and other
+      ## accepted specifications and must not be used otherwise.
+      ##
+
+      %w[REQUEST_METHOD SERVER_NAME SERVER_PORT
+         QUERY_STRING
+         rack.version rack.input rack.errors
+         rack.multithread rack.multiprocess rack.run_once].each { |header|
+        assert("env missing required key #{header}") { env.include? header }
+      }
+
+      ## The environment must not contain the keys
+      ## <tt>HTTP_CONTENT_TYPE</tt> or <tt>HTTP_CONTENT_LENGTH</tt>
+      ## (use the versions without <tt>HTTP_</tt>).
+      %w[HTTP_CONTENT_TYPE HTTP_CONTENT_LENGTH].each { |header|
+        assert("env contains #{header}, must use #{header[5,-1]}") {
+          not env.include? header
+        }
+      }
+
+      ## The CGI keys (named without a period) must have String values.
+      env.each { |key, value|
+        next  if key.include? "."   # Skip extensions
+        assert("env variable #{key} has non-string value #{value.inspect}") {
+          value.kind_of? String
+        }
+      }
+
+      ##
+      ## There are the following restrictions:
+
+      ## * <tt>rack.version</tt> must be an array of Integers.
+      assert("rack.version must be an Array, was #{env["rack.version"].class}") {
+        env["rack.version"].kind_of? Array
+      }
+      ## * <tt>rack.url_scheme</tt> must either be +http+ or +https+.
+      assert("rack.url_scheme unknown: #{env["rack.url_scheme"].inspect}") {
+        %w[http https].include? env["rack.url_scheme"]
+      }
+
+      ## * There must be a valid input stream in <tt>rack.input</tt>.
+      check_input env["rack.input"]
+      ## * There must be a valid error stream in <tt>rack.errors</tt>.
+      check_error env["rack.errors"]
+      ## * There may be a valid hijack stream in <tt>rack.hijack_io</tt>
+      check_hijack env
+
+      ## * The <tt>REQUEST_METHOD</tt> must be a valid token.
+      assert("REQUEST_METHOD unknown: #{env["REQUEST_METHOD"]}") {
+        env["REQUEST_METHOD"] =~ /\A[0-9A-Za-z!\#$%&'*+.^_`|~-]+\z/
+      }
+
+      ## * The <tt>SCRIPT_NAME</tt>, if non-empty, must start with <tt>/</tt>
+      assert("SCRIPT_NAME must start with /") {
+        !env.include?("SCRIPT_NAME") ||
+        env["SCRIPT_NAME"] == "" ||
+        env["SCRIPT_NAME"] =~ /\A\//
+      }
+      ## * The <tt>PATH_INFO</tt>, if non-empty, must start with <tt>/</tt>
+      assert("PATH_INFO must start with /") {
+        !env.include?("PATH_INFO") ||
+        env["PATH_INFO"] == "" ||
+        env["PATH_INFO"] =~ /\A\//
+      }
+      ## * The <tt>CONTENT_LENGTH</tt>, if given, must consist of digits only.
+      assert("Invalid CONTENT_LENGTH: #{env["CONTENT_LENGTH"]}") {
+        !env.include?("CONTENT_LENGTH") || env["CONTENT_LENGTH"] =~ /\A\d+\z/
+      }
+
+      ## * One of <tt>SCRIPT_NAME</tt> or <tt>PATH_INFO</tt> must be
+      ##   set.  <tt>PATH_INFO</tt> should be <tt>/</tt> if
+      ##   <tt>SCRIPT_NAME</tt> is empty.
+      assert("One of SCRIPT_NAME or PATH_INFO must be set (make PATH_INFO '/' if SCRIPT_NAME is empty)") {
+        env["SCRIPT_NAME"] || env["PATH_INFO"]
+      }
+      ##   <tt>SCRIPT_NAME</tt> never should be <tt>/</tt>, but instead be empty.
+      assert("SCRIPT_NAME cannot be '/', make it '' and PATH_INFO '/'") {
+        env["SCRIPT_NAME"] != "/"
+      }
+    end
+
+    ## === The Input Stream
+    ##
+    ## The input stream is an IO-like object which contains the raw HTTP
+    ## POST data.
+    def check_input(input)
+      ## When applicable, its external encoding must be "ASCII-8BIT" and it
+      ## must be opened in binary mode, for Ruby 1.9 compatibility.
+      assert("rack.input #{input} does not have ASCII-8BIT as its external encoding") {
+        input.external_encoding.name == "ASCII-8BIT"
+      } if input.respond_to?(:external_encoding)
+      assert("rack.input #{input} is not opened in binary mode") {
+        input.binmode?
+      } if input.respond_to?(:binmode?)
+
+      ## The input stream must respond to +gets+, +each+, +read+ and +rewind+.
+      [:gets, :each, :read, :rewind].each { |method|
+        assert("rack.input #{input} does not respond to ##{method}") {
+          input.respond_to? method
+        }
+      }
+    end
+
+    class InputWrapper
+      include Assertion
+
+      def initialize(input)
+        @input = input
+      end
+
+      ## * +gets+ must be called without arguments and return a string,
+      ##   or +nil+ on EOF.
+      def gets(*args)
+        assert("rack.input#gets called with arguments") { args.size == 0 }
+        v = @input.gets
+        assert("rack.input#gets didn't return a String") {
+          v.nil? or v.kind_of? String
+        }
+        v
+      end
+
+      ## * +read+ behaves like IO#read. Its signature is <tt>read([length, [buffer]])</tt>.
+      ##   If given, +length+ must be a non-negative Integer (>= 0) or +nil+, and +buffer+ must
+      ##   be a String and may not be nil. If +length+ is given and not nil, then this method
+      ##   reads at most +length+ bytes from the input stream. If +length+ is not given or nil,
+      ##   then this method reads all data until EOF.
+      ##   When EOF is reached, this method returns nil if +length+ is given and not nil, or ""
+      ##   if +length+ is not given or is nil.
+      ##   If +buffer+ is given, then the read data will be placed into +buffer+ instead of a
+      ##   newly created String object.
+      def read(*args)
+        assert("rack.input#read called with too many arguments") {
+          args.size <= 2
+        }
+        if args.size >= 1
+          assert("rack.input#read called with non-integer and non-nil length") {
+            args.first.kind_of?(Integer) || args.first.nil?
+          }
+          assert("rack.input#read called with a negative length") {
+            args.first.nil? || args.first >= 0
+          }
+        end
+        if args.size >= 2
+          assert("rack.input#read called with non-String buffer") {
+            args[1].kind_of?(String)
+          }
+        end
+
+        v = @input.read(*args)
+
+        assert("rack.input#read didn't return nil or a String") {
+          v.nil? or v.kind_of? String
+        }
+        if args[0].nil?
+          assert("rack.input#read(nil) returned nil on EOF") {
+            !v.nil?
+          }
+        end
+
+        v
+      end
+
+      ## * +each+ must be called without arguments and only yield Strings.
+      def each(*args)
+        assert("rack.input#each called with arguments") { args.size == 0 }
+        @input.each { |line|
+          assert("rack.input#each didn't yield a String") {
+            line.kind_of? String
+          }
+          yield line
+        }
+      end
+
+      ## * +rewind+ must be called without arguments. It rewinds the input
+      ##   stream back to the beginning. It must not raise Errno::ESPIPE:
+      ##   that is, it may not be a pipe or a socket. Therefore, handler
+      ##   developers must buffer the input data into some rewindable object
+      ##   if the underlying input stream is not rewindable.
+      def rewind(*args)
+        assert("rack.input#rewind called with arguments") { args.size == 0 }
+        assert("rack.input#rewind raised Errno::ESPIPE") {
+          begin
+            @input.rewind
+            true
+          rescue Errno::ESPIPE
+            false
+          end
+        }
+      end
+
+      ## * +close+ must never be called on the input stream.
+      def close(*args)
+        assert("rack.input#close must not be called") { false }
+      end
+    end
+
+    ## === The Error Stream
+    def check_error(error)
+      ## The error stream must respond to +puts+, +write+ and +flush+.
+      [:puts, :write, :flush].each { |method|
+        assert("rack.error #{error} does not respond to ##{method}") {
+          error.respond_to? method
+        }
+      }
+    end
+
+    class ErrorWrapper
+      include Assertion
+
+      def initialize(error)
+        @error = error
+      end
+
+      ## * +puts+ must be called with a single argument that responds to +to_s+.
+      def puts(str)
+        @error.puts str
+      end
+
+      ## * +write+ must be called with a single argument that is a String.
+      def write(str)
+        assert("rack.errors#write not called with a String") { str.kind_of? String }
+        @error.write str
+      end
+
+      ## * +flush+ must be called without arguments and must be called
+      ##   in order to make the error appear for sure.
+      def flush
+        @error.flush
+      end
+
+      ## * +close+ must never be called on the error stream.
+      def close(*args)
+        assert("rack.errors#close must not be called") { false }
+      end
+    end
+
+    class HijackWrapper
+      include Assertion
+      extend Forwardable
+
+      REQUIRED_METHODS = [
+        :read, :write, :read_nonblock, :write_nonblock, :flush, :close,
+        :close_read, :close_write, :closed?
+      ]
+
+      def_delegators :@io, *REQUIRED_METHODS
+
+      def initialize(io)
+        @io = io
+        REQUIRED_METHODS.each do |meth|
+          assert("rack.hijack_io must respond to #{meth}") { io.respond_to? meth }
+        end
+      end
+    end
+
+    ## === Hijacking
+    #
+    # AUTHORS: n.b. The trailing whitespace between paragraphs is important and
+    # should not be removed. The whitespace creates paragraphs in the RDoc
+    # output.
+    #
+    ## ==== Request (before status)
+    def check_hijack(env)
+      if env['rack.hijack?']
+        ## If rack.hijack? is true then rack.hijack must respond to #call.
+        original_hijack = env['rack.hijack']
+        assert("rack.hijack must respond to call") { original_hijack.respond_to?(:call) }
+        env['rack.hijack'] = proc do
+          ## rack.hijack must return the io that will also be assigned (or is
+          ## already present, in rack.hijack_io.
+          io = original_hijack.call
+          HijackWrapper.new(io)
+          ## 
+          ## rack.hijack_io must respond to:
+          ## <tt>read, write, read_nonblock, write_nonblock, flush, close,
+          ## close_read, close_write, closed?</tt>
+          ## 
+          ## The semantics of these IO methods must be a best effort match to
+          ## those of a normal ruby IO or Socket object, using standard
+          ## arguments and raising standard exceptions. Servers are encouraged
+          ## to simply pass on real IO objects, although it is recognized that
+          ## this approach is not directly compatible with SPDY and HTTP 2.0.
+          ## 
+          ## IO provided in rack.hijack_io should preference the
+          ## IO::WaitReadable and IO::WaitWritable APIs wherever supported.
+          ## 
+          ## There is a deliberate lack of full specification around
+          ## rack.hijack_io, as semantics will change from server to server.
+          ## Users are encouraged to utilize this API with a knowledge of their
+          ## server choice, and servers may extend the functionality of
+          ## hijack_io to provide additional features to users. The purpose of
+          ## rack.hijack is for Rack to "get out of the way", as such, Rack only
+          ## provides the minimum of specification and support.
+          env['rack.hijack_io'] = HijackWrapper.new(env['rack.hijack_io'])
+          io
+        end
+      else
+        ## 
+        ## If rack.hijack? is false, then rack.hijack should not be set.
+        assert("rack.hijack? is false, but rack.hijack is present") { env['rack.hijack'].nil? }
+        ## 
+        ## If rack.hijack? is false, then rack.hijack_io should not be set.
+        assert("rack.hijack? is false, but rack.hijack_io is present") { env['rack.hijack_io'].nil? }
+      end
+    end
+
+    ## ==== Response (after headers)
+    ## It is also possible to hijack a response after the status and headers
+    ## have been sent.
+    def check_hijack_response(headers, env)
+
+      # this check uses headers like a hash, but the spec only requires
+      # headers respond to #each
+      headers = Rack::Utils::HeaderHash.new(headers)
+
+      ## In order to do this, an application may set the special header
+      ## <tt>rack.hijack</tt> to an object that responds to <tt>call</tt>
+      ## accepting an argument that conforms to the <tt>rack.hijack_io</tt>
+      ## protocol.
+      ## 
+      ## After the headers have been sent, and this hijack callback has been
+      ## called, the application is now responsible for the remaining lifecycle
+      ## of the IO. The application is also responsible for maintaining HTTP
+      ## semantics. Of specific note, in almost all cases in the current SPEC,
+      ## applications will have wanted to specify the header Connection:close in
+      ## HTTP/1.1, and not Connection:keep-alive, as there is no protocol for
+      ## returning hijacked sockets to the web server. For that purpose, use the
+      ## body streaming API instead (progressively yielding strings via each).
+      ## 
+      ## Servers must ignore the <tt>body</tt> part of the response tuple when
+      ## the <tt>rack.hijack</tt> response API is in use.
+
+      if env['rack.hijack?'] && headers['rack.hijack']
+        assert('rack.hijack header must respond to #call') {
+          headers['rack.hijack'].respond_to? :call
+        }
+        original_hijack = headers['rack.hijack']
+        headers['rack.hijack'] = proc do |io|
+          original_hijack.call HijackWrapper.new(io)
+        end
+      else
+        ## 
+        ## The special response header <tt>rack.hijack</tt> must only be set
+        ## if the request env has <tt>rack.hijack?</tt> <tt>true</tt>.
+        assert('rack.hijack header must not be present if server does not support hijacking') {
+          headers['rack.hijack'].nil?
+        }
+      end
+    end
+    ## ==== Conventions
+    ## * Middleware should not use hijack unless it is handling the whole
+    ##   response.
+    ## * Middleware may wrap the IO object for the response pattern.
+    ## * Middleware should not wrap the IO object for the request pattern. The
+    ##   request pattern is intended to provide the hijacker with "raw tcp".
+
+    ## == The Response
+
+    ## === The Status
+    def check_status(status)
+      ## This is an HTTP status. When parsed as integer (+to_i+), it must be
+      ## greater than or equal to 100.
+      assert("Status must be >=100 seen as integer") { status.to_i >= 100 }
+    end
+
+    ## === The Headers
+    def check_headers(header)
+      ## The header must respond to +each+, and yield values of key and value.
+      assert("headers object should respond to #each, but doesn't (got #{header.class} as headers)") {
+         header.respond_to? :each
+      }
+      header.each { |key, value|
+        ## Special headers starting "rack." are for communicating with the
+        ## server, and must not be sent back to the client.
+        next if key =~ /^rack\..+$/
+
+        ## The header keys must be Strings.
+        assert("header key must be a string, was #{key.class}") {
+          key.kind_of? String
+        }
+        ## The header must not contain a +Status+ key,
+        assert("header must not contain Status") { key.downcase != "status" }
+        ## contain keys with <tt>:</tt> or newlines in their name,
+        assert("header names must not contain : or \\n") { key !~ /[:\n]/ }
+        ## contain keys names that end in <tt>-</tt> or <tt>_</tt>,
+        assert("header names must not end in - or _") { key !~ /[-_]\z/ }
+        ## but only contain keys that consist of
+        ## letters, digits, <tt>_</tt> or <tt>-</tt> and start with a letter.
+        assert("invalid header name: #{key}") { key =~ /\A[a-zA-Z][a-zA-Z0-9_-]*\z/ }
+
+        ## The values of the header must be Strings,
+        assert("a header value must be a String, but the value of " +
+          "'#{key}' is a #{value.class}") { value.kind_of? String }
+        ## consisting of lines (for multiple header values, e.g. multiple
+        ## <tt>Set-Cookie</tt> values) seperated by "\n".
+        value.split("\n").each { |item|
+          ## The lines must not contain characters below 037.
+          assert("invalid header value #{key}: #{item.inspect}") {
+            item !~ /[\000-\037]/
+          }
+        }
+      }
+    end
+
+    ## === The Content-Type
+    def check_content_type(status, headers)
+      headers.each { |key, value|
+        ## There must not be a <tt>Content-Type</tt>, when the +Status+ is 1xx,
+        ## 204, 205 or 304.
+        if key.downcase == "content-type"
+          assert("Content-Type header found in #{status} response, not allowed") {
+            not Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.include? status.to_i
+          }
+          return
+        end
+      }
+    end
+
+    ## === The Content-Length
+    def check_content_length(status, headers)
+      headers.each { |key, value|
+        if key.downcase == 'content-length'
+          ## There must not be a <tt>Content-Length</tt> header when the
+          ## +Status+ is 1xx, 204, 205 or 304.
+          assert("Content-Length header found in #{status} response, not allowed") {
+            not Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.include? status.to_i
+          }
+          @content_length = value
+        end
+      }
+    end
+
+    def verify_content_length(bytes)
+      if @head_request
+        assert("Response body was given for HEAD request, but should be empty") {
+          bytes == 0
+        }
+      elsif @content_length
+        assert("Content-Length header was #{@content_length}, but should be #{bytes}") {
+          @content_length == bytes.to_s
+        }
+      end
+    end
+
+    ## === The Body
+    def each
+      @closed = false
+      bytes = 0
+
+      ## The Body must respond to +each+
+      assert("Response body must respond to each") do
+        @body.respond_to?(:each)
+      end
+
+      @body.each { |part|
+        ## and must only yield String values.
+        assert("Body yielded non-string value #{part.inspect}") {
+          part.kind_of? String
+        }
+        bytes += Rack::Utils.bytesize(part)
+        yield part
+      }
+      verify_content_length(bytes)
+
+      ##
+      ## The Body itself should not be an instance of String, as this will
+      ## break in Ruby 1.9.
+      ##
+      ## If the Body responds to +close+, it will be called after iteration. If
+      ## the body is replaced by a middleware after action, the original body
+      ## must be closed first, if it repsonds to close.
+      # XXX howto: assert("Body has not been closed") { @closed }
+
+
+      ##
+      ## If the Body responds to +to_path+, it must return a String
+      ## identifying the location of a file whose contents are identical
+      ## to that produced by calling +each+; this may be used by the
+      ## server as an alternative, possibly more efficient way to
+      ## transport the response.
+
+      if @body.respond_to?(:to_path)
+        assert("The file identified by body.to_path does not exist") {
+          ::File.exist? @body.to_path
+        }
+      end
+
+      ##
+      ## The Body commonly is an Array of Strings, the application
+      ## instance itself, or a File-like object.
+    end
+
+    def close
+      @closed = true
+      @body.close  if @body.respond_to?(:close)
+    end
+
+    # :startdoc:
+
+  end
+end
+
+## == Thanks
+## Some parts of this specification are adopted from PEP333: Python
+## Web Server Gateway Interface
+## v1.0 (http://www.python.org/dev/peps/pep-0333/). I'd like to thank
+## everyone involved in that effort.
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/lobster.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/lobster.rb
new file mode 100644
index 0000000..d1a7f7b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/lobster.rb
@@ -0,0 +1,65 @@
+require 'zlib'
+
+require 'rack/request'
+require 'rack/response'
+
+module Rack
+  # Paste has a Pony, Rack has a Lobster!
+  class Lobster
+    LobsterString = Zlib::Inflate.inflate("eJx9kEEOwyAMBO99xd7MAcytUhPlJyj2
+    P6jy9i4k9EQyGAnBarEXeCBqSkntNXsi/ZCvC48zGQoZKikGrFMZvgS5ZHd+aGWVuWwhVF0
+    t1drVmiR42HcWNz5w3QanT+2gIvTVCiE1lm1Y0eU4JGmIIbaKwextKn8rvW+p5PIwFl8ZWJ
+    I8jyiTlhTcYXkekJAzTyYN6E08A+dk8voBkAVTJQ==".delete("\n ").unpack("m*")[0])
+
+    LambdaLobster = lambda { |env|
+      if env["QUERY_STRING"].include?("flip")
+        lobster = LobsterString.split("\n").
+          map { |line| line.ljust(42).reverse }.
+          join("\n")
+        href = "?"
+      else
+        lobster = LobsterString
+        href = "?flip"
+      end
+
+      content = ["<title>Lobstericious!</title>",
+                 "<pre>", lobster, "</pre>",
+                 "<a href='#{href}'>flip!</a>"]
+      length = content.inject(0) { |a,e| a+e.size }.to_s
+      [200, {"Content-Type" => "text/html", "Content-Length" => length}, content]
+    }
+
+    def call(env)
+      req = Request.new(env)
+      if req.GET["flip"] == "left"
+        lobster = LobsterString.split("\n").
+          map { |line| line.ljust(42).reverse }.
+          join("\n")
+        href = "?flip=right"
+      elsif req.GET["flip"] == "crash"
+        raise "Lobster crashed"
+      else
+        lobster = LobsterString
+        href = "?flip=left"
+      end
+
+      res = Response.new
+      res.write "<title>Lobstericious!</title>"
+      res.write "<pre>"
+      res.write lobster
+      res.write "</pre>"
+      res.write "<p><a href='#{href}'>flip!</a></p>"
+      res.write "<p><a href='?flip=crash'>crash!</a></p>"
+      res.finish
+    end
+
+  end
+end
+
+if $0 == __FILE__
+  require 'rack'
+  require 'rack/showexceptions'
+  Rack::Server.start(
+    :app => Rack::ShowExceptions.new(Rack::Lint.new(Rack::Lobster.new)), :Port => 9292
+  )
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/lock.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/lock.rb
new file mode 100644
index 0000000..b3139c0
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/lock.rb
@@ -0,0 +1,26 @@
+require 'thread'
+require 'rack/body_proxy'
+
+module Rack
+  # Rack::Lock locks every request inside a mutex, so that every request
+  # will effectively be executed synchronously.
+  class Lock
+    FLAG = 'rack.multithread'.freeze
+
+    def initialize(app, mutex = Mutex.new)
+      @app, @mutex = app, mutex
+    end
+
+    def call(env)
+      old, env[FLAG] = env[FLAG], false
+      @mutex.lock
+      response = @app.call(env)
+      body = BodyProxy.new(response[2]) { @mutex.unlock }
+      response[2] = body
+      response
+    ensure
+      @mutex.unlock unless body
+      env[FLAG] = old
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/logger.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/logger.rb
new file mode 100644
index 0000000..88f9837
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/logger.rb
@@ -0,0 +1,18 @@
+require 'logger'
+
+module Rack
+  # Sets up rack.logger to write to rack.errors stream
+  class Logger
+    def initialize(app, level = ::Logger::INFO)
+      @app, @level = app, level
+    end
+
+    def call(env)
+      logger = ::Logger.new(env['rack.errors'])
+      logger.level = @level
+
+      env['rack.logger'] = logger
+      @app.call(env)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/methodoverride.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/methodoverride.rb
new file mode 100644
index 0000000..1bdaca8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/methodoverride.rb
@@ -0,0 +1,31 @@
+module Rack
+  class MethodOverride
+    HTTP_METHODS = %w(GET HEAD PUT POST DELETE OPTIONS PATCH)
+
+    METHOD_OVERRIDE_PARAM_KEY = "_method".freeze
+    HTTP_METHOD_OVERRIDE_HEADER = "HTTP_X_HTTP_METHOD_OVERRIDE".freeze
+
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      if env["REQUEST_METHOD"] == "POST"
+        method = method_override(env)
+        if HTTP_METHODS.include?(method)
+          env["rack.methodoverride.original_method"] = env["REQUEST_METHOD"]
+          env["REQUEST_METHOD"] = method
+        end
+      end
+
+      @app.call(env)
+    end
+
+    def method_override(env)
+      req = Request.new(env)
+      method = req.POST[METHOD_OVERRIDE_PARAM_KEY] ||
+        env[HTTP_METHOD_OVERRIDE_HEADER]
+      method.to_s.upcase
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/mime.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/mime.rb
new file mode 100644
index 0000000..5d05022
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/mime.rb
@@ -0,0 +1,677 @@
+module Rack
+  module Mime
+    # Returns String with mime type if found, otherwise use +fallback+.
+    # +ext+ should be filename extension in the '.ext' format that
+    #       File.extname(file) returns.
+    # +fallback+ may be any object
+    #
+    # Also see the documentation for MIME_TYPES
+    #
+    # Usage:
+    #     Rack::Mime.mime_type('.foo')
+    #
+    # This is a shortcut for:
+    #     Rack::Mime::MIME_TYPES.fetch('.foo', 'application/octet-stream')
+
+    def mime_type(ext, fallback='application/octet-stream')
+      MIME_TYPES.fetch(ext.to_s.downcase, fallback)
+    end
+    module_function :mime_type
+
+    # Returns true if the given value is a mime match for the given mime match
+    # specification, false otherwise.
+    #
+    #    Rack::Mime.match?('text/html', 'text/*') => true
+    #    Rack::Mime.match?('text/plain', '*') => true
+    #    Rack::Mime.match?('text/html', 'application/json') => false
+
+    def match?(value, matcher)
+      v1, v2 = value.split('/', 2)
+      m1, m2 = matcher.split('/', 2)
+
+      if m1 == '*'
+        if m2.nil? || m2 == '*'
+          return true
+        elsif m2 == v2
+          return true
+        else
+          return false
+        end
+      end
+
+      return false if v1 != m1
+
+      return true if m2.nil? || m2 == '*'
+
+      m2 == v2
+    end
+    module_function :match?
+
+    # List of most common mime-types, selected various sources
+    # according to their usefulness in a webserving scope for Ruby
+    # users.
+    #
+    # To amend this list with your local mime.types list you can use:
+    #
+    #     require 'webrick/httputils'
+    #     list = WEBrick::HTTPUtils.load_mime_types('/etc/mime.types')
+    #     Rack::Mime::MIME_TYPES.merge!(list)
+    #
+    # N.B. On Ubuntu the mime.types file does not include the leading period, so
+    # users may need to modify the data before merging into the hash.
+    #
+    # To add the list mongrel provides, use:
+    #
+    #     require 'mongrel/handlers'
+    #     Rack::Mime::MIME_TYPES.merge!(Mongrel::DirHandler::MIME_TYPES)
+
+    MIME_TYPES = {
+      ".123"       => "application/vnd.lotus-1-2-3",
+      ".3dml"      => "text/vnd.in3d.3dml",
+      ".3g2"       => "video/3gpp2",
+      ".3gp"       => "video/3gpp",
+      ".a"         => "application/octet-stream",
+      ".acc"       => "application/vnd.americandynamics.acc",
+      ".ace"       => "application/x-ace-compressed",
+      ".acu"       => "application/vnd.acucobol",
+      ".aep"       => "application/vnd.audiograph",
+      ".afp"       => "application/vnd.ibm.modcap",
+      ".ai"        => "application/postscript",
+      ".aif"       => "audio/x-aiff",
+      ".aiff"      => "audio/x-aiff",
+      ".ami"       => "application/vnd.amiga.ami",
+      ".appcache"  => "text/cache-manifest",
+      ".apr"       => "application/vnd.lotus-approach",
+      ".asc"       => "application/pgp-signature",
+      ".asf"       => "video/x-ms-asf",
+      ".asm"       => "text/x-asm",
+      ".aso"       => "application/vnd.accpac.simply.aso",
+      ".asx"       => "video/x-ms-asf",
+      ".atc"       => "application/vnd.acucorp",
+      ".atom"      => "application/atom+xml",
+      ".atomcat"   => "application/atomcat+xml",
+      ".atomsvc"   => "application/atomsvc+xml",
+      ".atx"       => "application/vnd.antix.game-component",
+      ".au"        => "audio/basic",
+      ".avi"       => "video/x-msvideo",
+      ".bat"       => "application/x-msdownload",
+      ".bcpio"     => "application/x-bcpio",
+      ".bdm"       => "application/vnd.syncml.dm+wbxml",
+      ".bh2"       => "application/vnd.fujitsu.oasysprs",
+      ".bin"       => "application/octet-stream",
+      ".bmi"       => "application/vnd.bmi",
+      ".bmp"       => "image/bmp",
+      ".box"       => "application/vnd.previewsystems.box",
+      ".btif"      => "image/prs.btif",
+      ".bz"        => "application/x-bzip",
+      ".bz2"       => "application/x-bzip2",
+      ".c"         => "text/x-c",
+      ".c4g"       => "application/vnd.clonk.c4group",
+      ".cab"       => "application/vnd.ms-cab-compressed",
+      ".cc"        => "text/x-c",
+      ".ccxml"     => "application/ccxml+xml",
+      ".cdbcmsg"   => "application/vnd.contact.cmsg",
+      ".cdkey"     => "application/vnd.mediastation.cdkey",
+      ".cdx"       => "chemical/x-cdx",
+      ".cdxml"     => "application/vnd.chemdraw+xml",
+      ".cdy"       => "application/vnd.cinderella",
+      ".cer"       => "application/pkix-cert",
+      ".cgm"       => "image/cgm",
+      ".chat"      => "application/x-chat",
+      ".chm"       => "application/vnd.ms-htmlhelp",
+      ".chrt"      => "application/vnd.kde.kchart",
+      ".cif"       => "chemical/x-cif",
+      ".cii"       => "application/vnd.anser-web-certificate-issue-initiation",
+      ".cil"       => "application/vnd.ms-artgalry",
+      ".cla"       => "application/vnd.claymore",
+      ".class"     => "application/octet-stream",
+      ".clkk"      => "application/vnd.crick.clicker.keyboard",
+      ".clkp"      => "application/vnd.crick.clicker.palette",
+      ".clkt"      => "application/vnd.crick.clicker.template",
+      ".clkw"      => "application/vnd.crick.clicker.wordbank",
+      ".clkx"      => "application/vnd.crick.clicker",
+      ".clp"       => "application/x-msclip",
+      ".cmc"       => "application/vnd.cosmocaller",
+      ".cmdf"      => "chemical/x-cmdf",
+      ".cml"       => "chemical/x-cml",
+      ".cmp"       => "application/vnd.yellowriver-custom-menu",
+      ".cmx"       => "image/x-cmx",
+      ".com"       => "application/x-msdownload",
+      ".conf"      => "text/plain",
+      ".cpio"      => "application/x-cpio",
+      ".cpp"       => "text/x-c",
+      ".cpt"       => "application/mac-compactpro",
+      ".crd"       => "application/x-mscardfile",
+      ".crl"       => "application/pkix-crl",
+      ".crt"       => "application/x-x509-ca-cert",
+      ".csh"       => "application/x-csh",
+      ".csml"      => "chemical/x-csml",
+      ".csp"       => "application/vnd.commonspace",
+      ".css"       => "text/css",
+      ".csv"       => "text/csv",
+      ".curl"      => "application/vnd.curl",
+      ".cww"       => "application/prs.cww",
+      ".cxx"       => "text/x-c",
+      ".daf"       => "application/vnd.mobius.daf",
+      ".davmount"  => "application/davmount+xml",
+      ".dcr"       => "application/x-director",
+      ".dd2"       => "application/vnd.oma.dd2+xml",
+      ".ddd"       => "application/vnd.fujixerox.ddd",
+      ".deb"       => "application/x-debian-package",
+      ".der"       => "application/x-x509-ca-cert",
+      ".dfac"      => "application/vnd.dreamfactory",
+      ".diff"      => "text/x-diff",
+      ".dis"       => "application/vnd.mobius.dis",
+      ".djv"       => "image/vnd.djvu",
+      ".djvu"      => "image/vnd.djvu",
+      ".dll"       => "application/x-msdownload",
+      ".dmg"       => "application/octet-stream",
+      ".dna"       => "application/vnd.dna",
+      ".doc"       => "application/msword",
+      ".docx"      => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+      ".dot"       => "application/msword",
+      ".dp"        => "application/vnd.osgi.dp",
+      ".dpg"       => "application/vnd.dpgraph",
+      ".dsc"       => "text/prs.lines.tag",
+      ".dtd"       => "application/xml-dtd",
+      ".dts"       => "audio/vnd.dts",
+      ".dtshd"     => "audio/vnd.dts.hd",
+      ".dv"        => "video/x-dv",
+      ".dvi"       => "application/x-dvi",
+      ".dwf"       => "model/vnd.dwf",
+      ".dwg"       => "image/vnd.dwg",
+      ".dxf"       => "image/vnd.dxf",
+      ".dxp"       => "application/vnd.spotfire.dxp",
+      ".ear"       => "application/java-archive",
+      ".ecelp4800" => "audio/vnd.nuera.ecelp4800",
+      ".ecelp7470" => "audio/vnd.nuera.ecelp7470",
+      ".ecelp9600" => "audio/vnd.nuera.ecelp9600",
+      ".ecma"      => "application/ecmascript",
+      ".edm"       => "application/vnd.novadigm.edm",
+      ".edx"       => "application/vnd.novadigm.edx",
+      ".efif"      => "application/vnd.picsel",
+      ".ei6"       => "application/vnd.pg.osasli",
+      ".eml"       => "message/rfc822",
+      ".eol"       => "audio/vnd.digital-winds",
+      ".eot"       => "application/vnd.ms-fontobject",
+      ".eps"       => "application/postscript",
+      ".es3"       => "application/vnd.eszigno3+xml",
+      ".esf"       => "application/vnd.epson.esf",
+      ".etx"       => "text/x-setext",
+      ".exe"       => "application/x-msdownload",
+      ".ext"       => "application/vnd.novadigm.ext",
+      ".ez"        => "application/andrew-inset",
+      ".ez2"       => "application/vnd.ezpix-album",
+      ".ez3"       => "application/vnd.ezpix-package",
+      ".f"         => "text/x-fortran",
+      ".f77"       => "text/x-fortran",
+      ".f90"       => "text/x-fortran",
+      ".fbs"       => "image/vnd.fastbidsheet",
+      ".fdf"       => "application/vnd.fdf",
+      ".fe_launch" => "application/vnd.denovo.fcselayout-link",
+      ".fg5"       => "application/vnd.fujitsu.oasysgp",
+      ".fli"       => "video/x-fli",
+      ".flo"       => "application/vnd.micrografx.flo",
+      ".flv"       => "video/x-flv",
+      ".flw"       => "application/vnd.kde.kivio",
+      ".flx"       => "text/vnd.fmi.flexstor",
+      ".fly"       => "text/vnd.fly",
+      ".fm"        => "application/vnd.framemaker",
+      ".fnc"       => "application/vnd.frogans.fnc",
+      ".for"       => "text/x-fortran",
+      ".fpx"       => "image/vnd.fpx",
+      ".fsc"       => "application/vnd.fsc.weblaunch",
+      ".fst"       => "image/vnd.fst",
+      ".ftc"       => "application/vnd.fluxtime.clip",
+      ".fti"       => "application/vnd.anser-web-funds-transfer-initiation",
+      ".fvt"       => "video/vnd.fvt",
+      ".fzs"       => "application/vnd.fuzzysheet",
+      ".g3"        => "image/g3fax",
+      ".gac"       => "application/vnd.groove-account",
+      ".gdl"       => "model/vnd.gdl",
+      ".gem"       => "application/octet-stream",
+      ".gemspec"   => "text/x-script.ruby",
+      ".ghf"       => "application/vnd.groove-help",
+      ".gif"       => "image/gif",
+      ".gim"       => "application/vnd.groove-identity-message",
+      ".gmx"       => "application/vnd.gmx",
+      ".gph"       => "application/vnd.flographit",
+      ".gqf"       => "application/vnd.grafeq",
+      ".gram"      => "application/srgs",
+      ".grv"       => "application/vnd.groove-injector",
+      ".grxml"     => "application/srgs+xml",
+      ".gtar"      => "application/x-gtar",
+      ".gtm"       => "application/vnd.groove-tool-message",
+      ".gtw"       => "model/vnd.gtw",
+      ".gv"        => "text/vnd.graphviz",
+      ".gz"        => "application/x-gzip",
+      ".h"         => "text/x-c",
+      ".h261"      => "video/h261",
+      ".h263"      => "video/h263",
+      ".h264"      => "video/h264",
+      ".hbci"      => "application/vnd.hbci",
+      ".hdf"       => "application/x-hdf",
+      ".hh"        => "text/x-c",
+      ".hlp"       => "application/winhlp",
+      ".hpgl"      => "application/vnd.hp-hpgl",
+      ".hpid"      => "application/vnd.hp-hpid",
+      ".hps"       => "application/vnd.hp-hps",
+      ".hqx"       => "application/mac-binhex40",
+      ".htc"       => "text/x-component",
+      ".htke"      => "application/vnd.kenameaapp",
+      ".htm"       => "text/html",
+      ".html"      => "text/html",
+      ".hvd"       => "application/vnd.yamaha.hv-dic",
+      ".hvp"       => "application/vnd.yamaha.hv-voice",
+      ".hvs"       => "application/vnd.yamaha.hv-script",
+      ".icc"       => "application/vnd.iccprofile",
+      ".ice"       => "x-conference/x-cooltalk",
+      ".ico"       => "image/vnd.microsoft.icon",
+      ".ics"       => "text/calendar",
+      ".ief"       => "image/ief",
+      ".ifb"       => "text/calendar",
+      ".ifm"       => "application/vnd.shana.informed.formdata",
+      ".igl"       => "application/vnd.igloader",
+      ".igs"       => "model/iges",
+      ".igx"       => "application/vnd.micrografx.igx",
+      ".iif"       => "application/vnd.shana.informed.interchange",
+      ".imp"       => "application/vnd.accpac.simply.imp",
+      ".ims"       => "application/vnd.ms-ims",
+      ".ipk"       => "application/vnd.shana.informed.package",
+      ".irm"       => "application/vnd.ibm.rights-management",
+      ".irp"       => "application/vnd.irepository.package+xml",
+      ".iso"       => "application/octet-stream",
+      ".itp"       => "application/vnd.shana.informed.formtemplate",
+      ".ivp"       => "application/vnd.immervision-ivp",
+      ".ivu"       => "application/vnd.immervision-ivu",
+      ".jad"       => "text/vnd.sun.j2me.app-descriptor",
+      ".jam"       => "application/vnd.jam",
+      ".jar"       => "application/java-archive",
+      ".java"      => "text/x-java-source",
+      ".jisp"      => "application/vnd.jisp",
+      ".jlt"       => "application/vnd.hp-jlyt",
+      ".jnlp"      => "application/x-java-jnlp-file",
+      ".joda"      => "application/vnd.joost.joda-archive",
+      ".jp2"       => "image/jp2",
+      ".jpeg"      => "image/jpeg",
+      ".jpg"       => "image/jpeg",
+      ".jpgv"      => "video/jpeg",
+      ".jpm"       => "video/jpm",
+      ".js"        => "application/javascript",
+      ".json"      => "application/json",
+      ".karbon"    => "application/vnd.kde.karbon",
+      ".kfo"       => "application/vnd.kde.kformula",
+      ".kia"       => "application/vnd.kidspiration",
+      ".kml"       => "application/vnd.google-earth.kml+xml",
+      ".kmz"       => "application/vnd.google-earth.kmz",
+      ".kne"       => "application/vnd.kinar",
+      ".kon"       => "application/vnd.kde.kontour",
+      ".kpr"       => "application/vnd.kde.kpresenter",
+      ".ksp"       => "application/vnd.kde.kspread",
+      ".ktz"       => "application/vnd.kahootz",
+      ".kwd"       => "application/vnd.kde.kword",
+      ".latex"     => "application/x-latex",
+      ".lbd"       => "application/vnd.llamagraphics.life-balance.desktop",
+      ".lbe"       => "application/vnd.llamagraphics.life-balance.exchange+xml",
+      ".les"       => "application/vnd.hhe.lesson-player",
+      ".link66"    => "application/vnd.route66.link66+xml",
+      ".log"       => "text/plain",
+      ".lostxml"   => "application/lost+xml",
+      ".lrm"       => "application/vnd.ms-lrm",
+      ".ltf"       => "application/vnd.frogans.ltf",
+      ".lvp"       => "audio/vnd.lucent.voice",
+      ".lwp"       => "application/vnd.lotus-wordpro",
+      ".m3u"       => "audio/x-mpegurl",
+      ".m4a"       => "audio/mp4a-latm",
+      ".m4v"       => "video/mp4",
+      ".ma"        => "application/mathematica",
+      ".mag"       => "application/vnd.ecowin.chart",
+      ".man"       => "text/troff",
+      ".manifest"  => "text/cache-manifest",
+      ".mathml"    => "application/mathml+xml",
+      ".mbk"       => "application/vnd.mobius.mbk",
+      ".mbox"      => "application/mbox",
+      ".mc1"       => "application/vnd.medcalcdata",
+      ".mcd"       => "application/vnd.mcd",
+      ".mdb"       => "application/x-msaccess",
+      ".mdi"       => "image/vnd.ms-modi",
+      ".mdoc"      => "text/troff",
+      ".me"        => "text/troff",
+      ".mfm"       => "application/vnd.mfmp",
+      ".mgz"       => "application/vnd.proteus.magazine",
+      ".mid"       => "audio/midi",
+      ".midi"      => "audio/midi",
+      ".mif"       => "application/vnd.mif",
+      ".mime"      => "message/rfc822",
+      ".mj2"       => "video/mj2",
+      ".mlp"       => "application/vnd.dolby.mlp",
+      ".mmd"       => "application/vnd.chipnuts.karaoke-mmd",
+      ".mmf"       => "application/vnd.smaf",
+      ".mml"       => "application/mathml+xml",
+      ".mmr"       => "image/vnd.fujixerox.edmics-mmr",
+      ".mng"       => "video/x-mng",
+      ".mny"       => "application/x-msmoney",
+      ".mov"       => "video/quicktime",
+      ".movie"     => "video/x-sgi-movie",
+      ".mp3"       => "audio/mpeg",
+      ".mp4"       => "video/mp4",
+      ".mp4a"      => "audio/mp4",
+      ".mp4s"      => "application/mp4",
+      ".mp4v"      => "video/mp4",
+      ".mpc"       => "application/vnd.mophun.certificate",
+      ".mpeg"      => "video/mpeg",
+      ".mpg"       => "video/mpeg",
+      ".mpga"      => "audio/mpeg",
+      ".mpkg"      => "application/vnd.apple.installer+xml",
+      ".mpm"       => "application/vnd.blueice.multipass",
+      ".mpn"       => "application/vnd.mophun.application",
+      ".mpp"       => "application/vnd.ms-project",
+      ".mpy"       => "application/vnd.ibm.minipay",
+      ".mqy"       => "application/vnd.mobius.mqy",
+      ".mrc"       => "application/marc",
+      ".ms"        => "text/troff",
+      ".mscml"     => "application/mediaservercontrol+xml",
+      ".mseq"      => "application/vnd.mseq",
+      ".msf"       => "application/vnd.epson.msf",
+      ".msh"       => "model/mesh",
+      ".msi"       => "application/x-msdownload",
+      ".msl"       => "application/vnd.mobius.msl",
+      ".msty"      => "application/vnd.muvee.style",
+      ".mts"       => "model/vnd.mts",
+      ".mus"       => "application/vnd.musician",
+      ".mvb"       => "application/x-msmediaview",
+      ".mwf"       => "application/vnd.mfer",
+      ".mxf"       => "application/mxf",
+      ".mxl"       => "application/vnd.recordare.musicxml",
+      ".mxml"      => "application/xv+xml",
+      ".mxs"       => "application/vnd.triscape.mxs",
+      ".mxu"       => "video/vnd.mpegurl",
+      ".n"         => "application/vnd.nokia.n-gage.symbian.install",
+      ".nc"        => "application/x-netcdf",
+      ".ngdat"     => "application/vnd.nokia.n-gage.data",
+      ".nlu"       => "application/vnd.neurolanguage.nlu",
+      ".nml"       => "application/vnd.enliven",
+      ".nnd"       => "application/vnd.noblenet-directory",
+      ".nns"       => "application/vnd.noblenet-sealer",
+      ".nnw"       => "application/vnd.noblenet-web",
+      ".npx"       => "image/vnd.net-fpx",
+      ".nsf"       => "application/vnd.lotus-notes",
+      ".oa2"       => "application/vnd.fujitsu.oasys2",
+      ".oa3"       => "application/vnd.fujitsu.oasys3",
+      ".oas"       => "application/vnd.fujitsu.oasys",
+      ".obd"       => "application/x-msbinder",
+      ".oda"       => "application/oda",
+      ".odc"       => "application/vnd.oasis.opendocument.chart",
+      ".odf"       => "application/vnd.oasis.opendocument.formula",
+      ".odg"       => "application/vnd.oasis.opendocument.graphics",
+      ".odi"       => "application/vnd.oasis.opendocument.image",
+      ".odp"       => "application/vnd.oasis.opendocument.presentation",
+      ".ods"       => "application/vnd.oasis.opendocument.spreadsheet",
+      ".odt"       => "application/vnd.oasis.opendocument.text",
+      ".oga"       => "audio/ogg",
+      ".ogg"       => "application/ogg",
+      ".ogv"       => "video/ogg",
+      ".ogx"       => "application/ogg",
+      ".org"       => "application/vnd.lotus-organizer",
+      ".otc"       => "application/vnd.oasis.opendocument.chart-template",
+      ".otf"       => "application/vnd.oasis.opendocument.formula-template",
+      ".otg"       => "application/vnd.oasis.opendocument.graphics-template",
+      ".oth"       => "application/vnd.oasis.opendocument.text-web",
+      ".oti"       => "application/vnd.oasis.opendocument.image-template",
+      ".otm"       => "application/vnd.oasis.opendocument.text-master",
+      ".ots"       => "application/vnd.oasis.opendocument.spreadsheet-template",
+      ".ott"       => "application/vnd.oasis.opendocument.text-template",
+      ".oxt"       => "application/vnd.openofficeorg.extension",
+      ".p"         => "text/x-pascal",
+      ".p10"       => "application/pkcs10",
+      ".p12"       => "application/x-pkcs12",
+      ".p7b"       => "application/x-pkcs7-certificates",
+      ".p7m"       => "application/pkcs7-mime",
+      ".p7r"       => "application/x-pkcs7-certreqresp",
+      ".p7s"       => "application/pkcs7-signature",
+      ".pas"       => "text/x-pascal",
+      ".pbd"       => "application/vnd.powerbuilder6",
+      ".pbm"       => "image/x-portable-bitmap",
+      ".pcl"       => "application/vnd.hp-pcl",
+      ".pclxl"     => "application/vnd.hp-pclxl",
+      ".pcx"       => "image/x-pcx",
+      ".pdb"       => "chemical/x-pdb",
+      ".pdf"       => "application/pdf",
+      ".pem"       => "application/x-x509-ca-cert",
+      ".pfr"       => "application/font-tdpfr",
+      ".pgm"       => "image/x-portable-graymap",
+      ".pgn"       => "application/x-chess-pgn",
+      ".pgp"       => "application/pgp-encrypted",
+      ".pic"       => "image/x-pict",
+      ".pict"      => "image/pict",
+      ".pkg"       => "application/octet-stream",
+      ".pki"       => "application/pkixcmp",
+      ".pkipath"   => "application/pkix-pkipath",
+      ".pl"        => "text/x-script.perl",
+      ".plb"       => "application/vnd.3gpp.pic-bw-large",
+      ".plc"       => "application/vnd.mobius.plc",
+      ".plf"       => "application/vnd.pocketlearn",
+      ".pls"       => "application/pls+xml",
+      ".pm"        => "text/x-script.perl-module",
+      ".pml"       => "application/vnd.ctc-posml",
+      ".png"       => "image/png",
+      ".pnm"       => "image/x-portable-anymap",
+      ".pntg"      => "image/x-macpaint",
+      ".portpkg"   => "application/vnd.macports.portpkg",
+      ".ppd"       => "application/vnd.cups-ppd",
+      ".ppm"       => "image/x-portable-pixmap",
+      ".pps"       => "application/vnd.ms-powerpoint",
+      ".ppt"       => "application/vnd.ms-powerpoint",
+      ".prc"       => "application/vnd.palm",
+      ".pre"       => "application/vnd.lotus-freelance",
+      ".prf"       => "application/pics-rules",
+      ".ps"        => "application/postscript",
+      ".psb"       => "application/vnd.3gpp.pic-bw-small",
+      ".psd"       => "image/vnd.adobe.photoshop",
+      ".ptid"      => "application/vnd.pvi.ptid1",
+      ".pub"       => "application/x-mspublisher",
+      ".pvb"       => "application/vnd.3gpp.pic-bw-var",
+      ".pwn"       => "application/vnd.3m.post-it-notes",
+      ".py"        => "text/x-script.python",
+      ".pya"       => "audio/vnd.ms-playready.media.pya",
+      ".pyv"       => "video/vnd.ms-playready.media.pyv",
+      ".qam"       => "application/vnd.epson.quickanime",
+      ".qbo"       => "application/vnd.intu.qbo",
+      ".qfx"       => "application/vnd.intu.qfx",
+      ".qps"       => "application/vnd.publishare-delta-tree",
+      ".qt"        => "video/quicktime",
+      ".qtif"      => "image/x-quicktime",
+      ".qxd"       => "application/vnd.quark.quarkxpress",
+      ".ra"        => "audio/x-pn-realaudio",
+      ".rake"      => "text/x-script.ruby",
+      ".ram"       => "audio/x-pn-realaudio",
+      ".rar"       => "application/x-rar-compressed",
+      ".ras"       => "image/x-cmu-raster",
+      ".rb"        => "text/x-script.ruby",
+      ".rcprofile" => "application/vnd.ipunplugged.rcprofile",
+      ".rdf"       => "application/rdf+xml",
+      ".rdz"       => "application/vnd.data-vision.rdz",
+      ".rep"       => "application/vnd.businessobjects",
+      ".rgb"       => "image/x-rgb",
+      ".rif"       => "application/reginfo+xml",
+      ".rl"        => "application/resource-lists+xml",
+      ".rlc"       => "image/vnd.fujixerox.edmics-rlc",
+      ".rld"       => "application/resource-lists-diff+xml",
+      ".rm"        => "application/vnd.rn-realmedia",
+      ".rmp"       => "audio/x-pn-realaudio-plugin",
+      ".rms"       => "application/vnd.jcp.javame.midlet-rms",
+      ".rnc"       => "application/relax-ng-compact-syntax",
+      ".roff"      => "text/troff",
+      ".rpm"       => "application/x-redhat-package-manager",
+      ".rpss"      => "application/vnd.nokia.radio-presets",
+      ".rpst"      => "application/vnd.nokia.radio-preset",
+      ".rq"        => "application/sparql-query",
+      ".rs"        => "application/rls-services+xml",
+      ".rsd"       => "application/rsd+xml",
+      ".rss"       => "application/rss+xml",
+      ".rtf"       => "application/rtf",
+      ".rtx"       => "text/richtext",
+      ".ru"        => "text/x-script.ruby",
+      ".s"         => "text/x-asm",
+      ".saf"       => "application/vnd.yamaha.smaf-audio",
+      ".sbml"      => "application/sbml+xml",
+      ".sc"        => "application/vnd.ibm.secure-container",
+      ".scd"       => "application/x-msschedule",
+      ".scm"       => "application/vnd.lotus-screencam",
+      ".scq"       => "application/scvp-cv-request",
+      ".scs"       => "application/scvp-cv-response",
+      ".sdkm"      => "application/vnd.solent.sdkm+xml",
+      ".sdp"       => "application/sdp",
+      ".see"       => "application/vnd.seemail",
+      ".sema"      => "application/vnd.sema",
+      ".semd"      => "application/vnd.semd",
+      ".semf"      => "application/vnd.semf",
+      ".setpay"    => "application/set-payment-initiation",
+      ".setreg"    => "application/set-registration-initiation",
+      ".sfd"       => "application/vnd.hydrostatix.sof-data",
+      ".sfs"       => "application/vnd.spotfire.sfs",
+      ".sgm"       => "text/sgml",
+      ".sgml"      => "text/sgml",
+      ".sh"        => "application/x-sh",
+      ".shar"      => "application/x-shar",
+      ".shf"       => "application/shf+xml",
+      ".sig"       => "application/pgp-signature",
+      ".sit"       => "application/x-stuffit",
+      ".sitx"      => "application/x-stuffitx",
+      ".skp"       => "application/vnd.koan",
+      ".slt"       => "application/vnd.epson.salt",
+      ".smi"       => "application/smil+xml",
+      ".snd"       => "audio/basic",
+      ".so"        => "application/octet-stream",
+      ".spf"       => "application/vnd.yamaha.smaf-phrase",
+      ".spl"       => "application/x-futuresplash",
+      ".spot"      => "text/vnd.in3d.spot",
+      ".spp"       => "application/scvp-vp-response",
+      ".spq"       => "application/scvp-vp-request",
+      ".src"       => "application/x-wais-source",
+      ".srx"       => "application/sparql-results+xml",
+      ".sse"       => "application/vnd.kodak-descriptor",
+      ".ssf"       => "application/vnd.epson.ssf",
+      ".ssml"      => "application/ssml+xml",
+      ".stf"       => "application/vnd.wt.stf",
+      ".stk"       => "application/hyperstudio",
+      ".str"       => "application/vnd.pg.format",
+      ".sus"       => "application/vnd.sus-calendar",
+      ".sv4cpio"   => "application/x-sv4cpio",
+      ".sv4crc"    => "application/x-sv4crc",
+      ".svd"       => "application/vnd.svd",
+      ".svg"       => "image/svg+xml",
+      ".svgz"      => "image/svg+xml",
+      ".swf"       => "application/x-shockwave-flash",
+      ".swi"       => "application/vnd.arastra.swi",
+      ".t"         => "text/troff",
+      ".tao"       => "application/vnd.tao.intent-module-archive",
+      ".tar"       => "application/x-tar",
+      ".tbz"       => "application/x-bzip-compressed-tar",
+      ".tcap"      => "application/vnd.3gpp2.tcap",
+      ".tcl"       => "application/x-tcl",
+      ".tex"       => "application/x-tex",
+      ".texi"      => "application/x-texinfo",
+      ".texinfo"   => "application/x-texinfo",
+      ".text"      => "text/plain",
+      ".tif"       => "image/tiff",
+      ".tiff"      => "image/tiff",
+      ".tmo"       => "application/vnd.tmobile-livetv",
+      ".torrent"   => "application/x-bittorrent",
+      ".tpl"       => "application/vnd.groove-tool-template",
+      ".tpt"       => "application/vnd.trid.tpt",
+      ".tr"        => "text/troff",
+      ".tra"       => "application/vnd.trueapp",
+      ".trm"       => "application/x-msterminal",
+      ".tsv"       => "text/tab-separated-values",
+      ".ttf"       => "application/octet-stream",
+      ".twd"       => "application/vnd.simtech-mindmapper",
+      ".txd"       => "application/vnd.genomatix.tuxedo",
+      ".txf"       => "application/vnd.mobius.txf",
+      ".txt"       => "text/plain",
+      ".ufd"       => "application/vnd.ufdl",
+      ".umj"       => "application/vnd.umajin",
+      ".unityweb"  => "application/vnd.unity",
+      ".uoml"      => "application/vnd.uoml+xml",
+      ".uri"       => "text/uri-list",
+      ".ustar"     => "application/x-ustar",
+      ".utz"       => "application/vnd.uiq.theme",
+      ".uu"        => "text/x-uuencode",
+      ".vcd"       => "application/x-cdlink",
+      ".vcf"       => "text/x-vcard",
+      ".vcg"       => "application/vnd.groove-vcard",
+      ".vcs"       => "text/x-vcalendar",
+      ".vcx"       => "application/vnd.vcx",
+      ".vis"       => "application/vnd.visionary",
+      ".viv"       => "video/vnd.vivo",
+      ".vrml"      => "model/vrml",
+      ".vsd"       => "application/vnd.visio",
+      ".vsf"       => "application/vnd.vsf",
+      ".vtu"       => "model/vnd.vtu",
+      ".vxml"      => "application/voicexml+xml",
+      ".war"       => "application/java-archive",
+      ".wav"       => "audio/x-wav",
+      ".wax"       => "audio/x-ms-wax",
+      ".wbmp"      => "image/vnd.wap.wbmp",
+      ".wbs"       => "application/vnd.criticaltools.wbs+xml",
+      ".wbxml"     => "application/vnd.wap.wbxml",
+      ".webm"      => "video/webm",
+      ".wm"        => "video/x-ms-wm",
+      ".wma"       => "audio/x-ms-wma",
+      ".wmd"       => "application/x-ms-wmd",
+      ".wmf"       => "application/x-msmetafile",
+      ".wml"       => "text/vnd.wap.wml",
+      ".wmlc"      => "application/vnd.wap.wmlc",
+      ".wmls"      => "text/vnd.wap.wmlscript",
+      ".wmlsc"     => "application/vnd.wap.wmlscriptc",
+      ".wmv"       => "video/x-ms-wmv",
+      ".wmx"       => "video/x-ms-wmx",
+      ".wmz"       => "application/x-ms-wmz",
+      ".woff"      => "application/font-woff",
+      ".wpd"       => "application/vnd.wordperfect",
+      ".wpl"       => "application/vnd.ms-wpl",
+      ".wps"       => "application/vnd.ms-works",
+      ".wqd"       => "application/vnd.wqd",
+      ".wri"       => "application/x-mswrite",
+      ".wrl"       => "model/vrml",
+      ".wsdl"      => "application/wsdl+xml",
+      ".wspolicy"  => "application/wspolicy+xml",
+      ".wtb"       => "application/vnd.webturbo",
+      ".wvx"       => "video/x-ms-wvx",
+      ".x3d"       => "application/vnd.hzn-3d-crossword",
+      ".xar"       => "application/vnd.xara",
+      ".xbd"       => "application/vnd.fujixerox.docuworks.binder",
+      ".xbm"       => "image/x-xbitmap",
+      ".xdm"       => "application/vnd.syncml.dm+xml",
+      ".xdp"       => "application/vnd.adobe.xdp+xml",
+      ".xdw"       => "application/vnd.fujixerox.docuworks",
+      ".xenc"      => "application/xenc+xml",
+      ".xer"       => "application/patch-ops-error+xml",
+      ".xfdf"      => "application/vnd.adobe.xfdf",
+      ".xfdl"      => "application/vnd.xfdl",
+      ".xhtml"     => "application/xhtml+xml",
+      ".xif"       => "image/vnd.xiff",
+      ".xls"       => "application/vnd.ms-excel",
+      ".xlsx"      => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+      ".xml"       => "application/xml",
+      ".xo"        => "application/vnd.olpc-sugar",
+      ".xop"       => "application/xop+xml",
+      ".xpm"       => "image/x-xpixmap",
+      ".xpr"       => "application/vnd.is-xpr",
+      ".xps"       => "application/vnd.ms-xpsdocument",
+      ".xpw"       => "application/vnd.intercon.formnet",
+      ".xsl"       => "application/xml",
+      ".xslt"      => "application/xslt+xml",
+      ".xsm"       => "application/vnd.syncml+xml",
+      ".xspf"      => "application/xspf+xml",
+      ".xul"       => "application/vnd.mozilla.xul+xml",
+      ".xwd"       => "image/x-xwindowdump",
+      ".xyz"       => "chemical/x-xyz",
+      ".yaml"      => "text/yaml",
+      ".yml"       => "text/yaml",
+      ".zaz"       => "application/vnd.zzazz.deck+xml",
+      ".zip"       => "application/zip",
+      ".zmm"       => "application/vnd.handheld-entertainment+xml",
+    }
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/mock.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/mock.rb
new file mode 100644
index 0000000..ac7ef08
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/mock.rb
@@ -0,0 +1,190 @@
+require 'uri'
+require 'stringio'
+require 'rack'
+require 'rack/lint'
+require 'rack/utils'
+require 'rack/response'
+
+module Rack
+  # Rack::MockRequest helps testing your Rack application without
+  # actually using HTTP.
+  #
+  # After performing a request on a URL with get/post/put/patch/delete, it
+  # returns a MockResponse with useful helper methods for effective
+  # testing.
+  #
+  # You can pass a hash with additional configuration to the
+  # get/post/put/patch/delete.
+  # <tt>:input</tt>:: A String or IO-like to be used as rack.input.
+  # <tt>:fatal</tt>:: Raise a FatalWarning if the app writes to rack.errors.
+  # <tt>:lint</tt>:: If true, wrap the application in a Rack::Lint.
+
+  class MockRequest
+    class FatalWarning < RuntimeError
+    end
+
+    class FatalWarner
+      def puts(warning)
+        raise FatalWarning, warning
+      end
+
+      def write(warning)
+        raise FatalWarning, warning
+      end
+
+      def flush
+      end
+
+      def string
+        ""
+      end
+    end
+
+    DEFAULT_ENV = {
+      "rack.version" => Rack::VERSION,
+      "rack.input" => StringIO.new,
+      "rack.errors" => StringIO.new,
+      "rack.multithread" => true,
+      "rack.multiprocess" => true,
+      "rack.run_once" => false,
+    }
+
+    def initialize(app)
+      @app = app
+    end
+
+    def get(uri, opts={})    request("GET", uri, opts)    end
+    def post(uri, opts={})   request("POST", uri, opts)   end
+    def put(uri, opts={})    request("PUT", uri, opts)    end
+    def patch(uri, opts={})  request("PATCH", uri, opts)    end
+    def delete(uri, opts={}) request("DELETE", uri, opts) end
+    def head(uri, opts={})   request("HEAD", uri, opts)   end
+
+    def request(method="GET", uri="", opts={})
+      env = self.class.env_for(uri, opts.merge(:method => method))
+
+      if opts[:lint]
+        app = Rack::Lint.new(@app)
+      else
+        app = @app
+      end
+
+      errors = env["rack.errors"]
+      status, headers, body  = app.call(env)
+      MockResponse.new(status, headers, body, errors)
+    ensure
+      body.close if body.respond_to?(:close)
+    end
+
+    # Return the Rack environment used for a request to +uri+.
+    def self.env_for(uri="", opts={})
+      uri = URI(uri)
+      uri.path = "/#{uri.path}" unless uri.path[0] == ?/
+
+      env = DEFAULT_ENV.dup
+
+      env["REQUEST_METHOD"] = opts[:method] ? opts[:method].to_s.upcase : "GET"
+      env["SERVER_NAME"] = uri.host || "example.org"
+      env["SERVER_PORT"] = uri.port ? uri.port.to_s : "80"
+      env["QUERY_STRING"] = uri.query.to_s
+      env["PATH_INFO"] = (!uri.path || uri.path.empty?) ? "/" : uri.path
+      env["rack.url_scheme"] = uri.scheme || "http"
+      env["HTTPS"] = env["rack.url_scheme"] == "https" ? "on" : "off"
+
+      env["SCRIPT_NAME"] = opts[:script_name] || ""
+
+      if opts[:fatal]
+        env["rack.errors"] = FatalWarner.new
+      else
+        env["rack.errors"] = StringIO.new
+      end
+
+      if params = opts[:params]
+        if env["REQUEST_METHOD"] == "GET"
+          params = Utils.parse_nested_query(params) if params.is_a?(String)
+          params.update(Utils.parse_nested_query(env["QUERY_STRING"]))
+          env["QUERY_STRING"] = Utils.build_nested_query(params)
+        elsif !opts.has_key?(:input)
+          opts["CONTENT_TYPE"] = "application/x-www-form-urlencoded"
+          if params.is_a?(Hash)
+            if data = Utils::Multipart.build_multipart(params)
+              opts[:input] = data
+              opts["CONTENT_LENGTH"] ||= data.length.to_s
+              opts["CONTENT_TYPE"] = "multipart/form-data; boundary=#{Utils::Multipart::MULTIPART_BOUNDARY}"
+            else
+              opts[:input] = Utils.build_nested_query(params)
+            end
+          else
+            opts[:input] = params
+          end
+        end
+      end
+
+      empty_str = ""
+      empty_str.force_encoding("ASCII-8BIT") if empty_str.respond_to? :force_encoding
+      opts[:input] ||= empty_str
+      if String === opts[:input]
+        rack_input = StringIO.new(opts[:input])
+      else
+        rack_input = opts[:input]
+      end
+
+      rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)
+      env['rack.input'] = rack_input
+
+      env["CONTENT_LENGTH"] ||= env["rack.input"].length.to_s
+
+      opts.each { |field, value|
+        env[field] = value  if String === field
+      }
+
+      env
+    end
+  end
+
+  # Rack::MockResponse provides useful helpers for testing your apps.
+  # Usually, you don't create the MockResponse on your own, but use
+  # MockRequest.
+
+  class MockResponse < Rack::Response
+    # Headers
+    attr_reader :original_headers
+
+    # Errors
+    attr_accessor :errors
+
+    def initialize(status, headers, body, errors=StringIO.new(""))
+      @original_headers = headers
+      @errors           = errors.string if errors.respond_to?(:string)
+      @body_string      = nil
+
+      super(body, status, headers)
+    end
+
+    def =~(other)
+      body =~ other
+    end
+
+    def match(other)
+      body.match other
+    end
+
+    def body
+      # FIXME: apparently users of MockResponse expect the return value of
+      # MockResponse#body to be a string.  However, the real response object
+      # returns the body as a list.
+      #
+      # See spec_showstatus.rb:
+      #
+      #   should "not replace existing messages" do
+      #     ...
+      #     res.body.should == "foo!"
+      #   end
+      super.join
+    end
+
+    def empty?
+      [201, 204, 205, 304].include? status
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/multipart.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/multipart.rb
new file mode 100644
index 0000000..6849248
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/multipart.rb
@@ -0,0 +1,34 @@
+module Rack
+  # A multipart form data parser, adapted from IOWA.
+  #
+  # Usually, Rack::Request#POST takes care of calling this.
+  module Multipart
+    autoload :UploadedFile, 'rack/multipart/uploaded_file'
+    autoload :Parser, 'rack/multipart/parser'
+    autoload :Generator, 'rack/multipart/generator'
+
+    EOL = "\r\n"
+    MULTIPART_BOUNDARY = "AaB03x"
+    MULTIPART = %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|n
+    TOKEN = /[^\s()<>,;:\\"\/\[\]?=]+/
+    CONDISP = /Content-Disposition:\s*#{TOKEN}\s*/i
+    DISPPARM = /;\s*(#{TOKEN})=("(?:\\"|[^"])*"|#{TOKEN})/
+    RFC2183 = /^#{CONDISP}(#{DISPPARM})+$/i
+    BROKEN_QUOTED = /^#{CONDISP}.*;\sfilename="(.*?)"(?:\s*$|\s*;\s*#{TOKEN}=)/i
+    BROKEN_UNQUOTED = /^#{CONDISP}.*;\sfilename=(#{TOKEN})/i
+    MULTIPART_CONTENT_TYPE = /Content-Type: (.*)#{EOL}/ni
+    MULTIPART_CONTENT_DISPOSITION = /Content-Disposition:.*\s+name="?([^\";]*)"?/ni
+    MULTIPART_CONTENT_ID = /Content-ID:\s*([^#{EOL}]*)/ni
+
+    class << self
+      def parse_multipart(env)
+        Parser.new(env).parse
+      end
+
+      def build_multipart(params, first = true)
+        Generator.new(params, first).dump
+      end
+    end
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/multipart/generator.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/multipart/generator.rb
new file mode 100644
index 0000000..1c586b7
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/multipart/generator.rb
@@ -0,0 +1,93 @@
+module Rack
+  module Multipart
+    class Generator
+      def initialize(params, first = true)
+        @params, @first = params, first
+
+        if @first && !@params.is_a?(Hash)
+          raise ArgumentError, "value must be a Hash"
+        end
+      end
+
+      def dump
+        return nil if @first && !multipart?
+        return flattened_params if !@first
+
+        flattened_params.map do |name, file|
+          if file.respond_to?(:original_filename)
+            ::File.open(file.path, "rb") do |f|
+              f.set_encoding(Encoding::BINARY) if f.respond_to?(:set_encoding)
+              content_for_tempfile(f, file, name)
+            end
+          else
+            content_for_other(file, name)
+          end
+        end.join + "--#{MULTIPART_BOUNDARY}--\r"
+      end
+
+      private
+      def multipart?
+        multipart = false
+
+        query = lambda { |value|
+          case value
+          when Array
+            value.each(&query)
+          when Hash
+            value.values.each(&query)
+          when Rack::Multipart::UploadedFile
+            multipart = true
+          end
+        }
+        @params.values.each(&query)
+
+        multipart
+      end
+
+      def flattened_params
+        @flattened_params ||= begin
+          h = Hash.new
+          @params.each do |key, value|
+            k = @first ? key.to_s : "[#{key}]"
+
+            case value
+            when Array
+              value.map { |v|
+                Multipart.build_multipart(v, false).each { |subkey, subvalue|
+                  h["#{k}[]#{subkey}"] = subvalue
+                }
+              }
+            when Hash
+              Multipart.build_multipart(value, false).each { |subkey, subvalue|
+                h[k + subkey] = subvalue
+              }
+            else
+              h[k] = value
+            end
+          end
+          h
+        end
+      end
+
+      def content_for_tempfile(io, file, name)
+<<-EOF
+--#{MULTIPART_BOUNDARY}\r
+Content-Disposition: form-data; name="#{name}"; filename="#{Utils.escape(file.original_filename)}"\r
+Content-Type: #{file.content_type}\r
+Content-Length: #{::File.stat(file.path).size}\r
+\r
+#{io.read}\r
+EOF
+      end
+
+      def content_for_other(file, name)
+<<-EOF
+--#{MULTIPART_BOUNDARY}\r
+Content-Disposition: form-data; name="#{name}"\r
+\r
+#{file}\r
+EOF
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/multipart/parser.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/multipart/parser.rb
new file mode 100644
index 0000000..1315c7b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/multipart/parser.rb
@@ -0,0 +1,176 @@
+require 'rack/utils'
+
+module Rack
+  module Multipart
+    class Parser
+      BUFSIZE = 16384
+
+      def initialize(env)
+        @env = env
+      end
+
+      def parse
+        return nil unless setup_parse
+
+        fast_forward_to_first_boundary
+
+        loop do
+          head, filename, content_type, name, body =
+            get_current_head_and_filename_and_content_type_and_name_and_body
+
+          # Save the rest.
+          if i = @buf.index(rx)
+            body << @buf.slice!(0, i)
+            @buf.slice!(0, @boundary_size+2)
+
+            @content_length = -1  if $1 == "--"
+          end
+
+          filename, data = get_data(filename, body, content_type, name, head)
+
+          Utils.normalize_params(@params, name, data) unless data.nil?
+
+          # break if we're at the end of a buffer, but not if it is the end of a field
+          break if (@buf.empty? && $1 != EOL) || @content_length == -1
+        end
+
+        @io.rewind
+
+        @params.to_params_hash
+      end
+
+      private
+      def setup_parse
+        return false unless @env['CONTENT_TYPE'] =~ MULTIPART
+
+        @boundary = "--#{$1}"
+
+        @buf = ""
+        @params = Utils::KeySpaceConstrainedParams.new
+
+        @io = @env['rack.input']
+        @io.rewind
+
+        @boundary_size = Utils.bytesize(@boundary) + EOL.size
+
+        if @content_length = @env['CONTENT_LENGTH']
+          @content_length = @content_length.to_i
+          @content_length -= @boundary_size
+        end
+        true
+      end
+
+      def full_boundary
+        @boundary + EOL
+      end
+
+      def rx
+        @rx ||= /(?:#{EOL})?#{Regexp.quote(@boundary)}(#{EOL}|--)/n
+      end
+
+      def fast_forward_to_first_boundary
+        loop do
+          content = @io.read(BUFSIZE)
+          raise EOFError, "bad content body" unless content
+          @buf << content
+
+          while @buf.gsub!(/\A([^\n]*\n)/, '')
+            read_buffer = $1
+            return if read_buffer == full_boundary
+          end
+
+          raise EOFError, "bad content body" if Utils.bytesize(@buf) >= BUFSIZE
+        end
+      end
+
+      def get_current_head_and_filename_and_content_type_and_name_and_body
+        head = nil
+        body = ''
+        filename = content_type = name = nil
+        content = nil
+
+        until head && @buf =~ rx
+          if !head && i = @buf.index(EOL+EOL)
+            head = @buf.slice!(0, i+2) # First \r\n
+
+            @buf.slice!(0, 2)          # Second \r\n
+
+            content_type = head[MULTIPART_CONTENT_TYPE, 1]
+            name = head[MULTIPART_CONTENT_DISPOSITION, 1] || head[MULTIPART_CONTENT_ID, 1]
+
+            filename = get_filename(head)
+
+            if filename
+              body = Tempfile.new("RackMultipart")
+              body.binmode  if body.respond_to?(:binmode)
+            end
+
+            next
+          end
+
+          # Save the read body part.
+          if head && (@boundary_size+4 < @buf.size)
+            body << @buf.slice!(0, @buf.size - (@boundary_size+4))
+          end
+
+          content = @io.read(@content_length && BUFSIZE >= @content_length ? @content_length : BUFSIZE)
+          raise EOFError, "bad content body"  if content.nil? || content.empty?
+
+          @buf << content
+          @content_length -= content.size if @content_length
+        end
+
+        [head, filename, content_type, name, body]
+      end
+
+      def get_filename(head)
+        filename = nil
+        if head =~ RFC2183
+          filename = Hash[head.scan(DISPPARM)]['filename']
+          filename = $1 if filename and filename =~ /^"(.*)"$/
+        elsif head =~ BROKEN_QUOTED
+          filename = $1
+        elsif head =~ BROKEN_UNQUOTED
+          filename = $1
+        end
+
+        if filename && filename.scan(/%.?.?/).all? { |s| s =~ /%[0-9a-fA-F]{2}/ }
+          filename = Utils.unescape(filename)
+        end
+        if filename && filename !~ /\\[^\\"]/
+          filename = filename.gsub(/\\(.)/, '\1')
+        end
+        filename
+      end
+
+      def get_data(filename, body, content_type, name, head)
+        data = nil
+        if filename == ""
+          # filename is blank which means no file has been selected
+          return data
+        elsif filename
+          body.rewind
+
+          # Take the basename of the upload's original filename.
+          # This handles the full Windows paths given by Internet Explorer
+          # (and perhaps other broken user agents) without affecting
+          # those which give the lone filename.
+          filename = filename.split(/[\/\\]/).last
+
+          data = {:filename => filename, :type => content_type,
+                  :name => name, :tempfile => body, :head => head}
+        elsif !filename && content_type && body.is_a?(IO)
+          body.rewind
+
+          # Generic multipart cases, not coming from a form
+          data = {:type => content_type,
+                  :name => name, :tempfile => body, :head => head}
+        else
+          data = body
+        end
+
+        [filename, data]
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/multipart/uploaded_file.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/multipart/uploaded_file.rb
new file mode 100644
index 0000000..11932b1
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/multipart/uploaded_file.rb
@@ -0,0 +1,34 @@
+module Rack
+  module Multipart
+    class UploadedFile
+      # The filename, *not* including the path, of the "uploaded" file
+      attr_reader :original_filename
+
+      # The content type of the "uploaded" file
+      attr_accessor :content_type
+
+      def initialize(path, content_type = "text/plain", binary = false)
+        raise "#{path} file does not exist" unless ::File.exist?(path)
+        @content_type = content_type
+        @original_filename = ::File.basename(path)
+        @tempfile = Tempfile.new(@original_filename)
+        @tempfile.set_encoding(Encoding::BINARY) if @tempfile.respond_to?(:set_encoding)
+        @tempfile.binmode if binary
+        FileUtils.copy_file(path, @tempfile.path)
+      end
+
+      def path
+        @tempfile.path
+      end
+      alias_method :local_path, :path
+
+      def respond_to?(*args)
+        super or @tempfile.respond_to?(*args)
+      end
+
+      def method_missing(method_name, *args, &block) #:nodoc:
+        @tempfile.__send__(method_name, *args, &block)
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/nulllogger.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/nulllogger.rb
new file mode 100644
index 0000000..77fb637
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/nulllogger.rb
@@ -0,0 +1,18 @@
+module Rack
+  class NullLogger
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      env['rack.logger'] = self
+      @app.call(env)
+    end
+
+    def info(progname = nil, &block);  end
+    def debug(progname = nil, &block); end
+    def warn(progname = nil, &block);  end
+    def error(progname = nil, &block); end
+    def fatal(progname = nil, &block); end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/recursive.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/recursive.rb
new file mode 100644
index 0000000..b431d4d
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/recursive.rb
@@ -0,0 +1,61 @@
+require 'uri'
+
+module Rack
+  # Rack::ForwardRequest gets caught by Rack::Recursive and redirects
+  # the current request to the app at +url+.
+  #
+  #   raise ForwardRequest.new("/not-found")
+  #
+
+  class ForwardRequest < Exception
+    attr_reader :url, :env
+
+    def initialize(url, env={})
+      @url = URI(url)
+      @env = env
+
+      @env["PATH_INFO"] =       @url.path
+      @env["QUERY_STRING"] =    @url.query  if @url.query
+      @env["HTTP_HOST"] =       @url.host   if @url.host
+      @env["HTTP_PORT"] =       @url.port   if @url.port
+      @env["rack.url_scheme"] = @url.scheme if @url.scheme
+
+      super "forwarding to #{url}"
+    end
+  end
+
+  # Rack::Recursive allows applications called down the chain to
+  # include data from other applications (by using
+  # <tt>rack['rack.recursive.include'][...]</tt> or raise a
+  # ForwardRequest to redirect internally.
+
+  class Recursive
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      dup._call(env)
+    end
+
+    def _call(env)
+      @script_name = env["SCRIPT_NAME"]
+      @app.call(env.merge('rack.recursive.include' => method(:include)))
+    rescue ForwardRequest => req
+      call(env.merge(req.env))
+    end
+
+    def include(env, path)
+      unless path.index(@script_name) == 0 && (path[@script_name.size] == ?/ ||
+                                               path[@script_name.size].nil?)
+        raise ArgumentError, "can only include below #{@script_name}, not #{path}"
+      end
+
+      env = env.merge("PATH_INFO" => path, "SCRIPT_NAME" => @script_name,
+                      "REQUEST_METHOD" => "GET",
+                      "CONTENT_LENGTH" => "0", "CONTENT_TYPE" => "",
+                      "rack.input" => StringIO.new(""))
+      @app.call(env)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/reloader.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/reloader.rb
new file mode 100644
index 0000000..5f64359
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/reloader.rb
@@ -0,0 +1,109 @@
+#          Copyright (c) 2009 Michael Fellinger m.fellinger at gmail.com
+#       Rack::Reloader is subject to the terms of an MIT-style license.
+#      See COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+require 'pathname'
+
+module Rack
+
+  # High performant source reloader
+  #
+  # This class acts as Rack middleware.
+  #
+  # What makes it especially suited for use in a production environment is that
+  # any file will only be checked once and there will only be made one system
+  # call stat(2).
+  #
+  # Please note that this will not reload files in the background, it does so
+  # only when actively called.
+  #
+  # It is performing a check/reload cycle at the start of every request, but
+  # also respects a cool down time, during which nothing will be done.
+  class Reloader
+    def initialize(app, cooldown = 10, backend = Stat)
+      @app = app
+      @cooldown = cooldown
+      @last = (Time.now - cooldown)
+      @cache = {}
+      @mtimes = {}
+
+      extend backend
+    end
+
+    def call(env)
+      if @cooldown and Time.now > @last + @cooldown
+        if Thread.list.size > 1
+          Thread.exclusive{ reload! }
+        else
+          reload!
+        end
+
+        @last = Time.now
+      end
+
+      @app.call(env)
+    end
+
+    def reload!(stderr = $stderr)
+      rotation do |file, mtime|
+        previous_mtime = @mtimes[file] ||= mtime
+        safe_load(file, mtime, stderr) if mtime > previous_mtime
+      end
+    end
+
+    # A safe Kernel::load, issuing the hooks depending on the results
+    def safe_load(file, mtime, stderr = $stderr)
+      load(file)
+      stderr.puts "#{self.class}: reloaded `#{file}'"
+      file
+    rescue LoadError, SyntaxError => ex
+      stderr.puts ex
+    ensure
+      @mtimes[file] = mtime
+    end
+
+    module Stat
+      def rotation
+        files = [$0, *$LOADED_FEATURES].uniq
+        paths = ['./', *$LOAD_PATH].uniq
+
+        files.map{|file|
+          next if file =~ /\.(so|bundle)$/ # cannot reload compiled files
+
+          found, stat = figure_path(file, paths)
+          next unless found && stat && mtime = stat.mtime
+
+          @cache[file] = found
+
+          yield(found, mtime)
+        }.compact
+      end
+
+      # Takes a relative or absolute +file+ name, a couple possible +paths+ that
+      # the +file+ might reside in. Returns the full path and File::Stat for the
+      # path.
+      def figure_path(file, paths)
+        found = @cache[file]
+        found = file if !found and Pathname.new(file).absolute?
+        found, stat = safe_stat(found)
+        return found, stat if found
+
+        paths.find do |possible_path|
+          path = ::File.join(possible_path, file)
+          found, stat = safe_stat(path)
+          return ::File.expand_path(found), stat if found
+        end
+
+        return false, false
+      end
+
+      def safe_stat(file)
+        return unless file
+        stat = ::File.stat(file)
+        return file, stat if stat.file?
+      rescue Errno::ENOENT, Errno::ENOTDIR, Errno::ESRCH
+        @cache.delete(file) and false
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/request.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/request.rb
new file mode 100644
index 0000000..e8734d7
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/request.rb
@@ -0,0 +1,380 @@
+require 'rack/utils'
+
+module Rack
+  # Rack::Request provides a convenient interface to a Rack
+  # environment.  It is stateless, the environment +env+ passed to the
+  # constructor will be directly modified.
+  #
+  #   req = Rack::Request.new(env)
+  #   req.post?
+  #   req.params["data"]
+  #
+  # The environment hash passed will store a reference to the Request object
+  # instantiated so that it will only instantiate if an instance of the Request
+  # object doesn't already exist.
+
+  class Request
+    # The environment of the request.
+    attr_reader :env
+
+    def initialize(env)
+      @env = env
+    end
+
+    def body;            @env["rack.input"]                       end
+    def script_name;     @env["SCRIPT_NAME"].to_s                 end
+    def path_info;       @env["PATH_INFO"].to_s                   end
+    def request_method;  @env["REQUEST_METHOD"]                   end
+    def query_string;    @env["QUERY_STRING"].to_s                end
+    def content_length;  @env['CONTENT_LENGTH']                   end
+
+    def content_type
+      content_type = @env['CONTENT_TYPE']
+      content_type.nil? || content_type.empty? ? nil : content_type
+    end
+
+    def session;         @env['rack.session'] ||= {}              end
+    def session_options; @env['rack.session.options'] ||= {}      end
+    def logger;          @env['rack.logger']                      end
+
+    # The media type (type/subtype) portion of the CONTENT_TYPE header
+    # without any media type parameters. e.g., when CONTENT_TYPE is
+    # "text/plain;charset=utf-8", the media-type is "text/plain".
+    #
+    # For more information on the use of media types in HTTP, see:
+    # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7
+    def media_type
+      content_type && content_type.split(/\s*[;,]\s*/, 2).first.downcase
+    end
+
+    # The media type parameters provided in CONTENT_TYPE as a Hash, or
+    # an empty Hash if no CONTENT_TYPE or media-type parameters were
+    # provided.  e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8",
+    # this method responds with the following Hash:
+    #   { 'charset' => 'utf-8' }
+    def media_type_params
+      return {} if content_type.nil?
+      Hash[*content_type.split(/\s*[;,]\s*/)[1..-1].
+        collect { |s| s.split('=', 2) }.
+        map { |k,v| [k.downcase, v] }.flatten]
+    end
+
+    # The character set of the request body if a "charset" media type
+    # parameter was given, or nil if no "charset" was specified. Note
+    # that, per RFC2616, text/* media types that specify no explicit
+    # charset are to be considered ISO-8859-1.
+    def content_charset
+      media_type_params['charset']
+    end
+
+    def scheme
+      if @env['HTTPS'] == 'on'
+        'https'
+      elsif @env['HTTP_X_FORWARDED_SSL'] == 'on'
+        'https'
+      elsif @env['HTTP_X_FORWARDED_SCHEME']
+        @env['HTTP_X_FORWARDED_SCHEME']
+      elsif @env['HTTP_X_FORWARDED_PROTO']
+        @env['HTTP_X_FORWARDED_PROTO'].split(',')[0]
+      else
+        @env["rack.url_scheme"]
+      end
+    end
+
+    def ssl?
+      scheme == 'https'
+    end
+
+    def host_with_port
+      if forwarded = @env["HTTP_X_FORWARDED_HOST"]
+        forwarded.split(/,\s?/).last
+      else
+        @env['HTTP_HOST'] || "#{@env['SERVER_NAME'] || @env['SERVER_ADDR']}:#{@env['SERVER_PORT']}"
+      end
+    end
+
+    def port
+      if port = host_with_port.split(/:/)[1]
+        port.to_i
+      elsif port = @env['HTTP_X_FORWARDED_PORT']
+        port.to_i
+      elsif @env.has_key?("HTTP_X_FORWARDED_HOST")
+        DEFAULT_PORTS[scheme]
+      else
+        @env["SERVER_PORT"].to_i
+      end
+    end
+
+    def host
+      # Remove port number.
+      host_with_port.to_s.gsub(/:\d+\z/, '')
+    end
+
+    def script_name=(s); @env["SCRIPT_NAME"] = s.to_s             end
+    def path_info=(s);   @env["PATH_INFO"] = s.to_s               end
+
+
+    # Checks the HTTP request method (or verb) to see if it was of type DELETE
+    def delete?;  request_method == "DELETE"  end
+
+    # Checks the HTTP request method (or verb) to see if it was of type GET
+    def get?;     request_method == "GET"     end
+
+    # Checks the HTTP request method (or verb) to see if it was of type HEAD
+    def head?;    request_method == "HEAD"    end
+
+    # Checks the HTTP request method (or verb) to see if it was of type OPTIONS
+    def options?; request_method == "OPTIONS" end
+
+    # Checks the HTTP request method (or verb) to see if it was of type PATCH
+    def patch?;   request_method == "PATCH"   end
+
+    # Checks the HTTP request method (or verb) to see if it was of type POST
+    def post?;    request_method == "POST"    end
+
+    # Checks the HTTP request method (or verb) to see if it was of type PUT
+    def put?;     request_method == "PUT"     end
+
+    # Checks the HTTP request method (or verb) to see if it was of type TRACE
+    def trace?;   request_method == "TRACE"   end
+
+
+    # The set of form-data media-types. Requests that do not indicate
+    # one of the media types presents in this list will not be eligible
+    # for form-data / param parsing.
+    FORM_DATA_MEDIA_TYPES = [
+      'application/x-www-form-urlencoded',
+      'multipart/form-data'
+    ]
+
+    # The set of media-types. Requests that do not indicate
+    # one of the media types presents in this list will not be eligible
+    # for param parsing like soap attachments or generic multiparts
+    PARSEABLE_DATA_MEDIA_TYPES = [
+      'multipart/related',
+      'multipart/mixed'
+    ]
+
+    # Default ports depending on scheme. Used to decide whether or not
+    # to include the port in a generated URI.
+    DEFAULT_PORTS = { 'http' => 80, 'https' => 443, 'coffee' => 80 }
+
+    # Determine whether the request body contains form-data by checking
+    # the request Content-Type for one of the media-types:
+    # "application/x-www-form-urlencoded" or "multipart/form-data". The
+    # list of form-data media types can be modified through the
+    # +FORM_DATA_MEDIA_TYPES+ array.
+    #
+    # A request body is also assumed to contain form-data when no
+    # Content-Type header is provided and the request_method is POST.
+    def form_data?
+      type = media_type
+      meth = env["rack.methodoverride.original_method"] || env['REQUEST_METHOD']
+      (meth == 'POST' && type.nil?) || FORM_DATA_MEDIA_TYPES.include?(type)
+    end
+
+    # Determine whether the request body contains data by checking
+    # the request media_type against registered parse-data media-types
+    def parseable_data?
+      PARSEABLE_DATA_MEDIA_TYPES.include?(media_type)
+    end
+
+    # Returns the data received in the query string.
+    def GET
+      if @env["rack.request.query_string"] == query_string
+        @env["rack.request.query_hash"]
+      else
+        @env["rack.request.query_string"] = query_string
+        @env["rack.request.query_hash"]   = parse_query(query_string)
+      end
+    end
+
+    # Returns the data received in the request body.
+    #
+    # This method support both application/x-www-form-urlencoded and
+    # multipart/form-data.
+    def POST
+      if @env["rack.input"].nil?
+        raise "Missing rack.input"
+      elsif @env["rack.request.form_input"].eql? @env["rack.input"]
+        @env["rack.request.form_hash"]
+      elsif form_data? || parseable_data?
+        @env["rack.request.form_input"] = @env["rack.input"]
+        unless @env["rack.request.form_hash"] = parse_multipart(env)
+          form_vars = @env["rack.input"].read
+
+          # Fix for Safari Ajax postings that always append \0
+          # form_vars.sub!(/\0\z/, '') # performance replacement:
+          form_vars.slice!(-1) if form_vars[-1] == ?\0
+
+          @env["rack.request.form_vars"] = form_vars
+          @env["rack.request.form_hash"] = parse_query(form_vars)
+
+          @env["rack.input"].rewind
+        end
+        @env["rack.request.form_hash"]
+      else
+        {}
+      end
+    end
+
+    # The union of GET and POST data.
+    #
+    # Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params.
+    def params
+      @params ||= self.GET.merge(self.POST)
+    rescue EOFError
+      self.GET.dup
+    end
+
+    # Destructively update a parameter, whether it's in GET and/or POST. Returns nil.
+    #
+    # The parameter is updated wherever it was previous defined, so GET, POST, or both. If it wasn't previously defined, it's inserted into GET.
+    #
+    # env['rack.input'] is not touched.
+    def update_param(k, v)
+      found = false
+      if self.GET.has_key?(k)
+        found = true
+        self.GET[k] = v
+      end
+      if self.POST.has_key?(k)
+        found = true
+        self.POST[k] = v
+      end
+      unless found
+        self.GET[k] = v
+      end
+      @params = nil
+      nil
+    end
+
+    # Destructively delete a parameter, whether it's in GET or POST. Returns the value of the deleted parameter.
+    #
+    # If the parameter is in both GET and POST, the POST value takes precedence since that's how #params works.
+    #
+    # env['rack.input'] is not touched.
+    def delete_param(k)
+      v = [ self.POST.delete(k), self.GET.delete(k) ].compact.first
+      @params = nil
+      v
+    end
+
+    # shortcut for request.params[key]
+    def [](key)
+      params[key.to_s]
+    end
+
+    # shortcut for request.params[key] = value
+    #
+    # Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params.
+    def []=(key, value)
+      params[key.to_s] = value
+    end
+
+    # like Hash#values_at
+    def values_at(*keys)
+      keys.map{|key| params[key] }
+    end
+
+    # the referer of the client
+    def referer
+      @env['HTTP_REFERER']
+    end
+    alias referrer referer
+
+    def user_agent
+      @env['HTTP_USER_AGENT']
+    end
+
+    def cookies
+      hash   = @env["rack.request.cookie_hash"] ||= {}
+      string = @env["HTTP_COOKIE"]
+
+      return hash if string == @env["rack.request.cookie_string"]
+      hash.clear
+
+      # According to RFC 2109:
+      #   If multiple cookies satisfy the criteria above, they are ordered in
+      #   the Cookie header such that those with more specific Path attributes
+      #   precede those with less specific.  Ordering with respect to other
+      #   attributes (e.g., Domain) is unspecified.
+      cookies = Utils.parse_query(string, ';,') { |s| Rack::Utils.unescape(s) rescue s }
+      cookies.each { |k,v| hash[k] = Array === v ? v.first : v }
+      @env["rack.request.cookie_string"] = string
+      hash
+    end
+
+    def xhr?
+      @env["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest"
+    end
+
+    def base_url
+      url = "#{scheme}://#{host}"
+      url << ":#{port}" if port != DEFAULT_PORTS[scheme]
+      url
+    end
+
+    # Tries to return a remake of the original request URL as a string.
+    def url
+      base_url + fullpath
+    end
+
+    def path
+      script_name + path_info
+    end
+
+    def fullpath
+      query_string.empty? ? path : "#{path}?#{query_string}"
+    end
+
+    def accept_encoding
+      @env["HTTP_ACCEPT_ENCODING"].to_s.split(/\s*,\s*/).map do |part|
+        encoding, parameters = part.split(/\s*;\s*/, 2)
+        quality = 1.0
+        if parameters and /\Aq=([\d.]+)/ =~ parameters
+          quality = $1.to_f
+        end
+        [encoding, quality]
+      end
+    end
+
+    def trusted_proxy?(ip)
+      ip =~ /\A127\.0\.0\.1\Z|\A(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.|\A::1\Z|\Afd[0-9a-f]{2}:.+|\Alocalhost\Z|\Aunix\Z|\Aunix:/i
+    end
+
+    def ip
+      remote_addrs = split_ip_addresses(@env['REMOTE_ADDR'])
+      remote_addrs = reject_trusted_ip_addresses(remote_addrs)
+
+      return remote_addrs.first if remote_addrs.any?
+
+      forwarded_ips = split_ip_addresses(@env['HTTP_X_FORWARDED_FOR'])
+
+      if client_ip = @env['HTTP_CLIENT_IP']
+        # If forwarded_ips doesn't include the client_ip, it might be an
+        # ip spoofing attempt, so we ignore HTTP_CLIENT_IP
+        return client_ip if forwarded_ips.include?(client_ip)
+      end
+
+      return reject_trusted_ip_addresses(forwarded_ips).last || @env["REMOTE_ADDR"]
+    end
+
+    protected
+      def split_ip_addresses(ip_addresses)
+        ip_addresses ? ip_addresses.strip.split(/[,\s]+/) : []
+      end
+
+      def reject_trusted_ip_addresses(ip_addresses)
+        ip_addresses.reject { |ip| trusted_proxy?(ip) }
+      end
+
+      def parse_query(qs)
+        Utils.parse_nested_query(qs)
+      end
+
+      def parse_multipart(env)
+        Rack::Multipart.parse_multipart(env)
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/response.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/response.rb
new file mode 100644
index 0000000..2beba7a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/response.rb
@@ -0,0 +1,155 @@
+require 'rack/request'
+require 'rack/utils'
+require 'time'
+
+module Rack
+  # Rack::Response provides a convenient interface to create a Rack
+  # response.
+  #
+  # It allows setting of headers and cookies, and provides useful
+  # defaults (a OK response containing HTML).
+  #
+  # You can use Response#write to iteratively generate your response,
+  # but note that this is buffered by Rack::Response until you call
+  # +finish+.  +finish+ however can take a block inside which calls to
+  # +write+ are synchronous with the Rack response.
+  #
+  # Your application's +call+ should end returning Response#finish.
+
+  class Response
+    attr_accessor :length
+
+    def initialize(body=[], status=200, header={})
+      @status = status.to_i
+      @header = Utils::HeaderHash.new.merge(header)
+
+      @chunked = "chunked" == @header['Transfer-Encoding']
+      @writer  = lambda { |x| @body << x }
+      @block   = nil
+      @length  = 0
+
+      @body = []
+
+      if body.respond_to? :to_str
+        write body.to_str
+      elsif body.respond_to?(:each)
+        body.each { |part|
+          write part.to_s
+        }
+      else
+        raise TypeError, "stringable or iterable required"
+      end
+
+      yield self  if block_given?
+    end
+
+    attr_reader :header
+    attr_accessor :status, :body
+
+    def [](key)
+      header[key]
+    end
+
+    def []=(key, value)
+      header[key] = value
+    end
+
+    def set_cookie(key, value)
+      Utils.set_cookie_header!(header, key, value)
+    end
+
+    def delete_cookie(key, value={})
+      Utils.delete_cookie_header!(header, key, value)
+    end
+
+    def redirect(target, status=302)
+      self.status = status
+      self["Location"] = target
+    end
+
+    def finish(&block)
+      @block = block
+
+      if [204, 205, 304].include?(status.to_i)
+        header.delete "Content-Type"
+        header.delete "Content-Length"
+        close
+        [status.to_i, header, []]
+      else
+        [status.to_i, header, BodyProxy.new(self){}]
+      end
+    end
+    alias to_a finish           # For *response
+    alias to_ary finish         # For implicit-splat on Ruby 1.9.2
+
+    def each(&callback)
+      @body.each(&callback)
+      @writer = callback
+      @block.call(self)  if @block
+    end
+
+    # Append to body and update Content-Length.
+    #
+    # NOTE: Do not mix #write and direct #body access!
+    #
+    def write(str)
+      s = str.to_s
+      @length += Rack::Utils.bytesize(s) unless @chunked
+      @writer.call s
+
+      header["Content-Length"] = @length.to_s unless @chunked
+      str
+    end
+
+    def close
+      body.close if body.respond_to?(:close)
+    end
+
+    def empty?
+      @block == nil && @body.empty?
+    end
+
+    alias headers header
+
+    module Helpers
+      def invalid?;            status < 100 || status >= 600;        end
+
+      def informational?;      status >= 100 && status < 200;        end
+      def successful?;         status >= 200 && status < 300;        end
+      def redirection?;        status >= 300 && status < 400;        end
+      def client_error?;       status >= 400 && status < 500;        end
+      def server_error?;       status >= 500 && status < 600;        end
+
+      def ok?;                 status == 200;                        end
+      def bad_request?;        status == 400;                        end
+      def forbidden?;          status == 403;                        end
+      def not_found?;          status == 404;                        end
+      def method_not_allowed?; status == 405;                        end
+      def unprocessable?;      status == 422;                        end
+
+      def redirect?;           [301, 302, 303, 307].include? status; end
+
+      # Headers
+      attr_reader :headers, :original_headers
+
+      def include?(header)
+        !!headers[header]
+      end
+
+      def content_type
+        headers["Content-Type"]
+      end
+
+      def content_length
+        cl = headers["Content-Length"]
+        cl ? cl.to_i : cl
+      end
+
+      def location
+        headers["Location"]
+      end
+    end
+
+    include Helpers
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/rewindable_input.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/rewindable_input.rb
new file mode 100644
index 0000000..15ecc58
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/rewindable_input.rb
@@ -0,0 +1,104 @@
+# -*- encoding: binary -*-
+require 'tempfile'
+require 'rack/utils'
+
+module Rack
+  # Class which can make any IO object rewindable, including non-rewindable ones. It does
+  # this by buffering the data into a tempfile, which is rewindable.
+  #
+  # rack.input is required to be rewindable, so if your input stream IO is non-rewindable
+  # by nature (e.g. a pipe or a socket) then you can wrap it in an object of this class
+  # to easily make it rewindable.
+  #
+  # Don't forget to call #close when you're done. This frees up temporary resources that
+  # RewindableInput uses, though it does *not* close the original IO object.
+  class RewindableInput
+    def initialize(io)
+      @io = io
+      @rewindable_io = nil
+      @unlinked = false
+    end
+
+    def gets
+      make_rewindable unless @rewindable_io
+      @rewindable_io.gets
+    end
+
+    def read(*args)
+      make_rewindable unless @rewindable_io
+      @rewindable_io.read(*args)
+    end
+
+    def each(&block)
+      make_rewindable unless @rewindable_io
+      @rewindable_io.each(&block)
+    end
+
+    def rewind
+      make_rewindable unless @rewindable_io
+      @rewindable_io.rewind
+    end
+
+    # Closes this RewindableInput object without closing the originally
+    # wrapped IO oject. Cleans up any temporary resources that this RewindableInput
+    # has created.
+    #
+    # This method may be called multiple times. It does nothing on subsequent calls.
+    def close
+      if @rewindable_io
+        if @unlinked
+          @rewindable_io.close
+        else
+          @rewindable_io.close!
+        end
+        @rewindable_io = nil
+      end
+    end
+
+    private
+
+    # Ruby's Tempfile class has a bug. Subclass it and fix it.
+    class Tempfile < ::Tempfile
+      def _close
+        @tmpfile.close if @tmpfile
+        @data[1] = nil if @data
+        @tmpfile = nil
+      end
+    end
+
+    def make_rewindable
+      # Buffer all data into a tempfile. Since this tempfile is private to this
+      # RewindableInput object, we chmod it so that nobody else can read or write
+      # it. On POSIX filesystems we also unlink the file so that it doesn't
+      # even have a file entry on the filesystem anymore, though we can still
+      # access it because we have the file handle open.
+      @rewindable_io = Tempfile.new('RackRewindableInput')
+      @rewindable_io.chmod(0000)
+      @rewindable_io.set_encoding(Encoding::BINARY) if @rewindable_io.respond_to?(:set_encoding)
+      @rewindable_io.binmode
+      if filesystem_has_posix_semantics?
+        # Use ::File.unlink as 1.9.1 Tempfile has a bug where unlink closes the file!
+        ::File.unlink @rewindable_io.path
+        raise 'Unlink failed. IO closed.' if @rewindable_io.closed?
+        @unlinked = true
+      end
+
+      buffer = ""
+      while @io.read(1024 * 4, buffer)
+        entire_buffer_written_out = false
+        while !entire_buffer_written_out
+          written = @rewindable_io.write(buffer)
+          entire_buffer_written_out = written == Rack::Utils.bytesize(buffer)
+          if !entire_buffer_written_out
+            buffer.slice!(0 .. written - 1)
+          end
+        end
+      end
+      @rewindable_io.rewind
+    end
+
+    def filesystem_has_posix_semantics?
+      RUBY_PLATFORM !~ /(mswin|mingw|cygwin|java)/
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/runtime.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/runtime.rb
new file mode 100644
index 0000000..1bd411f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/runtime.rb
@@ -0,0 +1,27 @@
+module Rack
+  # Sets an "X-Runtime" response header, indicating the response
+  # time of the request, in seconds
+  #
+  # You can put it right before the application to see the processing
+  # time, or before all the other middlewares to include time for them,
+  # too.
+  class Runtime
+    def initialize(app, name = nil)
+      @app = app
+      @header_name = "X-Runtime"
+      @header_name << "-#{name}" if name
+    end
+
+    def call(env)
+      start_time = Time.now
+      status, headers, body = @app.call(env)
+      request_time = Time.now - start_time
+
+      if !headers.has_key?(@header_name)
+        headers[@header_name] = "%0.6f" % request_time
+      end
+
+      [status, headers, body]
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/sendfile.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/sendfile.rb
new file mode 100644
index 0000000..bc04ca2
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/sendfile.rb
@@ -0,0 +1,155 @@
+require 'rack/file'
+
+module Rack
+
+  # = Sendfile
+  #
+  # The Sendfile middleware intercepts responses whose body is being
+  # served from a file and replaces it with a server specific X-Sendfile
+  # header. The web server is then responsible for writing the file contents
+  # to the client. This can dramatically reduce the amount of work required
+  # by the Ruby backend and takes advantage of the web server's optimized file
+  # delivery code.
+  #
+  # In order to take advantage of this middleware, the response body must
+  # respond to +to_path+ and the request must include an X-Sendfile-Type
+  # header. Rack::File and other components implement +to_path+ so there's
+  # rarely anything you need to do in your application. The X-Sendfile-Type
+  # header is typically set in your web servers configuration. The following
+  # sections attempt to document
+  #
+  # === Nginx
+  #
+  # Nginx supports the X-Accel-Redirect header. This is similar to X-Sendfile
+  # but requires parts of the filesystem to be mapped into a private URL
+  # hierarachy.
+  #
+  # The following example shows the Nginx configuration required to create
+  # a private "/files/" area, enable X-Accel-Redirect, and pass the special
+  # X-Sendfile-Type and X-Accel-Mapping headers to the backend:
+  #
+  #   location ~ /files/(.*) {
+  #     internal;
+  #     alias /var/www/$1;
+  #   }
+  #
+  #   location / {
+  #     proxy_redirect     off;
+  #
+  #     proxy_set_header   Host                $host;
+  #     proxy_set_header   X-Real-IP           $remote_addr;
+  #     proxy_set_header   X-Forwarded-For     $proxy_add_x_forwarded_for;
+  #
+  #     proxy_set_header   X-Sendfile-Type     X-Accel-Redirect;
+  #     proxy_set_header   X-Accel-Mapping     /var/www/=/files/;
+  #
+  #     proxy_pass         http://127.0.0.1:8080/;
+  #   }
+  #
+  # Note that the X-Sendfile-Type header must be set exactly as shown above.
+  # The X-Accel-Mapping header should specify the location on the file system,
+  # followed by an equals sign (=), followed name of the private URL pattern
+  # that it maps to. The middleware performs a simple substitution on the
+  # resulting path.
+  #
+  # See Also: http://wiki.codemongers.com/NginxXSendfile
+  #
+  # === lighttpd
+  #
+  # Lighttpd has supported some variation of the X-Sendfile header for some
+  # time, although only recent version support X-Sendfile in a reverse proxy
+  # configuration.
+  #
+  #   $HTTP["host"] == "example.com" {
+  #      proxy-core.protocol = "http"
+  #      proxy-core.balancer = "round-robin"
+  #      proxy-core.backends = (
+  #        "127.0.0.1:8000",
+  #        "127.0.0.1:8001",
+  #        ...
+  #      )
+  #
+  #      proxy-core.allow-x-sendfile = "enable"
+  #      proxy-core.rewrite-request = (
+  #        "X-Sendfile-Type" => (".*" => "X-Sendfile")
+  #      )
+  #    }
+  #
+  # See Also: http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModProxyCore
+  #
+  # === Apache
+  #
+  # X-Sendfile is supported under Apache 2.x using a separate module:
+  #
+  # https://tn123.org/mod_xsendfile/
+  #
+  # Once the module is compiled and installed, you can enable it using
+  # XSendFile config directive:
+  #
+  #   RequestHeader Set X-Sendfile-Type X-Sendfile
+  #   ProxyPassReverse / http://localhost:8001/
+  #   XSendFile on
+  #
+  # === Mapping parameter
+  #
+  # The third parameter allows for an overriding extension of the
+  # X-Accel-Mapping header. Mappings should be provided in tuples of internal to
+  # external. The internal values may contain regular expression syntax, they
+  # will be matched with case indifference.
+
+  class Sendfile
+    F = ::File
+
+    def initialize(app, variation=nil, mappings=[])
+      @app = app
+      @variation = variation
+      @mappings = mappings.map do |internal, external|
+        [/^#{internal}/i, external]
+      end
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+      if body.respond_to?(:to_path)
+        case type = variation(env)
+        when 'X-Accel-Redirect'
+          path = F.expand_path(body.to_path)
+          if url = map_accel_path(env, path)
+            headers['Content-Length'] = '0'
+            headers[type] = url
+            body.close if body.respond_to?(:close)
+            body = []
+          else
+            env['rack.errors'].puts "X-Accel-Mapping header missing"
+          end
+        when 'X-Sendfile', 'X-Lighttpd-Send-File'
+          path = F.expand_path(body.to_path)
+          headers['Content-Length'] = '0'
+          headers[type] = path
+          body.close if body.respond_to?(:close)
+          body = []
+        when '', nil
+        else
+          env['rack.errors'].puts "Unknown x-sendfile variation: '#{variation}'.\n"
+        end
+      end
+      [status, headers, body]
+    end
+
+    private
+    def variation(env)
+      @variation ||
+        env['sendfile.type'] ||
+        env['HTTP_X_SENDFILE_TYPE']
+    end
+
+    def map_accel_path(env, path)
+      if mapping = @mappings.find { |internal,_| internal =~ path }
+        path.sub(*mapping)
+      elsif mapping = env['HTTP_X_ACCEL_MAPPING']
+        internal, external = mapping.split('=', 2).map{ |p| p.strip }
+        path.sub(/^#{internal}/i, external)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/server.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/server.rb
new file mode 100644
index 0000000..dfaed3f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/server.rb
@@ -0,0 +1,362 @@
+require 'optparse'
+
+module Rack
+  class Server
+    class Options
+      def parse!(args)
+        options = {}
+        opt_parser = OptionParser.new("", 24, '  ') do |opts|
+          opts.banner = "Usage: rackup [ruby options] [rack options] [rackup config]"
+
+          opts.separator ""
+          opts.separator "Ruby options:"
+
+          lineno = 1
+          opts.on("-e", "--eval LINE", "evaluate a LINE of code") { |line|
+            eval line, TOPLEVEL_BINDING, "-e", lineno
+            lineno += 1
+          }
+
+          opts.on("-b", "--builder BUILDER_LINE", "evaluate a BUILDER_LINE of code as a builder script") { |line|
+            options[:builder] = line
+          }
+
+          opts.on("-d", "--debug", "set debugging flags (set $DEBUG to true)") {
+            options[:debug] = true
+          }
+          opts.on("-w", "--warn", "turn warnings on for your script") {
+            options[:warn] = true
+          }
+
+          opts.on("-I", "--include PATH",
+                  "specify $LOAD_PATH (may be used more than once)") { |path|
+            (options[:include] ||= []).concat(path.split(":"))
+          }
+
+          opts.on("-r", "--require LIBRARY",
+                  "require the library, before executing your script") { |library|
+            options[:require] = library
+          }
+
+          opts.separator ""
+          opts.separator "Rack options:"
+          opts.on("-s", "--server SERVER", "serve using SERVER (thin/puma/webrick/mongrel)") { |s|
+            options[:server] = s
+          }
+
+          opts.on("-o", "--host HOST", "listen on HOST (default: 0.0.0.0)") { |host|
+            options[:Host] = host
+          }
+
+          opts.on("-p", "--port PORT", "use PORT (default: 9292)") { |port|
+            options[:Port] = port
+          }
+
+          opts.on("-O", "--option NAME[=VALUE]", "pass VALUE to the server as option NAME. If no VALUE, sets it to true. Run '#{$0} -s SERVER -h' to get a list of options for SERVER") { |name|
+            name, value = name.split('=', 2)
+            value = true if value.nil?
+            options[name.to_sym] = value
+          }
+
+          opts.on("-E", "--env ENVIRONMENT", "use ENVIRONMENT for defaults (default: development)") { |e|
+            options[:environment] = e
+          }
+
+          opts.on("-D", "--daemonize", "run daemonized in the background") { |d|
+            options[:daemonize] = d ? true : false
+          }
+
+          opts.on("-P", "--pid FILE", "file to store PID (default: rack.pid)") { |f|
+            options[:pid] = ::File.expand_path(f)
+          }
+
+          opts.separator ""
+          opts.separator "Common options:"
+
+          opts.on_tail("-h", "-?", "--help", "Show this message") do
+            puts opts
+            puts handler_opts(options)
+
+            exit
+          end
+
+          opts.on_tail("--version", "Show version") do
+            puts "Rack #{Rack.version} (Release: #{Rack.release})"
+            exit
+          end
+        end
+
+        begin
+          opt_parser.parse! args
+        rescue OptionParser::InvalidOption => e
+          warn e.message
+          abort opt_parser.to_s
+        end
+
+        options[:config] = args.last if args.last
+        options
+      end
+
+      def handler_opts(options)
+        begin
+          info = []
+          server = Rack::Handler.get(options[:server]) || Rack::Handler.default(options)
+          if server && server.respond_to?(:valid_options)
+            info << ""
+            info << "Server-specific options for #{server.name}:"
+
+            has_options = false
+            server.valid_options.each do |name, description|
+              next if name.to_s.match(/^(Host|Port)[^a-zA-Z]/) # ignore handler's host and port options, we do our own.
+              info << "  -O %-21s %s" % [name, description]
+              has_options = true
+            end
+            return "" if !has_options
+          end
+          info.join("\n")
+        rescue NameError
+          return "Warning: Could not find handler specified (#{options[:server] || 'default'}) to determine handler-specific options"
+        end
+      end
+    end
+
+    # Start a new rack server (like running rackup). This will parse ARGV and
+    # provide standard ARGV rackup options, defaulting to load 'config.ru'.
+    #
+    # Providing an options hash will prevent ARGV parsing and will not include
+    # any default options.
+    #
+    # This method can be used to very easily launch a CGI application, for
+    # example:
+    #
+    #  Rack::Server.start(
+    #    :app => lambda do |e|
+    #      [200, {'Content-Type' => 'text/html'}, ['hello world']]
+    #    end,
+    #    :server => 'cgi'
+    #  )
+    #
+    # Further options available here are documented on Rack::Server#initialize
+    def self.start(options = nil)
+      new(options).start
+    end
+
+    attr_writer :options
+
+    # Options may include:
+    # * :app
+    #     a rack application to run (overrides :config)
+    # * :config
+    #     a rackup configuration file path to load (.ru)
+    # * :environment
+    #     this selects the middleware that will be wrapped around
+    #     your application. Default options available are:
+    #       - development: CommonLogger, ShowExceptions, and Lint
+    #       - deployment: CommonLogger
+    #       - none: no extra middleware
+    #     note: when the server is a cgi server, CommonLogger is not included.
+    # * :server
+    #     choose a specific Rack::Handler, e.g. cgi, fcgi, webrick
+    # * :daemonize
+    #     if true, the server will daemonize itself (fork, detach, etc)
+    # * :pid
+    #     path to write a pid file after daemonize
+    # * :Host
+    #     the host address to bind to (used by supporting Rack::Handler)
+    # * :Port
+    #     the port to bind to (used by supporting Rack::Handler)
+    # * :AccessLog
+    #     webrick acess log options (or supporting Rack::Handler)
+    # * :debug
+    #     turn on debug output ($DEBUG = true)
+    # * :warn
+    #     turn on warnings ($-w = true)
+    # * :include
+    #     add given paths to $LOAD_PATH
+    # * :require
+    #     require the given libraries
+    def initialize(options = nil)
+      @options = options
+      @app = options[:app] if options && options[:app]
+    end
+
+    def options
+      @options ||= parse_options(ARGV)
+    end
+
+    def default_options
+      {
+        :environment => ENV['RACK_ENV'] || "development",
+        :pid         => nil,
+        :Port        => 9292,
+        :Host        => "0.0.0.0",
+        :AccessLog   => [],
+        :config      => "config.ru"
+      }
+    end
+
+    def app
+      @app ||= options[:builder] ? build_app_from_string : build_app_and_options_from_config
+    end
+
+    def self.logging_middleware
+      lambda { |server|
+        server.server.name =~ /CGI/ ? nil : [Rack::CommonLogger, $stderr]
+      }
+    end
+
+    def self.middleware
+      @middleware ||= begin
+        m = Hash.new {|h,k| h[k] = []}
+        m["deployment"].concat [
+          [Rack::ContentLength],
+          [Rack::Chunked],
+          logging_middleware
+        ]
+        m["development"].concat m["deployment"] + [[Rack::ShowExceptions], [Rack::Lint]]
+        m
+      end
+    end
+
+    def middleware
+      self.class.middleware
+    end
+
+    def start &blk
+      if options[:warn]
+        $-w = true
+      end
+
+      if includes = options[:include]
+        $LOAD_PATH.unshift(*includes)
+      end
+
+      if library = options[:require]
+        require library
+      end
+
+      if options[:debug]
+        $DEBUG = true
+        require 'pp'
+        p options[:server]
+        pp wrapped_app
+        pp app
+      end
+
+      check_pid! if options[:pid]
+
+      # Touch the wrapped app, so that the config.ru is loaded before
+      # daemonization (i.e. before chdir, etc).
+      wrapped_app
+
+      daemonize_app if options[:daemonize]
+
+      write_pid if options[:pid]
+
+      trap(:INT) do
+        if server.respond_to?(:shutdown)
+          server.shutdown
+        else
+          exit
+        end
+      end
+
+      server.run wrapped_app, options, &blk
+    end
+
+    def server
+      @_server ||= Rack::Handler.get(options[:server]) || Rack::Handler.default(options)
+    end
+
+    private
+      def build_app_and_options_from_config
+        if !::File.exist? options[:config]
+          abort "configuration #{options[:config]} not found"
+        end
+
+        app, options = Rack::Builder.parse_file(self.options[:config], opt_parser)
+        self.options.merge! options
+        app
+      end
+
+      def build_app_from_string
+        Rack::Builder.new_from_string(self.options[:builder])
+      end
+
+      def parse_options(args)
+        options = default_options
+
+        # Don't evaluate CGI ISINDEX parameters.
+        # http://www.meb.uni-bonn.de/docs/cgi/cl.html
+        args.clear if ENV.include?("REQUEST_METHOD")
+
+        options.merge! opt_parser.parse!(args)
+        options[:config] = ::File.expand_path(options[:config])
+        ENV["RACK_ENV"] = options[:environment]
+        options
+      end
+
+      def opt_parser
+        Options.new
+      end
+
+      def build_app(app)
+        middleware[options[:environment]].reverse_each do |middleware|
+          middleware = middleware.call(self) if middleware.respond_to?(:call)
+          next unless middleware
+          klass, *args = middleware
+          app = klass.new(app, *args)
+        end
+        app
+      end
+
+      def wrapped_app
+        @wrapped_app ||= build_app app
+      end
+
+      def daemonize_app
+        if RUBY_VERSION < "1.9"
+          exit if fork
+          Process.setsid
+          exit if fork
+          Dir.chdir "/"
+          STDIN.reopen "/dev/null"
+          STDOUT.reopen "/dev/null", "a"
+          STDERR.reopen "/dev/null", "a"
+        else
+          Process.daemon
+        end
+      end
+
+      def write_pid
+        ::File.open(options[:pid], ::File::CREAT | ::File::EXCL | ::File::WRONLY ){ |f| f.write("#{Process.pid}") }
+        at_exit { ::File.delete(options[:pid]) if ::File.exist?(options[:pid]) }
+      rescue Errno::EEXIST
+        check_pid!
+        retry
+      end
+
+      def check_pid!
+        case pidfile_process_status
+        when :running, :not_owned
+          $stderr.puts "A server is already running. Check #{options[:pid]}."
+          exit(1)
+        when :dead
+          ::File.delete(options[:pid])
+        end
+      end
+
+      def pidfile_process_status
+        return :exited unless ::File.exist?(options[:pid])
+
+        pid = ::File.read(options[:pid]).to_i
+        Process.kill(0, pid)
+        :running
+      rescue Errno::ESRCH
+        :dead
+      rescue Errno::EPERM
+        :not_owned
+      end
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/session/abstract/id.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/session/abstract/id.rb
new file mode 100644
index 0000000..0e0ad35
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/session/abstract/id.rb
@@ -0,0 +1,398 @@
+# AUTHOR: blink <blinketje at gmail.com>; blink#ruby-lang at irc.freenode.net
+# bugrep: Andreas Zehnder
+
+require 'time'
+require 'rack/request'
+require 'rack/response'
+begin
+  require 'securerandom'
+rescue LoadError
+  # We just won't get securerandom
+end
+
+module Rack
+
+  module Session
+
+    module Abstract
+      ENV_SESSION_KEY = 'rack.session'.freeze
+      ENV_SESSION_OPTIONS_KEY = 'rack.session.options'.freeze
+
+      # SessionHash is responsible to lazily load the session from store.
+
+      class SessionHash
+        include Enumerable
+        attr_writer :id
+
+        def self.find(env)
+          env[ENV_SESSION_KEY]
+        end
+
+        def self.set(env, session)
+          env[ENV_SESSION_KEY] = session
+        end
+
+        def self.set_options(env, options)
+          env[ENV_SESSION_OPTIONS_KEY] = options.dup
+        end
+
+        def initialize(store, env)
+          @store = store
+          @env = env
+          @loaded = false
+        end
+
+        def id
+          return @id if @loaded or instance_variable_defined?(:@id)
+          @id = @store.send(:extract_session_id, @env)
+        end
+
+        def options
+          @env[ENV_SESSION_OPTIONS_KEY]
+        end
+
+        def each(&block)
+          load_for_read!
+          @data.each(&block)
+        end
+
+        def [](key)
+          load_for_read!
+          @data[key.to_s]
+        end
+        alias :fetch :[]
+
+        def has_key?(key)
+          load_for_read!
+          @data.has_key?(key.to_s)
+        end
+        alias :key? :has_key?
+        alias :include? :has_key?
+
+        def []=(key, value)
+          load_for_write!
+          @data[key.to_s] = value
+        end
+        alias :store :[]=
+
+        def clear
+          load_for_write!
+          @data.clear
+        end
+
+        def destroy
+          clear
+          @id = @store.send(:destroy_session, @env, id, options)
+        end
+
+        def to_hash
+          load_for_read!
+          @data.dup
+        end
+
+        def update(hash)
+          load_for_write!
+          @data.update(stringify_keys(hash))
+        end
+        alias :merge! :update
+
+        def replace(hash)
+          load_for_write!
+          @data.replace(stringify_keys(hash))
+        end
+
+        def delete(key)
+          load_for_write!
+          @data.delete(key.to_s)
+        end
+
+        def inspect
+          if loaded?
+            @data.inspect
+          else
+            "#<#{self.class}:0x#{self.object_id.to_s(16)} not yet loaded>"
+          end
+        end
+
+        def exists?
+          return @exists if instance_variable_defined?(:@exists)
+          @data = {}
+          @exists = @store.send(:session_exists?, @env)
+        end
+
+        def loaded?
+          @loaded
+        end
+
+        def empty?
+          load_for_read!
+          @data.empty?
+        end
+
+        def keys
+          @data.keys
+        end
+
+        def values
+          @data.values
+        end
+
+      private
+
+        def load_for_read!
+          load! if !loaded? && exists?
+        end
+
+        def load_for_write!
+          load! unless loaded?
+        end
+
+        def load!
+          @id, session = @store.send(:load_session, @env)
+          @data = stringify_keys(session)
+          @loaded = true
+        end
+
+        def stringify_keys(other)
+          hash = {}
+          other.each do |key, value|
+            hash[key.to_s] = value
+          end
+          hash
+        end
+      end
+
+      # ID sets up a basic framework for implementing an id based sessioning
+      # service. Cookies sent to the client for maintaining sessions will only
+      # contain an id reference. Only #get_session and #set_session are
+      # required to be overwritten.
+      #
+      # All parameters are optional.
+      # * :key determines the name of the cookie, by default it is
+      #   'rack.session'
+      # * :path, :domain, :expire_after, :secure, and :httponly set the related
+      #   cookie options as by Rack::Response#add_cookie
+      # * :skip will not a set a cookie in the response nor update the session state
+      # * :defer will not set a cookie in the response but still update the session
+      #   state if it is used with a backend
+      # * :renew (implementation dependent) will prompt the generation of a new
+      #   session id, and migration of data to be referenced at the new id. If
+      #   :defer is set, it will be overridden and the cookie will be set.
+      # * :sidbits sets the number of bits in length that a generated session
+      #   id will be.
+      #
+      # These options can be set on a per request basis, at the location of
+      # env['rack.session.options']. Additionally the id of the session can be
+      # found within the options hash at the key :id. It is highly not
+      # recommended to change its value.
+      #
+      # Is Rack::Utils::Context compatible.
+      #
+      # Not included by default; you must require 'rack/session/abstract/id'
+      # to use.
+
+      class ID
+        DEFAULT_OPTIONS = {
+          :key =>           'rack.session',
+          :path =>          '/',
+          :domain =>        nil,
+          :expire_after =>  nil,
+          :secure =>        false,
+          :httponly =>      true,
+          :defer =>         false,
+          :renew =>         false,
+          :sidbits =>       128,
+          :cookie_only =>   true,
+          :secure_random => (::SecureRandom rescue false)
+        }
+
+        attr_reader :key, :default_options
+
+        def initialize(app, options={})
+          @app = app
+          @default_options = self.class::DEFAULT_OPTIONS.merge(options)
+          @key = @default_options.delete(:key)
+          @cookie_only = @default_options.delete(:cookie_only)
+          initialize_sid
+        end
+
+        def call(env)
+          context(env)
+        end
+
+        def context(env, app=@app)
+          prepare_session(env)
+          status, headers, body = app.call(env)
+          commit_session(env, status, headers, body)
+        end
+
+        private
+
+        def initialize_sid
+          @sidbits = @default_options[:sidbits]
+          @sid_secure = @default_options[:secure_random]
+          @sid_length = @sidbits / 4
+        end
+
+        # Generate a new session id using Ruby #rand.  The size of the
+        # session id is controlled by the :sidbits option.
+        # Monkey patch this to use custom methods for session id generation.
+
+        def generate_sid(secure = @sid_secure)
+          if secure
+            secure.hex(@sid_length)
+          else
+            "%0#{@sid_length}x" % Kernel.rand(2**@sidbits - 1)
+          end
+        rescue NotImplementedError
+          generate_sid(false)
+        end
+
+        # Sets the lazy session at 'rack.session' and places options and session
+        # metadata into 'rack.session.options'.
+
+        def prepare_session(env)
+          session_was                  = env[ENV_SESSION_KEY]
+          env[ENV_SESSION_KEY]         = session_class.new(self, env)
+          env[ENV_SESSION_OPTIONS_KEY] = @default_options.dup
+          env[ENV_SESSION_KEY].merge! session_was if session_was
+        end
+
+        # Extracts the session id from provided cookies and passes it and the
+        # environment to #get_session.
+
+        def load_session(env)
+          sid = current_session_id(env)
+          sid, session = get_session(env, sid)
+          [sid, session || {}]
+        end
+
+        # Extract session id from request object.
+
+        def extract_session_id(env)
+          request = Rack::Request.new(env)
+          sid = request.cookies[@key]
+          sid ||= request.params[@key] unless @cookie_only
+          sid
+        end
+
+        # Returns the current session id from the SessionHash.
+
+        def current_session_id(env)
+          env[ENV_SESSION_KEY].id
+        end
+
+        # Check if the session exists or not.
+
+        def session_exists?(env)
+          value = current_session_id(env)
+          value && !value.empty?
+        end
+
+        # Session should be commited if it was loaded, any of specific options like :renew, :drop
+        # or :expire_after was given and the security permissions match. Skips if skip is given.
+
+        def commit_session?(env, session, options)
+          if options[:skip]
+            false
+          else
+            has_session = loaded_session?(session) || forced_session_update?(session, options)
+            has_session && security_matches?(env, options)
+          end
+        end
+
+        def loaded_session?(session)
+          !session.is_a?(session_class) || session.loaded?
+        end
+
+        def forced_session_update?(session, options)
+          force_options?(options) && session && !session.empty?
+        end
+
+        def force_options?(options)
+          options.values_at(:renew, :drop, :defer, :expire_after).any?
+        end
+
+        def security_matches?(env, options)
+          return true unless options[:secure]
+          request = Rack::Request.new(env)
+          request.ssl?
+        end
+
+        # Acquires the session from the environment and the session id from
+        # the session options and passes them to #set_session. If successful
+        # and the :defer option is not true, a cookie will be added to the
+        # response with the session's id.
+
+        def commit_session(env, status, headers, body)
+          session = env[ENV_SESSION_KEY]
+          options = session.options
+
+          if options[:drop] || options[:renew]
+            session_id = destroy_session(env, session.id || generate_sid, options)
+            return [status, headers, body] unless session_id
+          end
+
+          return [status, headers, body] unless commit_session?(env, session, options)
+
+          session.send(:load!) unless loaded_session?(session)
+          session_id ||= session.id
+          session_data = session.to_hash.delete_if { |k,v| v.nil? }
+
+          if not data = set_session(env, session_id, session_data, options)
+            env["rack.errors"].puts("Warning! #{self.class.name} failed to save session. Content dropped.")
+          elsif options[:defer] and not options[:renew]
+            env["rack.errors"].puts("Defering cookie for #{session_id}") if $VERBOSE
+          else
+            cookie = Hash.new
+            cookie[:value] = data
+            cookie[:expires] = Time.now + options[:expire_after] if options[:expire_after]
+            set_cookie(env, headers, cookie.merge!(options))
+          end
+
+          [status, headers, body]
+        end
+
+        # Sets the cookie back to the client with session id. We skip the cookie
+        # setting if the value didn't change (sid is the same) or expires was given.
+
+        def set_cookie(env, headers, cookie)
+          request = Rack::Request.new(env)
+          if request.cookies[@key] != cookie[:value] || cookie[:expires]
+            Utils.set_cookie_header!(headers, @key, cookie)
+          end
+        end
+
+        # Allow subclasses to prepare_session for different Session classes
+
+        def session_class
+          SessionHash
+        end
+
+        # All thread safety and session retrival proceedures should occur here.
+        # Should return [session_id, session].
+        # If nil is provided as the session id, generation of a new valid id
+        # should occur within.
+
+        def get_session(env, sid)
+          raise '#get_session not implemented.'
+        end
+
+        # All thread safety and session storage proceedures should occur here.
+        # Must return the session id if the session was saved successfully, or
+        # false if the session could not be saved.
+
+        def set_session(env, sid, session, options)
+          raise '#set_session not implemented.'
+        end
+
+        # All thread safety and session destroy proceedures should occur here.
+        # Should return a new session id or nil if options[:drop]
+
+        def destroy_session(env, sid, options)
+          raise '#destroy_session not implemented'
+        end
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/session/cookie.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/session/cookie.rb
new file mode 100644
index 0000000..5aa80cb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/session/cookie.rb
@@ -0,0 +1,178 @@
+require 'openssl'
+require 'rack/request'
+require 'rack/response'
+require 'rack/session/abstract/id'
+
+module Rack
+
+  module Session
+
+    # Rack::Session::Cookie provides simple cookie based session management.
+    # By default, the session is a Ruby Hash stored as base64 encoded marshalled
+    # data set to :key (default: rack.session).  The object that encodes the
+    # session data is configurable and must respond to +encode+ and +decode+.
+    # Both methods must take a string and return a string.
+    #
+    # When the secret key is set, cookie data is checked for data integrity.
+    # The old secret key is also accepted and allows graceful secret rotation.
+    #
+    # Example:
+    #
+    #     use Rack::Session::Cookie, :key => 'rack.session',
+    #                                :domain => 'foo.com',
+    #                                :path => '/',
+    #                                :expire_after => 2592000,
+    #                                :secret => 'change_me',
+    #                                :old_secret => 'also_change_me'
+    #
+    #     All parameters are optional.
+    #
+    # Example of a cookie with no encoding:
+    #
+    #   Rack::Session::Cookie.new(application, {
+    #     :coder => Rack::Session::Cookie::Identity.new
+    #   })
+    #
+    # Example of a cookie with custom encoding:
+    #
+    #   Rack::Session::Cookie.new(application, {
+    #     :coder => Class.new {
+    #       def encode(str); str.reverse; end
+    #       def decode(str); str.reverse; end
+    #     }.new
+    #   })
+    #
+
+    class Cookie < Abstract::ID
+      # Encode session cookies as Base64
+      class Base64
+        def encode(str)
+          [str].pack('m')
+        end
+
+        def decode(str)
+          str.unpack('m').first
+        end
+
+        # Encode session cookies as Marshaled Base64 data
+        class Marshal < Base64
+          def encode(str)
+            super(::Marshal.dump(str))
+          end
+
+          def decode(str)
+            return unless str
+            ::Marshal.load(super(str)) rescue nil
+          end
+        end
+
+        # N.B. Unlike other encoding methods, the contained objects must be a
+        # valid JSON composite type, either a Hash or an Array.
+        class JSON < Base64
+          def encode(obj)
+            super(::Rack::Utils::OkJson.encode(obj))
+          end
+
+          def decode(str)
+            return unless str
+            ::Rack::Utils::OkJson.decode(super(str)) rescue nil
+          end
+        end
+      end
+
+      # Use no encoding for session cookies
+      class Identity
+        def encode(str); str; end
+        def decode(str); str; end
+      end
+
+      # Reverse string encoding. (trollface)
+      class Reverse
+        def encode(str); str.reverse; end
+        def decode(str); str.reverse; end
+      end
+
+      attr_reader :coder
+
+      def initialize(app, options={})
+        @secrets = options.values_at(:secret, :old_secret).compact
+        warn <<-MSG unless @secrets.size >= 1
+        SECURITY WARNING: No secret option provided to Rack::Session::Cookie.
+        This poses a security threat. It is strongly recommended that you
+        provide a secret to prevent exploits that may be possible from crafted
+        cookies. This will not be supported in future versions of Rack, and
+        future versions will even invalidate your existing user cookies.
+
+        Called from: #{caller[0]}.
+        MSG
+        @coder  = options[:coder] ||= Base64::Marshal.new
+        super(app, options.merge!(:cookie_only => true))
+      end
+
+      private
+
+      def get_session(env, sid)
+        data = unpacked_cookie_data(env)
+        data = persistent_session_id!(data)
+        [data["session_id"], data]
+      end
+
+      def extract_session_id(env)
+        unpacked_cookie_data(env)["session_id"]
+      end
+
+      def unpacked_cookie_data(env)
+        env["rack.session.unpacked_cookie_data"] ||= begin
+          request = Rack::Request.new(env)
+          session_data = request.cookies[@key]
+
+          if @secrets.size > 0 && session_data
+            session_data, digest = session_data.split("--")
+            session_data = nil unless digest_match?(session_data, digest)
+          end
+
+          coder.decode(session_data) || {}
+        end
+      end
+
+      def persistent_session_id!(data, sid=nil)
+        data ||= {}
+        data["session_id"] ||= sid || generate_sid
+        data
+      end
+
+      def set_session(env, session_id, session, options)
+        session = session.merge("session_id" => session_id)
+        session_data = coder.encode(session)
+
+        if @secrets.first
+          session_data << "--#{generate_hmac(session_data, @secrets.first)}"
+        end
+
+        if session_data.size > (4096 - @key.size)
+          env["rack.errors"].puts("Warning! Rack::Session::Cookie data size exceeds 4K.")
+          nil
+        else
+          session_data
+        end
+      end
+
+      def destroy_session(env, session_id, options)
+        # Nothing to do here, data is in the client
+        generate_sid unless options[:drop]
+      end
+
+      def digest_match?(data, digest)
+        return unless data && digest
+        @secrets.any? do |secret|
+          Rack::Utils.secure_compare(digest, generate_hmac(data, secret))
+        end
+      end
+
+      def generate_hmac(data, secret)
+        OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA1.new, secret, data)
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/session/memcache.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/session/memcache.rb
new file mode 100644
index 0000000..53261fd
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/session/memcache.rb
@@ -0,0 +1,93 @@
+# AUTHOR: blink <blinketje at gmail.com>; blink#ruby-lang at irc.freenode.net
+
+require 'rack/session/abstract/id'
+require 'memcache'
+
+module Rack
+  module Session
+    # Rack::Session::Memcache provides simple cookie based session management.
+    # Session data is stored in memcached. The corresponding session key is
+    # maintained in the cookie.
+    # You may treat Session::Memcache as you would Session::Pool with the
+    # following caveats.
+    #
+    # * Setting :expire_after to 0 would note to the Memcache server to hang
+    #   onto the session data until it would drop it according to it's own
+    #   specifications. However, the cookie sent to the client would expire
+    #   immediately.
+    #
+    # Note that memcache does drop data before it may be listed to expire. For
+    # a full description of behaviour, please see memcache's documentation.
+
+    class Memcache < Abstract::ID
+      attr_reader :mutex, :pool
+
+      DEFAULT_OPTIONS = Abstract::ID::DEFAULT_OPTIONS.merge \
+        :namespace => 'rack:session',
+        :memcache_server => 'localhost:11211'
+
+      def initialize(app, options={})
+        super
+
+        @mutex = Mutex.new
+        mserv = @default_options[:memcache_server]
+        mopts = @default_options.reject{|k,v| !MemCache::DEFAULT_OPTIONS.include? k }
+
+        @pool = options[:cache] || MemCache.new(mserv, mopts)
+        unless @pool.active? and @pool.servers.any?{|c| c.alive? }
+          raise 'No memcache servers'
+        end
+      end
+
+      def generate_sid
+        loop do
+          sid = super
+          break sid unless @pool.get(sid, true)
+        end
+      end
+
+      def get_session(env, sid)
+        with_lock(env, [nil, {}]) do
+          unless sid and session = @pool.get(sid)
+            sid, session = generate_sid, {}
+            unless /^STORED/ =~ @pool.add(sid, session)
+              raise "Session collision on '#{sid.inspect}'"
+            end
+          end
+          [sid, session]
+        end
+      end
+
+      def set_session(env, session_id, new_session, options)
+        expiry = options[:expire_after]
+        expiry = expiry.nil? ? 0 : expiry + 1
+
+        with_lock(env, false) do
+          @pool.set session_id, new_session, expiry
+          session_id
+        end
+      end
+
+      def destroy_session(env, session_id, options)
+        with_lock(env) do
+          @pool.delete(session_id)
+          generate_sid unless options[:drop]
+        end
+      end
+
+      def with_lock(env, default=nil)
+        @mutex.lock if env['rack.multithread']
+        yield
+      rescue MemCache::MemCacheError, Errno::ECONNREFUSED
+        if $VERBOSE
+          warn "#{self} is unable to find memcached server."
+          warn $!.inspect
+        end
+        default
+      ensure
+        @mutex.unlock if @mutex.locked?
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/session/pool.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/session/pool.rb
new file mode 100644
index 0000000..d4774fe
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/session/pool.rb
@@ -0,0 +1,79 @@
+# AUTHOR: blink <blinketje at gmail.com>; blink#ruby-lang at irc.freenode.net
+# THANKS:
+#   apeiros, for session id generation, expiry setup, and threadiness
+#   sergio, threadiness and bugreps
+
+require 'rack/session/abstract/id'
+require 'thread'
+
+module Rack
+  module Session
+    # Rack::Session::Pool provides simple cookie based session management.
+    # Session data is stored in a hash held by @pool.
+    # In the context of a multithreaded environment, sessions being
+    # committed to the pool is done in a merging manner.
+    #
+    # The :drop option is available in rack.session.options if you wish to
+    # explicitly remove the session from the session cache.
+    #
+    # Example:
+    #   myapp = MyRackApp.new
+    #   sessioned = Rack::Session::Pool.new(myapp,
+    #     :domain => 'foo.com',
+    #     :expire_after => 2592000
+    #   )
+    #   Rack::Handler::WEBrick.run sessioned
+
+    class Pool < Abstract::ID
+      attr_reader :mutex, :pool
+      DEFAULT_OPTIONS = Abstract::ID::DEFAULT_OPTIONS.merge :drop => false
+
+      def initialize(app, options={})
+        super
+        @pool = Hash.new
+        @mutex = Mutex.new
+      end
+
+      def generate_sid
+        loop do
+          sid = super
+          break sid unless @pool.key? sid
+        end
+      end
+
+      def get_session(env, sid)
+        with_lock(env, [nil, {}]) do
+          unless sid and session = @pool[sid]
+            sid, session = generate_sid, {}
+            @pool.store sid, session
+          end
+          [sid, session]
+        end
+      end
+
+      def set_session(env, session_id, new_session, options)
+        with_lock(env, false) do
+          @pool.store session_id, new_session
+          session_id
+        end
+      end
+
+      def destroy_session(env, session_id, options)
+        with_lock(env) do
+          @pool.delete(session_id)
+          generate_sid unless options[:drop]
+        end
+      end
+
+      def with_lock(env, default=nil)
+        @mutex.lock if env['rack.multithread']
+        yield
+      rescue
+        default
+      ensure
+        @mutex.unlock if @mutex.locked?
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/showexceptions.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/showexceptions.rb
new file mode 100644
index 0000000..c91ca07
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/showexceptions.rb
@@ -0,0 +1,378 @@
+require 'ostruct'
+require 'erb'
+require 'rack/request'
+require 'rack/utils'
+
+module Rack
+  # Rack::ShowExceptions catches all exceptions raised from the app it
+  # wraps.  It shows a useful backtrace with the sourcefile and
+  # clickable context, the whole Rack environment and the request
+  # data.
+  #
+  # Be careful when you use this on public-facing sites as it could
+  # reveal information helpful to attackers.
+
+  class ShowExceptions
+    CONTEXT = 7
+
+    def initialize(app)
+      @app = app
+      @template = ERB.new(TEMPLATE)
+    end
+
+    def call(env)
+      @app.call(env)
+    rescue StandardError, LoadError, SyntaxError => e
+      exception_string = dump_exception(e)
+
+      env["rack.errors"].puts(exception_string)
+      env["rack.errors"].flush
+
+      if prefers_plain_text?(env)
+        content_type = "text/plain"
+        body = [exception_string]
+      else
+        content_type = "text/html"
+        body = pretty(env, e)
+      end
+
+      [500,
+       {"Content-Type" => content_type,
+        "Content-Length" => Rack::Utils.bytesize(body.join).to_s},
+       body]
+    end
+
+    def prefers_plain_text?(env)
+      env["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest" && (!env["HTTP_ACCEPT"] || !env["HTTP_ACCEPT"].include?("text/html"))
+    end
+
+    def dump_exception(exception)
+      string = "#{exception.class}: #{exception.message}\n"
+      string << exception.backtrace.map { |l| "\t#{l}" }.join("\n")
+      string
+    end
+
+    def pretty(env, exception)
+      req = Rack::Request.new(env)
+
+      # This double assignment is to prevent an "unused variable" warning on
+      # Ruby 1.9.3.  Yes, it is dumb, but I don't like Ruby yelling at me.
+      path = path = (req.script_name + req.path_info).squeeze("/")
+
+      # This double assignment is to prevent an "unused variable" warning on
+      # Ruby 1.9.3.  Yes, it is dumb, but I don't like Ruby yelling at me.
+      frames = frames = exception.backtrace.map { |line|
+        frame = OpenStruct.new
+        if line =~ /(.*?):(\d+)(:in `(.*)')?/
+          frame.filename = $1
+          frame.lineno = $2.to_i
+          frame.function = $4
+
+          begin
+            lineno = frame.lineno-1
+            lines = ::File.readlines(frame.filename)
+            frame.pre_context_lineno = [lineno-CONTEXT, 0].max
+            frame.pre_context = lines[frame.pre_context_lineno...lineno]
+            frame.context_line = lines[lineno].chomp
+            frame.post_context_lineno = [lineno+CONTEXT, lines.size].min
+            frame.post_context = lines[lineno+1..frame.post_context_lineno]
+          rescue
+          end
+
+          frame
+        else
+          nil
+        end
+      }.compact
+
+      [@template.result(binding)]
+    end
+
+    def h(obj)                  # :nodoc:
+      case obj
+      when String
+        Utils.escape_html(obj)
+      else
+        Utils.escape_html(obj.inspect)
+      end
+    end
+
+    # :stopdoc:
+
+# adapted from Django <djangoproject.com>
+# Copyright (c) 2005, the Lawrence Journal-World
+# Used under the modified BSD license:
+# http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5
+TEMPLATE = <<'HTML'
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <meta name="robots" content="NONE,NOARCHIVE" />
+  <title><%=h exception.class %> at <%=h path %></title>
+  <style type="text/css">
+    html * { padding:0; margin:0; }
+    body * { padding:10px 20px; }
+    body * * { padding:0; }
+    body { font:small sans-serif; }
+    body>div { border-bottom:1px solid #ddd; }
+    h1 { font-weight:normal; }
+    h2 { margin-bottom:.8em; }
+    h2 span { font-size:80%; color:#666; font-weight:normal; }
+    h3 { margin:1em 0 .5em 0; }
+    h4 { margin:0 0 .5em 0; font-weight: normal; }
+    table {
+        border:1px solid #ccc; border-collapse: collapse; background:white; }
+    tbody td, tbody th { vertical-align:top; padding:2px 3px; }
+    thead th {
+        padding:1px 6px 1px 3px; background:#fefefe; text-align:left;
+        font-weight:normal; font-size:11px; border:1px solid #ddd; }
+    tbody th { text-align:right; color:#666; padding-right:.5em; }
+    table.vars { margin:5px 0 2px 40px; }
+    table.vars td, table.req td { font-family:monospace; }
+    table td.code { width:100%;}
+    table td.code div { overflow:hidden; }
+    table.source th { color:#666; }
+    table.source td {
+        font-family:monospace; white-space:pre; border-bottom:1px solid #eee; }
+    ul.traceback { list-style-type:none; }
+    ul.traceback li.frame { margin-bottom:1em; }
+    div.context { margin: 10px 0; }
+    div.context ol {
+        padding-left:30px; margin:0 10px; list-style-position: inside; }
+    div.context ol li {
+        font-family:monospace; white-space:pre; color:#666; cursor:pointer; }
+    div.context ol.context-line li { color:black; background-color:#ccc; }
+    div.context ol.context-line li span { float: right; }
+    div.commands { margin-left: 40px; }
+    div.commands a { color:black; text-decoration:none; }
+    #summary { background: #ffc; }
+    #summary h2 { font-weight: normal; color: #666; }
+    #summary ul#quicklinks { list-style-type: none; margin-bottom: 2em; }
+    #summary ul#quicklinks li { float: left; padding: 0 1em; }
+    #summary ul#quicklinks>li+li { border-left: 1px #666 solid; }
+    #explanation { background:#eee; }
+    #template, #template-not-exist { background:#f6f6f6; }
+    #template-not-exist ul { margin: 0 0 0 20px; }
+    #traceback { background:#eee; }
+    #requestinfo { background:#f6f6f6; padding-left:120px; }
+    #summary table { border:none; background:transparent; }
+    #requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; }
+    #requestinfo h3 { margin-bottom:-1em; }
+    .error { background: #ffc; }
+    .specific { color:#cc3300; font-weight:bold; }
+  </style>
+  <script type="text/javascript">
+  //<!--
+    function getElementsByClassName(oElm, strTagName, strClassName){
+        // Written by Jonathan Snook, http://www.snook.ca/jon;
+        // Add-ons by Robert Nyman, http://www.robertnyman.com
+        var arrElements = (strTagName == "*" && document.all)? document.all :
+        oElm.getElementsByTagName(strTagName);
+        var arrReturnElements = new Array();
+        strClassName = strClassName.replace(/\-/g, "\\-");
+        var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$$)");
+        var oElement;
+        for(var i=0; i<arrElements.length; i++){
+            oElement = arrElements[i];
+            if(oRegExp.test(oElement.className)){
+                arrReturnElements.push(oElement);
+            }
+        }
+        return (arrReturnElements)
+    }
+    function hideAll(elems) {
+      for (var e = 0; e < elems.length; e++) {
+        elems[e].style.display = 'none';
+      }
+    }
+    window.onload = function() {
+      hideAll(getElementsByClassName(document, 'table', 'vars'));
+      hideAll(getElementsByClassName(document, 'ol', 'pre-context'));
+      hideAll(getElementsByClassName(document, 'ol', 'post-context'));
+    }
+    function toggle() {
+      for (var i = 0; i < arguments.length; i++) {
+        var e = document.getElementById(arguments[i]);
+        if (e) {
+          e.style.display = e.style.display == 'none' ? 'block' : 'none';
+        }
+      }
+      return false;
+    }
+    function varToggle(link, id) {
+      toggle('v' + id);
+      var s = link.getElementsByTagName('span')[0];
+      var uarr = String.fromCharCode(0x25b6);
+      var darr = String.fromCharCode(0x25bc);
+      s.innerHTML = s.innerHTML == uarr ? darr : uarr;
+      return false;
+    }
+    //-->
+  </script>
+</head>
+<body>
+
+<div id="summary">
+  <h1><%=h exception.class %> at <%=h path %></h1>
+  <h2><%=h exception.message %></h2>
+  <table><tr>
+    <th>Ruby</th>
+    <td>
+<% if first = frames.first %>
+      <code><%=h first.filename %></code>: in <code><%=h first.function %></code>, line <%=h frames.first.lineno %>
+<% else %>
+      unknown location
+<% end %>
+    </td>
+  </tr><tr>
+    <th>Web</th>
+    <td><code><%=h req.request_method %> <%=h(req.host + path)%></code></td>
+  </tr></table>
+
+  <h3>Jump to:</h3>
+  <ul id="quicklinks">
+    <li><a href="#get-info">GET</a></li>
+    <li><a href="#post-info">POST</a></li>
+    <li><a href="#cookie-info">Cookies</a></li>
+    <li><a href="#env-info">ENV</a></li>
+  </ul>
+</div>
+
+<div id="traceback">
+  <h2>Traceback <span>(innermost first)</span></h2>
+  <ul class="traceback">
+<% frames.each { |frame| %>
+      <li class="frame">
+        <code><%=h frame.filename %></code>: in <code><%=h frame.function %></code>
+
+          <% if frame.context_line %>
+          <div class="context" id="c<%=h frame.object_id %>">
+              <% if frame.pre_context %>
+              <ol start="<%=h frame.pre_context_lineno+1 %>" class="pre-context" id="pre<%=h frame.object_id %>">
+                <% frame.pre_context.each { |line| %>
+                <li onclick="toggle('pre<%=h frame.object_id %>', 'post<%=h frame.object_id %>')"><%=h line %></li>
+                <% } %>
+              </ol>
+              <% end %>
+
+            <ol start="<%=h frame.lineno %>" class="context-line">
+              <li onclick="toggle('pre<%=h frame.object_id %>', 'post<%=h frame.object_id %>')"><%=h frame.context_line %><span>...</span></li></ol>
+
+              <% if frame.post_context %>
+              <ol start='<%=h frame.lineno+1 %>' class="post-context" id="post<%=h frame.object_id %>">
+                <% frame.post_context.each { |line| %>
+                <li onclick="toggle('pre<%=h frame.object_id %>', 'post<%=h frame.object_id %>')"><%=h line %></li>
+                <% } %>
+              </ol>
+              <% end %>
+          </div>
+          <% end %>
+      </li>
+<% } %>
+  </ul>
+</div>
+
+<div id="requestinfo">
+  <h2>Request information</h2>
+
+  <h3 id="get-info">GET</h3>
+  <% if req.GET and not req.GET.empty? %>
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+          <% req.GET.sort_by { |k, v| k.to_s }.each { |key, val| %>
+          <tr>
+            <td><%=h key %></td>
+            <td class="code"><div><%=h val.inspect %></div></td>
+          </tr>
+          <% } %>
+      </tbody>
+    </table>
+  <% else %>
+    <p>No GET data.</p>
+  <% end %>
+
+  <h3 id="post-info">POST</h3>
+  <% if req.POST and not req.POST.empty? %>
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+          <% req.POST.sort_by { |k, v| k.to_s }.each { |key, val| %>
+          <tr>
+            <td><%=h key %></td>
+            <td class="code"><div><%=h val.inspect %></div></td>
+          </tr>
+          <% } %>
+      </tbody>
+    </table>
+  <% else %>
+    <p>No POST data.</p>
+  <% end %>
+
+
+  <h3 id="cookie-info">COOKIES</h3>
+  <% unless req.cookies.empty? %>
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+        <% req.cookies.each { |key, val| %>
+          <tr>
+            <td><%=h key %></td>
+            <td class="code"><div><%=h val.inspect %></div></td>
+          </tr>
+        <% } %>
+      </tbody>
+    </table>
+  <% else %>
+    <p>No cookie data.</p>
+  <% end %>
+
+  <h3 id="env-info">Rack ENV</h3>
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+          <% env.sort_by { |k, v| k.to_s }.each { |key, val| %>
+          <tr>
+            <td><%=h key %></td>
+            <td class="code"><div><%=h val %></div></td>
+          </tr>
+          <% } %>
+      </tbody>
+    </table>
+
+</div>
+
+<div id="explanation">
+  <p>
+    You're seeing this error because you use <code>Rack::ShowExceptions</code>.
+  </p>
+</div>
+
+</body>
+</html>
+HTML
+
+    # :startdoc:
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/showstatus.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/showstatus.rb
new file mode 100644
index 0000000..5a9506f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/showstatus.rb
@@ -0,0 +1,113 @@
+require 'erb'
+require 'rack/request'
+require 'rack/utils'
+
+module Rack
+  # Rack::ShowStatus catches all empty responses and replaces them 
+  # with a site explaining the error.
+  #
+  # Additional details can be put into <tt>rack.showstatus.detail</tt>
+  # and will be shown as HTML.  If such details exist, the error page
+  # is always rendered, even if the reply was not empty.
+
+  class ShowStatus
+    def initialize(app)
+      @app = app
+      @template = ERB.new(TEMPLATE)
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+      headers = Utils::HeaderHash.new(headers)
+      empty = headers['Content-Length'].to_i <= 0
+
+      # client or server error, or explicit message
+      if (status.to_i >= 400 && empty) || env["rack.showstatus.detail"]
+        # This double assignment is to prevent an "unused variable" warning on
+        # Ruby 1.9.3.  Yes, it is dumb, but I don't like Ruby yelling at me.
+        req = req = Rack::Request.new(env)
+
+        message = Rack::Utils::HTTP_STATUS_CODES[status.to_i] || status.to_s
+
+        # This double assignment is to prevent an "unused variable" warning on
+        # Ruby 1.9.3.  Yes, it is dumb, but I don't like Ruby yelling at me.
+        detail = detail = env["rack.showstatus.detail"] || message
+
+        body = @template.result(binding)
+        size = Rack::Utils.bytesize(body)
+        [status, headers.merge("Content-Type" => "text/html", "Content-Length" => size.to_s), [body]]
+      else
+        [status, headers, body]
+      end
+    end
+
+    def h(obj)                  # :nodoc:
+      case obj
+      when String
+        Utils.escape_html(obj)
+      else
+        Utils.escape_html(obj.inspect)
+      end
+    end
+
+    # :stopdoc:
+
+# adapted from Django <djangoproject.com>
+# Copyright (c) 2005, the Lawrence Journal-World
+# Used under the modified BSD license:
+# http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5
+TEMPLATE = <<'HTML'
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <title><%=h message %> at <%=h req.script_name + req.path_info %></title>
+  <meta name="robots" content="NONE,NOARCHIVE" />
+  <style type="text/css">
+    html * { padding:0; margin:0; }
+    body * { padding:10px 20px; }
+    body * * { padding:0; }
+    body { font:small sans-serif; background:#eee; }
+    body>div { border-bottom:1px solid #ddd; }
+    h1 { font-weight:normal; margin-bottom:.4em; }
+    h1 span { font-size:60%; color:#666; font-weight:normal; }
+    table { border:none; border-collapse: collapse; width:100%; }
+    td, th { vertical-align:top; padding:2px 3px; }
+    th { width:12em; text-align:right; color:#666; padding-right:.5em; }
+    #info { background:#f6f6f6; }
+    #info ol { margin: 0.5em 4em; }
+    #info ol li { font-family: monospace; }
+    #summary { background: #ffc; }
+    #explanation { background:#eee; border-bottom: 0px none; }
+  </style>
+</head>
+<body>
+  <div id="summary">
+    <h1><%=h message %> <span>(<%= status.to_i %>)</span></h1>
+    <table class="meta">
+      <tr>
+        <th>Request Method:</th>
+        <td><%=h req.request_method %></td>
+      </tr>
+      <tr>
+        <th>Request URL:</th>
+      <td><%=h req.url %></td>
+      </tr>
+    </table>
+  </div>
+  <div id="info">
+    <p><%= detail %></p>
+  </div>
+
+  <div id="explanation">
+    <p>
+    You're seeing this error because you use <code>Rack::ShowStatus</code>.
+    </p>
+  </div>
+</body>
+</html>
+HTML
+
+    # :startdoc:
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/static.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/static.rb
new file mode 100644
index 0000000..46bc66d
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/static.rb
@@ -0,0 +1,153 @@
+module Rack
+
+  # The Rack::Static middleware intercepts requests for static files
+  # (javascript files, images, stylesheets, etc) based on the url prefixes or
+  # route mappings passed in the options, and serves them using a Rack::File
+  # object. This allows a Rack stack to serve both static and dynamic content.
+  #
+  # Examples:
+  #
+  # Serve all requests beginning with /media from the "media" folder located
+  # in the current directory (ie media/*):
+  #
+  #     use Rack::Static, :urls => ["/media"]
+  #
+  # Serve all requests beginning with /css or /images from the folder "public"
+  # in the current directory (ie public/css/* and public/images/*):
+  #
+  #     use Rack::Static, :urls => ["/css", "/images"], :root => "public"
+  #
+  # Serve all requests to / with "index.html" from the folder "public" in the
+  # current directory (ie public/index.html):
+  #
+  #     use Rack::Static, :urls => {"/" => 'index.html'}, :root => 'public'
+  #
+  # Serve all requests normally from the folder "public" in the current
+  # directory but uses index.html as default route for "/"
+  #
+  #     use Rack::Static, :urls => [""], :root => 'public', :index =>
+  #     'index.html'
+  #
+  # Set custom HTTP Headers for based on rules:
+  #
+  #     use Rack::Static, :root => 'public',
+  #         :header_rules => [
+  #           [rule, {header_field => content, header_field => content}],
+  #           [rule, {header_field => content}]
+  #         ]
+  #
+  #  Rules for selecting files:
+  #
+  #  1) All files
+  #     Provide the :all symbol
+  #     :all => Matches every file
+  #
+  #  2) Folders
+  #     Provide the folder path as a string
+  #     '/folder' or '/folder/subfolder' => Matches files in a certain folder
+  #
+  #  3) File Extensions
+  #     Provide the file extensions as an array
+  #     ['css', 'js'] or %w(css js) => Matches files ending in .css or .js
+  #
+  #  4) Regular Expressions / Regexp
+  #     Provide a regular expression
+  #     %r{\.(?:css|js)\z} => Matches files ending in .css or .js
+  #     /\.(?:eot|ttf|otf|woff|svg)\z/ => Matches files ending in
+  #       the most common web font formats (.eot, .ttf, .otf, .woff, .svg)
+  #       Note: This Regexp is available as a shortcut, using the :fonts rule
+  #
+  #  5) Font Shortcut
+  #     Provide the :fonts symbol
+  #     :fonts => Uses the Regexp rule stated right above to match all common web font endings
+  #
+  #  Rule Ordering:
+  #    Rules are applied in the order that they are provided.
+  #    List rather general rules above special ones.
+  #
+  #  Complete example use case including HTTP header rules:
+  #
+  #     use Rack::Static, :root => 'public',
+  #         :header_rules => [
+  #           # Cache all static files in public caches (e.g. Rack::Cache)
+  #           #  as well as in the browser
+  #           [:all, {'Cache-Control' => 'public, max-age=31536000'}],
+  #
+  #           # Provide web fonts with cross-origin access-control-headers
+  #           #  Firefox requires this when serving assets using a Content Delivery Network
+  #           [:fonts, {'Access-Control-Allow-Origin' => '*'}]
+  #         ]
+  #
+  class Static
+
+    def initialize(app, options={})
+      @app = app
+      @urls = options[:urls] || ["/favicon.ico"]
+      @index = options[:index]
+      root = options[:root] || Dir.pwd
+
+      # HTTP Headers
+      @header_rules = options[:header_rules] || []
+      # Allow for legacy :cache_control option while prioritizing global header_rules setting
+      @header_rules.insert(0, [:all, {'Cache-Control' => options[:cache_control]}]) if options[:cache_control]
+      @headers = {}
+
+      @file_server = Rack::File.new(root, @headers)
+    end
+
+    def overwrite_file_path(path)
+      @urls.kind_of?(Hash) && @urls.key?(path) || @index && path =~ /\/$/
+    end
+
+    def route_file(path)
+      @urls.kind_of?(Array) && @urls.any? { |url| path.index(url) == 0 }
+    end
+
+    def can_serve(path)
+      route_file(path) || overwrite_file_path(path)
+    end
+
+    def call(env)
+      path = env["PATH_INFO"]
+
+      if can_serve(path)
+        env["PATH_INFO"] = (path =~ /\/$/ ? path + @index : @urls[path]) if overwrite_file_path(path)
+        @path = env["PATH_INFO"]
+        apply_header_rules
+        @file_server.call(env)
+      else
+        @app.call(env)
+      end
+    end
+
+    # Convert HTTP header rules to HTTP headers
+    def apply_header_rules
+      @header_rules.each do |rule, headers|
+        apply_rule(rule, headers)
+      end
+    end
+
+    def apply_rule(rule, headers)
+      case rule
+      when :all    # All files
+        set_headers(headers)
+      when :fonts  # Fonts Shortcut
+        set_headers(headers) if @path.match(/\.(?:ttf|otf|eot|woff|svg)\z/)
+      when String  # Folder
+        path = ::Rack::Utils.unescape(@path)
+        set_headers(headers) if (path.start_with?(rule) || path.start_with?('/' + rule))
+      when Array   # Extension/Extensions
+        extensions = rule.join('|')
+        set_headers(headers) if @path.match(/\.(#{extensions})\z/)
+      when Regexp  # Flexible Regexp
+        set_headers(headers) if @path.match(rule)
+      else
+      end
+    end
+
+    def set_headers(headers)
+      headers.each { |field, content| @headers[field] = content }
+    end
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/urlmap.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/urlmap.rb
new file mode 100644
index 0000000..d301ce9
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/urlmap.rb
@@ -0,0 +1,76 @@
+module Rack
+  # Rack::URLMap takes a hash mapping urls or paths to apps, and
+  # dispatches accordingly.  Support for HTTP/1.1 host names exists if
+  # the URLs start with <tt>http://</tt> or <tt>https://</tt>.
+  #
+  # URLMap modifies the SCRIPT_NAME and PATH_INFO such that the part
+  # relevant for dispatch is in the SCRIPT_NAME, and the rest in the
+  # PATH_INFO.  This should be taken care of when you need to
+  # reconstruct the URL in order to create links.
+  #
+  # URLMap dispatches in such a way that the longest paths are tried
+  # first, since they are most specific.
+
+  class URLMap
+    NEGATIVE_INFINITY = -1.0 / 0.0
+    INFINITY = 1.0 / 0.0
+
+    def initialize(map = {})
+      remap(map)
+    end
+
+    def remap(map)
+      @mapping = map.map { |location, app|
+        if location =~ %r{\Ahttps?://(.*?)(/.*)}
+          host, location = $1, $2
+        else
+          host = nil
+        end
+
+        unless location[0] == ?/
+          raise ArgumentError, "paths need to start with /"
+        end
+
+        location = location.chomp('/')
+        match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n')
+
+        [host, location, match, app]
+      }.sort_by do |(host, location, _, _)|
+        [host ? -host.size : INFINITY, -location.size]
+      end
+    end
+
+    def call(env)
+      path = env["PATH_INFO"]
+      script_name = env['SCRIPT_NAME']
+      hHost = env['HTTP_HOST']
+      sName = env['SERVER_NAME']
+      sPort = env['SERVER_PORT']
+
+      @mapping.each do |host, location, match, app|
+        unless hHost == host \
+            || sName == host \
+            || (!host && (hHost == sName || hHost == sName+':'+sPort))
+          next
+        end
+
+        next unless m = match.match(path.to_s)
+
+        rest = m[1]
+        next unless !rest || rest.empty? || rest[0] == ?/
+
+        env['SCRIPT_NAME'] = (script_name + location)
+        env['PATH_INFO'] = rest
+
+        return app.call(env)
+      end
+
+      [404, {"Content-Type" => "text/plain", "X-Cascade" => "pass"}, ["Not Found: #{path}"]]
+
+    ensure
+      env['PATH_INFO'] = path
+      env['SCRIPT_NAME'] = script_name
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/utils.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/utils.rb
new file mode 100644
index 0000000..561e46e
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/utils.rb
@@ -0,0 +1,628 @@
+# -*- encoding: binary -*-
+require 'fileutils'
+require 'set'
+require 'tempfile'
+require 'rack/multipart'
+require 'time'
+
+major, minor, patch = RUBY_VERSION.split('.').map { |v| v.to_i }
+
+if major == 1 && minor < 9
+  require 'rack/backports/uri/common_18'
+elsif major == 1 && minor == 9 && patch == 2 && RUBY_PATCHLEVEL <= 320 && RUBY_ENGINE != 'jruby'
+  require 'rack/backports/uri/common_192'
+elsif major == 1 && minor == 9 && patch == 3 && RUBY_PATCHLEVEL < 125
+  require 'rack/backports/uri/common_193'
+else
+  require 'uri/common'
+end
+
+module Rack
+  # Rack::Utils contains a grab-bag of useful methods for writing web
+  # applications adopted from all kinds of Ruby libraries.
+
+  module Utils
+    # URI escapes. (CGI style space to +)
+    def escape(s)
+      URI.encode_www_form_component(s)
+    end
+    module_function :escape
+
+    # Like URI escaping, but with %20 instead of +. Strictly speaking this is
+    # true URI escaping.
+    def escape_path(s)
+      escape(s).gsub('+', '%20')
+    end
+    module_function :escape_path
+
+    # Unescapes a URI escaped string with +encoding+. +encoding+ will be the
+    # target encoding of the string returned, and it defaults to UTF-8
+    if defined?(::Encoding)
+      def unescape(s, encoding = Encoding::UTF_8)
+        URI.decode_www_form_component(s, encoding)
+      end
+    else
+      def unescape(s, encoding = nil)
+        URI.decode_www_form_component(s, encoding)
+      end
+    end
+    module_function :unescape
+
+    DEFAULT_SEP = /[&;] */n
+
+    class << self
+      attr_accessor :key_space_limit
+    end
+
+    # The default number of bytes to allow parameter keys to take up.
+    # This helps prevent a rogue client from flooding a Request.
+    self.key_space_limit = 65536
+
+    # Stolen from Mongrel, with some small modifications:
+    # Parses a query string by breaking it up at the '&'
+    # and ';' characters.  You can also use this to parse
+    # cookies by changing the characters used in the second
+    # parameter (which defaults to '&;').
+    def parse_query(qs, d = nil, &unescaper)
+      unescaper ||= method(:unescape)
+
+      params = KeySpaceConstrainedParams.new
+
+      (qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p|
+        next if p.empty?
+        k, v = p.split('=', 2).map(&unescaper)
+
+        if cur = params[k]
+          if cur.class == Array
+            params[k] << v
+          else
+            params[k] = [cur, v]
+          end
+        else
+          params[k] = v
+        end
+      end
+
+      return params.to_params_hash
+    end
+    module_function :parse_query
+
+    def parse_nested_query(qs, d = nil)
+      params = KeySpaceConstrainedParams.new
+
+      (qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p|
+        k, v = p.split('=', 2).map { |s| unescape(s) }
+
+        normalize_params(params, k, v)
+      end
+
+      return params.to_params_hash
+    end
+    module_function :parse_nested_query
+
+    def normalize_params(params, name, v = nil)
+      name =~ %r(\A[\[\]]*([^\[\]]+)\]*)
+      k = $1 || ''
+      after = $' || ''
+
+      return if k.empty?
+
+      if after == ""
+        params[k] = v
+      elsif after == "[]"
+        params[k] ||= []
+        raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
+        params[k] << v
+      elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$)
+        child_key = $1
+        params[k] ||= []
+        raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
+        if params_hash_type?(params[k].last) && !params[k].last.key?(child_key)
+          normalize_params(params[k].last, child_key, v)
+        else
+          params[k] << normalize_params(params.class.new, child_key, v)
+        end
+      else
+        params[k] ||= params.class.new
+        raise TypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params_hash_type?(params[k])
+        params[k] = normalize_params(params[k], after, v)
+      end
+
+      return params
+    end
+    module_function :normalize_params
+
+    def params_hash_type?(obj)
+      obj.kind_of?(KeySpaceConstrainedParams) || obj.kind_of?(Hash)
+    end
+    module_function :params_hash_type?
+
+    def build_query(params)
+      params.map { |k, v|
+        if v.class == Array
+          build_query(v.map { |x| [k, x] })
+        else
+          v.nil? ? escape(k) : "#{escape(k)}=#{escape(v)}"
+        end
+      }.join("&")
+    end
+    module_function :build_query
+
+    def build_nested_query(value, prefix = nil)
+      case value
+      when Array
+        value.map { |v|
+          build_nested_query(v, "#{prefix}[]")
+        }.join("&")
+      when Hash
+        value.map { |k, v|
+          build_nested_query(v, prefix ? "#{prefix}[#{escape(k)}]" : escape(k))
+        }.join("&")
+      when String
+        raise ArgumentError, "value must be a Hash" if prefix.nil?
+        "#{prefix}=#{escape(value)}"
+      else
+        prefix
+      end
+    end
+    module_function :build_nested_query
+
+    def q_values(q_value_header)
+      q_value_header.to_s.split(/\s*,\s*/).map do |part|
+        value, parameters = part.split(/\s*;\s*/, 2)
+        quality = 1.0
+        if md = /\Aq=([\d.]+)/.match(parameters)
+          quality = md[1].to_f
+        end
+        [value, quality]
+      end
+    end
+    module_function :q_values
+
+    def best_q_match(q_value_header, available_mimes)
+      values = q_values(q_value_header)
+
+      values.map do |req_mime, quality|
+        match = available_mimes.first { |am| Rack::Mime.match?(am, req_mime) }
+        next unless match
+        [match, quality]
+      end.compact.sort_by do |match, quality|
+        (match.split('/', 2).count('*') * -10) + quality
+      end.last.first
+    end
+    module_function :best_q_match
+
+    ESCAPE_HTML = {
+      "&" => "&",
+      "<" => "<",
+      ">" => ">",
+      "'" => "&#x27;",
+      '"' => """,
+      "/" => "&#x2F;"
+    }
+    if //.respond_to?(:encoding)
+      ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys)
+    else
+      # On 1.8, there is a kcode = 'u' bug that allows for XSS otherwhise
+      # TODO doesn't apply to jruby, so a better condition above might be preferable?
+      ESCAPE_HTML_PATTERN = /#{Regexp.union(*ESCAPE_HTML.keys)}/n
+    end
+
+    # Escape ampersands, brackets and quotes to their HTML/XML entities.
+    def escape_html(string)
+      string.to_s.gsub(ESCAPE_HTML_PATTERN){|c| ESCAPE_HTML[c] }
+    end
+    module_function :escape_html
+
+    def select_best_encoding(available_encodings, accept_encoding)
+      # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
+
+      expanded_accept_encoding =
+        accept_encoding.map { |m, q|
+          if m == "*"
+            (available_encodings - accept_encoding.map { |m2, _| m2 }).map { |m2| [m2, q] }
+          else
+            [[m, q]]
+          end
+        }.inject([]) { |mem, list|
+          mem + list
+        }
+
+      encoding_candidates = expanded_accept_encoding.sort_by { |_, q| -q }.map { |m, _| m }
+
+      unless encoding_candidates.include?("identity")
+        encoding_candidates.push("identity")
+      end
+
+      expanded_accept_encoding.find_all { |m, q|
+        q == 0.0
+      }.each { |m, _|
+        encoding_candidates.delete(m)
+      }
+
+      return (encoding_candidates & available_encodings)[0]
+    end
+    module_function :select_best_encoding
+
+    def set_cookie_header!(header, key, value)
+      case value
+      when Hash
+        domain  = "; domain="  + value[:domain] if value[:domain]
+        path    = "; path="    + value[:path]   if value[:path]
+        max_age = "; max-age=" + value[:max_age] if value[:max_age]
+        # There is an RFC mess in the area of date formatting for Cookies. Not
+        # only are there contradicting RFCs and examples within RFC text, but
+        # there are also numerous conflicting names of fields and partially
+        # cross-applicable specifications.
+        #
+        # These are best described in RFC 2616 3.3.1. This RFC text also
+        # specifies that RFC 822 as updated by RFC 1123 is preferred. That is a
+        # fixed length format with space-date delimeted fields.
+        #
+        # See also RFC 1123 section 5.2.14.
+        #
+        # RFC 6265 also specifies "sane-cookie-date" as RFC 1123 date, defined
+        # in RFC 2616 3.3.1. RFC 6265 also gives examples that clearly denote
+        # the space delimited format. These formats are compliant with RFC 2822.
+        #
+        # For reference, all involved RFCs are:
+        # RFC 822
+        # RFC 1123
+        # RFC 2109
+        # RFC 2616
+        # RFC 2822
+        # RFC 2965
+        # RFC 6265
+        expires = "; expires=" +
+          rfc2822(value[:expires].clone.gmtime) if value[:expires]
+        secure = "; secure"  if value[:secure]
+        httponly = "; HttpOnly" if value[:httponly]
+        value = value[:value]
+      end
+      value = [value] unless Array === value
+      cookie = escape(key) + "=" +
+        value.map { |v| escape v }.join("&") +
+        "#{domain}#{path}#{max_age}#{expires}#{secure}#{httponly}"
+
+      case header["Set-Cookie"]
+      when nil, ''
+        header["Set-Cookie"] = cookie
+      when String
+        header["Set-Cookie"] = [header["Set-Cookie"], cookie].join("\n")
+      when Array
+        header["Set-Cookie"] = (header["Set-Cookie"] + [cookie]).join("\n")
+      end
+
+      nil
+    end
+    module_function :set_cookie_header!
+
+    def delete_cookie_header!(header, key, value = {})
+      case header["Set-Cookie"]
+      when nil, ''
+        cookies = []
+      when String
+        cookies = header["Set-Cookie"].split("\n")
+      when Array
+        cookies = header["Set-Cookie"]
+      end
+
+      cookies.reject! { |cookie|
+        if value[:domain]
+          cookie =~ /\A#{escape(key)}=.*domain=#{value[:domain]}/
+        elsif value[:path]
+          cookie =~ /\A#{escape(key)}=.*path=#{value[:path]}/
+        else
+          cookie =~ /\A#{escape(key)}=/
+        end
+      }
+
+      header["Set-Cookie"] = cookies.join("\n")
+
+      set_cookie_header!(header, key,
+                 {:value => '', :path => nil, :domain => nil,
+                   :max_age => '0',
+                   :expires => Time.at(0) }.merge(value))
+
+      nil
+    end
+    module_function :delete_cookie_header!
+
+    # Return the bytesize of String; uses String#size under Ruby 1.8 and
+    # String#bytesize under 1.9.
+    if ''.respond_to?(:bytesize)
+      def bytesize(string)
+        string.bytesize
+      end
+    else
+      def bytesize(string)
+        string.size
+      end
+    end
+    module_function :bytesize
+
+    def rfc2822(time)
+      time.rfc2822
+    end
+    module_function :rfc2822
+
+    # Modified version of stdlib time.rb Time#rfc2822 to use '%d-%b-%Y' instead
+    # of '% %b %Y'.
+    # It assumes that the time is in GMT to comply to the RFC 2109.
+    #
+    # NOTE: I'm not sure the RFC says it requires GMT, but is ambigous enough
+    # that I'm certain someone implemented only that option.
+    # Do not use %a and %b from Time.strptime, it would use localized names for
+    # weekday and month.
+    #
+    def rfc2109(time)
+      wday = Time::RFC2822_DAY_NAME[time.wday]
+      mon = Time::RFC2822_MONTH_NAME[time.mon - 1]
+      time.strftime("#{wday}, %d-#{mon}-%Y %H:%M:%S GMT")
+    end
+    module_function :rfc2109
+
+    # Parses the "Range:" header, if present, into an array of Range objects.
+    # Returns nil if the header is missing or syntactically invalid.
+    # Returns an empty array if none of the ranges are satisfiable.
+    def byte_ranges(env, size)
+      # See <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35>
+      http_range = env['HTTP_RANGE']
+      return nil unless http_range && http_range =~ /bytes=([^;]+)/
+      ranges = []
+      $1.split(/,\s*/).each do |range_spec|
+        return nil  unless range_spec =~ /(\d*)-(\d*)/
+        r0,r1 = $1, $2
+        if r0.empty?
+          return nil  if r1.empty?
+          # suffix-byte-range-spec, represents trailing suffix of file
+          r0 = size - r1.to_i
+          r0 = 0  if r0 < 0
+          r1 = size - 1
+        else
+          r0 = r0.to_i
+          if r1.empty?
+            r1 = size - 1
+          else
+            r1 = r1.to_i
+            return nil  if r1 < r0  # backwards range is syntactically invalid
+            r1 = size-1  if r1 >= size
+          end
+        end
+        ranges << (r0..r1)  if r0 <= r1
+      end
+      ranges
+    end
+    module_function :byte_ranges
+
+    # Constant time string comparison.
+    def secure_compare(a, b)
+      return false unless bytesize(a) == bytesize(b)
+
+      l = a.unpack("C*")
+
+      r, i = 0, -1
+      b.each_byte { |v| r |= v ^ l[i+=1] }
+      r == 0
+    end
+    module_function :secure_compare
+
+    # Context allows the use of a compatible middleware at different points
+    # in a request handling stack. A compatible middleware must define
+    # #context which should take the arguments env and app. The first of which
+    # would be the request environment. The second of which would be the rack
+    # application that the request would be forwarded to.
+    class Context
+      attr_reader :for, :app
+
+      def initialize(app_f, app_r)
+        raise 'running context does not respond to #context' unless app_f.respond_to? :context
+        @for, @app = app_f, app_r
+      end
+
+      def call(env)
+        @for.context(env, @app)
+      end
+
+      def recontext(app)
+        self.class.new(@for, app)
+      end
+
+      def context(env, app=@app)
+        recontext(app).call(env)
+      end
+    end
+
+    # A case-insensitive Hash that preserves the original case of a
+    # header when set.
+    class HeaderHash < Hash
+      def self.new(hash={})
+        HeaderHash === hash ? hash : super(hash)
+      end
+
+      def initialize(hash={})
+        super()
+        @names = {}
+        hash.each { |k, v| self[k] = v }
+      end
+
+      def each
+        super do |k, v|
+          yield(k, v.respond_to?(:to_ary) ? v.to_ary.join("\n") : v)
+        end
+      end
+
+      def to_hash
+        hash = {}
+        each { |k,v| hash[k] = v }
+        hash
+      end
+
+      def [](k)
+        super(k) || super(@names[k.downcase])
+      end
+
+      def []=(k, v)
+        canonical = k.downcase
+        delete k if @names[canonical] && @names[canonical] != k # .delete is expensive, don't invoke it unless necessary
+        @names[k] = @names[canonical] = k
+        super k, v
+      end
+
+      def delete(k)
+        canonical = k.downcase
+        result = super @names.delete(canonical)
+        @names.delete_if { |name,| name.downcase == canonical }
+        result
+      end
+
+      def include?(k)
+        @names.include?(k) || @names.include?(k.downcase)
+      end
+
+      alias_method :has_key?, :include?
+      alias_method :member?, :include?
+      alias_method :key?, :include?
+
+      def merge!(other)
+        other.each { |k, v| self[k] = v }
+        self
+      end
+
+      def merge(other)
+        hash = dup
+        hash.merge! other
+      end
+
+      def replace(other)
+        clear
+        other.each { |k, v| self[k] = v }
+        self
+      end
+    end
+
+    class KeySpaceConstrainedParams
+      def initialize(limit = Utils.key_space_limit)
+        @limit  = limit
+        @size   = 0
+        @params = {}
+      end
+
+      def [](key)
+        @params[key]
+      end
+
+      def []=(key, value)
+        @size += key.size if key && !@params.key?(key)
+        raise RangeError, 'exceeded available parameter key space' if @size > @limit
+        @params[key] = value
+      end
+
+      def key?(key)
+        @params.key?(key)
+      end
+
+      def to_params_hash
+        hash = @params
+        hash.keys.each do |key|
+          value = hash[key]
+          if value.kind_of?(self.class)
+            hash[key] = value.to_params_hash
+          elsif value.kind_of?(Array)
+            value.map! {|x| x.kind_of?(self.class) ? x.to_params_hash : x}
+          end
+        end
+        hash
+      end
+    end
+
+    # Every standard HTTP code mapped to the appropriate message.
+    # Generated with:
+    # irb -ropen-uri -rnokogiri
+    # > Nokogiri::XML(open("http://www.iana.org/assignments/http-status-codes/http-status-codes.xml")).css("record").each{|r|
+    #         puts "#{r.css('value').text} => '#{r.css('description').text}'"}
+    HTTP_STATUS_CODES = {
+      100 => 'Continue',
+      101 => 'Switching Protocols',
+      102 => 'Processing',
+      200 => 'OK',
+      201 => 'Created',
+      202 => 'Accepted',
+      203 => 'Non-Authoritative Information',
+      204 => 'No Content',
+      205 => 'Reset Content',
+      206 => 'Partial Content',
+      207 => 'Multi-Status',
+      208 => 'Already Reported',
+      226 => 'IM Used',
+      300 => 'Multiple Choices',
+      301 => 'Moved Permanently',
+      302 => 'Found',
+      303 => 'See Other',
+      304 => 'Not Modified',
+      305 => 'Use Proxy',
+      306 => 'Reserved',
+      307 => 'Temporary Redirect',
+      308 => 'Permanent Redirect',
+      400 => 'Bad Request',
+      401 => 'Unauthorized',
+      402 => 'Payment Required',
+      403 => 'Forbidden',
+      404 => 'Not Found',
+      405 => 'Method Not Allowed',
+      406 => 'Not Acceptable',
+      407 => 'Proxy Authentication Required',
+      408 => 'Request Timeout',
+      409 => 'Conflict',
+      410 => 'Gone',
+      411 => 'Length Required',
+      412 => 'Precondition Failed',
+      413 => 'Request Entity Too Large',
+      414 => 'Request-URI Too Long',
+      415 => 'Unsupported Media Type',
+      416 => 'Requested Range Not Satisfiable',
+      417 => 'Expectation Failed',
+      422 => 'Unprocessable Entity',
+      423 => 'Locked',
+      424 => 'Failed Dependency',
+      425 => 'Reserved for WebDAV advanced collections expired proposal',
+      426 => 'Upgrade Required',
+      427 => 'Unassigned',
+      428 => 'Precondition Required',
+      429 => 'Too Many Requests',
+      430 => 'Unassigned',
+      431 => 'Request Header Fields Too Large',
+      500 => 'Internal Server Error',
+      501 => 'Not Implemented',
+      502 => 'Bad Gateway',
+      503 => 'Service Unavailable',
+      504 => 'Gateway Timeout',
+      505 => 'HTTP Version Not Supported',
+      506 => 'Variant Also Negotiates (Experimental)',
+      507 => 'Insufficient Storage',
+      508 => 'Loop Detected',
+      509 => 'Unassigned',
+      510 => 'Not Extended',
+      511 => 'Network Authentication Required'
+    }
+
+    # Responses with HTTP status codes that should not have an entity body
+    STATUS_WITH_NO_ENTITY_BODY = Set.new((100..199).to_a << 204 << 205 << 304)
+
+    SYMBOL_TO_STATUS_CODE = Hash[*HTTP_STATUS_CODES.map { |code, message|
+      [message.downcase.gsub(/\s|-/, '_').to_sym, code]
+    }.flatten]
+
+    def status_code(status)
+      if status.is_a?(Symbol)
+        SYMBOL_TO_STATUS_CODE[status] || 500
+      else
+        status.to_i
+      end
+    end
+    module_function :status_code
+
+    Multipart = Rack::Multipart
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/utils/okjson.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/utils/okjson.rb
new file mode 100644
index 0000000..dcf80e5
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/lib/rack/utils/okjson.rb
@@ -0,0 +1,599 @@
+# encoding: UTF-8
+#
+# Copyright 2011, 2012 Keith Rarick
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+# See https://github.com/kr/okjson for updates.
+# Imported from the above repo @ d4e8643ad92e14b37d11326855499c7e4108ed17
+# Namespace modified for vendoring under Rack::Utils
+
+require 'stringio'
+
+# Some parts adapted from
+# http://golang.org/src/pkg/json/decode.go and
+# http://golang.org/src/pkg/utf8/utf8.go
+module Rack::Utils::OkJson
+  Upstream = 'LTD7LBKLZWFF7OZK'
+  extend self
+
+
+  # Decodes a json document in string s and
+  # returns the corresponding ruby value.
+  # String s must be valid UTF-8. If you have
+  # a string in some other encoding, convert
+  # it first.
+  #
+  # String values in the resulting structure
+  # will be UTF-8.
+  def decode(s)
+    ts = lex(s)
+    v, ts = textparse(ts)
+    if ts.length > 0
+      raise Error, 'trailing garbage'
+    end
+    v
+  end
+
+
+  # Parses a "json text" in the sense of RFC 4627.
+  # Returns the parsed value and any trailing tokens.
+  # Note: this is almost the same as valparse,
+  # except that it does not accept atomic values.
+  def textparse(ts)
+    if ts.length < 0
+      raise Error, 'empty'
+    end
+
+    typ, _, val = ts[0]
+    case typ
+    when '{' then objparse(ts)
+    when '[' then arrparse(ts)
+    else
+      raise Error, "unexpected #{val.inspect}"
+    end
+  end
+
+
+  # Parses a "value" in the sense of RFC 4627.
+  # Returns the parsed value and any trailing tokens.
+  def valparse(ts)
+    if ts.length < 0
+      raise Error, 'empty'
+    end
+
+    typ, _, val = ts[0]
+    case typ
+    when '{' then objparse(ts)
+    when '[' then arrparse(ts)
+    when :val,:str then [val, ts[1..-1]]
+    else
+      raise Error, "unexpected #{val.inspect}"
+    end
+  end
+
+
+  # Parses an "object" in the sense of RFC 4627.
+  # Returns the parsed value and any trailing tokens.
+  def objparse(ts)
+    ts = eat('{', ts)
+    obj = {}
+
+    if ts[0][0] == '}'
+      return obj, ts[1..-1]
+    end
+
+    k, v, ts = pairparse(ts)
+    obj[k] = v
+
+    if ts[0][0] == '}'
+      return obj, ts[1..-1]
+    end
+
+    loop do
+      ts = eat(',', ts)
+
+      k, v, ts = pairparse(ts)
+      obj[k] = v
+
+      if ts[0][0] == '}'
+        return obj, ts[1..-1]
+      end
+    end
+  end
+
+
+  # Parses a "member" in the sense of RFC 4627.
+  # Returns the parsed values and any trailing tokens.
+  def pairparse(ts)
+    (typ, _, k), ts = ts[0], ts[1..-1]
+    if typ != :str
+      raise Error, "unexpected #{k.inspect}"
+    end
+    ts = eat(':', ts)
+    v, ts = valparse(ts)
+    [k, v, ts]
+  end
+
+
+  # Parses an "array" in the sense of RFC 4627.
+  # Returns the parsed value and any trailing tokens.
+  def arrparse(ts)
+    ts = eat('[', ts)
+    arr = []
+
+    if ts[0][0] == ']'
+      return arr, ts[1..-1]
+    end
+
+    v, ts = valparse(ts)
+    arr << v
+
+    if ts[0][0] == ']'
+      return arr, ts[1..-1]
+    end
+
+    loop do
+      ts = eat(',', ts)
+
+      v, ts = valparse(ts)
+      arr << v
+
+      if ts[0][0] == ']'
+        return arr, ts[1..-1]
+      end
+    end
+  end
+
+
+  def eat(typ, ts)
+    if ts[0][0] != typ
+      raise Error, "expected #{typ} (got #{ts[0].inspect})"
+    end
+    ts[1..-1]
+  end
+
+
+  # Scans s and returns a list of json tokens,
+  # excluding white space (as defined in RFC 4627).
+  def lex(s)
+    ts = []
+    while s.length > 0
+      typ, lexeme, val = tok(s)
+      if typ == nil
+        raise Error, "invalid character at #{s[0,10].inspect}"
+      end
+      if typ != :space
+        ts << [typ, lexeme, val]
+      end
+      s = s[lexeme.length..-1]
+    end
+    ts
+  end
+
+
+  # Scans the first token in s and
+  # returns a 3-element list, or nil
+  # if s does not begin with a valid token.
+  #
+  # The first list element is one of
+  # '{', '}', ':', ',', '[', ']',
+  # :val, :str, and :space.
+  #
+  # The second element is the lexeme.
+  #
+  # The third element is the value of the
+  # token for :val and :str, otherwise
+  # it is the lexeme.
+  def tok(s)
+    case s[0]
+    when ?{  then ['{', s[0,1], s[0,1]]
+    when ?}  then ['}', s[0,1], s[0,1]]
+    when ?:  then [':', s[0,1], s[0,1]]
+    when ?,  then [',', s[0,1], s[0,1]]
+    when ?[  then ['[', s[0,1], s[0,1]]
+    when ?]  then [']', s[0,1], s[0,1]]
+    when ?n  then nulltok(s)
+    when ?t  then truetok(s)
+    when ?f  then falsetok(s)
+    when ?"  then strtok(s)
+    when Spc then [:space, s[0,1], s[0,1]]
+    when ?\t then [:space, s[0,1], s[0,1]]
+    when ?\n then [:space, s[0,1], s[0,1]]
+    when ?\r then [:space, s[0,1], s[0,1]]
+    else          numtok(s)
+    end
+  end
+
+
+  def nulltok(s);  s[0,4] == 'null'  ? [:val, 'null',  nil]   : [] end
+  def truetok(s);  s[0,4] == 'true'  ? [:val, 'true',  true]  : [] end
+  def falsetok(s); s[0,5] == 'false' ? [:val, 'false', false] : [] end
+
+
+  def numtok(s)
+    m = /-?([1-9][0-9]+|[0-9])([.][0-9]+)?([eE][+-]?[0-9]+)?/.match(s)
+    if m && m.begin(0) == 0
+      if m[3] && !m[2]
+        [:val, m[0], Integer(m[1])*(10**Integer(m[3][1..-1]))]
+      elsif m[2]
+        [:val, m[0], Float(m[0])]
+      else
+        [:val, m[0], Integer(m[0])]
+      end
+    else
+      []
+    end
+  end
+
+
+  def strtok(s)
+    m = /"([^"\\]|\\["\/\\bfnrt]|\\u[0-9a-fA-F]{4})*"/.match(s)
+    if ! m
+      raise Error, "invalid string literal at #{abbrev(s)}"
+    end
+    [:str, m[0], unquote(m[0])]
+  end
+
+
+  def abbrev(s)
+    t = s[0,10]
+    p = t['`']
+    t = t[0,p] if p
+    t = t + '...' if t.length < s.length
+    '`' + t + '`'
+  end
+
+
+  # Converts a quoted json string literal q into a UTF-8-encoded string.
+  # The rules are different than for Ruby, so we cannot use eval.
+  # Unquote will raise an error if q contains control characters.
+  def unquote(q)
+    q = q[1...-1]
+    a = q.dup # allocate a big enough string
+    rubydoesenc = false
+    # In ruby >= 1.9, a[w] is a codepoint, not a byte.
+    if a.class.method_defined?(:force_encoding)
+      a.force_encoding('UTF-8')
+      rubydoesenc = true
+    end
+    r, w = 0, 0
+    while r < q.length
+      c = q[r]
+      case true
+      when c == ?\\
+        r += 1
+        if r >= q.length
+          raise Error, "string literal ends with a \"\\\": \"#{q}\""
+        end
+
+        case q[r]
+        when ?",?\\,?/,?'
+          a[w] = q[r]
+          r += 1
+          w += 1
+        when ?b,?f,?n,?r,?t
+          a[w] = Unesc[q[r]]
+          r += 1
+          w += 1
+        when ?u
+          r += 1
+          uchar = begin
+            hexdec4(q[r,4])
+          rescue RuntimeError => e
+            raise Error, "invalid escape sequence \\u#{q[r,4]}: #{e}"
+          end
+          r += 4
+          if surrogate? uchar
+            if q.length >= r+6
+              uchar1 = hexdec4(q[r+2,4])
+              uchar = subst(uchar, uchar1)
+              if uchar != Ucharerr
+                # A valid pair; consume.
+                r += 6
+              end
+            end
+          end
+          if rubydoesenc
+            a[w] = '' << uchar
+            w += 1
+          else
+            w += ucharenc(a, w, uchar)
+          end
+        else
+          raise Error, "invalid escape char #{q[r]} in \"#{q}\""
+        end
+      when c == ?", c < Spc
+        raise Error, "invalid character in string literal \"#{q}\""
+      else
+        # Copy anything else byte-for-byte.
+        # Valid UTF-8 will remain valid UTF-8.
+        # Invalid UTF-8 will remain invalid UTF-8.
+        # In ruby >= 1.9, c is a codepoint, not a byte,
+        # in which case this is still what we want.
+        a[w] = c
+        r += 1
+        w += 1
+      end
+    end
+    a[0,w]
+  end
+
+
+  # Encodes unicode character u as UTF-8
+  # bytes in string a at position i.
+  # Returns the number of bytes written.
+  def ucharenc(a, i, u)
+    case true
+    when u <= Uchar1max
+      a[i] = (u & 0xff).chr
+      1
+    when u <= Uchar2max
+      a[i+0] = (Utag2 | ((u>>6)&0xff)).chr
+      a[i+1] = (Utagx | (u&Umaskx)).chr
+      2
+    when u <= Uchar3max
+      a[i+0] = (Utag3 | ((u>>12)&0xff)).chr
+      a[i+1] = (Utagx | ((u>>6)&Umaskx)).chr
+      a[i+2] = (Utagx | (u&Umaskx)).chr
+      3
+    else
+      a[i+0] = (Utag4 | ((u>>18)&0xff)).chr
+      a[i+1] = (Utagx | ((u>>12)&Umaskx)).chr
+      a[i+2] = (Utagx | ((u>>6)&Umaskx)).chr
+      a[i+3] = (Utagx | (u&Umaskx)).chr
+      4
+    end
+  end
+
+
+  def hexdec4(s)
+    if s.length != 4
+      raise Error, 'short'
+    end
+    (nibble(s[0])<<12) | (nibble(s[1])<<8) | (nibble(s[2])<<4) | nibble(s[3])
+  end
+
+
+  def subst(u1, u2)
+    if Usurr1 <= u1 && u1 < Usurr2 && Usurr2 <= u2 && u2 < Usurr3
+      return ((u1-Usurr1)<<10) | (u2-Usurr2) + Usurrself
+    end
+    return Ucharerr
+  end
+
+
+  def surrogate?(u)
+    Usurr1 <= u && u < Usurr3
+  end
+
+
+  def nibble(c)
+    case true
+    when ?0 <= c && c <= ?9 then c.ord - ?0.ord
+    when ?a <= c && c <= ?z then c.ord - ?a.ord + 10
+    when ?A <= c && c <= ?Z then c.ord - ?A.ord + 10
+    else
+      raise Error, "invalid hex code #{c}"
+    end
+  end
+
+
+  # Encodes x into a json text. It may contain only
+  # Array, Hash, String, Numeric, true, false, nil.
+  # (Note, this list excludes Symbol.)
+  # X itself must be an Array or a Hash.
+  # No other value can be encoded, and an error will
+  # be raised if x contains any other value, such as
+  # Nan, Infinity, Symbol, and Proc, or if a Hash key
+  # is not a String.
+  # Strings contained in x must be valid UTF-8.
+  def encode(x)
+    case x
+    when Hash    then objenc(x)
+    when Array   then arrenc(x)
+    else
+      raise Error, 'root value must be an Array or a Hash'
+    end
+  end
+
+
+  def valenc(x)
+    case x
+    when Hash    then objenc(x)
+    when Array   then arrenc(x)
+    when String  then strenc(x)
+    when Numeric then numenc(x)
+    when true    then "true"
+    when false   then "false"
+    when nil     then "null"
+    else
+      raise Error, "cannot encode #{x.class}: #{x.inspect}"
+    end
+  end
+
+
+  def objenc(x)
+    '{' + x.map{|k,v| keyenc(k) + ':' + valenc(v)}.join(',') + '}'
+  end
+
+
+  def arrenc(a)
+    '[' + a.map{|x| valenc(x)}.join(',') + ']'
+  end
+
+
+  def keyenc(k)
+    case k
+    when String then strenc(k)
+    else
+      raise Error, "Hash key is not a string: #{k.inspect}"
+    end
+  end
+
+
+  def strenc(s)
+    t = StringIO.new
+    t.putc(?")
+    r = 0
+
+    # In ruby >= 1.9, s[r] is a codepoint, not a byte.
+    rubydoesenc = s.class.method_defined?(:encoding)
+
+    while r < s.length
+      case s[r]
+      when ?"  then t.print('\\"')
+      when ?\\ then t.print('\\\\')
+      when ?\b then t.print('\\b')
+      when ?\f then t.print('\\f')
+      when ?\n then t.print('\\n')
+      when ?\r then t.print('\\r')
+      when ?\t then t.print('\\t')
+      else
+        c = s[r]
+        case true
+        when rubydoesenc
+          begin
+            c.ord # will raise an error if c is invalid UTF-8
+            t.write(c)
+          rescue
+            t.write(Ustrerr)
+          end
+        when Spc <= c && c <= ?~
+          t.putc(c)
+        else
+          n = ucharcopy(t, s, r) # ensure valid UTF-8 output
+          r += n - 1 # r is incremented below
+        end
+      end
+      r += 1
+    end
+    t.putc(?")
+    t.string
+  end
+
+
+  def numenc(x)
+    if ((x.nan? || x.infinite?) rescue false)
+      raise Error, "Numeric cannot be represented: #{x}"
+    end
+    "#{x}"
+  end
+
+
+  # Copies the valid UTF-8 bytes of a single character
+  # from string s at position i to I/O object t, and
+  # returns the number of bytes copied.
+  # If no valid UTF-8 char exists at position i,
+  # ucharcopy writes Ustrerr and returns 1.
+  def ucharcopy(t, s, i)
+    n = s.length - i
+    raise Utf8Error if n < 1
+
+    c0 = s[i].ord
+
+    # 1-byte, 7-bit sequence?
+    if c0 < Utagx
+      t.putc(c0)
+      return 1
+    end
+
+    raise Utf8Error if c0 < Utag2 # unexpected continuation byte?
+
+    raise Utf8Error if n < 2 # need continuation byte
+    c1 = s[i+1].ord
+    raise Utf8Error if c1 < Utagx || Utag2 <= c1
+
+    # 2-byte, 11-bit sequence?
+    if c0 < Utag3
+      raise Utf8Error if ((c0&Umask2)<<6 | (c1&Umaskx)) <= Uchar1max
+      t.putc(c0)
+      t.putc(c1)
+      return 2
+    end
+
+    # need second continuation byte
+    raise Utf8Error if n < 3
+
+    c2 = s[i+2].ord
+    raise Utf8Error if c2 < Utagx || Utag2 <= c2
+
+    # 3-byte, 16-bit sequence?
+    if c0 < Utag4
+      u = (c0&Umask3)<<12 | (c1&Umaskx)<<6 | (c2&Umaskx)
+      raise Utf8Error if u <= Uchar2max
+      t.putc(c0)
+      t.putc(c1)
+      t.putc(c2)
+      return 3
+    end
+
+    # need third continuation byte
+    raise Utf8Error if n < 4
+    c3 = s[i+3].ord
+    raise Utf8Error if c3 < Utagx || Utag2 <= c3
+
+    # 4-byte, 21-bit sequence?
+    if c0 < Utag5
+      u = (c0&Umask4)<<18 | (c1&Umaskx)<<12 | (c2&Umaskx)<<6 | (c3&Umaskx)
+      raise Utf8Error if u <= Uchar3max
+      t.putc(c0)
+      t.putc(c1)
+      t.putc(c2)
+      t.putc(c3)
+      return 4
+    end
+
+    raise Utf8Error
+  rescue Utf8Error
+    t.write(Ustrerr)
+    return 1
+  end
+
+
+  class Utf8Error < ::StandardError
+  end
+
+
+  class Error < ::StandardError
+  end
+
+
+  Utagx = 0x80 # 1000 0000
+  Utag2 = 0xc0 # 1100 0000
+  Utag3 = 0xe0 # 1110 0000
+  Utag4 = 0xf0 # 1111 0000
+  Utag5 = 0xF8 # 1111 1000
+  Umaskx = 0x3f # 0011 1111
+  Umask2 = 0x1f # 0001 1111
+  Umask3 = 0x0f # 0000 1111
+  Umask4 = 0x07 # 0000 0111
+  Uchar1max = (1<<7) - 1
+  Uchar2max = (1<<11) - 1
+  Uchar3max = (1<<16) - 1
+  Ucharerr = 0xFFFD # unicode "replacement char"
+  Ustrerr = "\xef\xbf\xbd" # unicode "replacement char"
+  Usurrself = 0x10000
+  Usurr1 = 0xd800
+  Usurr2 = 0xdc00
+  Usurr3 = 0xe000
+
+  Spc = ' '[0]
+  Unesc = {?b=>?\b, ?f=>?\f, ?n=>?\n, ?r=>?\r, ?t=>?\t}
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/rack.gemspec b/.bundle/ruby/1.9.1/gems/rack-1.5.2/rack.gemspec
new file mode 100644
index 0000000..388d6ed
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/rack.gemspec
@@ -0,0 +1,33 @@
+Gem::Specification.new do |s|
+  s.name            = "rack"
+  s.version         = "1.5.2"
+  s.platform        = Gem::Platform::RUBY
+  s.summary         = "a modular Ruby webserver interface"
+  s.license         = "MIT"
+
+  s.description = <<-EOF
+Rack provides a minimal, modular and adaptable interface for developing
+web applications in Ruby.  By wrapping HTTP requests and responses in
+the simplest way possible, it unifies and distills the API for web
+servers, web frameworks, and software in between (the so-called
+middleware) into a single method call.
+
+Also see http://rack.github.com/.
+EOF
+
+  s.files           = Dir['{bin/*,contrib/*,example/*,lib/**/*,test/**/*}'] +
+                        %w(COPYING KNOWN-ISSUES rack.gemspec Rakefile README.rdoc SPEC)
+  s.bindir          = 'bin'
+  s.executables     << 'rackup'
+  s.require_path    = 'lib'
+  s.extra_rdoc_files = ['README.rdoc', 'KNOWN-ISSUES']
+  s.test_files      = Dir['test/spec_*.rb']
+
+  s.author          = 'Christian Neukirchen'
+  s.email           = 'chneukirchen at gmail.com'
+  s.homepage        = 'http://rack.github.com/'
+  s.rubyforge_project = 'rack'
+
+  s.add_development_dependency 'bacon'
+  s.add_development_dependency 'rake'
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/anything.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/anything.rb
new file mode 100644
index 0000000..c07f82c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/anything.rb
@@ -0,0 +1,5 @@
+class Anything
+  def self.call(env)
+    [200, {'Content-Type' => 'text/plain'}, ['OK']]
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/comment.ru b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/comment.ru
new file mode 100644
index 0000000..0722f0a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/comment.ru
@@ -0,0 +1,4 @@
+=begin
+
+=end
+run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] }
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/end.ru b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/end.ru
new file mode 100644
index 0000000..7f36d8c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/end.ru
@@ -0,0 +1,5 @@
+run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] }
+__END__
+Should not be evaluated
+Neither should
+This
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/line.ru b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/line.ru
new file mode 100644
index 0000000..f4c84ad
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/line.ru
@@ -0,0 +1 @@
+run lambda{ |env| [200, {'Content-Type' => 'text/plain'}, [__LINE__.to_s]] }
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/options.ru b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/options.ru
new file mode 100644
index 0000000..8562da6
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/builder/options.ru
@@ -0,0 +1,2 @@
+#\ -d
+run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] }
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/folder/test.js b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/folder/test.js
new file mode 100644
index 0000000..6874e45
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/folder/test.js
@@ -0,0 +1 @@
+### TestFile ###
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/fonts/font.eot b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/fonts/font.eot
new file mode 100644
index 0000000..6874e45
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/fonts/font.eot
@@ -0,0 +1 @@
+### TestFile ###
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/images/image.png b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/images/image.png
new file mode 100644
index 0000000..6874e45
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/images/image.png
@@ -0,0 +1 @@
+### TestFile ###
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/index.html b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/index.html
new file mode 100644
index 0000000..6874e45
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/index.html
@@ -0,0 +1 @@
+### TestFile ###
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/javascripts/app.js b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/javascripts/app.js
new file mode 100644
index 0000000..6874e45
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/javascripts/app.js
@@ -0,0 +1 @@
+### TestFile ###
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/stylesheets/app.css b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/stylesheets/app.css
new file mode 100644
index 0000000..6874e45
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/assets/stylesheets/app.css
@@ -0,0 +1 @@
+### TestFile ###
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/lighttpd.conf b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/lighttpd.conf
new file mode 100755
index 0000000..c195f78
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/lighttpd.conf
@@ -0,0 +1,26 @@
+server.modules = ("mod_fastcgi", "mod_cgi")
+server.document-root = "."
+server.errorlog = var.CWD + "/lighttpd.errors"
+server.port = 9203
+server.bind = "127.0.0.1"
+
+server.event-handler = "select"
+
+cgi.assign = ("/test" => "",
+#              ".ru" => ""
+             )
+
+fastcgi.server = (
+                  "test.fcgi" => ("localhost" =>
+                    ("min-procs" => 1,
+                     "socket" => "/tmp/rack-test-fcgi",
+                     "bin-path" => "test.fcgi")),
+                  "test.ru" => ("localhost" =>
+                    ("min-procs" => 1,
+                     "socket" => "/tmp/rack-test-ru-fcgi",
+                     "bin-path" => CWD + "/rackup_stub.rb test.ru")),
+                  "sample_rackup.ru" => ("localhost" =>
+                    ("min-procs" => 1,
+                     "socket" => "/tmp/rack-test-rackup-fcgi",
+                     "bin-path" => CWD + "/rackup_stub.rb sample_rackup.ru")),
+                 )
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/rackup_stub.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/rackup_stub.rb
new file mode 100755
index 0000000..a216cdc
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/rackup_stub.rb
@@ -0,0 +1,6 @@
+#!/usr/bin/env ruby
+# -*- ruby -*-
+
+$:.unshift '../../lib'
+require 'rack'
+Rack::Server.start
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/sample_rackup.ru b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/sample_rackup.ru
new file mode 100755
index 0000000..a73df81
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/sample_rackup.ru
@@ -0,0 +1,5 @@
+# -*- ruby -*-
+
+require '../testrequest'
+
+run Rack::Lint.new(TestRequest.new)
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test
new file mode 100755
index 0000000..e4837a4
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test
@@ -0,0 +1,9 @@
+#!/usr/bin/env ruby
+# -*- ruby -*-
+
+$: << File.join(File.dirname(__FILE__), "..", "..", "lib")
+
+require 'rack'
+require '../testrequest'
+
+Rack::Handler::CGI.run(Rack::Lint.new(TestRequest.new))
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test+directory/test+file b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test+directory/test+file
new file mode 100644
index 0000000..f4273fb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test+directory/test+file
@@ -0,0 +1 @@
+this file has plusses!
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test.fcgi b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test.fcgi
new file mode 100755
index 0000000..5e104fc
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test.fcgi
@@ -0,0 +1,8 @@
+#!/usr/bin/env ruby
+# -*- ruby -*-
+
+$:.unshift '../../lib'
+require 'rack'
+require '../testrequest'
+
+Rack::Handler::FastCGI.run(Rack::Lint.new(TestRequest.new))
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test.ru b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test.ru
new file mode 100755
index 0000000..7913ef7
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/cgi/test.ru
@@ -0,0 +1,5 @@
+#!../../bin/rackup
+# -*- ruby -*-
+
+require '../testrequest'
+run Rack::Lint.new(TestRequest.new)
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/gemloader.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/gemloader.rb
new file mode 100644
index 0000000..22be697
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/gemloader.rb
@@ -0,0 +1,10 @@
+require 'rubygems'
+project = 'rack'
+gemspec = File.expand_path("#{project}.gemspec", Dir.pwd)
+Gem::Specification.load(gemspec).dependencies.each do |dep|
+  begin
+    gem dep.name, *dep.requirement.as_list
+  rescue Gem::LoadError
+    warn "Cannot load #{dep.name} #{dep.requirement.to_s}"
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/bad_robots b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/bad_robots
new file mode 100644
index 0000000..7e5bd41
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/bad_robots
@@ -0,0 +1,259 @@
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="bbbbbbbbbbbbbbb"
+
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="ccccccc"
+
+ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="file.name"
+
+INPUTMSG.gz
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="file.content_type"
+
+application/octet-stream
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="file.path"
+
+/var/tmp/uploads/4/0001728414
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="file.md5"
+
+aa73198feb4b4c1c3186f5e7466cbbcc
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="file.size"
+
+13212
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="size"
+
+80892
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="mail_server_id"
+
+<1111111111.22222222.3333333333333.JavaMail.app at ffff-aaaa.dddd>
+
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="addresses"
+
+{"campsy_programmer at pinkedum.com":{"domain":"pinkedum.com","name":"Campsy Programmer","type":["env_sender"],"mailbox":"campsy_programmer"},"tex at rapidcity.com":{"domain":"rapidcity.com","name":"Big Tex","type":["env_recipients","to"],"mailbox":"tex"},"group-digests at linkedin.com":{"domain":"linkedin.com","name":"Group Members","type":["from"],"mailbox":"group-digests"}}
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="received_on"
+
+2009-11-15T14:21:11Z
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="id"
+
+dbfd9804d26d11deab24e3037639bf77
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="ip_address"
+
+127.0.0.1
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/binary b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/binary
new file mode 100644
index 0000000..a3bd67c
Binary files /dev/null and b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/binary differ
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/content_type_and_no_filename b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/content_type_and_no_filename
new file mode 100644
index 0000000..bd4c89b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/content_type_and_no_filename
@@ -0,0 +1,6 @@
+--AaB03x
+Content-Disposition: form-data; name="text"
+Content-Type: text/plain; charset=US-ASCII
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/empty b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/empty
new file mode 100644
index 0000000..f0f7983
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/empty
@@ -0,0 +1,10 @@
+--AaB03x
+Content-Disposition: form-data; name="submit-name"
+
+Larry
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="file1.txt"
+Content-Type: text/plain
+
+
+--AaB03x--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/fail_16384_nofile b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/fail_16384_nofile
new file mode 100644
index 0000000..bdcd332
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/fail_16384_nofile
@@ -0,0 +1,814 @@
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="_method"
+
+put
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="authenticity_token"
+
+XCUgSyYsZ+iHQunq/yCSKFzjeVmsXV/WcphHQ0J+05I=
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[SESE]"
+
+BooBar
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[BBBBBBBBB]"
+
+18
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[CCCCCCCCCCCCCCCCCCC]"
+
+0
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[STARTFOO]"
+
+2009-11-04
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[ENDFOO]"
+
+2009-12-01
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[DDDDDDDD]"
+
+0
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[DDDDDDDD]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[EEEEEEEEEE]"
+
+10000
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[FFFFFFFFF]"
+
+boskoizcool
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[GGGGGGGGGGG]"
+
+0
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[GGGGGGGGGGG]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[YYYYYYYYYYYYYYY]"
+
+5.00
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[ZZZZZZZZZZZZZ]"
+
+mille
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[XXXXXXXXXXXXXXXXXXXXX]"
+
+0
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[WWWWWWWWWWWWWWWWWWWWWWWWW][678][ZEZE]"
+
+PLAPLAPLAINCINCINC
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[WWWWWWWWWWWWWWWWWWWWWWWWW][678][123412341234e]"
+
+SITE
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[WWWWWWWWWWWWWWWWWWWWWWWWW][678][12345678901]"
+
+56
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_type]"
+
+none
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][has_hashashas_has]"
+
+0
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][frefrefre_fre_freee]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][frefrefre_fre_frefre]"
+
+forever
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][self_block]"
+
+0
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][GGG_RULES][][COUCOUN]"
+
+
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][GGG_RULES][][REGREG]"
+
+
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][GGG_RULES][][c1c1]"
+
+
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA_TARTARTAR_wizard_rule"
+
+
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_rule]"
+
+
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[selection_selection]"
+
+R
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[PLAPLAPLA_MEMMEMMEMM_ATTRATTRER][new][-1][selection_selection]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[PLAPLAPLA_MEMMEMMEMM_ATTRATTRER][new][-1][ba_unit_id]"
+
+1015
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[PLAPLAPLA_MEMMEMMEMM_ATTRATTRER][new][-2][selection_selection]"
+
+2
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[PLAPLAPLA_MEMMEMMEMM_ATTRATTRER][new][-2][ba_unit_id]"
+
+1017
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[tile_name]"
+
+
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo--
+
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/file1.txt b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/file1.txt
new file mode 100644
index 0000000..0839b2e
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/file1.txt
@@ -0,0 +1 @@
+contents
\ No newline at end of file
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_and_modification_param b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_and_modification_param
new file mode 100644
index 0000000..20893f4
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_and_modification_param
@@ -0,0 +1,7 @@
+--AaB03x
+Content-Type: image/jpeg
+Content-Disposition: attachment; name="files"; filename=genome.jpeg; modification-date="Wed, 12 Feb 1997 16:29:51 -0500";
+Content-Description: a complete map of the human genome
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_escaped_quotes b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_escaped_quotes
new file mode 100644
index 0000000..0a332df
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_escaped_quotes
@@ -0,0 +1,6 @@
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="escape \"quotes"
+Content-Type: application/octet-stream
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_escaped_quotes_and_modification_param b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_escaped_quotes_and_modification_param
new file mode 100644
index 0000000..7619bd5
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_escaped_quotes_and_modification_param
@@ -0,0 +1,7 @@
+--AaB03x
+Content-Type: image/jpeg
+Content-Disposition: attachment; name="files"; filename=""human" genome.jpeg"; modification-date="Wed, 12 Feb 1997 16:29:51 -0500";
+Content-Description: a complete map of the human genome
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_percent_escaped_quotes b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_percent_escaped_quotes
new file mode 100644
index 0000000..7db0641
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_percent_escaped_quotes
@@ -0,0 +1,6 @@
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="escape %22quotes"
+Content-Type: application/octet-stream
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages
new file mode 100644
index 0000000..f63dd22
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages
@@ -0,0 +1,6 @@
+------WebKitFormBoundary2NHc7OhsgU68l3Al
+Content-Disposition: form-data; name="document[attachment]"; filename="100% of a photo.jpeg"
+Content-Type: image/jpeg
+
+contents
+------WebKitFormBoundary2NHc7OhsgU68l3Al--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages2 b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages2
new file mode 100644
index 0000000..83eac36
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages2
@@ -0,0 +1,6 @@
+------WebKitFormBoundary2NHc7OhsgU68l3Al
+Content-Disposition: form-data; name="document[attachment]"; filename="100%a"
+Content-Type: image/jpeg
+
+contents
+------WebKitFormBoundary2NHc7OhsgU68l3Al--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages3 b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages3
new file mode 100644
index 0000000..4dba3c8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages3
@@ -0,0 +1,6 @@
+------WebKitFormBoundary2NHc7OhsgU68l3Al
+Content-Disposition: form-data; name="document[attachment]"; filename="100%"
+Content-Type: image/jpeg
+
+contents
+------WebKitFormBoundary2NHc7OhsgU68l3Al--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_unescaped_quotes b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_unescaped_quotes
new file mode 100644
index 0000000..9a291e8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/filename_with_unescaped_quotes
@@ -0,0 +1,6 @@
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="escape "quotes"
+Content-Type: application/octet-stream
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/ie b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/ie
new file mode 100644
index 0000000..eae06ab
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/ie
@@ -0,0 +1,6 @@
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="C:\Documents and Settings\Administrator\Desktop\file1.txt"
+Content-Type: text/plain
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/mixed_files b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/mixed_files
new file mode 100644
index 0000000..624d804
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/mixed_files
@@ -0,0 +1,21 @@
+--AaB03x
+Content-Disposition: form-data; name="foo"
+
+bar
+--AaB03x
+Content-Disposition: form-data; name="files"
+Content-Type: multipart/mixed, boundary=BbC04y
+
+--BbC04y
+Content-Disposition: attachment; filename="file.txt"
+Content-Type: text/plain
+
+contents
+--BbC04y
+Content-Disposition: attachment; filename="flowers.jpg"
+Content-Type: image/jpeg
+Content-Transfer-Encoding: binary
+
+contents
+--BbC04y--
+--AaB03x--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/nested b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/nested
new file mode 100644
index 0000000..5197882
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/nested
@@ -0,0 +1,10 @@
+--AaB03x
+Content-Disposition: form-data; name="foo[submit-name]"
+
+Larry
+--AaB03x
+Content-Disposition: form-data; name="foo[files]"; filename="file1.txt"
+Content-Type: text/plain
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/none b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/none
new file mode 100644
index 0000000..d66f473
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/none
@@ -0,0 +1,9 @@
+--AaB03x
+Content-Disposition: form-data; name="submit-name"
+
+Larry
+--AaB03x
+Content-Disposition: form-data; name="files"; filename=""
+
+
+--AaB03x--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/semicolon b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/semicolon
new file mode 100644
index 0000000..00fd68a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/semicolon
@@ -0,0 +1,6 @@
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="fi;le1.txt"
+Content-Type: text/plain
+
+contents
+--AaB03x--
\ No newline at end of file
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/text b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/text
new file mode 100644
index 0000000..01376d0
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/text
@@ -0,0 +1,15 @@
+--AaB03x
+Content-Disposition: form-data; name="submit-name"
+
+Larry
+--AaB03x
+Content-Disposition: form-data; name="submit-name-with-content"
+Content-Type: text/plain
+
+Berry
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="file1.txt"
+Content-Type: text/plain
+
+contents
+--AaB03x--
\ No newline at end of file
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/webkit b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/webkit
new file mode 100644
index 0000000..1375af3
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/multipart/webkit
@@ -0,0 +1,32 @@
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="_method"
+
+put
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="profile[blog]"
+
+
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="profile[public_email]"
+
+
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="profile[interests]"
+
+
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="profile[bio]"
+
+hello
+
+"quote"
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="media"; filename=""
+Content-Type: application/octet-stream
+
+
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="commit"
+
+Save
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR--
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/rackup/config.ru b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/rackup/config.ru
new file mode 100644
index 0000000..f1e2e1f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/rackup/config.ru
@@ -0,0 +1,31 @@
+require "#{File.dirname(__FILE__)}/../testrequest"
+
+$stderr = File.open("#{File.dirname(__FILE__)}/log_output", "w")
+
+class EnvMiddleware
+  def initialize(app)
+    @app = app
+  end
+
+  def call(env)
+    # provides a way to test that lint is present
+    if env["PATH_INFO"] == "/broken_lint"
+      return [200, {}, ["Broken Lint"]]
+    # provides a way to kill the process without knowing the pid
+    elsif env["PATH_INFO"] == "/die"
+      exit!
+    end
+
+    env["test.$DEBUG"]      = $DEBUG
+    env["test.$EVAL"]       = BUKKIT if defined?(BUKKIT)
+    env["test.$VERBOSE"]    = $VERBOSE
+    env["test.$LOAD_PATH"]  = $LOAD_PATH
+    env["test.stderr"]      = File.expand_path($stderr.path)
+    env["test.Ping"]        = defined?(Ping)
+    env["test.pid"]         = Process.pid
+    @app.call(env)
+  end
+end
+
+use EnvMiddleware
+run TestRequest.new
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/registering_handler/rack/handler/registering_myself.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/registering_handler/rack/handler/registering_myself.rb
new file mode 100644
index 0000000..1635efa
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/registering_handler/rack/handler/registering_myself.rb
@@ -0,0 +1,8 @@
+module Rack
+  module Handler
+    class RegisteringMyself
+    end
+
+    register :registering_myself, RegisteringMyself
+  end
+end
\ No newline at end of file
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_auth_basic.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_auth_basic.rb
new file mode 100644
index 0000000..af8e779
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_auth_basic.rb
@@ -0,0 +1,81 @@
+require 'rack/auth/basic'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Auth::Basic do
+  def realm
+    'WallysWorld'
+  end
+
+  def unprotected_app
+    Rack::Lint.new lambda { |env|
+      [ 200, {'Content-Type' => 'text/plain'}, ["Hi #{env['REMOTE_USER']}"] ]
+    }
+  end
+
+  def protected_app
+    app = Rack::Auth::Basic.new(unprotected_app) { |username, password| 'Boss' == username }
+    app.realm = realm
+    app
+  end
+
+  before do
+    @request = Rack::MockRequest.new(protected_app)
+  end
+
+  def request_with_basic_auth(username, password, &block)
+    request 'HTTP_AUTHORIZATION' => 'Basic ' + ["#{username}:#{password}"].pack("m*"), &block
+  end
+
+  def request(headers = {})
+    yield @request.get('/', headers)
+  end
+
+  def assert_basic_auth_challenge(response)
+    response.should.be.a.client_error
+    response.status.should.equal 401
+    response.should.include 'WWW-Authenticate'
+    response.headers['WWW-Authenticate'].should =~ /Basic realm="#{Regexp.escape(realm)}"/
+    response.body.should.be.empty
+  end
+
+  should 'challenge correctly when no credentials are specified' do
+    request do |response|
+      assert_basic_auth_challenge response
+    end
+  end
+
+  should 'rechallenge if incorrect credentials are specified' do
+    request_with_basic_auth 'joe', 'password' do |response|
+      assert_basic_auth_challenge response
+    end
+  end
+
+  should 'return application output if correct credentials are specified' do
+    request_with_basic_auth 'Boss', 'password' do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Boss'
+    end
+  end
+
+  should 'return 400 Bad Request if different auth scheme used' do
+    request 'HTTP_AUTHORIZATION' => 'Digest params' do |response|
+      response.should.be.a.client_error
+      response.status.should.equal 400
+      response.should.not.include 'WWW-Authenticate'
+    end
+  end
+
+  should 'return 400 Bad Request for a malformed authorization header' do
+    request 'HTTP_AUTHORIZATION' => '' do |response|
+      response.should.be.a.client_error
+      response.status.should.equal 400
+      response.should.not.include 'WWW-Authenticate'
+    end
+  end
+
+  it 'takes realm as optional constructor arg' do
+    app = Rack::Auth::Basic.new(unprotected_app, realm) { true }
+    realm.should == app.realm
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_auth_digest.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_auth_digest.rb
new file mode 100644
index 0000000..040be2e
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_auth_digest.rb
@@ -0,0 +1,259 @@
+require 'rack/auth/digest/md5'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Auth::Digest::MD5 do
+  def realm
+    'WallysWorld'
+  end
+
+  def unprotected_app
+    Rack::Lint.new lambda { |env|
+      friend = Rack::Utils.parse_query(env["QUERY_STRING"])["friend"]
+      [ 200, {'Content-Type' => 'text/plain'}, ["Hi #{env['REMOTE_USER']}#{friend ? " and #{friend}" : ''}"] ]
+    }
+  end
+
+  def protected_app
+    Rack::Auth::Digest::MD5.new(unprotected_app, :realm => realm, :opaque => 'this-should-be-secret') do |username|
+      { 'Alice' => 'correct-password' }[username]
+    end
+  end
+
+  def protected_app_with_hashed_passwords
+    app = Rack::Auth::Digest::MD5.new(unprotected_app) do |username|
+      username == 'Alice' ? Digest::MD5.hexdigest("Alice:#{realm}:correct-password") : nil
+    end
+    app.realm = realm
+    app.opaque = 'this-should-be-secret'
+    app.passwords_hashed = true
+    app
+  end
+
+  def partially_protected_app
+    Rack::URLMap.new({
+      '/' => unprotected_app,
+      '/protected' => protected_app
+    })
+  end
+
+  def protected_app_with_method_override
+    Rack::MethodOverride.new(protected_app)
+  end
+
+  before do
+    @request = Rack::MockRequest.new(protected_app)
+  end
+
+  def request(method, path, headers = {}, &block)
+    response = @request.request(method, path, headers)
+    block.call(response) if block
+    return response
+  end
+
+  class MockDigestRequest
+    def initialize(params)
+      @params = params
+    end
+    def method_missing(sym)
+      if @params.has_key? k = sym.to_s
+        return @params[k]
+      end
+      super
+    end
+    def method
+      @params['method']
+    end
+    def response(password)
+      Rack::Auth::Digest::MD5.new(nil).send :digest, self, password
+    end
+  end
+
+  def request_with_digest_auth(method, path, username, password, options = {}, &block)
+    request_options = {}
+    request_options[:input] = options.delete(:input) if options.include? :input
+
+    response = request(method, path, request_options)
+
+    return response unless response.status == 401
+
+    if wait = options.delete(:wait)
+      sleep wait
+    end
+
+    challenge = response['WWW-Authenticate'].split(' ', 2).last
+
+    params = Rack::Auth::Digest::Params.parse(challenge)
+
+    params['username'] = username
+    params['nc'] = '00000001'
+    params['cnonce'] = 'nonsensenonce'
+    params['uri'] = path
+
+    params['method'] = method
+
+    params.update options
+
+    params['response'] = MockDigestRequest.new(params).response(password)
+
+    request(method, path, request_options.merge('HTTP_AUTHORIZATION' => "Digest #{params}"), &block)
+  end
+
+  def assert_digest_auth_challenge(response)
+    response.should.be.a.client_error
+    response.status.should.equal 401
+    response.should.include 'WWW-Authenticate'
+    response.headers['WWW-Authenticate'].should =~ /^Digest /
+    response.body.should.be.empty
+  end
+
+  def assert_bad_request(response)
+    response.should.be.a.client_error
+    response.status.should.equal 400
+    response.should.not.include 'WWW-Authenticate'
+  end
+
+  should 'challenge when no credentials are specified' do
+    request 'GET', '/' do |response|
+      assert_digest_auth_challenge response
+    end
+  end
+
+  should 'return application output if correct credentials given' do
+    request_with_digest_auth 'GET', '/', 'Alice', 'correct-password' do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice'
+    end
+  end
+
+  should 'return application output if correct credentials given (hashed passwords)' do
+    @request = Rack::MockRequest.new(protected_app_with_hashed_passwords)
+
+    request_with_digest_auth 'GET', '/', 'Alice', 'correct-password' do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice'
+    end
+  end
+
+  should 'rechallenge if incorrect username given' do
+    request_with_digest_auth 'GET', '/', 'Bob', 'correct-password' do |response|
+      assert_digest_auth_challenge response
+    end
+  end
+
+  should 'rechallenge if incorrect password given' do
+    request_with_digest_auth 'GET', '/', 'Alice', 'wrong-password' do |response|
+      assert_digest_auth_challenge response
+    end
+  end
+
+  should 'rechallenge if incorrect user and blank password given' do
+    request_with_digest_auth 'GET', '/', 'Bob', '' do |response|
+      assert_digest_auth_challenge response
+    end
+  end
+
+  should 'not rechallenge if nonce is not stale' do
+    begin
+      Rack::Auth::Digest::Nonce.time_limit = 10
+
+      request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', :wait => 1 do |response|
+        response.status.should.equal 200
+        response.body.to_s.should.equal 'Hi Alice'
+        response.headers['WWW-Authenticate'].should.not =~ /\bstale=true\b/
+      end
+    ensure
+      Rack::Auth::Digest::Nonce.time_limit = nil
+    end
+  end
+
+  should 'rechallenge with stale parameter if nonce is stale' do
+    begin
+      Rack::Auth::Digest::Nonce.time_limit = 1
+
+      request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', :wait => 2 do |response|
+        assert_digest_auth_challenge response
+        response.headers['WWW-Authenticate'].should =~ /\bstale=true\b/
+      end
+    ensure
+      Rack::Auth::Digest::Nonce.time_limit = nil
+    end
+  end
+
+  should 'return 400 Bad Request if incorrect qop given' do
+    request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', 'qop' => 'auth-int' do |response|
+      assert_bad_request response
+    end
+  end
+
+  should 'return 400 Bad Request if incorrect uri given' do
+    request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', 'uri' => '/foo' do |response|
+      assert_bad_request response
+    end
+  end
+
+  should 'return 400 Bad Request if different auth scheme used' do
+    request 'GET', '/', 'HTTP_AUTHORIZATION' => 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==' do |response|
+      assert_bad_request response
+    end
+  end
+
+  should 'not require credentials for unprotected path' do
+    @request = Rack::MockRequest.new(partially_protected_app)
+    request 'GET', '/' do |response|
+      response.should.be.ok
+    end
+  end
+
+  should 'challenge when no credentials are specified for protected path' do
+    @request = Rack::MockRequest.new(partially_protected_app)
+    request 'GET', '/protected' do |response|
+      assert_digest_auth_challenge response
+    end
+  end
+
+  should 'return application output if correct credentials given for protected path' do
+    @request = Rack::MockRequest.new(partially_protected_app)
+    request_with_digest_auth 'GET', '/protected', 'Alice', 'correct-password' do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice'
+    end
+  end
+
+  should 'return application output when used with a query string and path as uri' do
+    @request = Rack::MockRequest.new(partially_protected_app)
+    request_with_digest_auth 'GET', '/protected?friend=Mike', 'Alice', 'correct-password' do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice and Mike'
+    end
+  end
+
+  should 'return application output when used with a query string and fullpath as uri' do
+    @request = Rack::MockRequest.new(partially_protected_app)
+    qs_uri = '/protected?friend=Mike'
+    request_with_digest_auth 'GET', qs_uri, 'Alice', 'correct-password', 'uri' => qs_uri do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice and Mike'
+    end
+  end
+
+  should 'return application output if correct credentials given for POST' do
+    request_with_digest_auth 'POST', '/', 'Alice', 'correct-password' do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice'
+    end
+  end
+
+  should 'return application output if correct credentials given for PUT (using method override of POST)' do
+    @request = Rack::MockRequest.new(protected_app_with_method_override)
+    request_with_digest_auth 'POST', '/', 'Alice', 'correct-password', :input => "_method=put" do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice'
+    end
+  end
+
+  it 'takes realm as optional constructor arg' do
+    app = Rack::Auth::Digest::MD5.new(unprotected_app, realm) { true }
+    realm.should == app.realm
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_body_proxy.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_body_proxy.rb
new file mode 100644
index 0000000..c65e10d
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_body_proxy.rb
@@ -0,0 +1,69 @@
+require 'rack/body_proxy'
+require 'stringio'
+
+describe Rack::BodyProxy do
+  should 'call each on the wrapped body' do
+    called = false
+    proxy  = Rack::BodyProxy.new(['foo']) { }
+    proxy.each do |str|
+      called = true
+      str.should.equal 'foo'
+    end
+    called.should.equal true
+  end
+
+  should 'call close on the wrapped body' do
+    body  = StringIO.new
+    proxy = Rack::BodyProxy.new(body) { }
+    proxy.close
+    body.should.be.closed
+  end
+
+  should 'only call close on the wrapped body if it responds to close' do
+    body  = []
+    proxy = Rack::BodyProxy.new(body) { }
+    proc { proxy.close }.should.not.raise
+  end
+
+  should 'call the passed block on close' do
+    called = false
+    proxy  = Rack::BodyProxy.new([]) { called = true }
+    called.should.equal false
+    proxy.close
+    called.should.equal true
+  end
+
+  should 'call the passed block on close even if there is an exception' do
+    object = Object.new
+    def object.close() raise "No!" end
+    called = false
+
+    begin
+      proxy  = Rack::BodyProxy.new(object) { called = true }
+      called.should.equal false
+      proxy.close
+    rescue RuntimeError => e
+    end
+
+    raise "Expected exception to have been raised" unless e
+    called.should.equal true
+  end
+
+  should 'not close more than one time' do
+    count = 0
+    proxy = Rack::BodyProxy.new([]) { count += 1; raise "Block invoked more than 1 time!" if count > 1 }
+    2.times { proxy.close }
+    count.should.equal 1
+  end
+
+  should 'be closed when the callback is triggered' do
+    closed = false
+    proxy = Rack::BodyProxy.new([]) { closed = proxy.closed? }
+    proxy.close
+    closed.should.equal true
+  end
+
+  should 'provide an #each method' do
+    Rack::BodyProxy.method_defined?(:each).should.equal true
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_builder.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_builder.rb
new file mode 100644
index 0000000..a2fd568
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_builder.rb
@@ -0,0 +1,214 @@
+require 'rack/builder'
+require 'rack/lint'
+require 'rack/mock'
+require 'rack/showexceptions'
+require 'rack/urlmap'
+
+class NothingMiddleware
+  def initialize(app)
+    @app = app
+  end
+  def call(env)
+    @@env = env
+    response = @app.call(env)
+    response
+  end
+  def self.env
+    @@env
+  end
+end
+
+describe Rack::Builder do
+  def builder(&block)
+    Rack::Lint.new Rack::Builder.new(&block)
+  end
+  
+  def builder_to_app(&block)
+    Rack::Lint.new Rack::Builder.new(&block).to_app
+  end
+  
+  it "supports mapping" do
+    app = builder_to_app do
+      map '/' do |outer_env|
+        run lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, ['root']] }
+      end
+      map '/sub' do
+        run lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, ['sub']] }
+      end
+    end
+    Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'root'
+    Rack::MockRequest.new(app).get("/sub").body.to_s.should.equal 'sub'
+  end
+
+  it "doesn't dupe env even when mapping" do
+    app = builder_to_app do
+      use NothingMiddleware
+      map '/' do |outer_env|
+        run lambda { |inner_env|
+          inner_env['new_key'] = 'new_value'
+          [200, {"Content-Type" => "text/plain"}, ['root']]
+        }
+      end
+    end
+    Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'root'
+    NothingMiddleware.env['new_key'].should.equal 'new_value'
+  end
+
+  it "chains apps by default" do
+    app = builder_to_app do
+      use Rack::ShowExceptions
+      run lambda { |env| raise "bzzzt" }
+    end
+
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+  end
+
+  it "has implicit #to_app" do
+    app = builder do
+      use Rack::ShowExceptions
+      run lambda { |env| raise "bzzzt" }
+    end
+
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+  end
+
+  it "supports blocks on use" do
+    app = builder do
+      use Rack::ShowExceptions
+      use Rack::Auth::Basic do |username, password|
+        'secret' == password
+      end
+
+      run lambda { |env| [200, {"Content-Type" => "text/plain"}, ['Hi Boss']] }
+    end
+
+    response = Rack::MockRequest.new(app).get("/")
+    response.should.be.client_error
+    response.status.should.equal 401
+
+    # with auth...
+    response = Rack::MockRequest.new(app).get("/",
+        'HTTP_AUTHORIZATION' => 'Basic ' + ["joe:secret"].pack("m*"))
+    response.status.should.equal 200
+    response.body.to_s.should.equal 'Hi Boss'
+  end
+
+  it "has explicit #to_app" do
+    app = builder do
+      use Rack::ShowExceptions
+      run lambda { |env| raise "bzzzt" }
+    end
+
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+  end
+
+  it "can mix map and run for endpoints" do
+    app = builder do
+      map '/sub' do
+        run lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, ['sub']] }
+      end
+      run lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, ['root']] }
+    end
+
+    Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'root'
+    Rack::MockRequest.new(app).get("/sub").body.to_s.should.equal 'sub'
+  end
+
+  it "accepts middleware-only map blocks" do
+    app = builder do
+      map('/foo') { use Rack::ShowExceptions }
+      run lambda { |env| raise "bzzzt" }
+    end
+
+    proc { Rack::MockRequest.new(app).get("/") }.should.raise(RuntimeError)
+    Rack::MockRequest.new(app).get("/foo").should.be.server_error
+  end
+
+  should "initialize apps once" do
+    app = builder do
+      class AppClass
+        def initialize
+          @called = 0
+        end
+        def call(env)
+          raise "bzzzt"  if @called > 0
+        @called += 1
+          [200, {'Content-Type' => 'text/plain'}, ['OK']]
+        end
+      end
+
+      use Rack::ShowExceptions
+      run AppClass.new
+    end
+
+    Rack::MockRequest.new(app).get("/").status.should.equal 200
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+  end
+
+  it "allows use after run" do
+    app = builder do
+      run lambda { |env| raise "bzzzt" }
+      use Rack::ShowExceptions
+    end
+
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+  end
+
+  it 'complains about a missing run' do
+    proc do
+      Rack::Lint.new Rack::Builder.app { use Rack::ShowExceptions }
+    end.should.raise(RuntimeError)
+  end
+
+  describe "parse_file" do
+    def config_file(name)
+      File.join(File.dirname(__FILE__), 'builder', name)
+    end
+
+    it "parses commented options" do
+      app, options = Rack::Builder.parse_file config_file('options.ru')
+      options[:debug].should.be.true
+      Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'OK'
+    end
+
+    it "removes __END__ before evaluating app" do
+      app, options = Rack::Builder.parse_file config_file('end.ru')
+      options = nil # ignored, prevents warning
+      Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'OK'
+    end
+
+    it "supports multi-line comments" do
+      lambda {
+        Rack::Builder.parse_file config_file('comment.ru')
+      }.should.not.raise(SyntaxError)
+    end
+
+    it "requires anything not ending in .ru" do
+      $: << File.dirname(__FILE__)
+      app, * = Rack::Builder.parse_file 'builder/anything'
+      Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'OK'
+      $:.pop
+    end
+
+    it "sets __LINE__ correctly" do
+      app, options = Rack::Builder.parse_file config_file('line.ru')
+      options = nil # ignored, prevents warning
+      Rack::MockRequest.new(app).get("/").body.to_s.should.equal '1'
+    end
+  end
+
+  describe 'new_from_string' do
+    it "builds a rack app from string" do
+      app, = Rack::Builder.new_from_string "run lambda{|env| [200, {'Content-Type' => 'text/plane'}, ['OK']] }"
+      Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'OK'
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_cascade.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_cascade.rb
new file mode 100644
index 0000000..38a18da
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_cascade.rb
@@ -0,0 +1,61 @@
+require 'rack/cascade'
+require 'rack/file'
+require 'rack/lint'
+require 'rack/urlmap'
+require 'rack/mock'
+
+describe Rack::Cascade do
+  def cascade(*args)
+    Rack::Lint.new Rack::Cascade.new(*args)
+  end
+  
+  docroot = File.expand_path(File.dirname(__FILE__))
+  app1 = Rack::File.new(docroot)
+
+  app2 = Rack::URLMap.new("/crash" => lambda { |env| raise "boom" })
+
+  app3 = Rack::URLMap.new("/foo" => lambda { |env|
+                            [200, { "Content-Type" => "text/plain"}, [""]]})
+
+  should "dispatch onward on 404 and 405 by default" do
+    cascade = cascade([app1, app2, app3])
+    Rack::MockRequest.new(cascade).get("/cgi/test").should.be.ok
+    Rack::MockRequest.new(cascade).get("/foo").should.be.ok
+    Rack::MockRequest.new(cascade).get("/toobad").should.be.not_found
+    Rack::MockRequest.new(cascade).get("/cgi/../..").should.be.client_error
+
+    # Put is not allowed by Rack::File so it'll 405.
+    Rack::MockRequest.new(cascade).put("/foo").should.be.ok
+  end
+
+  should "dispatch onward on whatever is passed" do
+    cascade = cascade([app1, app2, app3], [404, 403])
+    Rack::MockRequest.new(cascade).get("/cgi/../bla").should.be.not_found
+  end
+
+  should "return 404 if empty" do
+    Rack::MockRequest.new(cascade([])).get('/').should.be.not_found
+  end
+
+  should "append new app" do
+    cascade = Rack::Cascade.new([], [404, 403])
+    Rack::MockRequest.new(cascade).get('/').should.be.not_found
+    cascade << app2
+    Rack::MockRequest.new(cascade).get('/cgi/test').should.be.not_found
+    Rack::MockRequest.new(cascade).get('/cgi/../bla').should.be.not_found
+    cascade << app1
+    Rack::MockRequest.new(cascade).get('/cgi/test').should.be.ok
+    Rack::MockRequest.new(cascade).get('/cgi/../..').should.be.client_error
+    Rack::MockRequest.new(cascade).get('/foo').should.be.not_found
+    cascade << app3
+    Rack::MockRequest.new(cascade).get('/foo').should.be.ok
+  end
+
+  should "close the body on cascade" do
+    body = StringIO.new
+    closer = lambda { |env| [404, {}, body] }
+    cascade = Rack::Cascade.new([closer, app3], [404])
+    Rack::MockRequest.new(cascade).get("/foo").should.be.ok
+    body.should.be.closed
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_cgi.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_cgi.rb
new file mode 100644
index 0000000..8c90ec8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_cgi.rb
@@ -0,0 +1,102 @@
+begin
+require File.expand_path('../testrequest', __FILE__)
+require 'rack/handler/cgi'
+
+describe Rack::Handler::CGI do
+  extend TestRequest::Helpers
+
+  @host = '127.0.0.1'
+  @port = 9203
+
+  if `which lighttpd` && !$?.success?
+    raise "lighttpd not found"
+  end
+
+  # Keep this first.
+  $pid = fork {
+    ENV['RACK_ENV'] = 'deployment'
+    ENV['RUBYLIB'] = [
+      File.expand_path('../../lib', __FILE__),
+      ENV['RUBYLIB'],
+    ].compact.join(':')
+
+    Dir.chdir(File.expand_path("../cgi", __FILE__)) do
+      exec "lighttpd -D -f lighttpd.conf"
+    end
+  }
+
+  should "respond" do
+    sleep 1
+    GET("/test")
+    response.should.not.be.nil
+  end
+
+  should "be a lighttpd" do
+    GET("/test")
+    status.should.equal 200
+    response["SERVER_SOFTWARE"].should =~ /lighttpd/
+    response["HTTP_VERSION"].should.equal "HTTP/1.1"
+    response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
+    response["SERVER_PORT"].should.equal @port.to_s
+    response["SERVER_NAME"].should.equal @host
+  end
+
+  should "have rack headers" do
+    GET("/test")
+    response["rack.version"].should.equal([1,2])
+    response["rack.multithread"].should.be.false
+    response["rack.multiprocess"].should.be.true
+    response["rack.run_once"].should.be.true
+  end
+
+  should "have CGI headers on GET" do
+    GET("/test")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/"
+    response["PATH_INFO"].should.be.nil
+    response["QUERY_STRING"].should.equal ""
+    response["test.postdata"].should.equal ""
+
+    GET("/test/foo?quux=1")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/"
+    response["PATH_INFO"].should.equal "/foo"
+    response["QUERY_STRING"].should.equal "quux=1"
+  end
+
+  should "have CGI headers on POST" do
+    POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
+    status.should.equal 200
+    response["REQUEST_METHOD"].should.equal "POST"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/"
+    response["QUERY_STRING"].should.equal ""
+    response["HTTP_X_TEST_HEADER"].should.equal "42"
+    response["test.postdata"].should.equal "rack-form-data=23"
+  end
+
+  should "support HTTP auth" do
+    GET("/test", {:user => "ruth", :passwd => "secret"})
+    response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
+  end
+
+  should "set status" do
+    GET("/test?secret")
+    status.should.equal 403
+    response["rack.url_scheme"].should.equal "http"
+  end
+
+  # Keep this last.
+  should "shutdown" do
+    Process.kill 15, $pid
+    Process.wait($pid).should == $pid
+  end
+end
+
+rescue RuntimeError
+  $stderr.puts "Skipping Rack::Handler::CGI tests (lighttpd is required). Install lighttpd and try again."
+rescue NotImplementedError
+  $stderr.puts "Your Ruby implemenation or platform does not support fork. Skipping Rack::Handler::CGI tests."
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_chunked.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_chunked.rb
new file mode 100644
index 0000000..12f2158
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_chunked.rb
@@ -0,0 +1,85 @@
+require 'rack/chunked'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Chunked do
+  def chunked(app)
+    proc do |env|
+      app = Rack::Chunked.new(app)
+      response = Rack::Lint.new(app).call(env)
+      # we want to use body like an array, but it only has #each
+      response[2] = response[2].to_enum.to_a
+      response
+    end
+  end
+
+  before do
+    @env = Rack::MockRequest.
+      env_for('/', 'HTTP_VERSION' => '1.1', 'REQUEST_METHOD' => 'GET')
+  end
+
+  should 'chunk responses with no Content-Length' do
+    app = lambda { |env| [200, {"Content-Type" => "text/plain"}, ['Hello', ' ', 'World!']] }
+    response = Rack::MockResponse.new(*chunked(app).call(@env))
+    response.headers.should.not.include 'Content-Length'
+    response.headers['Transfer-Encoding'].should.equal 'chunked'
+    response.body.should.equal "5\r\nHello\r\n1\r\n \r\n6\r\nWorld!\r\n0\r\n\r\n"
+  end
+
+  should 'chunks empty bodies properly' do
+    app = lambda { |env| [200, {"Content-Type" => "text/plain"}, []] }
+    response = Rack::MockResponse.new(*chunked(app).call(@env))
+    response.headers.should.not.include 'Content-Length'
+    response.headers['Transfer-Encoding'].should.equal 'chunked'
+    response.body.should.equal "0\r\n\r\n"
+  end
+
+  should 'chunks encoded bodies properly' do
+    body = ["\uFFFEHello", " ", "World"].map {|t| t.encode("UTF-16LE") }
+    app  = lambda { |env| [200, {"Content-Type" => "text/plain"}, body] }
+    response = Rack::MockResponse.new(*chunked(app).call(@env))
+    response.headers.should.not.include 'Content-Length'
+    response.headers['Transfer-Encoding'].should.equal 'chunked'
+    response.body.encoding.to_s.should.equal "ASCII-8BIT"
+    response.body.should.equal "c\r\n\xFE\xFFH\x00e\x00l\x00l\x00o\x00\r\n2\r\n \x00\r\na\r\nW\x00o\x00r\x00l\x00d\x00\r\n0\r\n\r\n".force_encoding("BINARY")
+  end if RUBY_VERSION >= "1.9"
+
+  should 'not modify response when Content-Length header present' do
+    app = lambda { |env|
+      [200, {"Content-Type" => "text/plain", 'Content-Length'=>'12'}, ['Hello', ' ', 'World!']]
+    }
+    status, headers, body = chunked(app).call(@env)
+    status.should.equal 200
+    headers.should.not.include 'Transfer-Encoding'
+    headers.should.include 'Content-Length'
+    body.join.should.equal 'Hello World!'
+  end
+
+  should 'not modify response when client is HTTP/1.0' do
+    app = lambda { |env| [200, {"Content-Type" => "text/plain"}, ['Hello', ' ', 'World!']] }
+    @env['HTTP_VERSION'] = 'HTTP/1.0'
+    status, headers, body = chunked(app).call(@env)
+    status.should.equal 200
+    headers.should.not.include 'Transfer-Encoding'
+    body.join.should.equal 'Hello World!'
+  end
+
+  should 'not modify response when Transfer-Encoding header already present' do
+    app = lambda { |env|
+      [200, {"Content-Type" => "text/plain", 'Transfer-Encoding' => 'identity'}, ['Hello', ' ', 'World!']]
+    }
+    status, headers, body = chunked(app).call(@env)
+    status.should.equal 200
+    headers['Transfer-Encoding'].should.equal 'identity'
+    body.join.should.equal 'Hello World!'
+  end
+
+  [100, 204, 205, 304].each do |status_code|
+    should "not modify response when status code is #{status_code}" do
+      app = lambda { |env| [status_code, {}, []] }
+      status, headers, _ = chunked(app).call(@env)
+      status.should.equal status_code
+      headers.should.not.include 'Transfer-Encoding'
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_commonlogger.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_commonlogger.rb
new file mode 100644
index 0000000..d88e19c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_commonlogger.rb
@@ -0,0 +1,57 @@
+require 'rack/commonlogger'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::CommonLogger do
+  obj = 'foobar'
+  length = obj.size
+
+  app = Rack::Lint.new lambda { |env|
+    [200,
+     {"Content-Type" => "text/html", "Content-Length" => length.to_s},
+     [obj]]}
+  app_without_length = Rack::Lint.new lambda { |env|
+    [200,
+     {"Content-Type" => "text/html"},
+     []]}
+  app_with_zero_length = Rack::Lint.new lambda { |env|
+    [200,
+     {"Content-Type" => "text/html", "Content-Length" => "0"},
+     []]}
+
+  should "log to rack.errors by default" do
+    res = Rack::MockRequest.new(Rack::CommonLogger.new(app)).get("/")
+
+    res.errors.should.not.be.empty
+    res.errors.should =~ /"GET \/ " 200 #{length} /
+  end
+
+  should "log to anything with +write+" do
+    log = StringIO.new
+    Rack::MockRequest.new(Rack::CommonLogger.new(app, log)).get("/")
+
+    log.string.should =~ /"GET \/ " 200 #{length} /
+  end
+
+  should "log - content length if header is missing" do
+    res = Rack::MockRequest.new(Rack::CommonLogger.new(app_without_length)).get("/")
+
+    res.errors.should.not.be.empty
+    res.errors.should =~ /"GET \/ " 200 - /
+  end
+
+  should "log - content length if header is zero" do
+    res = Rack::MockRequest.new(Rack::CommonLogger.new(app_with_zero_length)).get("/")
+
+    res.errors.should.not.be.empty
+    res.errors.should =~ /"GET \/ " 200 - /
+  end
+
+  def length
+    123
+  end
+
+  def self.obj
+    "hello world"
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_conditionalget.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_conditionalget.rb
new file mode 100644
index 0000000..8b365eb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_conditionalget.rb
@@ -0,0 +1,102 @@
+require 'time'
+require 'rack/conditionalget'
+require 'rack/mock'
+
+describe Rack::ConditionalGet do
+  def conditional_get(app)
+    Rack::Lint.new Rack::ConditionalGet.new(app)
+  end
+  
+  should "set a 304 status and truncate body when If-Modified-Since hits" do
+    timestamp = Time.now.httpdate
+    app = conditional_get(lambda { |env|
+      [200, {'Last-Modified'=>timestamp}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_MODIFIED_SINCE' => timestamp)
+
+    response.status.should.equal 304
+    response.body.should.be.empty
+  end
+
+  should "set a 304 status and truncate body when If-Modified-Since hits and is higher than current time" do
+    app = conditional_get(lambda { |env|
+      [200, {'Last-Modified'=>(Time.now - 3600).httpdate}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_MODIFIED_SINCE' => Time.now.httpdate)
+
+    response.status.should.equal 304
+    response.body.should.be.empty
+  end
+
+  should "set a 304 status and truncate body when If-None-Match hits" do
+    app = conditional_get(lambda { |env|
+      [200, {'Etag'=>'1234'}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_NONE_MATCH' => '1234')
+
+    response.status.should.equal 304
+    response.body.should.be.empty
+  end
+
+  should "not set a 304 status if If-Modified-Since hits but Etag does not" do
+    timestamp = Time.now.httpdate
+    app = conditional_get(lambda { |env|
+      [200, {'Last-Modified'=>timestamp, 'Etag'=>'1234', 'Content-Type' => 'text/plain'}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_MODIFIED_SINCE' => timestamp, 'HTTP_IF_NONE_MATCH' => '4321')
+
+    response.status.should.equal 200
+    response.body.should.equal 'TEST'
+  end
+
+  should "set a 304 status and truncate body when both If-None-Match and If-Modified-Since hits" do
+    timestamp = Time.now.httpdate
+    app = conditional_get(lambda { |env|
+      [200, {'Last-Modified'=>timestamp, 'Etag'=>'1234'}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_MODIFIED_SINCE' => timestamp, 'HTTP_IF_NONE_MATCH' => '1234')
+
+    response.status.should.equal 304
+    response.body.should.be.empty
+  end
+
+  should "not affect non-GET/HEAD requests" do
+    app = conditional_get(lambda { |env|
+      [200, {'Etag'=>'1234', 'Content-Type' => 'text/plain'}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      post("/", 'HTTP_IF_NONE_MATCH' => '1234')
+
+    response.status.should.equal 200
+    response.body.should.equal 'TEST'
+  end
+
+  should "not affect non-200 requests" do
+    app = conditional_get(lambda { |env|
+      [302, {'Etag'=>'1234', 'Content-Type' => 'text/plain'}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_NONE_MATCH' => '1234')
+
+    response.status.should.equal 302
+    response.body.should.equal 'TEST'
+  end
+
+  should "not affect requests with malformed HTTP_IF_NONE_MATCH" do
+    bad_timestamp = Time.now.strftime('%Y-%m-%d %H:%M:%S %z')
+    app = conditional_get(lambda { |env|
+      [200,{'Last-Modified'=>(Time.now - 3600).httpdate, 'Content-Type' => 'text/plain'}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_MODIFIED_SINCE' => bad_timestamp)
+
+    response.status.should.equal 200
+    response.body.should.equal 'TEST'
+  end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_config.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_config.rb
new file mode 100644
index 0000000..29bca0a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_config.rb
@@ -0,0 +1,22 @@
+require 'rack/builder'
+require 'rack/config'
+require 'rack/content_length'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Config do
+  should "accept a block that modifies the environment" do
+    app = Rack::Builder.new do
+      use Rack::Lint
+      use Rack::Config do |env|
+        env['greeting'] = 'hello'
+      end
+      run lambda { |env|
+        [200, {'Content-Type' => 'text/plain'}, [env['greeting'] || '']]
+      }
+    end
+
+    response = Rack::MockRequest.new(app).get('/')
+    response.body.should.equal('hello')
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_content_length.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_content_length.rb
new file mode 100644
index 0000000..4b80a0f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_content_length.rb
@@ -0,0 +1,83 @@
+require 'rack/content_length'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::ContentLength do
+  def content_length(app)
+    Rack::Lint.new Rack::ContentLength.new(app)
+  end
+
+  def request
+    Rack::MockRequest.env_for
+  end
+
+  should "set Content-Length on Array bodies if none is set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
+    response = content_length(app).call(request)
+    response[1]['Content-Length'].should.equal '13'
+  end
+
+  should "not set Content-Length on variable length bodies" do
+    body = lambda { "Hello World!" }
+    def body.each ; yield call ; end
+
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
+    response = content_length(app).call(request)
+    response[1]['Content-Length'].should.be.nil
+  end
+
+  should "not change Content-Length if it is already set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Content-Length' => '1'}, "Hello, World!"] }
+    response = content_length(app).call(request)
+    response[1]['Content-Length'].should.equal '1'
+  end
+
+  should "not set Content-Length on 304 responses" do
+    app = lambda { |env| [304, {}, []] }
+    response = content_length(app).call(request)
+    response[1]['Content-Length'].should.equal nil
+  end
+
+  should "not set Content-Length when Transfer-Encoding is chunked" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Transfer-Encoding' => 'chunked'}, []] }
+    response = content_length(app).call(request)
+    response[1]['Content-Length'].should.equal nil
+  end
+
+  # Using "Connection: close" for this is fairly contended. It might be useful
+  # to have some other way to signal this.
+  #
+  # should "not force a Content-Length when Connection:close" do
+  #   app = lambda { |env| [200, {'Connection' => 'close'}, []] }
+  #   response = content_length(app).call({})
+  #   response[1]['Content-Length'].should.equal nil
+  # end
+
+  should "close bodies that need to be closed" do
+    body = Struct.new(:body) do
+      attr_reader :closed
+      def each; body.join; end
+      def close; @closed = true; end
+      def to_ary; end
+    end.new(%w[one two three])
+
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
+    content_length(app).call(request)
+    body.closed.should.equal true
+  end
+
+  should "support single-execute bodies" do
+    body = Struct.new(:body) do
+      def each
+        yield body.shift until body.empty?
+      end
+      def to_ary; end
+    end.new(%w[one two three])
+
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
+    response = content_length(app).call(request)
+    expected = %w[one two three]
+    response[1]['Content-Length'].should.equal expected.join.size.to_s
+    response[2].to_enum.to_a.should.equal expected
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_content_type.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_content_type.rb
new file mode 100644
index 0000000..308611b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_content_type.rb
@@ -0,0 +1,45 @@
+require 'rack/content_type'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::ContentType do
+  def content_type(app, *args)
+    Rack::Lint.new Rack::ContentType.new(app, *args)
+  end
+  
+  def request
+    Rack::MockRequest.env_for
+  end
+  
+  should "set Content-Type to default text/html if none is set" do
+    app = lambda { |env| [200, {}, "Hello, World!"] }
+    headers = content_type(app).call(request)[1]
+    headers['Content-Type'].should.equal 'text/html'
+  end
+
+  should "set Content-Type to chosen default if none is set" do
+    app = lambda { |env| [200, {}, "Hello, World!"] }
+    headers =
+      content_type(app, 'application/octet-stream').call(request)[1]
+    headers['Content-Type'].should.equal 'application/octet-stream'
+  end
+
+  should "not change Content-Type if it is already set" do
+    app = lambda { |env| [200, {'Content-Type' => 'foo/bar'}, "Hello, World!"] }
+    headers = content_type(app).call(request)[1]
+    headers['Content-Type'].should.equal 'foo/bar'
+  end
+
+  should "detect Content-Type case insensitive" do
+    app = lambda { |env| [200, {'CONTENT-Type' => 'foo/bar'}, "Hello, World!"] }
+    headers = content_type(app).call(request)[1]
+    headers.to_a.select { |k,v| k.downcase == "content-type" }.
+      should.equal [["CONTENT-Type","foo/bar"]]
+  end
+
+  should "not set Content-Type on 304 responses" do
+    app = lambda { |env| [304, {}, []] }
+    response = content_type(app, "text/html").call(request)
+    response[1]['Content-Type'].should.equal nil
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_deflater.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_deflater.rb
new file mode 100644
index 0000000..6f5137c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_deflater.rb
@@ -0,0 +1,204 @@
+require 'stringio'
+require 'time'  # for Time#httpdate
+require 'rack/deflater'
+require 'rack/lint'
+require 'rack/mock'
+require 'zlib'
+
+describe Rack::Deflater do
+  def deflater(app)
+    Rack::Lint.new Rack::Deflater.new(app)
+  end
+
+  def build_response(status, body, accept_encoding, headers = {})
+    body = [body]  if body.respond_to? :to_str
+    app = lambda do |env|
+      res = [status, {}, body]
+      res[1]["Content-Type"] = "text/plain" unless res[0] == 304
+      res
+    end
+    request = Rack::MockRequest.env_for("", headers.merge("HTTP_ACCEPT_ENCODING" => accept_encoding))
+    response = deflater(app).call(request)
+
+    return response
+  end
+
+  def inflate(buf)
+    inflater = Zlib::Inflate.new(-Zlib::MAX_WBITS)
+    inflater.inflate(buf) << inflater.finish
+  end
+
+  should "be able to deflate bodies that respond to each" do
+    body = Object.new
+    class << body; def each; yield("foo"); yield("bar"); end; end
+
+    response = build_response(200, body, "deflate")
+
+    response[0].should.equal(200)
+    response[1].should.equal({
+      "Content-Encoding" => "deflate",
+      "Vary" => "Accept-Encoding",
+      "Content-Type" => "text/plain"
+    })
+    buf = ''
+    response[2].each { |part| buf << part }
+    inflate(buf).should.equal("foobar")
+  end
+
+  should "flush deflated chunks to the client as they become ready" do
+    body = Object.new
+    class << body; def each; yield("foo"); yield("bar"); end; end
+
+    response = build_response(200, body, "deflate")
+
+    response[0].should.equal(200)
+    response[1].should.equal({
+      "Content-Encoding" => "deflate",
+      "Vary" => "Accept-Encoding",
+      "Content-Type" => "text/plain"
+    })
+    buf = []
+    inflater = Zlib::Inflate.new(-Zlib::MAX_WBITS)
+    response[2].each { |part| buf << inflater.inflate(part) }
+    buf << inflater.finish
+    buf.delete_if { |part| part.empty? }
+    buf.join.should.equal("foobar")
+  end
+
+  # TODO: This is really just a special case of the above...
+  should "be able to deflate String bodies" do
+    response = build_response(200, "Hello world!", "deflate")
+
+    response[0].should.equal(200)
+    response[1].should.equal({
+      "Content-Encoding" => "deflate",
+      "Vary" => "Accept-Encoding",
+      "Content-Type" => "text/plain"
+    })
+    buf = ''
+    response[2].each { |part| buf << part }
+    inflate(buf).should.equal("Hello world!")
+  end
+
+  should "be able to gzip bodies that respond to each" do
+    body = Object.new
+    class << body; def each; yield("foo"); yield("bar"); end; end
+
+    response = build_response(200, body, "gzip")
+
+    response[0].should.equal(200)
+    response[1].should.equal({
+      "Content-Encoding" => "gzip",
+      "Vary" => "Accept-Encoding",
+      "Content-Type" => "text/plain"
+    })
+
+    buf = ''
+    response[2].each { |part| buf << part }
+    io = StringIO.new(buf)
+    gz = Zlib::GzipReader.new(io)
+    gz.read.should.equal("foobar")
+    gz.close
+  end
+
+  should "flush gzipped chunks to the client as they become ready" do
+    body = Object.new
+    class << body; def each; yield("foo"); yield("bar"); end; end
+
+    response = build_response(200, body, "gzip")
+
+    response[0].should.equal(200)
+    response[1].should.equal({
+      "Content-Encoding" => "gzip",
+      "Vary" => "Accept-Encoding",
+      "Content-Type" => "text/plain"
+    })
+    buf = []
+    inflater = Zlib::Inflate.new(Zlib::MAX_WBITS + 32)
+    response[2].each { |part| buf << inflater.inflate(part) }
+    buf << inflater.finish
+    buf.delete_if { |part| part.empty? }
+    buf.join.should.equal("foobar")
+  end
+
+  should "be able to fallback to no deflation" do
+    response = build_response(200, "Hello world!", "superzip")
+
+    response[0].should.equal(200)
+    response[1].should.equal({ "Vary" => "Accept-Encoding", "Content-Type" => "text/plain" })
+    response[2].to_enum.to_a.should.equal(["Hello world!"])
+  end
+
+  should "be able to skip when there is no response entity body" do
+    response = build_response(304, [], "gzip")
+
+    response[0].should.equal(304)
+    response[1].should.equal({})
+    response[2].to_enum.to_a.should.equal([])
+  end
+
+  should "handle the lack of an acceptable encoding" do
+    response1 = build_response(200, "Hello world!", "identity;q=0", "PATH_INFO" => "/")
+    response1[0].should.equal(406)
+    response1[1].should.equal({"Content-Type" => "text/plain", "Content-Length" => "71"})
+    response1[2].to_enum.to_a.should.equal(["An acceptable encoding for the requested resource / could not be found."])
+
+    response2 = build_response(200, "Hello world!", "identity;q=0", "SCRIPT_NAME" => "/foo", "PATH_INFO" => "/bar")
+    response2[0].should.equal(406)
+    response2[1].should.equal({"Content-Type" => "text/plain", "Content-Length" => "78"})
+    response2[2].to_enum.to_a.should.equal(["An acceptable encoding for the requested resource /foo/bar could not be found."])
+  end
+
+  should "handle gzip response with Last-Modified header" do
+    last_modified = Time.now.httpdate
+
+    app = lambda { |env| [200, { "Content-Type" => "text/plain", "Last-Modified" => last_modified }, ["Hello World!"]] }
+    request = Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => "gzip")
+    response = deflater(app).call(request)
+
+    response[0].should.equal(200)
+    response[1].should.equal({
+      "Content-Encoding" => "gzip",
+      "Vary" => "Accept-Encoding",
+      "Last-Modified" => last_modified,
+      "Content-Type" => "text/plain"
+    })
+
+    buf = ''
+    response[2].each { |part| buf << part }
+    io = StringIO.new(buf)
+    gz = Zlib::GzipReader.new(io)
+    gz.read.should.equal("Hello World!")
+    gz.close
+  end
+
+  should "do nothing when no-transform Cache-Control directive present" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Cache-Control' => 'no-transform'}, ['Hello World!']] }
+    request = Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => "gzip")
+    response = deflater(app).call(request)
+
+    response[0].should.equal(200)
+    response[1].should.not.include "Content-Encoding"
+    response[2].to_enum.to_a.join.should.equal("Hello World!")
+  end
+
+  should "do nothing when Content-Encoding already present" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Content-Encoding' => 'gzip'}, ['Hello World!']] }
+    request = Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => "gzip")
+    response = deflater(app).call(request)
+
+    response[0].should.equal(200)
+    response[2].to_enum.to_a.join.should.equal("Hello World!")
+  end
+
+  should "deflate when Content-Encoding is identity" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Content-Encoding' => 'identity'}, ['Hello World!']] }
+    request = Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => "deflate")
+    response = deflater(app).call(request)
+
+    response[0].should.equal(200)
+    buf = ''
+    response[2].each { |part| buf << part }
+    inflate(buf).should.equal("Hello World!")
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_directory.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_directory.rb
new file mode 100644
index 0000000..d41ef67
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_directory.rb
@@ -0,0 +1,88 @@
+require 'rack/directory'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Directory do
+  DOCROOT = File.expand_path(File.dirname(__FILE__)) unless defined? DOCROOT
+  FILE_CATCH = proc{|env| [200, {'Content-Type'=>'text/plain', "Content-Length" => "7"}, ['passed!']] }
+  app = Rack::Lint.new(Rack::Directory.new(DOCROOT, FILE_CATCH))
+
+  should "serve directory indices" do
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/cgi/")
+
+    res.should.be.ok
+    res.should =~ /<html><head>/
+  end
+
+  should "pass to app if file found" do
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/cgi/test")
+
+    res.should.be.ok
+    res.should =~ /passed!/
+  end
+
+  should "serve uri with URL encoded filenames" do
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/%63%67%69/") # "/cgi/test"
+
+    res.should.be.ok
+    res.should =~ /<html><head>/
+
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/cgi/%74%65%73%74") # "/cgi/test"
+
+    res.should.be.ok
+    res.should =~ /passed!/
+  end
+
+  should "not allow directory traversal" do
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/cgi/../test")
+
+    res.should.be.forbidden
+
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/cgi/%2E%2E/test")
+
+    res.should.be.forbidden
+  end
+
+  should "404 if it can't find the file" do
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/cgi/blubb")
+
+    res.should.be.not_found
+  end
+
+  should "uri escape path parts" do # #265, properly escape file names
+    mr = Rack::MockRequest.new(Rack::Lint.new(app))
+
+    res = mr.get("/cgi/test%2bdirectory")
+
+    res.should.be.ok
+    res.body.should =~ %r[/cgi/test%2Bdirectory/test%2Bfile]
+
+    res = mr.get("/cgi/test%2bdirectory/test%2bfile")
+    res.should.be.ok
+  end
+
+  should "correctly escape script name" do
+    app2 = Rack::Builder.new do
+      map '/script-path' do
+        run app
+      end
+    end
+
+    mr = Rack::MockRequest.new(Rack::Lint.new(app2))
+
+    res = mr.get("/script-path/cgi/test%2bdirectory")
+
+    res.should.be.ok
+    res.body.should =~ %r[/script-path/cgi/test%2Bdirectory/test%2Bfile]
+
+    res = mr.get("/script-path/cgi/test%2bdirectory/test%2bfile")
+    res.should.be.ok
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_etag.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_etag.rb
new file mode 100644
index 0000000..d7f0350
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_etag.rb
@@ -0,0 +1,98 @@
+require 'rack/etag'
+require 'rack/lint'
+require 'rack/mock'
+require 'time'
+
+describe Rack::ETag do
+  def etag(app, *args)
+    Rack::Lint.new Rack::ETag.new(app, *args)
+  end
+  
+  def request
+    Rack::MockRequest.env_for
+  end
+  
+  def sendfile_body
+    res = ['Hello World']
+    def res.to_path ; "/tmp/hello.txt" ; end
+    res
+  end
+
+  should "set ETag if none is set if status is 200" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.equal "\"65a8e27d8879283831b664bd8b7f0ad4\""
+  end
+
+  should "set ETag if none is set if status is 201" do
+    app = lambda { |env| [201, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.equal "\"65a8e27d8879283831b664bd8b7f0ad4\""
+  end
+
+  should "set Cache-Control to 'max-age=0, private, must-revalidate' (default) if none is set" do
+    app = lambda { |env| [201, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
+    response = etag(app).call(request)
+    response[1]['Cache-Control'].should.equal 'max-age=0, private, must-revalidate'
+  end
+
+  should "set Cache-Control to chosen one if none is set" do
+    app = lambda { |env| [201, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
+    response = etag(app, nil, 'public').call(request)
+    response[1]['Cache-Control'].should.equal 'public'
+  end
+
+  should "set a given Cache-Control even if digest could not be calculated" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, []] }
+    response = etag(app, 'no-cache').call(request)
+    response[1]['Cache-Control'].should.equal 'no-cache'
+  end
+
+  should "not set Cache-Control if it is already set" do
+    app = lambda { |env| [201, {'Content-Type' => 'text/plain', 'Cache-Control' => 'public'}, ["Hello, World!"]] }
+    response = etag(app).call(request)
+    response[1]['Cache-Control'].should.equal 'public'
+  end
+
+  should "not set Cache-Control if directive isn't present" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
+    response = etag(app, nil, nil).call(request)
+    response[1]['Cache-Control'].should.equal nil
+  end
+
+  should "not change ETag if it is already set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'ETag' => '"abc"'}, ["Hello, World!"]] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.equal "\"abc\""
+  end
+
+  should "not set ETag if body is empty" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Last-Modified' => Time.now.httpdate}, []] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.be.nil
+  end
+
+  should "not set ETag if Last-Modified is set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Last-Modified' => Time.now.httpdate}, ["Hello, World!"]] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.be.nil
+  end
+
+  should "not set ETag if a sendfile_body is given" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, sendfile_body] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.be.nil
+  end
+
+  should "not set ETag if a status is not 200 or 201" do
+    app = lambda { |env| [401, {'Content-Type' => 'text/plain'}, ['Access denied.']] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.be.nil
+  end
+
+  should "not set ETag if no-cache is given" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Cache-Control' => 'no-cache, must-revalidate'}, ['Hello, World!']] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.be.nil
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_fastcgi.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_fastcgi.rb
new file mode 100644
index 0000000..14594a2
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_fastcgi.rb
@@ -0,0 +1,107 @@
+begin
+require File.expand_path('../testrequest', __FILE__)
+require 'rack/handler/fastcgi'
+
+describe Rack::Handler::FastCGI do
+  extend TestRequest::Helpers
+
+  @host = '127.0.0.1'
+  @port = 9203
+
+  if `which lighttpd` && !$?.success?
+    raise "lighttpd not found"
+  end
+
+  # Keep this first.
+  $pid = fork {
+    ENV['RACK_ENV'] = 'deployment'
+    ENV['RUBYLIB'] = [
+      File.expand_path('../../lib', __FILE__),
+      ENV['RUBYLIB'],
+    ].compact.join(':')
+
+    Dir.chdir(File.expand_path("../cgi", __FILE__)) do
+      exec "lighttpd -D -f lighttpd.conf"
+    end
+  }
+
+  should "respond" do
+    sleep 1
+    GET("/test")
+    response.should.not.be.nil
+  end
+
+  should "respond via rackup server" do
+    GET("/sample_rackup.ru")
+    status.should.equal 200
+  end
+
+  should "be a lighttpd" do
+    GET("/test.fcgi")
+    status.should.equal 200
+    response["SERVER_SOFTWARE"].should =~ /lighttpd/
+    response["HTTP_VERSION"].should.equal "HTTP/1.1"
+    response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
+    response["SERVER_PORT"].should.equal @port.to_s
+    response["SERVER_NAME"].should.equal @host
+  end
+
+  should "have rack headers" do
+    GET("/test.fcgi")
+    response["rack.version"].should.equal [1,2]
+    response["rack.multithread"].should.be.false
+    response["rack.multiprocess"].should.be.true
+    response["rack.run_once"].should.be.false
+  end
+
+  should "have CGI headers on GET" do
+    GET("/test.fcgi")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test.fcgi"
+    response["REQUEST_PATH"].should.equal "/"
+    response["PATH_INFO"].should.equal ""
+    response["QUERY_STRING"].should.equal ""
+    response["test.postdata"].should.equal ""
+
+    GET("/test.fcgi/foo?quux=1")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test.fcgi"
+    response["REQUEST_PATH"].should.equal "/"
+    response["PATH_INFO"].should.equal "/foo"
+    response["QUERY_STRING"].should.equal "quux=1"
+  end
+
+  should "have CGI headers on POST" do
+    POST("/test.fcgi", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
+    status.should.equal 200
+    response["REQUEST_METHOD"].should.equal "POST"
+    response["SCRIPT_NAME"].should.equal "/test.fcgi"
+    response["REQUEST_PATH"].should.equal "/"
+    response["QUERY_STRING"].should.equal ""
+    response["HTTP_X_TEST_HEADER"].should.equal "42"
+    response["test.postdata"].should.equal "rack-form-data=23"
+  end
+
+  should "support HTTP auth" do
+    GET("/test.fcgi", {:user => "ruth", :passwd => "secret"})
+    response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
+  end
+
+  should "set status" do
+    GET("/test.fcgi?secret")
+    status.should.equal 403
+    response["rack.url_scheme"].should.equal "http"
+  end
+
+  # Keep this last.
+  should "shutdown" do
+    Process.kill 15, $pid
+    Process.wait($pid).should.equal $pid
+  end
+end
+
+rescue RuntimeError
+  $stderr.puts "Skipping Rack::Handler::FastCGI tests (lighttpd is required). Install lighttpd and try again."
+rescue LoadError
+  $stderr.puts "Skipping Rack::Handler::FastCGI tests (FCGI is required). `gem install fcgi` and try again."
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_file.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_file.rb
new file mode 100644
index 0000000..c9d7a1b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_file.rb
@@ -0,0 +1,213 @@
+require 'rack/file'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::File do
+  DOCROOT = File.expand_path(File.dirname(__FILE__)) unless defined? DOCROOT
+
+  def file(*args)
+    Rack::Lint.new Rack::File.new(*args)
+  end
+
+  should "serve files" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/cgi/test")
+
+    res.should.be.ok
+    res.should =~ /ruby/
+  end
+
+  should "set Last-Modified header" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/cgi/test")
+
+    path = File.join(DOCROOT, "/cgi/test")
+
+    res.should.be.ok
+    res["Last-Modified"].should.equal File.mtime(path).httpdate
+  end
+
+  should "return 304 if file isn't modified since last serve" do
+    path = File.join(DOCROOT, "/cgi/test")
+    res = Rack::MockRequest.new(file(DOCROOT)).
+      get("/cgi/test", 'HTTP_IF_MODIFIED_SINCE' => File.mtime(path).httpdate)
+
+    res.status.should.equal 304
+    res.body.should.be.empty
+  end
+
+  should "return the file if it's modified since last serve" do
+    path = File.join(DOCROOT, "/cgi/test")
+    res = Rack::MockRequest.new(file(DOCROOT)).
+      get("/cgi/test", 'HTTP_IF_MODIFIED_SINCE' => (File.mtime(path) - 100).httpdate)
+
+    res.should.be.ok
+  end
+
+  should "serve files with URL encoded filenames" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/cgi/%74%65%73%74") # "/cgi/test"
+
+    res.should.be.ok
+    res.should =~ /ruby/
+  end
+
+  should "allow safe directory traversal" do
+    req = Rack::MockRequest.new(file(DOCROOT))
+
+    res = req.get('/cgi/../cgi/test')
+    res.should.be.successful
+
+    res = req.get('.')
+    res.should.be.not_found
+
+    res = req.get("test/..")
+    res.should.be.not_found
+  end
+
+  should "not allow unsafe directory traversal" do
+    req = Rack::MockRequest.new(file(DOCROOT))
+
+    res = req.get("/../README.rdoc")
+    res.should.be.client_error
+
+    res = req.get("../test/spec_file.rb")
+    res.should.be.client_error
+
+    res = req.get("../README.rdoc")
+    res.should.be.client_error
+
+    res.should.be.not_found
+  end
+
+  should "allow files with .. in their name" do
+    req = Rack::MockRequest.new(file(DOCROOT))
+    res = req.get("/cgi/..test")
+    res.should.be.not_found
+
+    res = req.get("/cgi/test..")
+    res.should.be.not_found
+
+    res = req.get("/cgi../test..")
+    res.should.be.not_found
+  end
+
+  should "not allow unsafe directory traversal with encoded periods" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/%2E%2E/README")
+
+    res.should.be.client_error?
+    res.should.be.not_found
+  end
+
+  should "allow safe directory traversal with encoded periods" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/cgi/%2E%2E/cgi/test")
+
+    res.should.be.successful
+  end
+
+  should "404 if it can't find the file" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/cgi/blubb")
+
+    res.should.be.not_found
+  end
+
+  should "detect SystemCallErrors" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/cgi")
+
+    res.should.be.not_found
+  end
+
+  should "return bodies that respond to #to_path" do
+    env = Rack::MockRequest.env_for("/cgi/test")
+    status, _, body = Rack::File.new(DOCROOT).call(env)
+
+    path = File.join(DOCROOT, "/cgi/test")
+
+    status.should.equal 200
+    body.should.respond_to :to_path
+    body.to_path.should.equal path
+  end
+
+  should "return correct byte range in body" do
+    env = Rack::MockRequest.env_for("/cgi/test")
+    env["HTTP_RANGE"] = "bytes=22-33"
+    res = Rack::MockResponse.new(*file(DOCROOT).call(env))
+
+    res.status.should.equal 206
+    res["Content-Length"].should.equal "12"
+    res["Content-Range"].should.equal "bytes 22-33/193"
+    res.body.should.equal "-*- ruby -*-"
+  end
+
+  should "return error for unsatisfiable byte range" do
+    env = Rack::MockRequest.env_for("/cgi/test")
+    env["HTTP_RANGE"] = "bytes=1234-5678"
+    res = Rack::MockResponse.new(*file(DOCROOT).call(env))
+
+    res.status.should.equal 416
+    res["Content-Range"].should.equal "bytes */193"
+  end
+
+  should "support custom http headers" do
+    env = Rack::MockRequest.env_for("/cgi/test")
+    status, heads, _ = file(DOCROOT, 'Cache-Control' => 'public, max-age=38',
+     'Access-Control-Allow-Origin' => '*').call(env)
+
+    status.should.equal 200
+    heads['Cache-Control'].should.equal 'public, max-age=38'
+    heads['Access-Control-Allow-Origin'].should.equal '*'
+  end
+
+  should "support not add custom http headers if none are supplied" do
+    env = Rack::MockRequest.env_for("/cgi/test")
+    status, heads, _ = file(DOCROOT).call(env)
+
+    status.should.equal 200
+    heads['Cache-Control'].should.equal nil
+    heads['Access-Control-Allow-Origin'].should.equal nil
+  end
+
+  should "only support GET and HEAD requests" do
+    req = Rack::MockRequest.new(file(DOCROOT))
+
+    forbidden = %w[post put patch delete]
+    forbidden.each do |method|
+
+      res = req.send(method, "/cgi/test")
+      res.should.be.client_error
+      res.should.be.method_not_allowed
+    end
+
+    allowed = %w[get head]
+    allowed.each do |method|
+      res = req.send(method, "/cgi/test")
+      res.should.be.successful
+    end
+  end
+
+  should "set Content-Length correctly for HEAD requests" do
+    req = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT)))
+    res = req.head "/cgi/test"
+    res.should.be.successful
+    res['Content-Length'].should.equal "193"
+  end
+
+  should "default to a mime type of text/plain" do
+    req = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT)))
+    res = req.get "/cgi/test"
+    res.should.be.successful
+    res['Content-Type'].should.equal "text/plain"
+  end
+
+  should "allow the default mime type to be set" do
+    req = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT, nil, 'application/octet-stream')))
+    res = req.get "/cgi/test"
+    res.should.be.successful
+    res['Content-Type'].should.equal "application/octet-stream"
+  end
+
+  should "not set Content-Type if the mime type is not set" do
+    req = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT, nil, nil)))
+    res = req.get "/cgi/test"
+    res.should.be.successful
+    res['Content-Type'].should.equal nil
+  end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_handler.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_handler.rb
new file mode 100644
index 0000000..e8f41fd
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_handler.rb
@@ -0,0 +1,59 @@
+require 'rack/handler'
+
+class Rack::Handler::Lobster; end
+class RockLobster; end
+
+describe Rack::Handler do
+  it "has registered default handlers" do
+    Rack::Handler.get('cgi').should.equal Rack::Handler::CGI
+    Rack::Handler.get('webrick').should.equal Rack::Handler::WEBrick
+
+    begin
+      Rack::Handler.get('fastcgi').should.equal Rack::Handler::FastCGI
+    rescue LoadError
+    end
+
+    begin
+      Rack::Handler.get('mongrel').should.equal Rack::Handler::Mongrel
+    rescue LoadError
+    end
+  end
+
+  should "raise LoadError if handler doesn't exist" do
+    lambda {
+      Rack::Handler.get('boom')
+    }.should.raise(LoadError)
+  end
+
+  should "get unregistered, but already required, handler by name" do
+    Rack::Handler.get('Lobster').should.equal Rack::Handler::Lobster
+  end
+
+  should "register custom handler" do
+    Rack::Handler.register('rock_lobster', 'RockLobster')
+    Rack::Handler.get('rock_lobster').should.equal RockLobster
+  end
+
+  should "not need registration for properly coded handlers even if not already required" do
+    begin
+      $LOAD_PATH.push File.expand_path('../unregistered_handler', __FILE__)
+      Rack::Handler.get('Unregistered').should.equal Rack::Handler::Unregistered
+      lambda {
+        Rack::Handler.get('UnRegistered')
+      }.should.raise LoadError
+      Rack::Handler.get('UnregisteredLongOne').should.equal Rack::Handler::UnregisteredLongOne
+    ensure
+      $LOAD_PATH.delete File.expand_path('../unregistered_handler', __FILE__)
+    end
+  end
+
+  should "allow autoloaded handlers to be registered properly while being loaded" do
+    path = File.expand_path('../registering_handler', __FILE__)
+    begin
+      $LOAD_PATH.push path
+      Rack::Handler.get('registering_myself').should.equal Rack::Handler::RegisteringMyself
+    ensure
+      $LOAD_PATH.delete path
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_head.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_head.rb
new file mode 100644
index 0000000..18f9a76
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_head.rb
@@ -0,0 +1,43 @@
+require 'rack/head'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Head do
+
+  def test_response(headers = {})
+    body = StringIO.new "foo"
+    app = lambda do |env|
+      [200, {"Content-type" => "test/plain", "Content-length" => "3"}, body]
+    end
+    request = Rack::MockRequest.env_for("/", headers)
+    response = Rack::Lint.new(Rack::Head.new(app)).call(request)
+
+    return response, body
+  end
+
+  should "pass GET, POST, PUT, DELETE, OPTIONS, TRACE requests" do
+    %w[GET POST PUT DELETE OPTIONS TRACE].each do |type|
+      resp, _ = test_response("REQUEST_METHOD" => type)
+
+      resp[0].should.equal(200)
+      resp[1].should.equal({"Content-type" => "test/plain", "Content-length" => "3"})
+      resp[2].to_enum.to_a.should.equal(["foo"])
+    end
+  end
+
+  should "remove body from HEAD requests" do
+    resp, _ = test_response("REQUEST_METHOD" => "HEAD")
+
+    resp[0].should.equal(200)
+    resp[1].should.equal({"Content-type" => "test/plain", "Content-length" => "3"})
+    resp[2].to_enum.to_a.should.equal([])
+  end
+
+  should "close the body when it is removed" do
+    resp, body = test_response("REQUEST_METHOD" => "HEAD")
+    resp[0].should.equal(200)
+    resp[1].should.equal({"Content-type" => "test/plain", "Content-length" => "3"})
+    resp[2].to_enum.to_a.should.equal([])
+    body.should.be.closed
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_lint.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_lint.rb
new file mode 100644
index 0000000..fb60b7e
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_lint.rb
@@ -0,0 +1,522 @@
+require 'stringio'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Lint do
+  def env(*args)
+    Rack::MockRequest.env_for("/", *args)
+  end
+
+  should "pass valid request" do
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Content-type" => "test/plain", "Content-length" => "3"}, ["foo"]]
+                     }).call(env({}))
+    }.should.not.raise
+  end
+
+  should "notice fatal errors" do
+    lambda { Rack::Lint.new(nil).call }.should.raise(Rack::Lint::LintError).
+      message.should.match(/No env given/)
+  end
+
+  should "notice environment errors" do
+    lambda { Rack::Lint.new(nil).call 5 }.should.raise(Rack::Lint::LintError).
+      message.should.match(/not a Hash/)
+
+    lambda {
+      e = env
+      e.delete("REQUEST_METHOD")
+      Rack::Lint.new(nil).call(e)
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/missing required key REQUEST_METHOD/)
+
+    lambda {
+      e = env
+      e.delete("SERVER_NAME")
+      Rack::Lint.new(nil).call(e)
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/missing required key SERVER_NAME/)
+
+
+    lambda {
+      Rack::Lint.new(nil).call(env("HTTP_CONTENT_TYPE" => "text/plain"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/contains HTTP_CONTENT_TYPE/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("HTTP_CONTENT_LENGTH" => "42"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/contains HTTP_CONTENT_LENGTH/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("FOO" => Object.new))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/non-string value/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("rack.version" => "0.2"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must be an Array/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("rack.url_scheme" => "gopher"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/url_scheme unknown/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("rack.session" => []))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("session [] must respond to store and []=")
+
+    lambda {
+      Rack::Lint.new(nil).call(env("rack.logger" => []))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("logger [] must respond to info")
+
+    lambda {
+      Rack::Lint.new(nil).call(env("REQUEST_METHOD" => "FUCKUP?"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/REQUEST_METHOD/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("SCRIPT_NAME" => "howdy"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must start with/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("PATH_INFO" => "../foo"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must start with/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("CONTENT_LENGTH" => "xcii"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/Invalid CONTENT_LENGTH/)
+
+    lambda {
+      e = env
+      e.delete("PATH_INFO")
+      e.delete("SCRIPT_NAME")
+      Rack::Lint.new(nil).call(e)
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/One of .* must be set/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("SCRIPT_NAME" => "/"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/cannot be .* make it ''/)
+  end
+
+  should "notice input errors" do
+    lambda {
+      Rack::Lint.new(nil).call(env("rack.input" => ""))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/does not respond to #gets/)
+
+    lambda {
+      input = Object.new
+      def input.binmode?
+        false
+      end
+      Rack::Lint.new(nil).call(env("rack.input" => input))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/is not opened in binary mode/)
+
+    lambda {
+      input = Object.new
+      def input.external_encoding
+        result = Object.new
+        def result.name
+          "US-ASCII"
+        end
+        result
+      end
+      Rack::Lint.new(nil).call(env("rack.input" => input))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/does not have ASCII-8BIT as its external encoding/)
+  end
+
+  should "notice error errors" do
+    lambda {
+      Rack::Lint.new(nil).call(env("rack.errors" => ""))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/does not respond to #puts/)
+  end
+
+  should "notice status errors" do
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       ["cc", {}, ""]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must be >=100 seen as integer/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [42, {}, ""]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must be >=100 seen as integer/)
+  end
+
+  should "notice header errors" do
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, Object.new, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("headers object should respond to #each, but doesn't (got Object as headers)")
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {true=>false}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("header key must be a string, was TrueClass")
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Status" => "404"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must not contain Status/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Content-Type:" => "text/plain"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must not contain :/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Content-" => "text/plain"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must not end/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"..%%quark%%.." => "text/plain"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("invalid header name: ..%%quark%%..")
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Foo" => Object.new}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("a header value must be a String, but the value of 'Foo' is a Object")
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Foo" => [1, 2, 3]}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("a header value must be a String, but the value of 'Foo' is a Array")
+
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Foo-Bar" => "text\000plain"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/invalid header/)
+
+    # line ends (010) should be allowed in header values.
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Foo-Bar" => "one\ntwo\nthree", "Content-Length" => "0", "Content-Type" => "text/plain" }, []]
+                     }).call(env({}))
+    }.should.not.raise(Rack::Lint::LintError)
+
+    # non-Hash header responses should be allowed
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, [%w(Content-Type text/plain), %w(Content-Length 0)], []]
+                     }).call(env({}))
+    }.should.not.raise(TypeError)
+  end
+
+  should "notice content-type errors" do
+    # lambda {
+    #   Rack::Lint.new(lambda { |env|
+    #                    [200, {"Content-length" => "0"}, []]
+    #                  }).call(env({}))
+    # }.should.raise(Rack::Lint::LintError).
+    #   message.should.match(/No Content-Type/)
+
+    [100, 101, 204, 205, 304].each do |status|
+      lambda {
+        Rack::Lint.new(lambda { |env|
+                         [status, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                       }).call(env({}))
+      }.should.raise(Rack::Lint::LintError).
+        message.should.match(/Content-Type header found/)
+    end
+  end
+
+  should "notice content-length errors" do
+    [100, 101, 204, 205, 304].each do |status|
+      lambda {
+        Rack::Lint.new(lambda { |env|
+                         [status, {"Content-length" => "0"}, []]
+                       }).call(env({}))
+      }.should.raise(Rack::Lint::LintError).
+        message.should.match(/Content-Length header found/)
+    end
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Content-type" => "text/plain", "Content-Length" => "1"}, []]
+                     }).call(env({}))[2].each { }
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/Content-Length header was 1, but should be 0/)
+  end
+
+  should "notice body errors" do
+    lambda {
+      body = Rack::Lint.new(lambda { |env|
+                               [200, {"Content-type" => "text/plain","Content-length" => "3"}, [1,2,3]]
+                             }).call(env({}))[2]
+      body.each { |part| }
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/yielded non-string/)
+  end
+
+  should "notice input handling errors" do
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].gets("\r\n")
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/gets called with arguments/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(1, 2, 3)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read called with too many arguments/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read("foo")
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read called with non-integer and non-nil length/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(-1)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read called with a negative length/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(nil, nil)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read called with non-String buffer/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(nil, 1)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read called with non-String buffer/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].rewind(0)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/rewind called with arguments/)
+
+    weirdio = Object.new
+    class << weirdio
+      def gets
+        42
+      end
+
+      def read
+        23
+      end
+
+      def each
+        yield 23
+        yield 42
+      end
+
+      def rewind
+        raise Errno::ESPIPE, "Errno::ESPIPE"
+      end
+    end
+
+    eof_weirdio = Object.new
+    class << eof_weirdio
+      def gets
+        nil
+      end
+
+      def read(*args)
+        nil
+      end
+
+      def each
+      end
+
+      def rewind
+      end
+    end
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].gets
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env("rack.input" => weirdio))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/gets didn't return a String/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].each { |x| }
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env("rack.input" => weirdio))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/each didn't yield a String/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env("rack.input" => weirdio))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read didn't return nil or a String/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env("rack.input" => eof_weirdio))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read\(nil\) returned nil on EOF/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].rewind
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env("rack.input" => weirdio))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/rewind raised Errno::ESPIPE/)
+
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].close
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/close must not be called/)
+  end
+
+  should "notice error handling errors" do
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.errors"].write(42)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/write not called with a String/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.errors"].close
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/close must not be called/)
+  end
+
+  should "notice HEAD errors" do
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Content-type" => "test/plain", "Content-length" => "3"}, []]
+                     }).call(env({"REQUEST_METHOD" => "HEAD"}))
+    }.should.not.raise
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Content-type" => "test/plain", "Content-length" => "3"}, ["foo"]]
+                     }).call(env({"REQUEST_METHOD" => "HEAD"}))[2].each { }
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/body was given for HEAD/)
+  end
+
+  should "pass valid read calls" do
+    hello_str = "hello world"
+    hello_str.force_encoding("ASCII-8BIT") if hello_str.respond_to? :force_encoding
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({"rack.input" => StringIO.new(hello_str)}))
+    }.should.not.raise(Rack::Lint::LintError)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(0)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({"rack.input" => StringIO.new(hello_str)}))
+    }.should.not.raise(Rack::Lint::LintError)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(1)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({"rack.input" => StringIO.new(hello_str)}))
+    }.should.not.raise(Rack::Lint::LintError)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(nil)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({"rack.input" => StringIO.new(hello_str)}))
+    }.should.not.raise(Rack::Lint::LintError)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(nil, '')
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({"rack.input" => StringIO.new(hello_str)}))
+    }.should.not.raise(Rack::Lint::LintError)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(1, '')
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({"rack.input" => StringIO.new(hello_str)}))
+    }.should.not.raise(Rack::Lint::LintError)
+  end
+end
+
+describe "Rack::Lint::InputWrapper" do
+  should "delegate :rewind to underlying IO object" do
+    io = StringIO.new("123")
+    wrapper = Rack::Lint::InputWrapper.new(io)
+    wrapper.read.should.equal "123"
+    wrapper.read.should.equal ""
+    wrapper.rewind
+    wrapper.read.should.equal "123"
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_lobster.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_lobster.rb
new file mode 100644
index 0000000..56a5479
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_lobster.rb
@@ -0,0 +1,58 @@
+require 'rack/lobster'
+require 'rack/lint'
+require 'rack/mock'
+
+module LobsterHelpers
+  def lobster
+    Rack::MockRequest.new Rack::Lint.new(Rack::Lobster.new)
+  end
+
+  def lambda_lobster
+    Rack::MockRequest.new Rack::Lint.new(Rack::Lobster::LambdaLobster)
+  end
+end
+
+describe Rack::Lobster::LambdaLobster do
+  extend LobsterHelpers
+  
+  should "be a single lambda" do
+    Rack::Lobster::LambdaLobster.should.be.kind_of Proc
+  end
+
+  should "look like a lobster" do
+    res = lambda_lobster.get("/")
+    res.should.be.ok
+    res.body.should.include "(,(,,(,,,("
+    res.body.should.include "?flip"
+  end
+
+  should "be flippable" do
+    res = lambda_lobster.get("/?flip")
+    res.should.be.ok
+    res.body.should.include "(,,,(,,(,("
+  end
+end
+
+describe Rack::Lobster do
+  extend LobsterHelpers
+  
+  should "look like a lobster" do
+    res = lobster.get("/")
+    res.should.be.ok
+    res.body.should.include "(,(,,(,,,("
+    res.body.should.include "?flip"
+    res.body.should.include "crash"
+  end
+
+  should "be flippable" do
+    res = lobster.get("/?flip=left")
+    res.should.be.ok
+    res.body.should.include "(,,,(,,(,("
+  end
+
+  should "provide crashing for testing purposes" do
+    lambda {
+      lobster.get("/?flip=crash")
+    }.should.raise
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_lock.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_lock.rb
new file mode 100644
index 0000000..0cbb544
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_lock.rb
@@ -0,0 +1,164 @@
+require 'rack/lint'
+require 'rack/lock'
+require 'rack/mock'
+
+class Lock
+  attr_reader :synchronized
+
+  def initialize
+    @synchronized = false
+  end
+
+  def synchronize
+    @synchronized = true
+    yield
+  end
+
+  def lock
+    @synchronized = true
+  end
+
+  def unlock
+    @synchronized = false
+  end
+end
+
+module LockHelpers
+  def lock_app(app, lock = Lock.new)
+    app = if lock
+      Rack::Lock.new app, lock
+    else
+      Rack::Lock.new app
+    end
+    Rack::Lint.new app
+  end
+end
+
+describe Rack::Lock do
+  extend LockHelpers
+
+  describe 'Proxy' do
+    extend LockHelpers
+
+    should 'delegate each' do
+      env      = Rack::MockRequest.env_for("/")
+      response = Class.new {
+        attr_accessor :close_called
+        def initialize; @close_called = false; end
+        def each; %w{ hi mom }.each { |x| yield x }; end
+      }.new
+
+      app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, response] })
+      response = app.call(env)[2]
+      list = []
+      response.each { |x| list << x }
+      list.should.equal %w{ hi mom }
+    end
+
+    should 'delegate to_path' do
+      lock = Lock.new
+      env  = Rack::MockRequest.env_for("/")
+
+      res = ['Hello World']
+      def res.to_path ; "/tmp/hello.txt" ; end
+
+      app = Rack::Lock.new(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, res] }, lock)
+      body = app.call(env)[2]
+
+      body.should.respond_to :to_path
+      body.to_path.should.equal "/tmp/hello.txt"
+    end
+
+    should 'not delegate to_path if body does not implement it' do
+      env  = Rack::MockRequest.env_for("/")
+
+      res = ['Hello World']
+
+      app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, res] })
+      body = app.call(env)[2]
+
+      body.should.not.respond_to :to_path
+    end
+  end
+
+  should 'call super on close' do
+    env      = Rack::MockRequest.env_for("/")
+    response = Class.new {
+      attr_accessor :close_called
+      def initialize; @close_called = false; end
+      def close; @close_called = true; end
+    }.new
+
+    app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, response] })
+    app.call(env)
+    response.close_called.should.equal false
+    response.close
+    response.close_called.should.equal true
+  end
+
+  should "not unlock until body is closed" do
+    lock     = Lock.new
+    env      = Rack::MockRequest.env_for("/")
+    response = Object.new
+    app      = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, response] }, lock)
+    lock.synchronized.should.equal false
+    response = app.call(env)[2]
+    lock.synchronized.should.equal true
+    response.close
+    lock.synchronized.should.equal false
+  end
+
+  should "return value from app" do
+    env  = Rack::MockRequest.env_for("/")
+    body = [200, {"Content-Type" => "text/plain"}, %w{ hi mom }]
+    app  = lock_app(lambda { |inner_env| body })
+
+    res = app.call(env)
+    res[0].should.equal body[0]
+    res[1].should.equal body[1]
+    res[2].to_enum.to_a.should.equal ["hi", "mom"]
+  end
+
+  should "call synchronize on lock" do
+    lock = Lock.new
+    env = Rack::MockRequest.env_for("/")
+    app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, %w{ a b c }] }, lock)
+    lock.synchronized.should.equal false
+    app.call(env)
+    lock.synchronized.should.equal true
+  end
+
+  should "unlock if the app raises" do
+    lock = Lock.new
+    env = Rack::MockRequest.env_for("/")
+    app = lock_app(lambda { raise Exception }, lock)
+    lambda { app.call(env) }.should.raise(Exception)
+    lock.synchronized.should.equal false
+  end
+
+  should "unlock if the app throws" do
+    lock = Lock.new
+    env = Rack::MockRequest.env_for("/")
+    app = lock_app(lambda {|_| throw :bacon }, lock)
+    lambda { app.call(env) }.should.throw(:bacon)
+    lock.synchronized.should.equal false
+  end
+
+  should "set multithread flag to false" do
+    app = lock_app(lambda { |env|
+      env['rack.multithread'].should.equal false
+      [200, {"Content-Type" => "text/plain"}, %w{ a b c }]
+    }, false)
+    app.call(Rack::MockRequest.env_for("/"))
+  end
+
+  should "reset original multithread flag when exiting lock" do
+    app = Class.new(Rack::Lock) {
+      def call(env)
+        env['rack.multithread'].should.equal true
+        super
+      end
+    }.new(lambda { |env| [200, {"Content-Type" => "text/plain"}, %w{ a b c }] })
+    Rack::Lint.new(app).call(Rack::MockRequest.env_for("/"))
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_logger.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_logger.rb
new file mode 100644
index 0000000..2ff4408
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_logger.rb
@@ -0,0 +1,23 @@
+require 'stringio'
+require 'rack/lint'
+require 'rack/logger'
+require 'rack/mock'
+
+describe Rack::Logger do
+  app = lambda { |env|
+    log = env['rack.logger']
+    log.debug("Created logger")
+    log.info("Program started")
+    log.warn("Nothing to do!")
+
+    [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]]
+  }
+
+  should "conform to Rack::Lint" do
+    errors = StringIO.new
+    a = Rack::Lint.new(Rack::Logger.new(app))
+    Rack::MockRequest.new(a).get('/', 'rack.errors' => errors)
+    errors.string.should.match(/INFO -- : Program started/)
+    errors.string.should.match(/WARN -- : Nothing to do/)
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_methodoverride.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_methodoverride.rb
new file mode 100644
index 0000000..16f5f28
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_methodoverride.rb
@@ -0,0 +1,75 @@
+require 'stringio'
+require 'rack/methodoverride'
+require 'rack/mock'
+
+describe Rack::MethodOverride do
+  def app
+    Rack::Lint.new(Rack::MethodOverride.new(lambda {|e|
+      [200, {"Content-Type" => "text/plain"}, []]
+    }))
+  end
+  
+  should "not affect GET requests" do
+    env = Rack::MockRequest.env_for("/?_method=delete", :method => "GET")
+    app.call env
+
+    env["REQUEST_METHOD"].should.equal "GET"
+  end
+
+  should "modify REQUEST_METHOD for POST requests when _method parameter is set" do
+    env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=put")
+    app.call env
+
+    env["REQUEST_METHOD"].should.equal "PUT"
+  end
+
+  should "modify REQUEST_METHOD for POST requests when X-HTTP-Method-Override is set" do
+    env = Rack::MockRequest.env_for("/",
+            :method => "POST",
+            "HTTP_X_HTTP_METHOD_OVERRIDE" => "PATCH"
+          )
+    app.call env
+
+    env["REQUEST_METHOD"].should.equal "PATCH"
+  end
+
+  should "not modify REQUEST_METHOD if the method is unknown" do
+    env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=foo")
+    app.call env
+
+    env["REQUEST_METHOD"].should.equal "POST"
+  end
+
+  should "not modify REQUEST_METHOD when _method is nil" do
+    env = Rack::MockRequest.env_for("/", :method => "POST", :input => "foo=bar")
+    app.call env
+
+    env["REQUEST_METHOD"].should.equal "POST"
+  end
+
+  should "store the original REQUEST_METHOD prior to overriding" do
+    env = Rack::MockRequest.env_for("/",
+            :method => "POST",
+            :input  => "_method=options")
+    app.call env
+
+    env["rack.methodoverride.original_method"].should.equal "POST"
+  end
+
+  should "not modify REQUEST_METHOD when given invalid multipart form data" do
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="huge"; filename="huge"\r
+EOF
+    env = Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size.to_s,
+                      :method => "POST", :input => input)
+    begin
+      app.call env
+    rescue EOFError
+    end
+
+    env["REQUEST_METHOD"].should.equal "POST"
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_mime.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_mime.rb
new file mode 100644
index 0000000..231bf35
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_mime.rb
@@ -0,0 +1,51 @@
+require 'rack/mime'
+
+describe Rack::Mime do
+
+  it "should return the fallback mime-type for files with no extension" do
+    fallback = 'image/jpg'
+    Rack::Mime.mime_type(File.extname('no_ext'), fallback).should.equal fallback
+  end
+
+  it "should always return 'application/octet-stream' for unknown file extensions" do
+    unknown_ext = File.extname('unknown_ext.abcdefg')
+    Rack::Mime.mime_type(unknown_ext).should.equal 'application/octet-stream'
+  end
+
+  it "should return the mime-type for a given extension" do
+    # sanity check. it would be infeasible test every single mime-type.
+    Rack::Mime.mime_type(File.extname('image.jpg')).should.equal 'image/jpeg'
+  end
+
+  it "should support null fallbacks" do
+    Rack::Mime.mime_type('.nothing', nil).should.equal nil
+  end
+
+  it "should match exact mimes" do
+    Rack::Mime.match?('text/html', 'text/html').should.equal true
+    Rack::Mime.match?('text/html', 'text/meme').should.equal false
+    Rack::Mime.match?('text', 'text').should.equal true
+    Rack::Mime.match?('text', 'binary').should.equal false
+  end
+
+  it "should match class wildcard mimes" do
+    Rack::Mime.match?('text/html', 'text/*').should.equal true
+    Rack::Mime.match?('text/plain', 'text/*').should.equal true
+    Rack::Mime.match?('application/json', 'text/*').should.equal false
+    Rack::Mime.match?('text/html', 'text').should.equal true
+  end
+
+  it "should match full wildcards" do
+    Rack::Mime.match?('text/html', '*').should.equal true
+    Rack::Mime.match?('text/plain', '*').should.equal true
+    Rack::Mime.match?('text/html', '*/*').should.equal true
+    Rack::Mime.match?('text/plain', '*/*').should.equal true
+  end
+
+  it "should match type wildcard mimes" do
+    Rack::Mime.match?('text/html', '*/html').should.equal true
+    Rack::Mime.match?('text/plain', '*/plain').should.equal true
+  end
+
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_mock.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_mock.rb
new file mode 100644
index 0000000..f49b196
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_mock.rb
@@ -0,0 +1,269 @@
+require 'yaml'
+require 'rack/lint'
+require 'rack/mock'
+require 'stringio'
+
+app = Rack::Lint.new(lambda { |env|
+  req = Rack::Request.new(env)
+
+  env["mock.postdata"] = env["rack.input"].read
+  if req.GET["error"]
+    env["rack.errors"].puts req.GET["error"]
+    env["rack.errors"].flush
+  end
+
+  body = req.head? ? "" : env.to_yaml
+  Rack::Response.new(body,
+                     req.GET["status"] || 200,
+                     "Content-Type" => "text/yaml").finish
+})
+
+describe Rack::MockRequest do
+  should "return a MockResponse" do
+    res = Rack::MockRequest.new(app).get("")
+    res.should.be.kind_of Rack::MockResponse
+  end
+
+  should "be able to only return the environment" do
+    env = Rack::MockRequest.env_for("")
+    env.should.be.kind_of Hash
+    env.should.include "rack.version"
+  end
+
+  should "provide sensible defaults" do
+    res = Rack::MockRequest.new(app).request
+
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+    env["SERVER_NAME"].should.equal "example.org"
+    env["SERVER_PORT"].should.equal "80"
+    env["QUERY_STRING"].should.equal ""
+    env["PATH_INFO"].should.equal "/"
+    env["SCRIPT_NAME"].should.equal ""
+    env["rack.url_scheme"].should.equal "http"
+    env["mock.postdata"].should.be.empty
+  end
+
+  should "allow GET/POST/PUT/DELETE/HEAD" do
+    res = Rack::MockRequest.new(app).get("", :input => "foo")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+
+    res = Rack::MockRequest.new(app).post("", :input => "foo")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "POST"
+
+    res = Rack::MockRequest.new(app).put("", :input => "foo")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "PUT"
+
+    res = Rack::MockRequest.new(app).patch("", :input => "foo")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "PATCH"
+
+    res = Rack::MockRequest.new(app).delete("", :input => "foo")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "DELETE"
+    
+    Rack::MockRequest.env_for("/", :method => "HEAD")["REQUEST_METHOD"].
+      should.equal "HEAD"
+
+    Rack::MockRequest.env_for("/", :method => "OPTIONS")["REQUEST_METHOD"].
+      should.equal "OPTIONS"
+  end
+
+  should "set content length" do
+    env = Rack::MockRequest.env_for("/", :input => "foo")
+    env["CONTENT_LENGTH"].should.equal "3"
+  end
+
+  should "allow posting" do
+    res = Rack::MockRequest.new(app).get("", :input => "foo")
+    env = YAML.load(res.body)
+    env["mock.postdata"].should.equal "foo"
+
+    res = Rack::MockRequest.new(app).post("", :input => StringIO.new("foo"))
+    env = YAML.load(res.body)
+    env["mock.postdata"].should.equal "foo"
+  end
+
+  should "use all parts of an URL" do
+    res = Rack::MockRequest.new(app).
+      get("https://bla.example.org:9292/meh/foo?bar")
+    res.should.be.kind_of Rack::MockResponse
+
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+    env["SERVER_NAME"].should.equal "bla.example.org"
+    env["SERVER_PORT"].should.equal "9292"
+    env["QUERY_STRING"].should.equal "bar"
+    env["PATH_INFO"].should.equal "/meh/foo"
+    env["rack.url_scheme"].should.equal "https"
+  end
+
+  should "set SSL port and HTTP flag on when using https" do
+    res = Rack::MockRequest.new(app).
+      get("https://example.org/foo")
+    res.should.be.kind_of Rack::MockResponse
+
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+    env["SERVER_NAME"].should.equal "example.org"
+    env["SERVER_PORT"].should.equal "443"
+    env["QUERY_STRING"].should.equal ""
+    env["PATH_INFO"].should.equal "/foo"
+    env["rack.url_scheme"].should.equal "https"
+    env["HTTPS"].should.equal "on"
+  end
+
+  should "prepend slash to uri path" do
+    res = Rack::MockRequest.new(app).
+      get("foo")
+    res.should.be.kind_of Rack::MockResponse
+
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+    env["SERVER_NAME"].should.equal "example.org"
+    env["SERVER_PORT"].should.equal "80"
+    env["QUERY_STRING"].should.equal ""
+    env["PATH_INFO"].should.equal "/foo"
+    env["rack.url_scheme"].should.equal "http"
+  end
+
+  should "properly convert method name to an uppercase string" do
+    res = Rack::MockRequest.new(app).request(:get)
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+  end
+
+  should "accept params and build query string for GET requests" do
+    res = Rack::MockRequest.new(app).get("/foo?baz=2", :params => {:foo => {:bar => "1"}})
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+    env["QUERY_STRING"].should.include "baz=2"
+    env["QUERY_STRING"].should.include "foo[bar]=1"
+    env["PATH_INFO"].should.equal "/foo"
+    env["mock.postdata"].should.equal ""
+  end
+
+  should "accept raw input in params for GET requests" do
+    res = Rack::MockRequest.new(app).get("/foo?baz=2", :params => "foo[bar]=1")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+    env["QUERY_STRING"].should.include "baz=2"
+    env["QUERY_STRING"].should.include "foo[bar]=1"
+    env["PATH_INFO"].should.equal "/foo"
+    env["mock.postdata"].should.equal ""
+  end
+
+  should "accept params and build url encoded params for POST requests" do
+    res = Rack::MockRequest.new(app).post("/foo", :params => {:foo => {:bar => "1"}})
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "POST"
+    env["QUERY_STRING"].should.equal ""
+    env["PATH_INFO"].should.equal "/foo"
+    env["CONTENT_TYPE"].should.equal "application/x-www-form-urlencoded"
+    env["mock.postdata"].should.equal "foo[bar]=1"
+  end
+
+  should "accept raw input in params for POST requests" do
+    res = Rack::MockRequest.new(app).post("/foo", :params => "foo[bar]=1")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "POST"
+    env["QUERY_STRING"].should.equal ""
+    env["PATH_INFO"].should.equal "/foo"
+    env["CONTENT_TYPE"].should.equal "application/x-www-form-urlencoded"
+    env["mock.postdata"].should.equal "foo[bar]=1"
+  end
+
+  should "accept params and build multipart encoded params for POST requests" do
+    files = Rack::Multipart::UploadedFile.new(File.join(File.dirname(__FILE__), "multipart", "file1.txt"))
+    res = Rack::MockRequest.new(app).post("/foo", :params => { "submit-name" => "Larry", "files" => files })
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "POST"
+    env["QUERY_STRING"].should.equal ""
+    env["PATH_INFO"].should.equal "/foo"
+    env["CONTENT_TYPE"].should.equal "multipart/form-data; boundary=AaB03x"
+    # The gsub accounts for differences in YAMLs affect on the data.
+    env["mock.postdata"].gsub("\r", "").length.should.equal 206
+  end
+
+  should "behave valid according to the Rack spec" do
+    lambda {
+      Rack::MockRequest.new(app).
+        get("https://bla.example.org:9292/meh/foo?bar", :lint => true)
+    }.should.not.raise(Rack::Lint::LintError)
+  end
+
+  should "call close on the original body object" do
+    called = false
+    body   = Rack::BodyProxy.new(['hi']) { called = true }
+    capp   = proc { |e| [200, {'Content-Type' => 'text/plain'}, body] }
+    called.should.equal false
+    Rack::MockRequest.new(capp).get('/', :lint => true)
+    called.should.equal true
+  end
+end
+
+describe Rack::MockResponse do
+  should "provide access to the HTTP status" do
+    res = Rack::MockRequest.new(app).get("")
+    res.should.be.successful
+    res.should.be.ok
+
+    res = Rack::MockRequest.new(app).get("/?status=404")
+    res.should.not.be.successful
+    res.should.be.client_error
+    res.should.be.not_found
+
+    res = Rack::MockRequest.new(app).get("/?status=501")
+    res.should.not.be.successful
+    res.should.be.server_error
+
+    res = Rack::MockRequest.new(app).get("/?status=307")
+    res.should.be.redirect
+
+    res = Rack::MockRequest.new(app).get("/?status=201", :lint => true)
+    res.should.be.empty
+  end
+
+  should "provide access to the HTTP headers" do
+    res = Rack::MockRequest.new(app).get("")
+    res.should.include "Content-Type"
+    res.headers["Content-Type"].should.equal "text/yaml"
+    res.original_headers["Content-Type"].should.equal "text/yaml"
+    res["Content-Type"].should.equal "text/yaml"
+    res.content_type.should.equal "text/yaml"
+    res.content_length.should.not.equal 0
+    res.location.should.be.nil
+  end
+
+  should "provide access to the HTTP body" do
+    res = Rack::MockRequest.new(app).get("")
+    res.body.should =~ /rack/
+    res.should =~ /rack/
+    res.should.match(/rack/)
+    res.should.satisfy { |r| r.match(/rack/) }
+  end
+
+  should "provide access to the Rack errors" do
+    res = Rack::MockRequest.new(app).get("/?error=foo", :lint => true)
+    res.should.be.ok
+    res.errors.should.not.be.empty
+    res.errors.should.include "foo"
+  end
+
+  should "allow calling body.close afterwards" do
+    # this is exactly what rack-test does
+    body = StringIO.new("hi")
+    res = Rack::MockResponse.new(200, {}, body)
+    body.close if body.respond_to?(:close)
+    res.body.should == 'hi'
+  end
+
+  should "optionally make Rack errors fatal" do
+    lambda {
+      Rack::MockRequest.new(app).get("/?error=foo", :fatal => true)
+    }.should.raise(Rack::MockRequest::FatalWarning)
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_mongrel.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_mongrel.rb
new file mode 100644
index 0000000..e162cdc
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_mongrel.rb
@@ -0,0 +1,182 @@
+begin
+require 'rack'
+require 'rack/handler/mongrel'
+require File.expand_path('../testrequest', __FILE__)
+require 'timeout'
+
+Thread.abort_on_exception = true
+$tcp_defer_accept_opts = nil
+$tcp_cork_opts = nil
+
+describe Rack::Handler::Mongrel do
+  extend TestRequest::Helpers
+
+  @server = Mongrel::HttpServer.new(@host='127.0.0.1', @port=9201)
+  @server.register('/test',
+                  Rack::Handler::Mongrel.new(Rack::Lint.new(TestRequest.new)))
+  @server.register('/stream',
+                  Rack::Handler::Mongrel.new(Rack::Lint.new(StreamingRequest)))
+  @acc = @server.run
+
+  should "respond" do
+    lambda {
+      GET("/test")
+    }.should.not.raise
+  end
+
+  should "be a Mongrel" do
+    GET("/test")
+    status.should.equal 200
+    response["SERVER_SOFTWARE"].should =~ /Mongrel/
+    response["HTTP_VERSION"].should.equal "HTTP/1.1"
+    response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
+    response["SERVER_PORT"].should.equal "9201"
+    response["SERVER_NAME"].should.equal "127.0.0.1"
+  end
+
+  should "have rack headers" do
+    GET("/test")
+    response["rack.version"].should.equal [1,2]
+    response["rack.multithread"].should.be.true
+    response["rack.multiprocess"].should.be.false
+    response["rack.run_once"].should.be.false
+  end
+
+  should "have CGI headers on GET" do
+    GET("/test")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test"
+    response["PATH_INFO"].should.be.equal ""
+    response["QUERY_STRING"].should.equal ""
+    response["test.postdata"].should.equal ""
+
+    GET("/test/foo?quux=1")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test/foo"
+    response["PATH_INFO"].should.equal "/foo"
+    response["QUERY_STRING"].should.equal "quux=1"
+  end
+
+  should "have CGI headers on POST" do
+    POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
+    status.should.equal 200
+    response["REQUEST_METHOD"].should.equal "POST"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test"
+    response["QUERY_STRING"].should.equal ""
+    response["HTTP_X_TEST_HEADER"].should.equal "42"
+    response["test.postdata"].should.equal "rack-form-data=23"
+  end
+
+  should "support HTTP auth" do
+    GET("/test", {:user => "ruth", :passwd => "secret"})
+    response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
+  end
+
+  should "set status" do
+    GET("/test?secret")
+    status.should.equal 403
+    response["rack.url_scheme"].should.equal "http"
+  end
+
+  should "provide a .run" do
+    block_ran = false
+    Thread.new {
+      Rack::Handler::Mongrel.run(lambda {}, {:Host => '127.0.0.1', :Port => 9211}) { |server|
+        server.should.be.kind_of Mongrel::HttpServer
+        block_ran = true
+      }
+    }
+    sleep 1
+    block_ran.should.be.true
+  end
+
+  should "provide a .run that maps a hash" do
+    block_ran = false
+    Thread.new {
+      map = {'/'=>lambda{},'/foo'=>lambda{}}
+      Rack::Handler::Mongrel.run(map, :map => true, :Host => '127.0.0.1', :Port => 9221) { |server|
+        server.should.be.kind_of Mongrel::HttpServer
+        server.classifier.uris.size.should.equal 2
+        server.classifier.uris.should.not.include '/arf'
+        server.classifier.uris.should.include '/'
+        server.classifier.uris.should.include '/foo'
+        block_ran = true
+      }
+    }
+    sleep 1
+    block_ran.should.be.true
+  end
+
+  should "provide a .run that maps a urlmap" do
+    block_ran = false
+    Thread.new {
+      map = Rack::URLMap.new({'/'=>lambda{},'/bar'=>lambda{}})
+      Rack::Handler::Mongrel.run(map, {:map => true, :Host => '127.0.0.1', :Port => 9231}) { |server|
+        server.should.be.kind_of Mongrel::HttpServer
+        server.classifier.uris.size.should.equal 2
+        server.classifier.uris.should.not.include '/arf'
+        server.classifier.uris.should.include '/'
+        server.classifier.uris.should.include '/bar'
+        block_ran = true
+      }
+    }
+    sleep 1
+    block_ran.should.be.true
+  end
+
+  should "provide a .run that maps a urlmap restricting by host" do
+    block_ran = false
+    Thread.new {
+      map = Rack::URLMap.new({
+        '/' => lambda{},
+        '/foo' => lambda{},
+        '/bar' => lambda{},
+        'http://127.0.0.1/' => lambda{},
+        'http://127.0.0.1/bar' => lambda{},
+        'http://falsehost/arf' => lambda{},
+        'http://falsehost/qux' => lambda{}
+      })
+      opt = {:map => true, :Port => 9241, :Host => '127.0.0.1'}
+      Rack::Handler::Mongrel.run(map, opt) { |server|
+        server.should.be.kind_of Mongrel::HttpServer
+        server.classifier.uris.should.include '/'
+        server.classifier.handler_map['/'].size.should.equal 2
+        server.classifier.uris.should.include '/foo'
+        server.classifier.handler_map['/foo'].size.should.equal 1
+        server.classifier.uris.should.include '/bar'
+        server.classifier.handler_map['/bar'].size.should.equal 2
+        server.classifier.uris.should.not.include '/qux'
+        server.classifier.uris.should.not.include '/arf'
+        server.classifier.uris.size.should.equal 3
+        block_ran = true
+      }
+    }
+    sleep 1
+    block_ran.should.be.true
+  end
+
+  should "stream #each part of the response" do
+    body = ''
+    begin
+      Timeout.timeout(1) do
+        Net::HTTP.start(@host, @port) do |http|
+          get = Net::HTTP::Get.new('/stream')
+          http.request(get) do |response|
+            response.read_body { |part| body << part }
+          end
+        end
+      end
+    rescue Timeout::Error
+    end
+    body.should.not.be.empty
+  end
+
+  @acc.raise Mongrel::StopServer
+end
+
+rescue LoadError
+  warn "Skipping Rack::Handler::Mongrel tests (Mongrel is required). `gem install mongrel` and try again."
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_multipart.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_multipart.rb
new file mode 100644
index 0000000..bd0b07b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_multipart.rb
@@ -0,0 +1,445 @@
+require 'rack/utils'
+require 'rack/mock'
+
+describe Rack::Multipart do
+  def multipart_fixture(name, boundary = "AaB03x")
+    file = multipart_file(name)
+    data = File.open(file, 'rb') { |io| io.read }
+
+    type = "multipart/form-data; boundary=#{boundary}"
+    length = data.respond_to?(:bytesize) ? data.bytesize : data.size
+
+    { "CONTENT_TYPE" => type,
+      "CONTENT_LENGTH" => length.to_s,
+      :input => StringIO.new(data) }
+  end
+
+  def multipart_file(name)
+    File.join(File.dirname(__FILE__), "multipart", name.to_s)
+  end
+
+  should "return nil if content type is not multipart" do
+    env = Rack::MockRequest.env_for("/",
+            "CONTENT_TYPE" => 'application/x-www-form-urlencoded')
+    Rack::Multipart.parse_multipart(env).should.equal nil
+  end
+
+  should "parse multipart content when content type present but filename is not" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:content_type_and_no_filename))
+    params = Rack::Multipart.parse_multipart(env)
+    params["text"].should.equal "contents"
+  end
+
+  should "raise RangeError if the key space is exhausted" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:content_type_and_no_filename))
+
+    old, Rack::Utils.key_space_limit = Rack::Utils.key_space_limit, 1
+    begin
+      lambda { Rack::Multipart.parse_multipart(env) }.should.raise(RangeError)
+    ensure
+      Rack::Utils.key_space_limit = old
+    end
+  end
+
+  should "parse multipart form webkit style" do
+    env = Rack::MockRequest.env_for '/', multipart_fixture(:webkit)
+    env['CONTENT_TYPE'] = "multipart/form-data; boundary=----WebKitFormBoundaryWLHCs9qmcJJoyjKR"
+    params = Rack::Multipart.parse_multipart(env)
+    params['profile']['bio'].should.include 'hello'
+  end
+
+  should "reject insanely long boundaries" do
+    # using a pipe since a tempfile can use up too much space
+    rd, wr = IO.pipe
+
+    # we only call rewind once at start, so make sure it succeeds
+    # and doesn't hit ESPIPE
+    def rd.rewind; end
+    wr.sync = true
+
+    # mock out length to make this pipe look like a Tempfile
+    def rd.length
+      1024 * 1024 * 8
+    end
+
+    # write to a pipe in a background thread, this will write a lot
+    # unless Rack (properly) shuts down the read end
+    thr = Thread.new do
+      begin
+        wr.write("--AaB03x")
+
+        # make the initial boundary a few gigs long
+        longer = "0123456789" * 1024 * 1024
+        (1024 * 1024).times { wr.write(longer) }
+
+        wr.write("\r\n")
+        wr.write('Content-Disposition: form-data; name="a"; filename="a.txt"')
+        wr.write("\r\n")
+        wr.write("Content-Type: text/plain\r\n")
+        wr.write("\r\na")
+        wr.write("--AaB03x--\r\n")
+        wr.close
+      rescue => err # this is EPIPE if Rack shuts us down
+        err
+      end
+    end
+
+    fixture = {
+      "CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
+      "CONTENT_LENGTH" => rd.length.to_s,
+      :input => rd,
+    }
+
+    env = Rack::MockRequest.env_for '/', fixture
+    lambda {
+      Rack::Multipart.parse_multipart(env)
+    }.should.raise(EOFError)
+    rd.close
+
+    err = thr.value
+    err.should.be.instance_of Errno::EPIPE
+    wr.close
+  end
+
+  should "parse multipart upload with text file" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:text))
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["submit-name-with-content"].should.equal "Berry"
+    params["files"][:type].should.equal "text/plain"
+    params["files"][:filename].should.equal "file1.txt"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; filename=\"file1.txt\"\r\n" +
+      "Content-Type: text/plain\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse multipart upload with nested parameters" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:nested))
+    params = Rack::Multipart.parse_multipart(env)
+    params["foo"]["submit-name"].should.equal "Larry"
+    params["foo"]["files"][:type].should.equal "text/plain"
+    params["foo"]["files"][:filename].should.equal "file1.txt"
+    params["foo"]["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"foo[files]\"; filename=\"file1.txt\"\r\n" +
+      "Content-Type: text/plain\r\n"
+    params["foo"]["files"][:name].should.equal "foo[files]"
+    params["foo"]["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse multipart upload with binary file" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:binary))
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["files"][:type].should.equal "image/png"
+    params["files"][:filename].should.equal "rack-logo.png"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; filename=\"rack-logo.png\"\r\n" +
+      "Content-Type: image/png\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.length.should.equal 26473
+  end
+
+  should "parse multipart upload with empty file" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:empty))
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["files"][:type].should.equal "text/plain"
+    params["files"][:filename].should.equal "file1.txt"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; filename=\"file1.txt\"\r\n" +
+      "Content-Type: text/plain\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal ""
+  end
+
+  should "parse multipart upload with filename with semicolons" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:semicolon))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "text/plain"
+    params["files"][:filename].should.equal "fi;le1.txt"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; filename=\"fi;le1.txt\"\r\n" +
+      "Content-Type: text/plain\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "not include file params if no file was selected" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:none))
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["files"].should.equal nil
+    params.keys.should.not.include "files"
+  end
+
+  should "parse multipart/mixed" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:mixed_files))
+    params = Rack::Utils::Multipart.parse_multipart(env)
+    params["foo"].should.equal "bar"
+    params["files"].should.be.instance_of String
+    params["files"].size.should.equal 252
+  end
+
+  should "parse IE multipart upload and clean up filename" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:ie))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "text/plain"
+    params["files"][:filename].should.equal "file1.txt"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; " +
+      'filename="C:\Documents and Settings\Administrator\Desktop\file1.txt"' +
+      "\r\nContent-Type: text/plain\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename and modification param" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_and_modification_param))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "image/jpeg"
+    params["files"][:filename].should.equal "genome.jpeg"
+    params["files"][:head].should.equal "Content-Type: image/jpeg\r\n" +
+      "Content-Disposition: attachment; " +
+      "name=\"files\"; " +
+      "filename=genome.jpeg; " +
+      "modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\";\r\n" +
+      "Content-Description: a complete map of the human genome\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with escaped quotes" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_escaped_quotes))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "application/octet-stream"
+    params["files"][:filename].should.equal "escape \"quotes"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; " +
+      "filename=\"escape \\\"quotes\"\r\n" +
+      "Content-Type: application/octet-stream\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with percent escaped quotes" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_percent_escaped_quotes))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "application/octet-stream"
+    params["files"][:filename].should.equal "escape \"quotes"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; " +
+      "filename=\"escape %22quotes\"\r\n" +
+      "Content-Type: application/octet-stream\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with unescaped quotes" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_unescaped_quotes))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "application/octet-stream"
+    params["files"][:filename].should.equal "escape \"quotes"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; " +
+      "filename=\"escape \"quotes\"\r\n" +
+      "Content-Type: application/octet-stream\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with escaped quotes and modification param" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_escaped_quotes_and_modification_param))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "image/jpeg"
+    params["files"][:filename].should.equal "\"human\" genome.jpeg"
+    params["files"][:head].should.equal "Content-Type: image/jpeg\r\n" +
+      "Content-Disposition: attachment; " +
+      "name=\"files\"; " +
+      "filename=\"\"human\" genome.jpeg\"; " +
+      "modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\";\r\n" +
+      "Content-Description: a complete map of the human genome\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with unescaped percentage characters" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_unescaped_percentages, "----WebKitFormBoundary2NHc7OhsgU68l3Al"))
+    params = Rack::Multipart.parse_multipart(env)
+    files = params["document"]["attachment"]
+    files[:type].should.equal "image/jpeg"
+    files[:filename].should.equal "100% of a photo.jpeg"
+    files[:head].should.equal <<-MULTIPART
+Content-Disposition: form-data; name="document[attachment]"; filename="100% of a photo.jpeg"\r
+Content-Type: image/jpeg\r
+    MULTIPART
+
+    files[:name].should.equal "document[attachment]"
+    files[:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with unescaped percentage characters that look like partial hex escapes" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_unescaped_percentages2, "----WebKitFormBoundary2NHc7OhsgU68l3Al"))
+    params = Rack::Multipart.parse_multipart(env)
+    files = params["document"]["attachment"]
+    files[:type].should.equal "image/jpeg"
+    files[:filename].should.equal "100%a"
+    files[:head].should.equal <<-MULTIPART
+Content-Disposition: form-data; name="document[attachment]"; filename="100%a"\r
+Content-Type: image/jpeg\r
+    MULTIPART
+
+    files[:name].should.equal "document[attachment]"
+    files[:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with unescaped percentage characters that look like partial hex escapes" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_unescaped_percentages3, "----WebKitFormBoundary2NHc7OhsgU68l3Al"))
+    params = Rack::Multipart.parse_multipart(env)
+    files = params["document"]["attachment"]
+    files[:type].should.equal "image/jpeg"
+    files[:filename].should.equal "100%"
+    files[:head].should.equal <<-MULTIPART
+Content-Disposition: form-data; name="document[attachment]"; filename="100%"\r
+Content-Type: image/jpeg\r
+    MULTIPART
+
+    files[:name].should.equal "document[attachment]"
+    files[:tempfile].read.should.equal "contents"
+  end
+
+  it "rewinds input after parsing upload" do
+    options = multipart_fixture(:text)
+    input = options[:input]
+    env = Rack::MockRequest.env_for("/", options)
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["files"][:filename].should.equal "file1.txt"
+    input.read.length.should.equal 307
+  end
+
+  it "builds multipart body" do
+    files = Rack::Multipart::UploadedFile.new(multipart_file("file1.txt"))
+    data  = Rack::Multipart.build_multipart("submit-name" => "Larry", "files" => files)
+
+    options = {
+      "CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
+      "CONTENT_LENGTH" => data.length.to_s,
+      :input => StringIO.new(data)
+    }
+    env = Rack::MockRequest.env_for("/", options)
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["files"][:filename].should.equal "file1.txt"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  it "builds nested multipart body" do
+    files = Rack::Multipart::UploadedFile.new(multipart_file("file1.txt"))
+    data  = Rack::Multipart.build_multipart("people" => [{"submit-name" => "Larry", "files" => files}])
+
+    options = {
+      "CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
+      "CONTENT_LENGTH" => data.length.to_s,
+      :input => StringIO.new(data)
+    }
+    env = Rack::MockRequest.env_for("/", options)
+    params = Rack::Multipart.parse_multipart(env)
+    params["people"][0]["submit-name"].should.equal "Larry"
+    params["people"][0]["files"][:filename].should.equal "file1.txt"
+    params["people"][0]["files"][:tempfile].read.should.equal "contents"
+  end
+
+  it "can parse fields that end at the end of the buffer" do
+    input = File.read(multipart_file("bad_robots"))
+
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    req.POST['file.path'].should.equal "/var/tmp/uploads/4/0001728414"
+    req.POST['addresses'].should.not.equal nil
+  end
+
+  it "builds complete params with the chunk size of 16384 slicing exactly on boundary" do
+    data = File.open(multipart_file("fail_16384_nofile"), 'rb') { |f| f.read }.gsub(/\n/, "\r\n")
+    options = {
+      "CONTENT_TYPE" => "multipart/form-data; boundary=----WebKitFormBoundaryWsY0GnpbI5U7ztzo",
+      "CONTENT_LENGTH" => data.length.to_s,
+      :input => StringIO.new(data)
+    }
+    env = Rack::MockRequest.env_for("/", options)
+    params = Rack::Multipart.parse_multipart(env)
+
+    params.should.not.equal nil
+    params.keys.should.include "AAAAAAAAAAAAAAAAAAA"
+    params["AAAAAAAAAAAAAAAAAAA"].keys.should.include "PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"
+    params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"].keys.should.include "new"
+    params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"].keys.should.include "-2"
+    params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"]["-2"].keys.should.include "ba_unit_id"
+    params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"]["-2"]["ba_unit_id"].should.equal "1017"
+  end
+
+  should "return nil if no UploadedFiles were used" do
+    data = Rack::Multipart.build_multipart("people" => [{"submit-name" => "Larry", "files" => "contents"}])
+    data.should.equal nil
+  end
+
+  should "raise ArgumentError if params is not a Hash" do
+    lambda { Rack::Multipart.build_multipart("foo=bar") }.
+      should.raise(ArgumentError).
+      message.should.equal "value must be a Hash"
+  end
+
+  it "can parse fields with a content type" do
+    data = <<-EOF
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon\r
+Content-Disposition: form-data; name="description"\r
+Content-Type: text/plain"\r
+\r
+Very very blue\r
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon--\r
+EOF
+    options = {
+      "CONTENT_TYPE" => "multipart/form-data; boundary=1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon",
+      "CONTENT_LENGTH" => data.length.to_s,
+      :input => StringIO.new(data)
+    }
+    env = Rack::MockRequest.env_for("/", options)
+    params = Rack::Utils::Multipart.parse_multipart(env)
+
+    params.should.equal({"description"=>"Very very blue"})
+  end
+
+  should "parse multipart upload with no content-length header" do
+    env = Rack::MockRequest.env_for '/', multipart_fixture(:webkit)
+    env['CONTENT_TYPE'] = "multipart/form-data; boundary=----WebKitFormBoundaryWLHCs9qmcJJoyjKR"
+    env.delete 'CONTENT_LENGTH'
+    params = Rack::Multipart.parse_multipart(env)
+    params['profile']['bio'].should.include 'hello'
+  end
+
+  should "parse very long unquoted multipart file names" do
+    data = <<-EOF
+--AaB03x\r
+Content-Type: text/plain\r
+Content-Disposition: attachment; name=file; filename=#{'long' * 100}\r
+\r
+contents\r
+--AaB03x--\r
+    EOF
+
+    options = {
+      "CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
+      "CONTENT_LENGTH" => data.length.to_s,
+      :input => StringIO.new(data)
+    }
+    env = Rack::MockRequest.env_for("/", options)
+    params = Rack::Utils::Multipart.parse_multipart(env)
+
+    params["file"][:filename].should.equal('long' * 100)
+  end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_nulllogger.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_nulllogger.rb
new file mode 100644
index 0000000..88ba521
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_nulllogger.rb
@@ -0,0 +1,20 @@
+require 'rack/lint'
+require 'rack/mock'
+require 'rack/nulllogger'
+
+describe Rack::NullLogger do
+  should "act as a noop logger" do
+    app = lambda { |env|
+      env['rack.logger'].warn "b00m"
+      [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]]
+    }
+
+    logger = Rack::Lint.new(Rack::NullLogger.new(app))
+
+    res = logger.call(Rack::MockRequest.env_for)
+    res[0..1].should.equal [
+      200, {'Content-Type' => 'text/plain'}
+    ]
+    res[2].to_enum.to_a.should.equal ["Hello, World!"]
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_recursive.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_recursive.rb
new file mode 100644
index 0000000..764c44c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_recursive.rb
@@ -0,0 +1,72 @@
+require 'rack/lint'
+require 'rack/recursive'
+require 'rack/mock'
+
+describe Rack::Recursive do
+  @app1 = lambda { |env|
+    res = Rack::Response.new
+    res["X-Path-Info"] = env["PATH_INFO"]
+    res["X-Query-String"] = env["QUERY_STRING"]
+    res.finish do |inner_res|
+      inner_res.write "App1"
+    end
+  }
+
+  @app2 = lambda { |env|
+    Rack::Response.new.finish do |res|
+      res.write "App2"
+      _, _, body = env['rack.recursive.include'].call(env, "/app1")
+      body.each { |b|
+        res.write b
+      }
+    end
+  }
+
+  @app3 = lambda { |env|
+    raise Rack::ForwardRequest.new("/app1")
+  }
+
+  @app4 = lambda { |env|
+    raise Rack::ForwardRequest.new("http://example.org/app1/quux?meh")
+  }
+  
+  def recursive(map)
+    Rack::Lint.new Rack::Recursive.new(Rack::URLMap.new(map))
+  end
+
+  should "allow for subrequests" do
+    res = Rack::MockRequest.new(recursive("/app1" => @app1,
+                                          "/app2" => @app2)).
+      get("/app2")
+
+    res.should.be.ok
+    res.body.should.equal "App2App1"
+  end
+
+  should "raise error on requests not below the app" do
+    app = Rack::URLMap.new("/app1" => @app1,
+                           "/app" => recursive("/1" => @app1,
+                                               "/2" => @app2))
+
+    lambda {
+      Rack::MockRequest.new(app).get("/app/2")
+    }.should.raise(ArgumentError).
+      message.should =~ /can only include below/
+  end
+
+  should "support forwarding" do
+    app = recursive("/app1" => @app1,
+                    "/app3" => @app3,
+                    "/app4" => @app4)
+
+    res = Rack::MockRequest.new(app).get("/app3")
+    res.should.be.ok
+    res.body.should.equal "App1"
+
+    res = Rack::MockRequest.new(app).get("/app4")
+    res.should.be.ok
+    res.body.should.equal "App1"
+    res["X-Path-Info"].should.equal "/quux"
+    res["X-Query-String"].should.equal "meh"
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_request.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_request.rb
new file mode 100644
index 0000000..9649c5d
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_request.rb
@@ -0,0 +1,1078 @@
+require 'stringio'
+require 'cgi'
+require 'rack/request'
+require 'rack/mock'
+
+describe Rack::Request do
+  should "wrap the rack variables" do
+    req = Rack::Request.new(Rack::MockRequest.env_for("http://example.com:8080/"))
+
+    req.body.should.respond_to? :gets
+    req.scheme.should.equal "http"
+    req.request_method.should.equal "GET"
+
+    req.should.be.get
+    req.should.not.be.post
+    req.should.not.be.put
+    req.should.not.be.delete
+    req.should.not.be.head
+    req.should.not.be.patch
+
+    req.script_name.should.equal ""
+    req.path_info.should.equal "/"
+    req.query_string.should.equal ""
+
+    req.host.should.equal "example.com"
+    req.port.should.equal 8080
+
+    req.content_length.should.equal "0"
+    req.content_type.should.be.nil
+  end
+
+  should "figure out the correct host" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "www2.example.org")
+    req.host.should.equal "www2.example.org"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "SERVER_NAME" => "example.org", "SERVER_PORT" => "9292")
+    req.host.should.equal "example.org"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org:9292")
+    req.host.should.equal "example.org"
+
+    env = Rack::MockRequest.env_for("/", "SERVER_ADDR" => "192.168.1.1", "SERVER_PORT" => "9292")
+    env.delete("SERVER_NAME")
+    req = Rack::Request.new(env)
+    req.host.should.equal "192.168.1.1"
+
+    env = Rack::MockRequest.env_for("/")
+    env.delete("SERVER_NAME")
+    req = Rack::Request.new(env)
+    req.host.should.equal ""
+  end
+
+  should "figure out the correct port" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "www2.example.org")
+    req.port.should.equal 80
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "www2.example.org:81")
+    req.port.should.equal 81
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "SERVER_NAME" => "example.org", "SERVER_PORT" => "9292")
+    req.port.should.equal 9292
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org:9292")
+    req.port.should.equal 9292
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org")
+    req.port.should.equal 80
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org", "HTTP_X_FORWARDED_SSL" => "on")
+    req.port.should.equal 443
+
+     req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org", "HTTP_X_FORWARDED_PROTO" => "https")
+    req.port.should.equal 443
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org", "HTTP_X_FORWARDED_PORT" => "9393")
+    req.port.should.equal 9393
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org:9393", "SERVER_PORT" => "80")
+    req.port.should.equal 9393
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org", "SERVER_PORT" => "9393")
+    req.port.should.equal 80
+  end
+
+  should "figure out the correct host with port" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "www2.example.org")
+    req.host_with_port.should.equal "www2.example.org"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81")
+    req.host_with_port.should.equal "localhost:81"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "SERVER_NAME" => "example.org", "SERVER_PORT" => "9292")
+    req.host_with_port.should.equal "example.org:9292"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org:9292")
+    req.host_with_port.should.equal "example.org:9292"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org", "SERVER_PORT" => "9393")
+    req.host_with_port.should.equal "example.org"
+  end
+
+  should "parse the query string" do
+    req = Rack::Request.new(Rack::MockRequest.env_for("/?foo=bar&quux=bla"))
+    req.query_string.should.equal "foo=bar&quux=bla"
+    req.GET.should.equal "foo" => "bar", "quux" => "bla"
+    req.POST.should.be.empty
+    req.params.should.equal "foo" => "bar", "quux" => "bla"
+  end
+
+  should "limit the keys from the GET query string" do
+    env = Rack::MockRequest.env_for("/?foo=bar")
+
+    old, Rack::Utils.key_space_limit = Rack::Utils.key_space_limit, 1
+    begin
+      req = Rack::Request.new(env)
+      lambda { req.GET }.should.raise(RangeError)
+    ensure
+      Rack::Utils.key_space_limit = old
+    end
+  end
+
+  should "limit the key size per nested params hash" do
+    nested_query = Rack::MockRequest.env_for("/?foo[bar][baz][qux]=1")
+    plain_query  = Rack::MockRequest.env_for("/?foo_bar__baz__qux_=1")
+
+    old, Rack::Utils.key_space_limit = Rack::Utils.key_space_limit, 3
+    begin
+      lambda { Rack::Request.new(nested_query).GET }.should.not.raise(RangeError)
+      lambda { Rack::Request.new(plain_query).GET  }.should.raise(RangeError)
+    ensure
+      Rack::Utils.key_space_limit = old
+    end
+  end
+
+  should "not unify GET and POST when calling params" do
+    mr = Rack::MockRequest.env_for("/?foo=quux",
+      "REQUEST_METHOD" => 'POST',
+      :input => "foo=bar&quux=bla"
+    )
+    req = Rack::Request.new mr
+
+    req.params
+
+    req.GET.should.equal "foo" => "quux"
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+    req.params.should.equal req.GET.merge(req.POST)
+  end
+
+  should "raise if rack.input is missing" do
+    req = Rack::Request.new({})
+    lambda { req.POST }.should.raise(RuntimeError)
+  end
+
+  should "parse POST data when method is POST and no Content-Type given" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/?foo=quux",
+        "REQUEST_METHOD" => 'POST',
+        :input => "foo=bar&quux=bla")
+    req.content_type.should.be.nil
+    req.media_type.should.be.nil
+    req.query_string.should.equal "foo=quux"
+    req.GET.should.equal "foo" => "quux"
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+    req.params.should.equal "foo" => "bar", "quux" => "bla"
+  end
+
+  should "limit the keys from the POST form data" do
+    env = Rack::MockRequest.env_for("",
+            "REQUEST_METHOD" => 'POST',
+            :input => "foo=bar&quux=bla")
+
+    old, Rack::Utils.key_space_limit = Rack::Utils.key_space_limit, 1
+    begin
+      req = Rack::Request.new(env)
+      lambda { req.POST }.should.raise(RangeError)
+    ensure
+      Rack::Utils.key_space_limit = old
+    end
+  end
+
+  should "parse POST data with explicit content type regardless of method" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/",
+        "CONTENT_TYPE" => 'application/x-www-form-urlencoded;foo=bar',
+        :input => "foo=bar&quux=bla")
+    req.content_type.should.equal 'application/x-www-form-urlencoded;foo=bar'
+    req.media_type.should.equal 'application/x-www-form-urlencoded'
+    req.media_type_params['foo'].should.equal 'bar'
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+    req.params.should.equal "foo" => "bar", "quux" => "bla"
+  end
+
+  should "not parse POST data when media type is not form-data" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/?foo=quux",
+        "REQUEST_METHOD" => 'POST',
+        "CONTENT_TYPE" => 'text/plain;charset=utf-8',
+        :input => "foo=bar&quux=bla")
+    req.content_type.should.equal 'text/plain;charset=utf-8'
+    req.media_type.should.equal 'text/plain'
+    req.media_type_params['charset'].should.equal 'utf-8'
+    req.POST.should.be.empty
+    req.params.should.equal "foo" => "quux"
+    req.body.read.should.equal "foo=bar&quux=bla"
+  end
+
+  should "parse POST data on PUT when media type is form-data" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/?foo=quux",
+        "REQUEST_METHOD" => 'PUT',
+        "CONTENT_TYPE" => 'application/x-www-form-urlencoded',
+        :input => "foo=bar&quux=bla")
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+    req.body.read.should.equal "foo=bar&quux=bla"
+  end
+
+  should "rewind input after parsing POST data" do
+    input = StringIO.new("foo=bar&quux=bla")
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/",
+        "CONTENT_TYPE" => 'application/x-www-form-urlencoded;foo=bar',
+        :input => input)
+    req.params.should.equal "foo" => "bar", "quux" => "bla"
+    input.read.should.equal "foo=bar&quux=bla"
+  end
+
+  should "clean up Safari's ajax POST body" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/",
+        'REQUEST_METHOD' => 'POST', :input => "foo=bar&quux=bla\0")
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+  end
+
+  should "get value by key from params with #[]" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("?foo=quux")
+    req['foo'].should.equal 'quux'
+    req[:foo].should.equal 'quux'
+  end
+
+  should "set value to key on params with #[]=" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("?foo=duh")
+    req['foo'].should.equal 'duh'
+    req[:foo].should.equal 'duh'
+    req.params.should.equal 'foo' => 'duh'
+
+    req['foo'] = 'bar'
+    req.params.should.equal 'foo' => 'bar'
+    req['foo'].should.equal 'bar'
+    req[:foo].should.equal 'bar'
+
+    req[:foo] = 'jaz'
+    req.params.should.equal 'foo' => 'jaz'
+    req['foo'].should.equal 'jaz'
+    req[:foo].should.equal 'jaz'
+  end
+
+  should "return values for the keys in the order given from values_at" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("?foo=baz&wun=der&bar=ful")
+    req.values_at('foo').should.equal ['baz']
+    req.values_at('foo', 'wun').should.equal ['baz', 'der']
+    req.values_at('bar', 'foo', 'wun').should.equal ['ful', 'baz', 'der']
+  end
+
+  should "extract referrer correctly" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_REFERER" => "/some/path")
+    req.referer.should.equal "/some/path"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/")
+    req.referer.should.equal nil
+  end
+
+  should "extract user agent correctly" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_USER_AGENT" => "Mozilla/4.0 (compatible)")
+    req.user_agent.should.equal "Mozilla/4.0 (compatible)"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/")
+    req.user_agent.should.equal nil
+  end
+
+  should "treat missing content type as nil" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/")
+    req.content_type.should.equal nil
+  end
+
+  should "treat empty content type as nil" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "CONTENT_TYPE" => "")
+    req.content_type.should.equal nil
+  end
+
+  should "return nil media type for empty content type" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "CONTENT_TYPE" => "")
+    req.media_type.should.equal nil
+  end
+
+  should "cache, but invalidates the cache" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/?foo=quux",
+        "CONTENT_TYPE" => "application/x-www-form-urlencoded",
+        :input => "foo=bar&quux=bla")
+    req.GET.should.equal "foo" => "quux"
+    req.GET.should.equal "foo" => "quux"
+    req.env["QUERY_STRING"] = "bla=foo"
+    req.GET.should.equal "bla" => "foo"
+    req.GET.should.equal "bla" => "foo"
+
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+    req.env["rack.input"] = StringIO.new("foo=bla&quux=bar")
+    req.POST.should.equal "foo" => "bla", "quux" => "bar"
+    req.POST.should.equal "foo" => "bla", "quux" => "bar"
+  end
+
+  should "figure out if called via XHR" do
+    req = Rack::Request.new(Rack::MockRequest.env_for(""))
+    req.should.not.be.xhr
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("", "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest")
+    req.should.be.xhr
+  end
+
+  should "ssl detection" do
+    request = Rack::Request.new(Rack::MockRequest.env_for("/"))
+    request.scheme.should.equal "http"
+    request.should.not.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTPS' => 'on'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'rack.url_scheme' => 'https'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_HOST' => 'www.example.org:8080'))
+    request.scheme.should.equal "http"
+    request.should.not.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_HOST' => 'www.example.org:8443', 'HTTPS' => 'on'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_HOST' => 'www.example.org:8443', 'HTTP_X_FORWARDED_SSL' => 'on'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_X_FORWARDED_SCHEME' => 'https'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_X_FORWARDED_PROTO' => 'https'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_X_FORWARDED_PROTO' => 'https, http, http'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+  end
+
+  should "parse cookies" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("", "HTTP_COOKIE" => "foo=bar;quux=h&m")
+    req.cookies.should.equal "foo" => "bar", "quux" => "h&m"
+    req.cookies.should.equal "foo" => "bar", "quux" => "h&m"
+    req.env.delete("HTTP_COOKIE")
+    req.cookies.should.equal({})
+  end
+
+  should "always return the same hash object" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("", "HTTP_COOKIE" => "foo=bar;quux=h&m")
+    hash = req.cookies
+    req.env.delete("HTTP_COOKIE")
+    req.cookies.should.equal(hash)
+    req.env["HTTP_COOKIE"] = "zoo=m"
+    req.cookies.should.equal(hash)
+  end
+
+  should "modify the cookies hash in place" do
+    req = Rack::Request.new(Rack::MockRequest.env_for(""))
+    req.cookies.should.equal({})
+    req.cookies['foo'] = 'bar'
+    req.cookies.should.equal 'foo' => 'bar'
+  end
+
+  should "not modify the params hash in place" do
+    e = Rack::MockRequest.env_for("")
+    req1 = Rack::Request.new(e)
+    req1.params.should.equal({})
+    req1.params['foo'] = 'bar'
+    req1.params.should.equal 'foo' => 'bar'
+    req2 = Rack::Request.new(e)
+    req2.params.should.equal({})
+  end
+
+  should "modify params hash if param is in GET" do
+    e = Rack::MockRequest.env_for("?foo=duh")
+    req1 = Rack::Request.new(e)
+    req1.params.should.equal 'foo' => 'duh'
+    req1.update_param 'foo', 'bar'
+    req1.params.should.equal 'foo' => 'bar'
+    req2 = Rack::Request.new(e)
+    req2.params.should.equal 'foo' => 'bar'
+  end
+
+  should "modify params hash if param is in POST" do
+    e = Rack::MockRequest.env_for("", "REQUEST_METHOD" => 'POST', :input => 'foo=duh')
+    req1 = Rack::Request.new(e)
+    req1.params.should.equal 'foo' => 'duh'
+    req1.update_param 'foo', 'bar'
+    req1.params.should.equal 'foo' => 'bar'
+    req2 = Rack::Request.new(e)
+    req2.params.should.equal 'foo' => 'bar'
+  end
+
+  should "modify params hash, even if param didn't exist before" do
+    e = Rack::MockRequest.env_for("")
+    req1 = Rack::Request.new(e)
+    req1.params.should.equal({})
+    req1.update_param 'foo', 'bar'
+    req1.params.should.equal 'foo' => 'bar'
+    req2 = Rack::Request.new(e)
+    req2.params.should.equal 'foo' => 'bar'
+  end
+
+  should "modify params hash by changing only GET" do
+    e = Rack::MockRequest.env_for("?foo=duhget")
+    req = Rack::Request.new(e)
+    req.GET.should.equal 'foo' => 'duhget'
+    req.POST.should.equal({})
+    req.update_param 'foo', 'bar'
+    req.GET.should.equal 'foo' => 'bar'
+    req.POST.should.equal({})
+  end
+
+  should "modify params hash by changing only POST" do
+    e = Rack::MockRequest.env_for("", "REQUEST_METHOD" => 'POST', :input => "foo=duhpost")
+    req = Rack::Request.new(e)
+    req.GET.should.equal({})
+    req.POST.should.equal 'foo' => 'duhpost'
+    req.update_param 'foo', 'bar'
+    req.GET.should.equal({})
+    req.POST.should.equal 'foo' => 'bar'
+  end
+
+  should "modify params hash, even if param is defined in both POST and GET" do
+    e = Rack::MockRequest.env_for("?foo=duhget", "REQUEST_METHOD" => 'POST', :input => "foo=duhpost")
+    req1 = Rack::Request.new(e)
+    req1.GET.should.equal 'foo' => 'duhget'
+    req1.POST.should.equal 'foo' => 'duhpost'
+    req1.params.should.equal 'foo' => 'duhpost'
+    req1.update_param 'foo', 'bar'
+    req1.GET.should.equal 'foo' => 'bar'
+    req1.POST.should.equal 'foo' => 'bar'
+    req1.params.should.equal 'foo' => 'bar'
+    req2 = Rack::Request.new(e)
+    req2.GET.should.equal 'foo' => 'bar'
+    req2.POST.should.equal 'foo' => 'bar'
+    req2.params.should.equal 'foo' => 'bar'
+    req2.params.should.equal 'foo' => 'bar'
+  end
+
+  should "allow deleting from params hash if param is in GET" do
+    e = Rack::MockRequest.env_for("?foo=bar")
+    req1 = Rack::Request.new(e)
+    req1.params.should.equal 'foo' => 'bar'
+    req1.delete_param('foo').should.equal 'bar'
+    req1.params.should.equal({})
+    req2 = Rack::Request.new(e)
+    req2.params.should.equal({})
+  end
+
+  should "allow deleting from params hash if param is in POST" do
+    e = Rack::MockRequest.env_for("", "REQUEST_METHOD" => 'POST', :input => 'foo=bar')
+    req1 = Rack::Request.new(e)
+    req1.params.should.equal 'foo' => 'bar'
+    req1.delete_param('foo').should.equal 'bar'
+    req1.params.should.equal({})
+    req2 = Rack::Request.new(e)
+    req2.params.should.equal({})
+  end
+
+  should "pass through non-uri escaped cookies as-is" do
+    req = Rack::Request.new Rack::MockRequest.env_for("", "HTTP_COOKIE" => "foo=%")
+    req.cookies["foo"].should == "%"
+  end
+
+  should "parse cookies according to RFC 2109" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for('', 'HTTP_COOKIE' => 'foo=bar;foo=car')
+    req.cookies.should.equal 'foo' => 'bar'
+  end
+
+  should 'parse cookies with quotes' do
+    req = Rack::Request.new Rack::MockRequest.env_for('', {
+      'HTTP_COOKIE' => '$Version="1"; Customer="WILE_E_COYOTE"; $Path="/acme"; Part_Number="Rocket_Launcher_0001"; $Path="/acme"'
+    })
+    req.cookies.should.equal({
+      '$Version'    => '"1"',
+      'Customer'    => '"WILE_E_COYOTE"',
+      '$Path'       => '"/acme"',
+      'Part_Number' => '"Rocket_Launcher_0001"',
+    })
+  end
+
+  should "provide setters" do
+    req = Rack::Request.new(e=Rack::MockRequest.env_for(""))
+    req.script_name.should.equal ""
+    req.script_name = "/foo"
+    req.script_name.should.equal "/foo"
+    e["SCRIPT_NAME"].should.equal "/foo"
+
+    req.path_info.should.equal "/"
+    req.path_info = "/foo"
+    req.path_info.should.equal "/foo"
+    e["PATH_INFO"].should.equal "/foo"
+  end
+
+  should "provide the original env" do
+    req = Rack::Request.new(e = Rack::MockRequest.env_for(""))
+    req.env.should == e
+  end
+
+  should "restore the base URL" do
+    Rack::Request.new(Rack::MockRequest.env_for("")).base_url.
+      should.equal "http://example.org"
+    Rack::Request.new(Rack::MockRequest.env_for("", "SCRIPT_NAME" => "/foo")).base_url.
+      should.equal "http://example.org"
+  end
+
+  should "restore the URL" do
+    Rack::Request.new(Rack::MockRequest.env_for("")).url.
+      should.equal "http://example.org/"
+    Rack::Request.new(Rack::MockRequest.env_for("", "SCRIPT_NAME" => "/foo")).url.
+      should.equal "http://example.org/foo/"
+    Rack::Request.new(Rack::MockRequest.env_for("/foo")).url.
+      should.equal "http://example.org/foo"
+    Rack::Request.new(Rack::MockRequest.env_for("?foo")).url.
+      should.equal "http://example.org/?foo"
+    Rack::Request.new(Rack::MockRequest.env_for("http://example.org:8080/")).url.
+      should.equal "http://example.org:8080/"
+    Rack::Request.new(Rack::MockRequest.env_for("https://example.org/")).url.
+      should.equal "https://example.org/"
+    Rack::Request.new(Rack::MockRequest.env_for("coffee://example.org/")).url.
+      should.equal "coffee://example.org/"
+    Rack::Request.new(Rack::MockRequest.env_for("coffee://example.org:443/")).url.
+      should.equal "coffee://example.org:443/"
+    Rack::Request.new(Rack::MockRequest.env_for("https://example.com:8080/foo?foo")).url.
+      should.equal "https://example.com:8080/foo?foo"
+  end
+
+  should "restore the full path" do
+    Rack::Request.new(Rack::MockRequest.env_for("")).fullpath.
+      should.equal "/"
+    Rack::Request.new(Rack::MockRequest.env_for("", "SCRIPT_NAME" => "/foo")).fullpath.
+      should.equal "/foo/"
+    Rack::Request.new(Rack::MockRequest.env_for("/foo")).fullpath.
+      should.equal "/foo"
+    Rack::Request.new(Rack::MockRequest.env_for("?foo")).fullpath.
+      should.equal "/?foo"
+    Rack::Request.new(Rack::MockRequest.env_for("http://example.org:8080/")).fullpath.
+      should.equal "/"
+    Rack::Request.new(Rack::MockRequest.env_for("https://example.org/")).fullpath.
+      should.equal "/"
+
+    Rack::Request.new(Rack::MockRequest.env_for("https://example.com:8080/foo?foo")).fullpath.
+      should.equal "/foo?foo"
+  end
+
+  should "handle multiple media type parameters" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/",
+        "CONTENT_TYPE" => 'text/plain; foo=BAR,baz=bizzle dizzle;BLING=bam')
+      req.should.not.be.form_data
+      req.media_type_params.should.include 'foo'
+      req.media_type_params['foo'].should.equal 'BAR'
+      req.media_type_params.should.include 'baz'
+      req.media_type_params['baz'].should.equal 'bizzle dizzle'
+      req.media_type_params.should.not.include 'BLING'
+      req.media_type_params.should.include 'bling'
+      req.media_type_params['bling'].should.equal 'bam'
+  end
+
+  should "parse with junk before boundry" do
+    # Adapted from RFC 1867.
+    input = <<EOF
+blah blah\r
+\r
+--AaB03x\r
+content-disposition: form-data; name="reply"\r
+\r
+yes\r
+--AaB03x\r
+content-disposition: form-data; name="fileupload"; filename="dj.jpg"\r
+Content-Type: image/jpeg\r
+Content-Transfer-Encoding: base64\r
+\r
+/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg\r
+--AaB03x--\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    req.POST.should.include "fileupload"
+    req.POST.should.include "reply"
+
+    req.should.be.form_data
+    req.content_length.should.equal input.size
+    req.media_type.should.equal 'multipart/form-data'
+    req.media_type_params.should.include 'boundary'
+    req.media_type_params['boundary'].should.equal 'AaB03x'
+
+    req.POST["reply"].should.equal "yes"
+
+    f = req.POST["fileupload"]
+    f.should.be.kind_of Hash
+    f[:type].should.equal "image/jpeg"
+    f[:filename].should.equal "dj.jpg"
+    f.should.include :tempfile
+    f[:tempfile].size.should.equal 76
+  end
+
+  should "not infinite loop with a malformed HTTP request" do
+    # Adapted from RFC 1867.
+    input = <<EOF
+--AaB03x
+content-disposition: form-data; name="reply"
+
+yes
+--AaB03x
+content-disposition: form-data; name="fileupload"; filename="dj.jpg"
+Content-Type: image/jpeg
+Content-Transfer-Encoding: base64
+
+/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg
+--AaB03x--
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    lambda{req.POST}.should.raise(EOFError)
+  end
+
+
+  should "parse multipart form data" do
+    # Adapted from RFC 1867.
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="reply"\r
+\r
+yes\r
+--AaB03x\r
+content-disposition: form-data; name="fileupload"; filename="dj.jpg"\r
+Content-Type: image/jpeg\r
+Content-Transfer-Encoding: base64\r
+\r
+/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg\r
+--AaB03x--\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    req.POST.should.include "fileupload"
+    req.POST.should.include "reply"
+
+    req.should.be.form_data
+    req.content_length.should.equal input.size
+    req.media_type.should.equal 'multipart/form-data'
+    req.media_type_params.should.include 'boundary'
+    req.media_type_params['boundary'].should.equal 'AaB03x'
+
+    req.POST["reply"].should.equal "yes"
+
+    f = req.POST["fileupload"]
+    f.should.be.kind_of Hash
+    f[:type].should.equal "image/jpeg"
+    f[:filename].should.equal "dj.jpg"
+    f.should.include :tempfile
+    f[:tempfile].size.should.equal 76
+  end
+
+  should "parse big multipart form data" do
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="huge"; filename="huge"\r
+\r
+#{"x"*32768}\r
+--AaB03x\r
+content-disposition: form-data; name="mean"; filename="mean"\r
+\r
+--AaB03xha\r
+--AaB03x--\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    req.POST["huge"][:tempfile].size.should.equal 32768
+    req.POST["mean"][:tempfile].size.should.equal 10
+    req.POST["mean"][:tempfile].read.should.equal "--AaB03xha"
+  end
+
+  should "detect invalid multipart form data" do
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="huge"; filename="huge"\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    lambda { req.POST }.should.raise(EOFError)
+
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="huge"; filename="huge"\r
+\r
+foo\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    lambda { req.POST }.should.raise(EOFError)
+
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="huge"; filename="huge"\r
+\r
+foo\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    lambda { req.POST }.should.raise(EOFError)
+  end
+
+  should "correctly parse the part name from Content-Id header" do
+    input = <<EOF
+--AaB03x\r
+Content-Type: text/xml; charset=utf-8\r
+Content-Id: <soap-start>\r
+Content-Transfer-Encoding: 7bit\r
+\r
+foo\r
+--AaB03x--\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/related, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    req.params.keys.should.equal ["<soap-start>"]
+  end
+
+  should "not try to interpret binary as utf8" do
+    if /regexp/.respond_to?(:kcode) # < 1.9
+      begin
+        original_kcode = $KCODE
+        $KCODE='UTF8'
+
+        input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="fileupload"; filename="junk.a"\r
+content-type: application/octet-stream\r
+\r
+#{[0x36,0xCF,0x0A,0xF8].pack('c*')}\r
+--AaB03x--\r
+EOF
+
+        req = Rack::Request.new Rack::MockRequest.env_for("/",
+                          "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                          "CONTENT_LENGTH" => input.size,
+                          :input => input)
+
+        lambda{req.POST}.should.not.raise(EOFError)
+        req.POST["fileupload"][:tempfile].size.should.equal 4
+      ensure
+        $KCODE = original_kcode
+      end
+    else # >= 1.9
+        input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="fileupload"; filename="junk.a"\r
+content-type: application/octet-stream\r
+\r
+#{[0x36,0xCF,0x0A,0xF8].pack('c*')}\r
+--AaB03x--\r
+EOF
+
+      req = Rack::Request.new Rack::MockRequest.env_for("/",
+                        "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                        "CONTENT_LENGTH" => input.size,
+                        :input => input)
+
+      lambda{req.POST}.should.not.raise(EOFError)
+      req.POST["fileupload"][:tempfile].size.should.equal 4
+    end
+  end
+
+  should "work around buggy 1.8.* Tempfile equality" do
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="huge"; filename="huge"\r
+\r
+foo\r
+--AaB03x--
+EOF
+
+    rack_input = Tempfile.new("rackspec")
+    rack_input.write(input)
+    rack_input.rewind
+
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => rack_input)
+
+    lambda{ req.POST }.should.not.raise
+    lambda{ req.POST }.should.not.raise("input re-processed!")
+  end
+
+  should "conform to the Rack spec" do
+    app = lambda { |env|
+      content = Rack::Request.new(env).POST["file"].inspect
+      size = content.respond_to?(:bytesize) ? content.bytesize : content.size
+      [200, {"Content-Type" => "text/html", "Content-Length" => size.to_s}, [content]]
+    }
+
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="reply"\r
+\r
+yes\r
+--AaB03x\r
+content-disposition: form-data; name="fileupload"; filename="dj.jpg"\r
+Content-Type: image/jpeg\r
+Content-Transfer-Encoding: base64\r
+\r
+/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg\r
+--AaB03x--\r
+EOF
+    input.force_encoding("ASCII-8BIT") if input.respond_to? :force_encoding
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).get "/",
+      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+      "CONTENT_LENGTH" => input.size.to_s, "rack.input" => StringIO.new(input)
+
+    res.should.be.ok
+  end
+
+  should "parse Accept-Encoding correctly" do
+    parser = lambda do |x|
+      Rack::Request.new(Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => x)).accept_encoding
+    end
+
+    parser.call(nil).should.equal([])
+
+    parser.call("compress, gzip").should.equal([["compress", 1.0], ["gzip", 1.0]])
+    parser.call("").should.equal([])
+    parser.call("*").should.equal([["*", 1.0]])
+    parser.call("compress;q=0.5, gzip;q=1.0").should.equal([["compress", 0.5], ["gzip", 1.0]])
+    parser.call("gzip;q=1.0, identity; q=0.5, *;q=0").should.equal([["gzip", 1.0], ["identity", 0.5], ["*", 0] ])
+
+    parser.call("gzip ; q=0.9").should.equal([["gzip", 0.9]])
+    parser.call("gzip ; deflate").should.equal([["gzip", 1.0]])
+  end
+
+  ip_app = lambda { |env|
+    request = Rack::Request.new(env)
+    response = Rack::Response.new
+    response.write request.ip
+    response.finish
+  }
+
+  should 'provide ip information' do
+    mock = Rack::MockRequest.new(Rack::Lint.new(ip_app))
+
+    res = mock.get '/', 'REMOTE_ADDR' => '1.2.3.4'
+    res.body.should.equal '1.2.3.4'
+
+    res = mock.get '/', 'REMOTE_ADDR' => 'fe80::202:b3ff:fe1e:8329'
+    res.body.should.equal 'fe80::202:b3ff:fe1e:8329'
+
+    res = mock.get '/', 'REMOTE_ADDR' => '1.2.3.4,3.4.5.6'
+    res.body.should.equal '1.2.3.4'
+  end
+
+  should 'deals with proxies' do
+    mock = Rack::MockRequest.new(Rack::Lint.new(ip_app))
+
+    res = mock.get '/',
+      'REMOTE_ADDR' => '1.2.3.4',
+      'HTTP_X_FORWARDED_FOR' => '3.4.5.6'
+    res.body.should.equal '1.2.3.4'
+
+    res = mock.get '/',
+      'REMOTE_ADDR' => '1.2.3.4',
+      'HTTP_X_FORWARDED_FOR' => 'unknown'
+    res.body.should.equal '1.2.3.4'
+
+    res = mock.get '/',
+      'REMOTE_ADDR' => '127.0.0.1',
+      'HTTP_X_FORWARDED_FOR' => '3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => 'unknown,3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '192.168.0.1,3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '10.0.0.1,3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '10.0.0.1, 10.0.0.1, 3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '127.0.0.1, 3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => 'unknown,192.168.0.1'
+    res.body.should.equal 'unknown'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => 'other,unknown,192.168.0.1'
+    res.body.should.equal 'unknown'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => 'unknown,localhost,192.168.0.1'
+    res.body.should.equal 'unknown'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '9.9.9.9, 3.4.5.6, 10.0.0.1, 172.31.4.4'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '::1,2620:0:1c00:0:812c:9583:754b:ca11'
+    res.body.should.equal '2620:0:1c00:0:812c:9583:754b:ca11'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '2620:0:1c00:0:812c:9583:754b:ca11,::1'
+    res.body.should.equal '2620:0:1c00:0:812c:9583:754b:ca11'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => 'fd5b:982e:9130:247f:0000:0000:0000:0000,2620:0:1c00:0:812c:9583:754b:ca11'
+    res.body.should.equal '2620:0:1c00:0:812c:9583:754b:ca11'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '2620:0:1c00:0:812c:9583:754b:ca11,fd5b:982e:9130:247f:0000:0000:0000:0000'
+    res.body.should.equal '2620:0:1c00:0:812c:9583:754b:ca11'
+
+    res = mock.get '/',
+      'HTTP_X_FORWARDED_FOR' => '1.1.1.1, 127.0.0.1',
+      'HTTP_CLIENT_IP' => '1.1.1.1'
+    res.body.should.equal '1.1.1.1'
+
+    # Spoofing attempt
+    res = mock.get '/',
+      'HTTP_X_FORWARDED_FOR' => '1.1.1.1',
+      'HTTP_CLIENT_IP' => '2.2.2.2'
+    res.body.should.equal '1.1.1.1'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '8.8.8.8, 9.9.9.9'
+    res.body.should.equal '9.9.9.9'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '8.8.8.8, fe80::202:b3ff:fe1e:8329'
+    res.body.should.equal 'fe80::202:b3ff:fe1e:8329'
+
+    # Unix Sockets
+    res = mock.get '/',
+      'REMOTE_ADDR' => 'unix',
+      'HTTP_X_FORWARDED_FOR' => '3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/',
+      'REMOTE_ADDR' => 'unix:/tmp/foo',
+      'HTTP_X_FORWARDED_FOR' => '3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+  end
+
+  should "regard local addresses as proxies" do
+    req = Rack::Request.new(Rack::MockRequest.env_for("/"))
+    req.trusted_proxy?('127.0.0.1').should.equal 0
+    req.trusted_proxy?('10.0.0.1').should.equal 0
+    req.trusted_proxy?('172.16.0.1').should.equal 0
+    req.trusted_proxy?('172.20.0.1').should.equal 0
+    req.trusted_proxy?('172.30.0.1').should.equal 0
+    req.trusted_proxy?('172.31.0.1').should.equal 0
+    req.trusted_proxy?('192.168.0.1').should.equal 0
+    req.trusted_proxy?('::1').should.equal 0
+    req.trusted_proxy?('fd00::').should.equal 0
+    req.trusted_proxy?('localhost').should.equal 0
+    req.trusted_proxy?('unix').should.equal 0
+    req.trusted_proxy?('unix:/tmp/sock').should.equal 0
+
+    req.trusted_proxy?("unix.example.org").should.equal nil
+    req.trusted_proxy?("example.org\n127.0.0.1").should.equal nil
+    req.trusted_proxy?("127.0.0.1\nexample.org").should.equal nil
+    req.trusted_proxy?("11.0.0.1").should.equal nil
+    req.trusted_proxy?("172.15.0.1").should.equal nil
+    req.trusted_proxy?("172.32.0.1").should.equal nil
+    req.trusted_proxy?("2001:470:1f0b:18f8::1").should.equal nil
+  end
+
+  class MyRequest < Rack::Request
+    def params
+      {:foo => "bar"}
+    end
+  end
+
+  should "allow subclass request to be instantiated after parent request" do
+    env = Rack::MockRequest.env_for("/?foo=bar")
+
+    req1 = Rack::Request.new(env)
+    req1.GET.should.equal "foo" => "bar"
+    req1.params.should.equal "foo" => "bar"
+
+    req2 = MyRequest.new(env)
+    req2.GET.should.equal "foo" => "bar"
+    req2.params.should.equal :foo => "bar"
+  end
+
+  should "allow parent request to be instantiated after subclass request" do
+    env = Rack::MockRequest.env_for("/?foo=bar")
+
+    req1 = MyRequest.new(env)
+    req1.GET.should.equal "foo" => "bar"
+    req1.params.should.equal :foo => "bar"
+
+    req2 = Rack::Request.new(env)
+    req2.GET.should.equal "foo" => "bar"
+    req2.params.should.equal "foo" => "bar"
+  end
+
+  (0x20...0x7E).collect { |a|
+    b = a.chr
+    c = CGI.escape(b)
+    should "not strip '#{a}' => '#{c}' => '#{b}' escaped character from parameters when accessed as string" do
+      url = "/?foo=#{c}bar#{c}"
+      env = Rack::MockRequest.env_for(url)
+      req2 = Rack::Request.new(env)
+      req2.GET.should.equal "foo" => "#{b}bar#{b}"
+      req2.params.should.equal "foo" => "#{b}bar#{b}"
+    end
+  }
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_response.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_response.rb
new file mode 100644
index 0000000..7ba1e0e
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_response.rb
@@ -0,0 +1,313 @@
+require 'rack/response'
+require 'stringio'
+
+describe Rack::Response do
+  should "have sensible default values" do
+    response = Rack::Response.new
+    status, header, body = response.finish
+    status.should.equal 200
+    header.should.equal({})
+    body.each { |part|
+      part.should.equal ""
+    }
+
+    response = Rack::Response.new
+    status, header, body = *response
+    status.should.equal 200
+    header.should.equal({})
+    body.each { |part|
+      part.should.equal ""
+    }
+  end
+
+  it "can be written to" do
+    response = Rack::Response.new
+
+    _, _, body = response.finish do
+      response.write "foo"
+      response.write "bar"
+      response.write "baz"
+    end
+
+    parts = []
+    body.each { |part| parts << part }
+
+    parts.should.equal ["foo", "bar", "baz"]
+  end
+
+  it "can set and read headers" do
+    response = Rack::Response.new
+    response["Content-Type"].should.equal nil
+    response["Content-Type"] = "text/plain"
+    response["Content-Type"].should.equal "text/plain"
+  end
+
+  it "can override the initial Content-Type with a different case" do
+    response = Rack::Response.new("", 200, "content-type" => "text/plain")
+    response["Content-Type"].should.equal "text/plain"
+  end
+
+  it "can set cookies" do
+    response = Rack::Response.new
+
+    response.set_cookie "foo", "bar"
+    response["Set-Cookie"].should.equal "foo=bar"
+    response.set_cookie "foo2", "bar2"
+    response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2"].join("\n")
+    response.set_cookie "foo3", "bar3"
+    response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2", "foo3=bar3"].join("\n")
+  end
+
+  it "can set cookies with the same name for multiple domains" do
+    response = Rack::Response.new
+    response.set_cookie "foo", {:value => "bar", :domain => "sample.example.com"}
+    response.set_cookie "foo", {:value => "bar", :domain => ".example.com"}
+    response["Set-Cookie"].should.equal ["foo=bar; domain=sample.example.com", "foo=bar; domain=.example.com"].join("\n")
+  end
+
+  it "formats the Cookie expiration date accordingly to RFC 6265" do
+    response = Rack::Response.new
+
+    response.set_cookie "foo", {:value => "bar", :expires => Time.now+10}
+    response["Set-Cookie"].should.match(
+      /expires=..., \d\d ... \d\d\d\d \d\d:\d\d:\d\d .../)
+  end
+
+  it "can set secure cookies" do
+    response = Rack::Response.new
+    response.set_cookie "foo", {:value => "bar", :secure => true}
+    response["Set-Cookie"].should.equal "foo=bar; secure"
+  end
+
+  it "can set http only cookies" do
+    response = Rack::Response.new
+    response.set_cookie "foo", {:value => "bar", :httponly => true}
+    response["Set-Cookie"].should.equal "foo=bar; HttpOnly"
+  end
+
+  it "can delete cookies" do
+    response = Rack::Response.new
+    response.set_cookie "foo", "bar"
+    response.set_cookie "foo2", "bar2"
+    response.delete_cookie "foo"
+    response["Set-Cookie"].should.equal [
+      "foo2=bar2",
+      "foo=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
+    ].join("\n")
+  end
+
+  it "can delete cookies with the same name from multiple domains" do
+    response = Rack::Response.new
+    response.set_cookie "foo", {:value => "bar", :domain => "sample.example.com"}
+    response.set_cookie "foo", {:value => "bar", :domain => ".example.com"}
+    response["Set-Cookie"].should.equal ["foo=bar; domain=sample.example.com", "foo=bar; domain=.example.com"].join("\n")
+    response.delete_cookie "foo", :domain => ".example.com"
+    response["Set-Cookie"].should.equal ["foo=bar; domain=sample.example.com", "foo=; domain=.example.com; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"].join("\n")
+    response.delete_cookie "foo", :domain => "sample.example.com"
+    response["Set-Cookie"].should.equal ["foo=; domain=.example.com; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000",
+                                         "foo=; domain=sample.example.com; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"].join("\n")
+  end
+
+  it "can delete cookies with the same name with different paths" do
+    response = Rack::Response.new
+    response.set_cookie "foo", {:value => "bar", :path => "/"}
+    response.set_cookie "foo", {:value => "bar", :path => "/path"}
+    response["Set-Cookie"].should.equal ["foo=bar; path=/",
+                                         "foo=bar; path=/path"].join("\n")
+
+    response.delete_cookie "foo", :path => "/path"
+    response["Set-Cookie"].should.equal ["foo=bar; path=/",
+                                         "foo=; path=/path; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"].join("\n")
+  end
+
+  it "can do redirects" do
+    response = Rack::Response.new
+    response.redirect "/foo"
+    status, header, body = response.finish
+    status.should.equal 302
+    header["Location"].should.equal "/foo"
+
+    response = Rack::Response.new
+    response.redirect "/foo", 307
+    status, header, body = response.finish
+
+    status.should.equal 307
+  end
+
+  it "has a useful constructor" do
+    r = Rack::Response.new("foo")
+    status, header, body = r.finish
+    str = ""; body.each { |part| str << part }
+    str.should.equal "foo"
+
+    r = Rack::Response.new(["foo", "bar"])
+    status, header, body = r.finish
+    str = ""; body.each { |part| str << part }
+    str.should.equal "foobar"
+
+    object_with_each = Object.new
+    def object_with_each.each
+      yield "foo"
+      yield "bar"
+    end
+    r = Rack::Response.new(object_with_each)
+    r.write "foo"
+    status, header, body = r.finish
+    str = ""; body.each { |part| str << part }
+    str.should.equal "foobarfoo"
+
+    r = Rack::Response.new([], 500)
+    r.status.should.equal 500
+
+    r = Rack::Response.new([], "200 OK")
+    r.status.should.equal 200
+  end
+
+  it "has a constructor that can take a block" do
+    r = Rack::Response.new { |res|
+      res.status = 404
+      res.write "foo"
+    }
+    status, _, body = r.finish
+    str = ""; body.each { |part| str << part }
+    str.should.equal "foo"
+    status.should.equal 404
+  end
+
+  it "doesn't return invalid responses" do
+    r = Rack::Response.new(["foo", "bar"], 204)
+    _, header, body = r.finish
+    str = ""; body.each { |part| str << part }
+    str.should.be.empty
+    header["Content-Type"].should.equal nil
+    header['Content-Length'].should.equal nil
+
+    lambda {
+      Rack::Response.new(Object.new)
+    }.should.raise(TypeError).
+      message.should =~ /stringable or iterable required/
+  end
+
+  it "knows if it's empty" do
+    r = Rack::Response.new
+    r.should.be.empty
+    r.write "foo"
+    r.should.not.be.empty
+
+    r = Rack::Response.new
+    r.should.be.empty
+    r.finish
+    r.should.be.empty
+
+    r = Rack::Response.new
+    r.should.be.empty
+    r.finish { }
+    r.should.not.be.empty
+  end
+
+  should "provide access to the HTTP status" do
+    res = Rack::Response.new
+    res.status = 200
+    res.should.be.successful
+    res.should.be.ok
+
+    res.status = 400
+    res.should.not.be.successful
+    res.should.be.client_error
+    res.should.be.bad_request
+
+    res.status = 404
+    res.should.not.be.successful
+    res.should.be.client_error
+    res.should.be.not_found
+
+    res.status = 405
+    res.should.not.be.successful
+    res.should.be.client_error
+    res.should.be.method_not_allowed
+
+    res.status = 422
+    res.should.not.be.successful
+    res.should.be.client_error
+    res.should.be.unprocessable
+
+    res.status = 501
+    res.should.not.be.successful
+    res.should.be.server_error
+
+    res.status = 307
+    res.should.be.redirect
+  end
+
+  should "provide access to the HTTP headers" do
+    res = Rack::Response.new
+    res["Content-Type"] = "text/yaml"
+
+    res.should.include "Content-Type"
+    res.headers["Content-Type"].should.equal "text/yaml"
+    res["Content-Type"].should.equal "text/yaml"
+    res.content_type.should.equal "text/yaml"
+    res.content_length.should.be.nil
+    res.location.should.be.nil
+  end
+
+  it "does not add or change Content-Length when #finish()ing" do
+    res = Rack::Response.new
+    res.status = 200
+    res.finish
+    res.headers["Content-Length"].should.be.nil
+
+    res = Rack::Response.new
+    res.status = 200
+    res.headers["Content-Length"] = "10"
+    res.finish
+    res.headers["Content-Length"].should.equal "10"
+  end
+
+  it "updates Content-Length when body appended to using #write" do
+    res = Rack::Response.new
+    res.status = 200
+    res.headers["Content-Length"].should.be.nil
+    res.write "Hi"
+    res.headers["Content-Length"].should.equal "2"
+    res.write " there"
+    res.headers["Content-Length"].should.equal "8"
+  end
+
+  it "calls close on #body" do
+    res = Rack::Response.new
+    res.body = StringIO.new
+    res.close
+    res.body.should.be.closed
+  end
+
+  it "calls close on #body when 204, 205, or 304" do
+    res = Rack::Response.new
+    res.body = StringIO.new
+    res.finish
+    res.body.should.not.be.closed
+
+    res.status = 204
+    _, _, b = res.finish
+    res.body.should.be.closed
+    b.should.not.equal res.body
+
+    res.body = StringIO.new
+    res.status = 205
+    _, _, b = res.finish
+    res.body.should.be.closed
+    b.should.not.equal res.body
+
+    res.body = StringIO.new
+    res.status = 304
+    _, _, b = res.finish
+    res.body.should.be.closed
+    b.should.not.equal res.body
+  end
+
+  it "wraps the body from #to_ary to prevent infinite loops" do
+    res = Rack::Response.new
+    res.finish.last.should.not.respond_to?(:to_ary)
+    lambda { res.finish.last.to_ary }.should.raise(NoMethodError)
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_rewindable_input.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_rewindable_input.rb
new file mode 100644
index 0000000..025d830
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_rewindable_input.rb
@@ -0,0 +1,118 @@
+require 'stringio'
+require 'rack/rewindable_input'
+
+shared "a rewindable IO object" do
+  before do
+    @rio = Rack::RewindableInput.new(@io)
+  end
+
+  should "be able to handle to read()" do
+    @rio.read.should.equal "hello world"
+  end
+
+  should "be able to handle to read(nil)" do
+    @rio.read(nil).should.equal "hello world"
+  end
+
+  should "be able to handle to read(length)" do
+    @rio.read(1).should.equal "h"
+  end
+
+  should "be able to handle to read(length, buffer)" do
+    buffer = ""
+    result = @rio.read(1, buffer)
+    result.should.equal "h"
+    result.object_id.should.equal buffer.object_id
+  end
+
+  should "be able to handle to read(nil, buffer)" do
+    buffer = ""
+    result = @rio.read(nil, buffer)
+    result.should.equal "hello world"
+    result.object_id.should.equal buffer.object_id
+  end
+
+  should "rewind to the beginning when #rewind is called" do
+    @rio.read(1)
+    @rio.rewind
+    @rio.read.should.equal "hello world"
+  end
+
+  should "be able to handle gets" do
+    @rio.gets.should == "hello world"
+  end
+
+  should "be able to handle each" do
+    array = []
+    @rio.each do |data|
+      array << data
+    end
+    array.should.equal(["hello world"])
+  end
+
+  should "not buffer into a Tempfile if no data has been read yet" do
+    @rio.instance_variable_get(:@rewindable_io).should.be.nil
+  end
+
+  should "buffer into a Tempfile when data has been consumed for the first time" do
+    @rio.read(1)
+    tempfile = @rio.instance_variable_get(:@rewindable_io)
+    tempfile.should.not.be.nil
+    @rio.read(1)
+    tempfile2 = @rio.instance_variable_get(:@rewindable_io)
+    tempfile2.path.should == tempfile.path
+  end
+
+  should "close the underlying tempfile upon calling #close" do
+    @rio.read(1)
+    tempfile = @rio.instance_variable_get(:@rewindable_io)
+    @rio.close
+    tempfile.should.be.closed
+  end
+
+  should "be possible to call #close when no data has been buffered yet" do
+    lambda{ @rio.close }.should.not.raise
+  end
+
+  should "be possible to call #close multiple times" do
+    lambda{
+      @rio.close
+      @rio.close
+    }.should.not.raise
+  end
+
+  @rio.close
+  @rio = nil
+end
+
+describe Rack::RewindableInput do
+  describe "given an IO object that is already rewindable" do
+    before do
+      @io = StringIO.new("hello world")
+    end
+
+    behaves_like "a rewindable IO object"
+  end
+
+  describe "given an IO object that is not rewindable" do
+    before do
+      @io = StringIO.new("hello world")
+      @io.instance_eval do
+        undef :rewind
+      end
+    end
+
+    behaves_like "a rewindable IO object"
+  end
+
+  describe "given an IO object whose rewind method raises Errno::ESPIPE" do
+    before do
+      @io = StringIO.new("hello world")
+      def @io.rewind
+        raise Errno::ESPIPE, "You can't rewind this!"
+      end
+    end
+
+    behaves_like "a rewindable IO object"
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_runtime.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_runtime.rb
new file mode 100644
index 0000000..f9897a1
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_runtime.rb
@@ -0,0 +1,49 @@
+require 'rack/lint'
+require 'rack/mock'
+require 'rack/runtime'
+
+describe Rack::Runtime do
+  def runtime_app(app, *args)
+    Rack::Lint.new Rack::Runtime.new(app, *args)
+  end
+  
+  def request
+    Rack::MockRequest.env_for
+  end
+  
+  it "sets X-Runtime is none is set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] }
+    response = runtime_app(app).call(request)
+    response[1]['X-Runtime'].should =~ /[\d\.]+/
+  end
+
+  it "doesn't set the X-Runtime if it is already set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', "X-Runtime" => "foobar"}, "Hello, World!"] }
+    response = runtime_app(app).call(request)
+    response[1]['X-Runtime'].should == "foobar"
+  end
+
+  should "allow a suffix to be set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] }
+    response = runtime_app(app, "Test").call(request)
+    response[1]['X-Runtime-Test'].should =~ /[\d\.]+/
+  end
+
+  should "allow multiple timers to be set" do
+    app = lambda { |env| sleep 0.1; [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] }
+    runtime = runtime_app(app, "App")
+
+    # wrap many times to guarantee a measurable difference
+    100.times do |i|
+      runtime = Rack::Runtime.new(runtime, i.to_s)
+    end
+    runtime = Rack::Runtime.new(runtime, "All")
+
+    response = runtime.call(request)
+
+    response[1]['X-Runtime-App'].should =~ /[\d\.]+/
+    response[1]['X-Runtime-All'].should =~ /[\d\.]+/
+
+    Float(response[1]['X-Runtime-All']).should > Float(response[1]['X-Runtime-App'])
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_sendfile.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_sendfile.rb
new file mode 100644
index 0000000..7c9acd6
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_sendfile.rb
@@ -0,0 +1,130 @@
+require 'fileutils'
+require 'rack/lint'
+require 'rack/sendfile'
+require 'rack/mock'
+require 'tmpdir'
+
+describe Rack::File do
+  should "respond to #to_path" do
+    Rack::File.new(Dir.pwd).should.respond_to :to_path
+  end
+end
+
+describe Rack::Sendfile do
+  def sendfile_body
+    FileUtils.touch File.join(Dir.tmpdir,  "rack_sendfile")
+    res = ['Hello World']
+    def res.to_path ; File.join(Dir.tmpdir,  "rack_sendfile") ; end
+    res
+  end
+
+  def simple_app(body=sendfile_body)
+    lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
+  end
+
+  def sendfile_app(body, mappings = [])
+    Rack::Lint.new Rack::Sendfile.new(simple_app(body), nil, mappings)
+  end
+
+  def request(headers={}, body=sendfile_body, mappings=[])
+    yield Rack::MockRequest.new(sendfile_app(body, mappings)).get('/', headers)
+  end
+
+  def open_file(path)
+    Class.new(File) do
+      unless method_defined?(:to_path)
+        alias :to_path :path
+      end
+    end.open(path, 'wb+')
+  end
+
+  it "does nothing when no X-Sendfile-Type header present" do
+    request do |response|
+      response.should.be.ok
+      response.body.should.equal 'Hello World'
+      response.headers.should.not.include 'X-Sendfile'
+    end
+  end
+
+  it "sets X-Sendfile response header and discards body" do
+    request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response|
+      response.should.be.ok
+      response.body.should.be.empty
+      response.headers['Content-Length'].should.equal '0'
+      response.headers['X-Sendfile'].should.equal File.join(Dir.tmpdir,  "rack_sendfile")
+    end
+  end
+
+  it "sets X-Lighttpd-Send-File response header and discards body" do
+    request 'HTTP_X_SENDFILE_TYPE' => 'X-Lighttpd-Send-File' do |response|
+      response.should.be.ok
+      response.body.should.be.empty
+      response.headers['Content-Length'].should.equal '0'
+      response.headers['X-Lighttpd-Send-File'].should.equal File.join(Dir.tmpdir,  "rack_sendfile")
+    end
+  end
+
+  it "sets X-Accel-Redirect response header and discards body" do
+    headers = {
+      'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect',
+      'HTTP_X_ACCEL_MAPPING' => "#{Dir.tmpdir}/=/foo/bar/"
+    }
+    request headers do |response|
+      response.should.be.ok
+      response.body.should.be.empty
+      response.headers['Content-Length'].should.equal '0'
+      response.headers['X-Accel-Redirect'].should.equal '/foo/bar/rack_sendfile'
+    end
+  end
+
+  it 'writes to rack.error when no X-Accel-Mapping is specified' do
+    request 'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect' do |response|
+      response.should.be.ok
+      response.body.should.equal 'Hello World'
+      response.headers.should.not.include 'X-Accel-Redirect'
+      response.errors.should.include 'X-Accel-Mapping'
+    end
+  end
+
+  it 'does nothing when body does not respond to #to_path' do
+    request({'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile'}, ['Not a file...']) do |response|
+      response.body.should.equal 'Not a file...'
+      response.headers.should.not.include 'X-Sendfile'
+    end
+  end
+
+  it "sets X-Accel-Redirect response header and discards body when initialized with multiple mappings" do
+    begin
+      dir1 = Dir.mktmpdir
+      dir2 = Dir.mktmpdir
+
+      first_body = open_file(File.join(dir1, 'rack_sendfile'))
+      first_body.puts 'hello world'
+
+      second_body = open_file(File.join(dir2, 'rack_sendfile'))
+      second_body.puts 'goodbye world'
+
+      mappings = [
+        ["#{dir1}/", '/foo/bar/'],
+        ["#{dir2}/", '/wibble/']
+      ]
+
+      request({'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect'}, first_body, mappings) do |response|
+        response.should.be.ok
+        response.body.should.be.empty
+        response.headers['Content-Length'].should.equal '0'
+        response.headers['X-Accel-Redirect'].should.equal '/foo/bar/rack_sendfile'
+      end
+
+      request({'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect'}, second_body, mappings) do |response|
+        response.should.be.ok
+        response.body.should.be.empty
+        response.headers['Content-Length'].should.equal '0'
+        response.headers['X-Accel-Redirect'].should.equal '/wibble/rack_sendfile'
+      end
+    ensure
+      FileUtils.remove_entry_secure dir1
+      FileUtils.remove_entry_secure dir2
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_server.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_server.rb
new file mode 100644
index 0000000..44d4bcb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_server.rb
@@ -0,0 +1,143 @@
+require 'rack'
+require 'rack/server'
+require 'tempfile'
+require 'socket'
+require 'open-uri'
+
+describe Rack::Server do
+
+  def app
+    lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['success']] }
+  end
+
+  def with_stderr
+    old, $stderr = $stderr, StringIO.new
+    yield $stderr
+  ensure
+    $stderr = old
+  end
+
+  it "overrides :config if :app is passed in" do
+    server = Rack::Server.new(:app => "FOO")
+    server.app.should.equal "FOO"
+  end
+
+  should "prefer to use :builder when it is passed in" do
+    server = Rack::Server.new(:builder => "run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['success']] }")
+    server.app.class.should.equal Proc
+    Rack::MockRequest.new(server.app).get("/").body.to_s.should.equal 'success'
+  end
+
+  should "not include Rack::Lint in deployment or none environments" do
+    server = Rack::Server.new(:app => 'foo')
+    server.middleware['deployment'].flatten.should.not.include(Rack::Lint)
+    server.middleware['none'].flatten.should.not.include(Rack::Lint)
+  end
+
+  should "not include Rack::ShowExceptions in deployment or none environments" do
+    server = Rack::Server.new(:app => 'foo')
+    server.middleware['deployment'].flatten.should.not.include(Rack::ShowExceptions)
+    server.middleware['none'].flatten.should.not.include(Rack::ShowExceptions)
+  end
+
+  should "support CGI" do
+    begin
+      o, ENV["REQUEST_METHOD"] = ENV["REQUEST_METHOD"], 'foo'
+      server = Rack::Server.new(:app => 'foo')
+      server.server.name =~ /CGI/
+      Rack::Server.logging_middleware.call(server).should.eql(nil)
+    ensure
+      ENV['REQUEST_METHOD'] = o
+    end
+  end
+
+  should "not force any middleware under the none configuration" do
+    server = Rack::Server.new(:app => 'foo')
+    server.middleware['none'].should.be.empty
+  end
+
+  should "use a full path to the pidfile" do
+    # avoids issues with daemonize chdir
+    opts = Rack::Server.new.send(:parse_options, %w[--pid testing.pid])
+    opts[:pid].should.eql(::File.expand_path('testing.pid'))
+  end
+
+  should "run a server" do
+    pidfile = Tempfile.open('pidfile') { |f| break f }.path
+    FileUtils.rm pidfile
+    server = Rack::Server.new(
+      :app         => app,
+      :environment => 'none',
+      :pid         => pidfile,
+      :Port        => TCPServer.open('127.0.0.1', 0){|s| s.addr[1] },
+      :Host        => '127.0.0.1',
+      :daemonize   => false,
+      :server      => 'webrick'
+    )
+    t = Thread.new { server.start { |s| Thread.current[:server] = s } }
+    t.join(0.01) until t[:server] && t[:server].status != :Stop
+    body = open("http://127.0.0.1:#{server.options[:Port]}/") { |f| f.read }
+    body.should.eql('success')
+
+    Process.kill(:INT, $$)
+    t.join
+    open(pidfile) { |f| f.read.should.eql $$.to_s }
+  end
+
+  should "check pid file presence and running process" do
+    pidfile = Tempfile.open('pidfile') { |f| f.write($$); break f }.path
+    server = Rack::Server.new(:pid => pidfile)
+    server.send(:pidfile_process_status).should.eql :running
+  end
+
+  should "check pid file presence and dead process" do
+    dead_pid = `echo $$`.to_i
+    pidfile = Tempfile.open('pidfile') { |f| f.write(dead_pid); break f }.path
+    server = Rack::Server.new(:pid => pidfile)
+    server.send(:pidfile_process_status).should.eql :dead
+  end
+
+  should "check pid file presence and exited process" do
+    pidfile = Tempfile.open('pidfile') { |f| break f }.path
+    ::File.delete(pidfile)
+    server = Rack::Server.new(:pid => pidfile)
+    server.send(:pidfile_process_status).should.eql :exited
+  end
+
+  should "check pid file presence and not owned process" do
+    pidfile = Tempfile.open('pidfile') { |f| f.write(1); break f }.path
+    server = Rack::Server.new(:pid => pidfile)
+    server.send(:pidfile_process_status).should.eql :not_owned
+  end
+
+  should "not write pid file when it is created after check" do
+    pidfile = Tempfile.open('pidfile') { |f| break f }.path
+    ::File.delete(pidfile)
+    server = Rack::Server.new(:pid => pidfile)
+    ::File.open(pidfile, 'w') { |f| f.write(1) }
+    with_stderr do |err|
+      should.raise(SystemExit) do
+        server.send(:write_pid)
+      end
+      err.rewind
+      output = err.read
+      output.should.match(/already running/)
+      output.should.include? pidfile
+    end
+  end
+
+  should "inform the user about existing pidfiles with running processes" do
+    pidfile = Tempfile.open('pidfile') { |f| f.write(1); break f }.path
+    server = Rack::Server.new(:pid => pidfile)
+    with_stderr do |err|
+      should.raise(SystemExit) do
+        server.start
+      end
+      err.rewind
+      output = err.read
+      output.should.match(/already running/)
+      output.should.include? pidfile
+    end
+  end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_session_abstract_id.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_session_abstract_id.rb
new file mode 100644
index 0000000..911f43b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_session_abstract_id.rb
@@ -0,0 +1,53 @@
+### WARNING: there be hax in this file.
+
+require 'rack/session/abstract/id'
+
+describe Rack::Session::Abstract::ID do
+  id = Rack::Session::Abstract::ID
+
+  def silence_warning
+    o, $VERBOSE = $VERBOSE, nil
+    yield
+  ensure
+    $VERBOSE = o
+  end
+
+  def reload_id
+    $".delete $".find { |part| part =~ %r{session/abstract/id.rb} }
+    silence_warning { require 'rack/session/abstract/id' }
+  end
+
+  should "use securerandom when available" do
+    begin
+      fake = false
+      silence_warning do
+        ::SecureRandom = fake = true unless defined?(SecureRandom)
+      end
+      reload_id
+      id::DEFAULT_OPTIONS[:secure_random].should.eql(fake || SecureRandom)
+    ensure
+      Object.send(:remove_const, :SecureRandom) if fake
+    end
+  end
+
+  should "not use securerandom when unavailable" do
+    begin
+      sr = Object.send(:remove_const, :SecureRandom) if defined?(SecureRandom)
+      reload_id
+      id::DEFAULT_OPTIONS[:secure_random].should.eql false
+    ensure
+      ::SecureRandom = sr if defined?(sr)
+    end
+  end
+
+  should "allow to use another securerandom provider" do
+    secure_random = Class.new do
+      def hex(*args)
+        'fake_hex'
+      end
+    end
+    id = Rack::Session::Abstract::ID.new nil, :secure_random => secure_random.new
+    id.send(:generate_sid).should.eql 'fake_hex'
+  end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_session_cookie.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_session_cookie.rb
new file mode 100644
index 0000000..8256f76
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_session_cookie.rb
@@ -0,0 +1,367 @@
+require 'rack/session/cookie'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Session::Cookie do
+  incrementor = lambda do |env|
+    env["rack.session"]["counter"] ||= 0
+    env["rack.session"]["counter"] += 1
+    hash = env["rack.session"].dup
+    hash.delete("session_id")
+    Rack::Response.new(hash.inspect).to_a
+  end
+  
+  session_id = lambda do |env|
+    Rack::Response.new(env["rack.session"].to_hash.inspect).to_a
+  end
+
+  session_option = lambda do |opt|
+    lambda do |env|
+      Rack::Response.new(env["rack.session.options"][opt].inspect).to_a
+    end
+  end
+
+  nothing = lambda do |env|
+    Rack::Response.new("Nothing").to_a
+  end
+
+  renewer = lambda do |env|
+    env["rack.session.options"][:renew] = true
+    Rack::Response.new("Nothing").to_a
+  end
+
+  only_session_id = lambda do |env|
+    Rack::Response.new(env["rack.session"]["session_id"].to_s).to_a
+  end
+
+  bigcookie = lambda do |env|
+    env["rack.session"]["cookie"] = "big" * 3000
+    Rack::Response.new(env["rack.session"].inspect).to_a
+  end
+
+  destroy_session = lambda do |env|
+    env["rack.session"].destroy
+    Rack::Response.new("Nothing").to_a
+  end
+
+  def response_for(options={})
+    request_options = options.fetch(:request, {})
+    cookie = if options[:cookie].is_a?(Rack::Response)
+      options[:cookie]["Set-Cookie"]
+    else
+      options[:cookie]
+    end
+    request_options["HTTP_COOKIE"] = cookie || ""
+
+    app_with_cookie = Rack::Session::Cookie.new(*options[:app])
+    app_with_cookie = Rack::Lint.new(app_with_cookie)
+    Rack::MockRequest.new(app_with_cookie).get("/", request_options)
+  end
+
+  before do
+    @warnings = warnings = []
+    Rack::Session::Cookie.class_eval do
+      define_method(:warn) { |m| warnings << m }
+    end
+  end
+
+  after do
+    Rack::Session::Cookie.class_eval { remove_method :warn }
+  end
+
+  describe 'Base64' do
+    it 'uses base64 to encode' do
+      coder = Rack::Session::Cookie::Base64.new
+      str   = 'fuuuuu'
+      coder.encode(str).should.equal [str].pack('m')
+    end
+
+    it 'uses base64 to decode' do
+      coder = Rack::Session::Cookie::Base64.new
+      str   = ['fuuuuu'].pack('m')
+      coder.decode(str).should.equal str.unpack('m').first
+    end
+
+    describe 'Marshal' do
+      it 'marshals and base64 encodes' do
+        coder = Rack::Session::Cookie::Base64::Marshal.new
+        str   = 'fuuuuu'
+        coder.encode(str).should.equal [::Marshal.dump(str)].pack('m')
+      end
+
+      it 'marshals and base64 decodes' do
+        coder = Rack::Session::Cookie::Base64::Marshal.new
+        str   = [::Marshal.dump('fuuuuu')].pack('m')
+        coder.decode(str).should.equal ::Marshal.load(str.unpack('m').first)
+      end
+
+      it 'rescues failures on decode' do
+        coder = Rack::Session::Cookie::Base64::Marshal.new
+        coder.decode('lulz').should.equal nil
+      end
+    end
+
+    describe 'JSON' do
+      it 'marshals and base64 encodes' do
+        coder = Rack::Session::Cookie::Base64::JSON.new
+        obj   = %w[fuuuuu]
+        coder.encode(obj).should.equal [::Rack::Utils::OkJson.encode(obj)].pack('m')
+      end
+
+      it 'marshals and base64 decodes' do
+        coder = Rack::Session::Cookie::Base64::JSON.new
+        str   = [::Rack::Utils::OkJson.encode(%w[fuuuuu])].pack('m')
+        coder.decode(str).should.equal ::Rack::Utils::OkJson.decode(str.unpack('m').first)
+      end
+
+      it 'rescues failures on decode' do
+        coder = Rack::Session::Cookie::Base64::JSON.new
+        coder.decode('lulz').should.equal nil
+      end
+    end
+  end
+
+  it "warns if no secret is given" do
+    cookie = Rack::Session::Cookie.new(incrementor)
+    @warnings.first.should =~ /no secret/i
+    @warnings.clear
+    cookie = Rack::Session::Cookie.new(incrementor, :secret => 'abc')
+    @warnings.should.be.empty?
+  end
+
+  it 'uses a coder' do
+    identity = Class.new {
+      attr_reader :calls
+
+      def initialize
+        @calls = []
+      end
+
+      def encode(str); @calls << :encode; str; end
+      def decode(str); @calls << :decode; str; end
+    }.new
+    response = response_for(:app => [incrementor, { :coder => identity }])
+
+    response["Set-Cookie"].should.include("rack.session=")
+    response.body.should.equal '{"counter"=>1}'
+    identity.calls.should.equal [:decode, :encode]
+  end
+
+  it "creates a new cookie" do
+    response = response_for(:app => incrementor)
+    response["Set-Cookie"].should.include("rack.session=")
+    response.body.should.equal '{"counter"=>1}'
+  end
+
+  it "loads from a cookie" do
+    response = response_for(:app => incrementor)
+
+    response = response_for(:app => incrementor, :cookie => response)
+    response.body.should.equal '{"counter"=>2}'
+
+    response = response_for(:app => incrementor, :cookie => response)
+    response.body.should.equal '{"counter"=>3}'
+  end
+
+  it "renew session id" do
+    response = response_for(:app => incrementor)
+    cookie   = response['Set-Cookie']
+    response = response_for(:app => only_session_id, :cookie => cookie)
+    cookie   = response['Set-Cookie'] if response['Set-Cookie']
+
+    response.body.should.not.equal ""
+    old_session_id = response.body
+
+    response = response_for(:app => renewer, :cookie => cookie)
+    cookie   = response['Set-Cookie'] if response['Set-Cookie']
+    response = response_for(:app => only_session_id, :cookie => cookie)
+
+    response.body.should.not.equal ""
+    response.body.should.not.equal old_session_id
+  end
+
+  it "destroys session" do
+    response = response_for(:app => incrementor)
+    response = response_for(:app => only_session_id, :cookie => response)
+
+    response.body.should.not.equal ""
+    old_session_id = response.body
+
+    response = response_for(:app => destroy_session, :cookie => response)
+    response = response_for(:app => only_session_id, :cookie => response)
+
+    response.body.should.not.equal ""
+    response.body.should.not.equal old_session_id
+  end
+
+  it "survives broken cookies" do
+    response = response_for(
+      :app => incrementor,
+      :cookie => "rack.session=blarghfasel"
+    )
+    response.body.should.equal '{"counter"=>1}'
+
+    response = response_for(
+      :app => [incrementor, { :secret => "test" }],
+      :cookie => "rack.session="
+    )
+    response.body.should.equal '{"counter"=>1}'
+  end
+
+  it "barks on too big cookies" do
+    lambda{
+      response_for(:app => bigcookie, :request => { :fatal => true })
+    }.should.raise(Rack::MockRequest::FatalWarning)
+  end
+
+  it "loads from a cookie with integrity hash" do
+    app = [incrementor, { :secret => "test" }]
+
+    response = response_for(:app => app)
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>2}'
+
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>3}'
+
+    app = [incrementor, { :secret => "other" }]
+
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>1}'
+  end
+
+  it "loads from a cookie wih accept-only integrity hash for graceful key rotation" do
+    response = response_for(:app => [incrementor, { :secret => "test" }])
+
+    app = [incrementor, { :secret => "test2", :old_secret => "test" }]
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>2}'
+
+    app = [incrementor, { :secret => "test3", :old_secret => "test2" }]
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>3}'
+  end
+
+  it "ignores tampered with session cookies" do
+    app = [incrementor, { :secret => "test" }]
+    response = response_for(:app => app)
+    response.body.should.equal '{"counter"=>1}'
+
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>2}'
+
+    _, digest = response["Set-Cookie"].split("--")
+    tampered_with_cookie = "hackerman-was-here" + "--" + digest
+
+    response = response_for(:app => app, :cookie => tampered_with_cookie)
+    response.body.should.equal '{"counter"=>1}'
+  end
+
+  it "supports either of secret or old_secret" do
+    app = [incrementor, { :secret => "test" }]
+    response = response_for(:app => app)
+    response.body.should.equal '{"counter"=>1}'
+
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>2}'
+
+    app = [incrementor, { :old_secret => "test" }]
+    response = response_for(:app => app)
+    response.body.should.equal '{"counter"=>1}'
+
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>2}'
+  end
+
+  it "can handle Rack::Lint middleware" do
+    response = response_for(:app => incrementor)
+
+    lint = Rack::Lint.new(session_id)
+    response = response_for(:app => lint, :cookie => response)
+    response.body.should.not.be.nil
+  end
+
+  it "can handle middleware that inspects the env" do
+    class TestEnvInspector
+      def initialize(app)
+        @app = app
+      end
+      def call(env)
+        env.inspect
+        @app.call(env)
+      end
+    end
+
+    response = response_for(:app => incrementor)
+
+    inspector = TestEnvInspector.new(session_id)
+    response = response_for(:app => inspector, :cookie => response)
+    response.body.should.not.be.nil
+  end
+
+  it "returns the session id in the session hash" do
+    response = response_for(:app => incrementor)
+    response.body.should.equal '{"counter"=>1}'
+
+    response = response_for(:app => session_id, :cookie => response)
+    response.body.should.match(/"session_id"=>/)
+    response.body.should.match(/"counter"=>1/)
+  end
+
+  it "does not return a cookie if set to secure but not using ssl" do
+    app = [incrementor, { :secure => true }]
+
+    response = response_for(:app => app)
+    response["Set-Cookie"].should.be.nil
+
+    response = response_for(:app => app, :request => { "HTTPS" => "on" })
+    response["Set-Cookie"].should.not.be.nil
+    response["Set-Cookie"].should.match(/secure/)
+  end
+
+  it "does not return a cookie if cookie was not read/written" do
+    response = response_for(:app => nothing)
+    response["Set-Cookie"].should.be.nil
+  end
+
+  it "does not return a cookie if cookie was not written (only read)" do
+    response = response_for(:app => session_id)
+    response["Set-Cookie"].should.be.nil
+  end
+
+  it "returns even if not read/written if :expire_after is set" do
+    app = [nothing, { :expire_after => 3600 }]
+    request = { "rack.session" => { "not" => "empty" }}
+    response = response_for(:app => app, :request => request)
+    response["Set-Cookie"].should.not.be.nil
+  end
+
+  it "returns no cookie if no data was written and no session was created previously, even if :expire_after is set" do
+    app = [nothing, { :expire_after => 3600 }]
+    response = response_for(:app => app)
+    response["Set-Cookie"].should.be.nil
+  end
+
+  it "exposes :secret in env['rack.session.option']" do
+    response = response_for(:app => [session_option[:secret], { :secret => "foo" }])
+    response.body.should == '"foo"'
+  end
+
+  it "exposes :coder in env['rack.session.option']" do
+    response = response_for(:app => session_option[:coder])
+    response.body.should.match(/Base64::Marshal/)
+  end
+
+  it "allows passing in a hash with session data from middleware in front" do
+    request = { 'rack.session' => { :foo => 'bar' }}
+    response = response_for(:app => session_id, :request => request)
+    response.body.should.match(/foo/)
+  end
+
+  it "allows modifying session data with session data from middleware in front" do
+    request = { 'rack.session' => { :foo => 'bar' }}
+    response = response_for(:app => incrementor, :request => request)
+    response.body.should.match(/counter/)
+    response.body.should.match(/foo/)
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_session_memcache.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_session_memcache.rb
new file mode 100644
index 0000000..6e5325b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_session_memcache.rb
@@ -0,0 +1,321 @@
+begin
+  require 'rack/session/memcache'
+  require 'rack/lint'
+  require 'rack/mock'
+  require 'thread'
+
+  describe Rack::Session::Memcache do
+    session_key = Rack::Session::Memcache::DEFAULT_OPTIONS[:key]
+    session_match = /#{session_key}=([0-9a-fA-F]+);/
+    incrementor = lambda do |env|
+      env["rack.session"]["counter"] ||= 0
+      env["rack.session"]["counter"] += 1
+      Rack::Response.new(env["rack.session"].inspect).to_a
+    end
+    drop_session = Rack::Lint.new(proc do |env|
+      env['rack.session.options'][:drop] = true
+      incrementor.call(env)
+    end)
+    renew_session = Rack::Lint.new(proc do |env|
+      env['rack.session.options'][:renew] = true
+      incrementor.call(env)
+    end)
+    defer_session = Rack::Lint.new(proc do |env|
+      env['rack.session.options'][:defer] = true
+      incrementor.call(env)
+    end)
+    skip_session = Rack::Lint.new(proc do |env|
+      env['rack.session.options'][:skip] = true
+      incrementor.call(env)
+    end)
+    incrementor = Rack::Lint.new(incrementor)
+
+    # test memcache connection
+    Rack::Session::Memcache.new(incrementor)
+
+    it "faults on no connection" do
+      lambda{
+        Rack::Session::Memcache.new(incrementor, :memcache_server => 'nosuchserver')
+      }.should.raise
+    end
+
+    it "connects to existing server" do
+      test_pool = MemCache.new(incrementor, :namespace => 'test:rack:session')
+      test_pool.namespace.should.equal 'test:rack:session'
+    end
+
+    it "passes options to MemCache" do
+      pool = Rack::Session::Memcache.new(incrementor, :namespace => 'test:rack:session')
+      pool.pool.namespace.should.equal 'test:rack:session'
+    end
+
+    it "creates a new cookie" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      res = Rack::MockRequest.new(pool).get("/")
+      res["Set-Cookie"].should.include("#{session_key}=")
+      res.body.should.equal '{"counter"=>1}'
+    end
+
+    it "determines session from a cookie" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      req = Rack::MockRequest.new(pool)
+      res = req.get("/")
+      cookie = res["Set-Cookie"]
+      req.get("/", "HTTP_COOKIE" => cookie).
+        body.should.equal '{"counter"=>2}'
+      req.get("/", "HTTP_COOKIE" => cookie).
+        body.should.equal '{"counter"=>3}'
+    end
+
+    it "determines session only from a cookie by default" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      req = Rack::MockRequest.new(pool)
+      res = req.get("/")
+      sid = res["Set-Cookie"][session_match, 1]
+      req.get("/?rack.session=#{sid}").
+        body.should.equal '{"counter"=>1}'
+      req.get("/?rack.session=#{sid}").
+        body.should.equal '{"counter"=>1}'
+    end
+
+    it "determines session from params" do
+      pool = Rack::Session::Memcache.new(incrementor, :cookie_only => false)
+      req = Rack::MockRequest.new(pool)
+      res = req.get("/")
+      sid = res["Set-Cookie"][session_match, 1]
+      req.get("/?rack.session=#{sid}").
+        body.should.equal '{"counter"=>2}'
+      req.get("/?rack.session=#{sid}").
+        body.should.equal '{"counter"=>3}'
+    end
+
+    it "survives nonexistant cookies" do
+      bad_cookie = "rack.session=blarghfasel"
+      pool = Rack::Session::Memcache.new(incrementor)
+      res = Rack::MockRequest.new(pool).
+        get("/", "HTTP_COOKIE" => bad_cookie)
+      res.body.should.equal '{"counter"=>1}'
+      cookie = res["Set-Cookie"][session_match]
+      cookie.should.not.match(/#{bad_cookie}/)
+    end
+
+    it "maintains freshness" do
+      pool = Rack::Session::Memcache.new(incrementor, :expire_after => 3)
+      res = Rack::MockRequest.new(pool).get('/')
+      res.body.should.include '"counter"=>1'
+      cookie = res["Set-Cookie"]
+      res = Rack::MockRequest.new(pool).get('/', "HTTP_COOKIE" => cookie)
+      res["Set-Cookie"].should.equal cookie
+      res.body.should.include '"counter"=>2'
+      puts 'Sleeping to expire session' if $DEBUG
+      sleep 4
+      res = Rack::MockRequest.new(pool).get('/', "HTTP_COOKIE" => cookie)
+      res["Set-Cookie"].should.not.equal cookie
+      res.body.should.include '"counter"=>1'
+    end
+
+    it "does not send the same session id if it did not change" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      req = Rack::MockRequest.new(pool)
+
+      res0 = req.get("/")
+      cookie = res0["Set-Cookie"][session_match]
+      res0.body.should.equal '{"counter"=>1}'
+
+      res1 = req.get("/", "HTTP_COOKIE" => cookie)
+      res1["Set-Cookie"].should.be.nil
+      res1.body.should.equal '{"counter"=>2}'
+
+      res2 = req.get("/", "HTTP_COOKIE" => cookie)
+      res2["Set-Cookie"].should.be.nil
+      res2.body.should.equal '{"counter"=>3}'
+    end
+
+    it "deletes cookies with :drop option" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      req = Rack::MockRequest.new(pool)
+      drop = Rack::Utils::Context.new(pool, drop_session)
+      dreq = Rack::MockRequest.new(drop)
+
+      res1 = req.get("/")
+      session = (cookie = res1["Set-Cookie"])[session_match]
+      res1.body.should.equal '{"counter"=>1}'
+
+      res2 = dreq.get("/", "HTTP_COOKIE" => cookie)
+      res2["Set-Cookie"].should.equal nil
+      res2.body.should.equal '{"counter"=>2}'
+
+      res3 = req.get("/", "HTTP_COOKIE" => cookie)
+      res3["Set-Cookie"][session_match].should.not.equal session
+      res3.body.should.equal '{"counter"=>1}'
+    end
+
+    it "provides new session id with :renew option" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      req = Rack::MockRequest.new(pool)
+      renew = Rack::Utils::Context.new(pool, renew_session)
+      rreq = Rack::MockRequest.new(renew)
+
+      res1 = req.get("/")
+      session = (cookie = res1["Set-Cookie"])[session_match]
+      res1.body.should.equal '{"counter"=>1}'
+
+      res2 = rreq.get("/", "HTTP_COOKIE" => cookie)
+      new_cookie = res2["Set-Cookie"]
+      new_session = new_cookie[session_match]
+      new_session.should.not.equal session
+      res2.body.should.equal '{"counter"=>2}'
+
+      res3 = req.get("/", "HTTP_COOKIE" => new_cookie)
+      res3.body.should.equal '{"counter"=>3}'
+
+      # Old cookie was deleted
+      res4 = req.get("/", "HTTP_COOKIE" => cookie)
+      res4.body.should.equal '{"counter"=>1}'
+    end
+
+    it "omits cookie with :defer option but still updates the state" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      count = Rack::Utils::Context.new(pool, incrementor)
+      defer = Rack::Utils::Context.new(pool, defer_session)
+      dreq = Rack::MockRequest.new(defer)
+      creq = Rack::MockRequest.new(count)
+
+      res0 = dreq.get("/")
+      res0["Set-Cookie"].should.equal nil
+      res0.body.should.equal '{"counter"=>1}'
+
+      res0 = creq.get("/")
+      res1 = dreq.get("/", "HTTP_COOKIE" => res0["Set-Cookie"])
+      res1.body.should.equal '{"counter"=>2}'
+      res2 = dreq.get("/", "HTTP_COOKIE" => res0["Set-Cookie"])
+      res2.body.should.equal '{"counter"=>3}'
+    end
+
+    it "omits cookie and state update with :skip option" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      count = Rack::Utils::Context.new(pool, incrementor)
+      skip = Rack::Utils::Context.new(pool, skip_session)
+      sreq = Rack::MockRequest.new(skip)
+      creq = Rack::MockRequest.new(count)
+
+      res0 = sreq.get("/")
+      res0["Set-Cookie"].should.equal nil
+      res0.body.should.equal '{"counter"=>1}'
+
+      res0 = creq.get("/")
+      res1 = sreq.get("/", "HTTP_COOKIE" => res0["Set-Cookie"])
+      res1.body.should.equal '{"counter"=>2}'
+      res2 = sreq.get("/", "HTTP_COOKIE" => res0["Set-Cookie"])
+      res2.body.should.equal '{"counter"=>2}'
+    end
+
+    it "updates deep hashes correctly" do
+      hash_check = proc do |env|
+        session = env['rack.session']
+        unless session.include? 'test'
+          session.update :a => :b, :c => { :d => :e },
+            :f => { :g => { :h => :i} }, 'test' => true
+        else
+          session[:f][:g][:h] = :j
+        end
+        [200, {}, [session.inspect]]
+      end
+      pool = Rack::Session::Memcache.new(hash_check)
+      req = Rack::MockRequest.new(pool)
+
+      res0 = req.get("/")
+      session_id = (cookie = res0["Set-Cookie"])[session_match, 1]
+      ses0 = pool.pool.get(session_id, true)
+
+      req.get("/", "HTTP_COOKIE" => cookie)
+      ses1 = pool.pool.get(session_id, true)
+
+      ses1.should.not.equal ses0
+    end
+
+    # anyone know how to do this better?
+    it "cleanly merges sessions when multithreaded" do
+      unless $DEBUG
+        1.should.equal 1 # fake assertion to appease the mighty bacon
+        next
+      end
+      warn 'Running multithread test for Session::Memcache'
+      pool = Rack::Session::Memcache.new(incrementor)
+      req = Rack::MockRequest.new(pool)
+
+      res = req.get('/')
+      res.body.should.equal '{"counter"=>1}'
+      cookie = res["Set-Cookie"]
+      session_id = cookie[session_match, 1]
+
+      delta_incrementor = lambda do |env|
+        # emulate disconjoinment of threading
+        env['rack.session'] = env['rack.session'].dup
+        Thread.stop
+        env['rack.session'][(Time.now.usec*rand).to_i] = true
+        incrementor.call(env)
+      end
+      tses = Rack::Utils::Context.new pool, delta_incrementor
+      treq = Rack::MockRequest.new(tses)
+      tnum = rand(7).to_i+5
+      r = Array.new(tnum) do
+        Thread.new(treq) do |run|
+          run.get('/', "HTTP_COOKIE" => cookie, 'rack.multithread' => true)
+        end
+      end.reverse.map{|t| t.run.join.value }
+      r.each do |request|
+        request['Set-Cookie'].should.equal cookie
+        request.body.should.include '"counter"=>2'
+      end
+
+      session = pool.pool.get(session_id)
+      session.size.should.equal tnum+1 # counter
+      session['counter'].should.equal 2 # meeeh
+
+      tnum = rand(7).to_i+5
+      r = Array.new(tnum) do |i|
+        app = Rack::Utils::Context.new pool, time_delta
+        req = Rack::MockRequest.new app
+        Thread.new(req) do |run|
+          run.get('/', "HTTP_COOKIE" => cookie, 'rack.multithread' => true)
+        end
+      end.reverse.map{|t| t.run.join.value }
+      r.each do |request|
+        request['Set-Cookie'].should.equal cookie
+        request.body.should.include '"counter"=>3'
+      end
+
+      session = pool.pool.get(session_id)
+      session.size.should.be tnum+1
+      session['counter'].should.be 3
+
+      drop_counter = proc do |env|
+        env['rack.session'].delete 'counter'
+        env['rack.session']['foo'] = 'bar'
+        [200, {'Content-Type'=>'text/plain'}, env['rack.session'].inspect]
+      end
+      tses = Rack::Utils::Context.new pool, drop_counter
+      treq = Rack::MockRequest.new(tses)
+      tnum = rand(7).to_i+5
+      r = Array.new(tnum) do
+        Thread.new(treq) do |run|
+          run.get('/', "HTTP_COOKIE" => cookie, 'rack.multithread' => true)
+        end
+      end.reverse.map{|t| t.run.join.value }
+      r.each do |request|
+        request['Set-Cookie'].should.equal cookie
+        request.body.should.include '"foo"=>"bar"'
+      end
+
+      session = pool.pool.get(session_id)
+      session.size.should.be r.size+1
+      session['counter'].should.be.nil?
+      session['foo'].should.equal 'bar'
+    end
+  end
+rescue RuntimeError
+  $stderr.puts "Skipping Rack::Session::Memcache tests. Start memcached and try again."
+rescue LoadError
+  $stderr.puts "Skipping Rack::Session::Memcache tests (Memcache is required). `gem install memcache-client` and try again."
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_session_pool.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_session_pool.rb
new file mode 100644
index 0000000..984f55a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_session_pool.rb
@@ -0,0 +1,209 @@
+require 'thread'
+require 'rack/lint'
+require 'rack/mock'
+require 'rack/session/pool'
+
+describe Rack::Session::Pool do
+  session_key = Rack::Session::Pool::DEFAULT_OPTIONS[:key]
+  session_match = /#{session_key}=[0-9a-fA-F]+;/
+
+  incrementor = lambda do |env|
+    env["rack.session"]["counter"] ||= 0
+    env["rack.session"]["counter"] += 1
+    Rack::Response.new(env["rack.session"].inspect).to_a
+  end
+
+  session_id = Rack::Lint.new(lambda do |env|
+    Rack::Response.new(env["rack.session"].inspect).to_a
+  end)
+
+  nothing = Rack::Lint.new(lambda do |env|
+    Rack::Response.new("Nothing").to_a
+  end)
+
+  drop_session = Rack::Lint.new(lambda do |env|
+    env['rack.session.options'][:drop] = true
+    incrementor.call(env)
+  end)
+
+  renew_session = Rack::Lint.new(lambda do |env|
+    env['rack.session.options'][:renew] = true
+    incrementor.call(env)
+  end)
+
+  defer_session = Rack::Lint.new(lambda do |env|
+    env['rack.session.options'][:defer] = true
+    incrementor.call(env)
+  end)
+  
+  incrementor = Rack::Lint.new(incrementor)
+
+  it "creates a new cookie" do
+    pool = Rack::Session::Pool.new(incrementor)
+    res = Rack::MockRequest.new(pool).get("/")
+    res["Set-Cookie"].should.match session_match
+    res.body.should.equal '{"counter"=>1}'
+  end
+
+  it "determines session from a cookie" do
+    pool = Rack::Session::Pool.new(incrementor)
+    req = Rack::MockRequest.new(pool)
+    cookie = req.get("/")["Set-Cookie"]
+    req.get("/", "HTTP_COOKIE" => cookie).
+      body.should.equal '{"counter"=>2}'
+    req.get("/", "HTTP_COOKIE" => cookie).
+      body.should.equal '{"counter"=>3}'
+  end
+
+  it "survives nonexistant cookies" do
+    pool = Rack::Session::Pool.new(incrementor)
+    res = Rack::MockRequest.new(pool).
+      get("/", "HTTP_COOKIE" => "#{session_key}=blarghfasel")
+    res.body.should.equal '{"counter"=>1}'
+  end
+
+  it "does not send the same session id if it did not change" do
+    pool = Rack::Session::Pool.new(incrementor)
+    req = Rack::MockRequest.new(pool)
+
+    res0 = req.get("/")
+    cookie = res0["Set-Cookie"][session_match]
+    res0.body.should.equal '{"counter"=>1}'
+    pool.pool.size.should.equal 1
+
+    res1 = req.get("/", "HTTP_COOKIE" => cookie)
+    res1["Set-Cookie"].should.be.nil
+    res1.body.should.equal '{"counter"=>2}'
+    pool.pool.size.should.equal 1
+
+    res2 = req.get("/", "HTTP_COOKIE" => cookie)
+    res2["Set-Cookie"].should.be.nil
+    res2.body.should.equal '{"counter"=>3}'
+    pool.pool.size.should.equal 1
+  end
+
+  it "deletes cookies with :drop option" do
+    pool = Rack::Session::Pool.new(incrementor)
+    req = Rack::MockRequest.new(pool)
+    drop = Rack::Utils::Context.new(pool, drop_session)
+    dreq = Rack::MockRequest.new(drop)
+
+    res1 = req.get("/")
+    session = (cookie = res1["Set-Cookie"])[session_match]
+    res1.body.should.equal '{"counter"=>1}'
+    pool.pool.size.should.equal 1
+
+    res2 = dreq.get("/", "HTTP_COOKIE" => cookie)
+    res2["Set-Cookie"].should.be.nil
+    res2.body.should.equal '{"counter"=>2}'
+    pool.pool.size.should.equal 0
+
+    res3 = req.get("/", "HTTP_COOKIE" => cookie)
+    res3["Set-Cookie"][session_match].should.not.equal session
+    res3.body.should.equal '{"counter"=>1}'
+    pool.pool.size.should.equal 1
+  end
+
+  it "provides new session id with :renew option" do
+    pool = Rack::Session::Pool.new(incrementor)
+    req = Rack::MockRequest.new(pool)
+    renew = Rack::Utils::Context.new(pool, renew_session)
+    rreq = Rack::MockRequest.new(renew)
+
+    res1 = req.get("/")
+    session = (cookie = res1["Set-Cookie"])[session_match]
+    res1.body.should.equal '{"counter"=>1}'
+    pool.pool.size.should.equal 1
+
+    res2 = rreq.get("/", "HTTP_COOKIE" => cookie)
+    new_cookie = res2["Set-Cookie"]
+    new_session = new_cookie[session_match]
+    new_session.should.not.equal session
+    res2.body.should.equal '{"counter"=>2}'
+    pool.pool.size.should.equal 1
+
+    res3 = req.get("/", "HTTP_COOKIE" => new_cookie)
+    res3.body.should.equal '{"counter"=>3}'
+    pool.pool.size.should.equal 1
+
+    res4 = req.get("/", "HTTP_COOKIE" => cookie)
+    res4.body.should.equal '{"counter"=>1}'
+    pool.pool.size.should.equal 2
+  end
+
+  it "omits cookie with :defer option" do
+    pool = Rack::Session::Pool.new(incrementor)
+    defer = Rack::Utils::Context.new(pool, defer_session)
+    dreq = Rack::MockRequest.new(defer)
+
+    res1 = dreq.get("/")
+    res1["Set-Cookie"].should.equal nil
+    res1.body.should.equal '{"counter"=>1}'
+    pool.pool.size.should.equal 1
+  end
+
+  # anyone know how to do this better?
+  it "should merge sessions when multithreaded" do
+    unless $DEBUG
+      1.should.equal 1
+      next
+    end
+
+    warn 'Running multithread tests for Session::Pool'
+    pool = Rack::Session::Pool.new(incrementor)
+    req = Rack::MockRequest.new(pool)
+
+    res = req.get('/')
+    res.body.should.equal '{"counter"=>1}'
+    cookie = res["Set-Cookie"]
+    sess_id = cookie[/#{pool.key}=([^,;]+)/,1]
+
+    delta_incrementor = lambda do |env|
+      # emulate disconjoinment of threading
+      env['rack.session'] = env['rack.session'].dup
+      Thread.stop
+      env['rack.session'][(Time.now.usec*rand).to_i] = true
+      incrementor.call(env)
+    end
+    tses = Rack::Utils::Context.new pool, delta_incrementor
+    treq = Rack::MockRequest.new(tses)
+    tnum = rand(7).to_i+5
+    r = Array.new(tnum) do
+      Thread.new(treq) do |run|
+        run.get('/', "HTTP_COOKIE" => cookie, 'rack.multithread' => true)
+      end
+    end.reverse.map{|t| t.run.join.value }
+    r.each do |resp|
+      resp['Set-Cookie'].should.equal cookie
+      resp.body.should.include '"counter"=>2'
+    end
+
+    session = pool.pool[sess_id]
+    session.size.should.equal tnum+1 # counter
+    session['counter'].should.equal 2 # meeeh
+  end
+
+  it "does not return a cookie if cookie was not read/written" do
+    app = Rack::Session::Pool.new(nothing)
+    res = Rack::MockRequest.new(app).get("/")
+    res["Set-Cookie"].should.be.nil
+  end
+
+  it "does not return a cookie if cookie was not written (only read)" do
+    app = Rack::Session::Pool.new(session_id)
+    res = Rack::MockRequest.new(app).get("/")
+    res["Set-Cookie"].should.be.nil
+  end
+
+  it "returns even if not read/written if :expire_after is set" do
+    app = Rack::Session::Pool.new(nothing, :expire_after => 3600)
+    res = Rack::MockRequest.new(app).get("/", 'rack.session' => {'not' => 'empty'})
+    res["Set-Cookie"].should.not.be.nil
+  end
+
+  it "returns no cookie if no data was written and no session was created previously, even if :expire_after is set" do
+    app = Rack::Session::Pool.new(nothing, :expire_after => 3600)
+    res = Rack::MockRequest.new(app).get("/")
+    res["Set-Cookie"].should.be.nil
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_showexceptions.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_showexceptions.rb
new file mode 100644
index 0000000..bdd5ce5
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_showexceptions.rb
@@ -0,0 +1,92 @@
+require 'rack/showexceptions'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::ShowExceptions do
+  def show_exceptions(app)
+    Rack::Lint.new Rack::ShowExceptions.new(app)
+  end
+  
+  it "catches exceptions" do
+    res = nil
+
+    req = Rack::MockRequest.new(
+      show_exceptions(
+        lambda{|env| raise RuntimeError }
+    ))
+
+    lambda{
+      res = req.get("/")
+    }.should.not.raise
+
+    res.should.be.a.server_error
+    res.status.should.equal 500
+
+    res.should =~ /RuntimeError/
+    res.should =~ /ShowExceptions/
+  end
+
+  it "responds with plain text on AJAX requests accepting anything but HTML" do
+    res = nil
+
+    req = Rack::MockRequest.new(
+      show_exceptions(
+        lambda{|env| raise RuntimeError, "It was never supposed to work" }
+    ))
+
+    lambda{
+      res = req.get("/", "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest")
+    }.should.not.raise
+
+    res.should.be.a.server_error
+    res.status.should.equal 500
+
+    res.content_type.should.equal "text/plain"
+
+    res.body.should.include "RuntimeError: It was never supposed to work\n"
+    res.body.should.include __FILE__
+  end
+
+  it "responds with HTML on AJAX requests accepting HTML" do
+    res = nil
+
+    req = Rack::MockRequest.new(
+      show_exceptions(
+        lambda{|env| raise RuntimeError, "It was never supposed to work" }
+    ))
+
+    lambda{
+      res = req.get("/", "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest", "HTTP_ACCEPT" => "text/html")
+    }.should.not.raise
+
+    res.should.be.a.server_error
+    res.status.should.equal 500
+
+    res.content_type.should.equal "text/html"
+
+    res.body.should.include "RuntimeError"
+    res.body.should.include "It was never supposed to work"
+    res.body.should.include Rack::Utils.escape_html(__FILE__)
+  end
+
+  it "handles exceptions without a backtrace" do
+    res = nil
+
+    req = Rack::MockRequest.new(
+      show_exceptions(
+        lambda{|env| raise RuntimeError, "", [] }
+      )
+    )
+
+    lambda{
+      res = req.get("/")
+    }.should.not.raise
+
+    res.should.be.a.server_error
+    res.status.should.equal 500
+
+    res.should =~ /RuntimeError/
+    res.should =~ /ShowExceptions/
+    res.should =~ /unknown location/
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_showstatus.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_showstatus.rb
new file mode 100644
index 0000000..6f8e6fe
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_showstatus.rb
@@ -0,0 +1,84 @@
+require 'rack/showstatus'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::ShowStatus do
+  def show_status(app)
+    Rack::Lint.new Rack::ShowStatus.new(app)
+  end
+  
+  should "provide a default status message" do
+    req = Rack::MockRequest.new(
+      show_status(lambda{|env|
+        [404, {"Content-Type" => "text/plain", "Content-Length" => "0"}, []]
+    }))
+
+    res = req.get("/", :lint => true)
+    res.should.be.not_found
+    res.should.be.not.empty
+
+    res["Content-Type"].should.equal("text/html")
+    res.should =~ /404/
+    res.should =~ /Not Found/
+  end
+
+  should "let the app provide additional information" do
+    req = Rack::MockRequest.new(
+      show_status(
+        lambda{|env|
+          env["rack.showstatus.detail"] = "gone too meta."
+          [404, {"Content-Type" => "text/plain", "Content-Length" => "0"}, []]
+    }))
+
+    res = req.get("/", :lint => true)
+    res.should.be.not_found
+    res.should.be.not.empty
+
+    res["Content-Type"].should.equal("text/html")
+    res.should =~ /404/
+    res.should =~ /Not Found/
+    res.should =~ /too meta/
+  end
+
+  should "not replace existing messages" do
+    req = Rack::MockRequest.new(
+      show_status(
+        lambda{|env|
+          [404, {"Content-Type" => "text/plain", "Content-Length" => "4"}, ["foo!"]]
+    }))
+
+    res = req.get("/", :lint => true)
+    res.should.be.not_found
+
+    res.body.should == "foo!"
+  end
+
+  should "pass on original headers" do
+    headers = {"WWW-Authenticate" => "Basic blah"}
+
+    req = Rack::MockRequest.new(
+      show_status(lambda{|env| [401, headers, []] }))
+    res = req.get("/", :lint => true)
+
+    res["WWW-Authenticate"].should.equal("Basic blah")
+  end
+
+  should "replace existing messages if there is detail" do
+    req = Rack::MockRequest.new(
+      show_status(
+        lambda{|env|
+          env["rack.showstatus.detail"] = "gone too meta."
+          [404, {"Content-Type" => "text/plain", "Content-Length" => "4"}, ["foo!"]]
+    }))
+
+    res = req.get("/", :lint => true)
+    res.should.be.not_found
+    res.should.be.not.empty
+
+    res["Content-Type"].should.equal("text/html")
+    res["Content-Length"].should.not.equal("4")
+    res.should =~ /404/
+    res.should =~ /too meta/
+    res.body.should.not =~ /foo/
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_static.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_static.rb
new file mode 100644
index 0000000..fed1df2
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_static.rb
@@ -0,0 +1,145 @@
+require 'rack/static'
+require 'rack/lint'
+require 'rack/mock'
+
+class DummyApp
+  def call(env)
+    [200, {"Content-Type" => "text/plain"}, ["Hello World"]]
+  end
+end
+
+describe Rack::Static do
+  def static(app, *args)
+    Rack::Lint.new Rack::Static.new(app, *args)
+  end
+
+  root = File.expand_path(File.dirname(__FILE__))
+
+  OPTIONS = {:urls => ["/cgi"], :root => root}
+  STATIC_OPTIONS = {:urls => [""], :root => "#{root}/static", :index => 'index.html'}
+  HASH_OPTIONS = {:urls => {"/cgi/sekret" => 'cgi/test'}, :root => root}
+
+  @request = Rack::MockRequest.new(static(DummyApp.new, OPTIONS))
+  @static_request = Rack::MockRequest.new(static(DummyApp.new, STATIC_OPTIONS))
+  @hash_request = Rack::MockRequest.new(static(DummyApp.new, HASH_OPTIONS))
+
+  it "serves files" do
+    res = @request.get("/cgi/test")
+    res.should.be.ok
+    res.body.should =~ /ruby/
+  end
+
+  it "404s if url root is known but it can't find the file" do
+    res = @request.get("/cgi/foo")
+    res.should.be.not_found
+  end
+
+  it "calls down the chain if url root is not known" do
+    res = @request.get("/something/else")
+    res.should.be.ok
+    res.body.should == "Hello World"
+  end
+
+  it "calls index file when requesting root in the given folder" do
+    res = @static_request.get("/")
+    res.should.be.ok
+    res.body.should =~ /index!/
+
+    res = @static_request.get("/other/")
+    res.should.be.not_found
+
+    res = @static_request.get("/another/")
+    res.should.be.ok
+    res.body.should =~ /another index!/
+  end
+
+  it "doesn't call index file if :index option was omitted" do
+    res = @request.get("/")
+    res.body.should == "Hello World"
+  end
+
+  it "serves hidden files" do
+    res = @hash_request.get("/cgi/sekret")
+    res.should.be.ok
+    res.body.should =~ /ruby/
+  end
+
+  it "calls down the chain if the URI is not specified" do
+    res = @hash_request.get("/something/else")
+    res.should.be.ok
+    res.body.should == "Hello World"
+  end
+
+  it "supports serving fixed cache-control (legacy option)" do
+    opts = OPTIONS.merge(:cache_control => 'public')
+    request = Rack::MockRequest.new(static(DummyApp.new, opts))
+    res = request.get("/cgi/test")
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public'
+  end
+
+  HEADER_OPTIONS = {:urls => ["/cgi"], :root => root, :header_rules => [
+    [:all, {'Cache-Control' => 'public, max-age=100'}],
+    [:fonts, {'Cache-Control' => 'public, max-age=200'}],
+    [%w(png jpg), {'Cache-Control' => 'public, max-age=300'}],
+    ['/cgi/assets/folder/', {'Cache-Control' => 'public, max-age=400'}],
+    ['cgi/assets/javascripts', {'Cache-Control' => 'public, max-age=500'}],
+    [/\.(css|erb)\z/, {'Cache-Control' => 'public, max-age=600'}]
+  ]}
+  @header_request = Rack::MockRequest.new(static(DummyApp.new, HEADER_OPTIONS))
+
+  it "supports header rule :all" do
+    # Headers for all files via :all shortcut
+    res = @header_request.get('/cgi/assets/index.html')
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=100'
+  end
+
+  it "supports header rule :fonts" do
+    # Headers for web fonts via :fonts shortcut
+    res = @header_request.get('/cgi/assets/fonts/font.eot')
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=200'
+  end
+
+  it "supports file extension header rules provided as an Array" do
+    # Headers for file extensions via array
+    res = @header_request.get('/cgi/assets/images/image.png')
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=300'
+  end
+
+  it "supports folder rules provided as a String" do
+    # Headers for files in folder via string
+    res = @header_request.get('/cgi/assets/folder/test.js')
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=400'
+  end
+
+  it "supports folder header rules provided as a String not starting with a slash" do
+    res = @header_request.get('/cgi/assets/javascripts/app.js')
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=500'
+  end
+
+  it "supports flexible header rules provided as Regexp" do
+    # Flexible Headers via Regexp
+    res = @header_request.get('/cgi/assets/stylesheets/app.css')
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=600'
+  end
+
+  it "prioritizes header rules over fixed cache-control setting (legacy option)" do
+    opts = OPTIONS.merge(
+      :cache_control => 'public, max-age=24',
+      :header_rules => [
+        [:all, {'Cache-Control' => 'public, max-age=42'}]
+      ])
+
+    request = Rack::MockRequest.new(static(DummyApp.new, opts))
+    res = request.get("/cgi/test")
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=42'
+  end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_thin.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_thin.rb
new file mode 100644
index 0000000..15a1ab5
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_thin.rb
@@ -0,0 +1,91 @@
+begin
+require 'rack/handler/thin'
+require File.expand_path('../testrequest', __FILE__)
+require 'timeout'
+
+describe Rack::Handler::Thin do
+  extend TestRequest::Helpers
+
+  @app = Rack::Lint.new(TestRequest.new)
+  @server = nil
+  Thin::Logging.silent = true
+
+  @thread = Thread.new do
+    Rack::Handler::Thin.run(@app, :Host => @host='127.0.0.1', :Port => @port=9204, :tag => "tag") do |server|
+      @server = server
+    end
+  end
+
+  Thread.pass until @server && @server.running?
+
+  should "respond" do
+    GET("/")
+    response.should.not.be.nil
+  end
+
+  should "be a Thin" do
+    GET("/")
+    status.should.equal 200
+    response["SERVER_SOFTWARE"].should =~ /thin/
+    response["HTTP_VERSION"].should.equal "HTTP/1.1"
+    response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
+    response["SERVER_PORT"].should.equal "9204"
+    response["SERVER_NAME"].should.equal "127.0.0.1"
+  end
+
+  should "have rack headers" do
+    GET("/")
+    response["rack.version"].should.equal [1,0]
+    response["rack.multithread"].should.equal false
+    response["rack.multiprocess"].should.equal false
+    response["rack.run_once"].should.equal false
+  end
+
+  should "have CGI headers on GET" do
+    GET("/")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["REQUEST_PATH"].should.equal "/"
+    response["PATH_INFO"].should.be.equal "/"
+    response["QUERY_STRING"].should.equal ""
+    response["test.postdata"].should.equal ""
+
+    GET("/test/foo?quux=1")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["REQUEST_PATH"].should.equal "/test/foo"
+    response["PATH_INFO"].should.equal "/test/foo"
+    response["QUERY_STRING"].should.equal "quux=1"
+  end
+
+  should "have CGI headers on POST" do
+    POST("/", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
+    status.should.equal 200
+    response["REQUEST_METHOD"].should.equal "POST"
+    response["REQUEST_PATH"].should.equal "/"
+    response["QUERY_STRING"].should.equal ""
+    response["HTTP_X_TEST_HEADER"].should.equal "42"
+    response["test.postdata"].should.equal "rack-form-data=23"
+  end
+
+  should "support HTTP auth" do
+    GET("/test", {:user => "ruth", :passwd => "secret"})
+    response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
+  end
+
+  should "set status" do
+    GET("/test?secret")
+    status.should.equal 403
+    response["rack.url_scheme"].should.equal "http"
+  end
+
+  should "set tag for server" do
+    @server.tag.should.equal 'tag'
+  end
+
+  @server.stop!
+  @thread.kill
+
+end
+
+rescue LoadError
+  $stderr.puts "Skipping Rack::Handler::Thin tests (Thin is required). `gem install thin` and try again."
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_urlmap.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_urlmap.rb
new file mode 100644
index 0000000..316c725
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_urlmap.rb
@@ -0,0 +1,213 @@
+require 'rack/urlmap'
+require 'rack/mock'
+
+describe Rack::URLMap do
+  it "dispatches paths correctly" do
+    app = lambda { |env|
+      [200, {
+        'X-ScriptName' => env['SCRIPT_NAME'],
+        'X-PathInfo' => env['PATH_INFO'],
+        'Content-Type' => 'text/plain'
+      }, [""]]
+    }
+    map = Rack::Lint.new(Rack::URLMap.new({
+      'http://foo.org/bar' => app,
+      '/foo' => app,
+      '/foo/bar' => app
+    }))
+
+    res = Rack::MockRequest.new(map).get("/")
+    res.should.be.not_found
+
+    res = Rack::MockRequest.new(map).get("/qux")
+    res.should.be.not_found
+
+    res = Rack::MockRequest.new(map).get("/foo")
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/foo"
+    res["X-PathInfo"].should.equal ""
+
+    res = Rack::MockRequest.new(map).get("/foo/")
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/foo"
+    res["X-PathInfo"].should.equal "/"
+
+    res = Rack::MockRequest.new(map).get("/foo/bar")
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/foo/bar"
+    res["X-PathInfo"].should.equal ""
+
+    res = Rack::MockRequest.new(map).get("/foo/bar/")
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/foo/bar"
+    res["X-PathInfo"].should.equal "/"
+
+    res = Rack::MockRequest.new(map).get("/foo///bar//quux")
+    res.status.should.equal 200
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/foo/bar"
+    res["X-PathInfo"].should.equal "//quux"
+
+    res = Rack::MockRequest.new(map).get("/foo/quux", "SCRIPT_NAME" => "/bleh")
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/bleh/foo"
+    res["X-PathInfo"].should.equal "/quux"
+
+    res = Rack::MockRequest.new(map).get("/bar", 'HTTP_HOST' => 'foo.org')
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/bar"
+    res["X-PathInfo"].should.be.empty
+
+    res = Rack::MockRequest.new(map).get("/bar/", 'HTTP_HOST' => 'foo.org')
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/bar"
+    res["X-PathInfo"].should.equal '/'
+  end
+
+
+  it "dispatches hosts correctly" do
+    map = Rack::Lint.new(Rack::URLMap.new("http://foo.org/" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "foo.org",
+                                "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
+                              }, [""]]},
+                           "http://subdomain.foo.org/" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "subdomain.foo.org",
+                                "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
+                              }, [""]]},
+                           "http://bar.org/" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "bar.org",
+                                "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
+                              }, [""]]},
+                           "/" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "default.org",
+                                "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
+                              }, [""]]}
+                           ))
+
+    res = Rack::MockRequest.new(map).get("/")
+    res.should.be.ok
+    res["X-Position"].should.equal "default.org"
+
+    res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "bar.org")
+    res.should.be.ok
+    res["X-Position"].should.equal "bar.org"
+
+    res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "foo.org")
+    res.should.be.ok
+    res["X-Position"].should.equal "foo.org"
+
+    res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "subdomain.foo.org", "SERVER_NAME" => "foo.org")
+    res.should.be.ok
+    res["X-Position"].should.equal "subdomain.foo.org"
+
+    res = Rack::MockRequest.new(map).get("http://foo.org/")
+    res.should.be.ok
+    res["X-Position"].should.equal "foo.org"
+
+    res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "example.org")
+    res.should.be.ok
+    res["X-Position"].should.equal "default.org"
+
+    res = Rack::MockRequest.new(map).get("/",
+                                         "HTTP_HOST" => "example.org:9292",
+                                         "SERVER_PORT" => "9292")
+    res.should.be.ok
+    res["X-Position"].should.equal "default.org"
+  end
+
+  should "be nestable" do
+    map = Rack::Lint.new(Rack::URLMap.new("/foo" =>
+      Rack::URLMap.new("/bar" =>
+        Rack::URLMap.new("/quux" =>  lambda { |env|
+                           [200,
+                            { "Content-Type" => "text/plain",
+                              "X-Position" => "/foo/bar/quux",
+                              "X-PathInfo" => env["PATH_INFO"],
+                              "X-ScriptName" => env["SCRIPT_NAME"],
+                            }, [""]]}
+                         ))))
+
+    res = Rack::MockRequest.new(map).get("/foo/bar")
+    res.should.be.not_found
+
+    res = Rack::MockRequest.new(map).get("/foo/bar/quux")
+    res.should.be.ok
+    res["X-Position"].should.equal "/foo/bar/quux"
+    res["X-PathInfo"].should.equal ""
+    res["X-ScriptName"].should.equal "/foo/bar/quux"
+  end
+
+  should "route root apps correctly" do
+    map = Rack::Lint.new(Rack::URLMap.new("/" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "root",
+                                "X-PathInfo" => env["PATH_INFO"],
+                                "X-ScriptName" => env["SCRIPT_NAME"]
+                              }, [""]]},
+                           "/foo" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "foo",
+                                "X-PathInfo" => env["PATH_INFO"],
+                                "X-ScriptName" => env["SCRIPT_NAME"]
+                              }, [""]]}
+                           ))
+
+    res = Rack::MockRequest.new(map).get("/foo/bar")
+    res.should.be.ok
+    res["X-Position"].should.equal "foo"
+    res["X-PathInfo"].should.equal "/bar"
+    res["X-ScriptName"].should.equal "/foo"
+
+    res = Rack::MockRequest.new(map).get("/foo")
+    res.should.be.ok
+    res["X-Position"].should.equal "foo"
+    res["X-PathInfo"].should.equal ""
+    res["X-ScriptName"].should.equal "/foo"
+
+    res = Rack::MockRequest.new(map).get("/bar")
+    res.should.be.ok
+    res["X-Position"].should.equal "root"
+    res["X-PathInfo"].should.equal "/bar"
+    res["X-ScriptName"].should.equal ""
+
+    res = Rack::MockRequest.new(map).get("")
+    res.should.be.ok
+    res["X-Position"].should.equal "root"
+    res["X-PathInfo"].should.equal "/"
+    res["X-ScriptName"].should.equal ""
+  end
+
+  should "not squeeze slashes" do
+    map = Rack::Lint.new(Rack::URLMap.new("/" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "root",
+                                "X-PathInfo" => env["PATH_INFO"],
+                                "X-ScriptName" => env["SCRIPT_NAME"]
+                              }, [""]]},
+                           "/foo" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "foo",
+                                "X-PathInfo" => env["PATH_INFO"],
+                                "X-ScriptName" => env["SCRIPT_NAME"]
+                              }, [""]]}
+                           ))
+
+    res = Rack::MockRequest.new(map).get("/http://example.org/bar")
+    res.should.be.ok
+    res["X-Position"].should.equal "root"
+    res["X-PathInfo"].should.equal "/http://example.org/bar"
+    res["X-ScriptName"].should.equal ""
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_utils.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_utils.rb
new file mode 100644
index 0000000..622b8ff
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_utils.rb
@@ -0,0 +1,573 @@
+# -*- encoding: utf-8 -*-
+require 'rack/utils'
+require 'rack/mock'
+require 'timeout'
+
+describe Rack::Utils do
+
+  # A helper method which checks
+  # if certain query parameters 
+  # are equal.
+  def equal_query_to(query)
+    parts = query.split('&')
+    lambda{|other| (parts & other.split('&')) == parts }
+  end
+
+  def kcodeu
+    one8 = RUBY_VERSION.to_f < 1.9
+    default_kcode, $KCODE = $KCODE, 'U' if one8
+    yield
+  ensure
+    $KCODE = default_kcode if one8
+  end
+
+  should "round trip binary data" do
+    r = [218, 0].pack 'CC'
+    if defined?(::Encoding)
+      z = Rack::Utils.unescape(Rack::Utils.escape(r), Encoding::BINARY)
+    else
+      z = Rack::Utils.unescape(Rack::Utils.escape(r))
+    end
+    r.should.equal z
+  end
+
+  should "escape correctly" do
+    Rack::Utils.escape("fo<o>bar").should.equal "fo%3Co%3Ebar"
+    Rack::Utils.escape("a space").should.equal "a+space"
+    Rack::Utils.escape("q1!2\"'w$5&7/z8)?\\").
+      should.equal "q1%212%22%27w%245%267%2Fz8%29%3F%5C"
+  end
+
+  should "escape correctly for multibyte characters" do
+    matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsumoto
+    matz_name.force_encoding("UTF-8") if matz_name.respond_to? :force_encoding
+    Rack::Utils.escape(matz_name).should.equal '%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8'
+    matz_name_sep = "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsu moto
+    matz_name_sep.force_encoding("UTF-8") if matz_name_sep.respond_to? :force_encoding
+    Rack::Utils.escape(matz_name_sep).should.equal '%E3%81%BE%E3%81%A4+%E3%82%82%E3%81%A8'
+  end
+
+  if RUBY_VERSION[/^\d+\.\d+/] == '1.8'
+    should "escape correctly for multibyte characters if $KCODE is set to 'U'" do
+      kcodeu do
+        matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsumoto
+        matz_name.force_encoding("UTF-8") if matz_name.respond_to? :force_encoding
+        Rack::Utils.escape(matz_name).should.equal '%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8'
+        matz_name_sep = "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsu moto
+        matz_name_sep.force_encoding("UTF-8") if matz_name_sep.respond_to? :force_encoding
+        Rack::Utils.escape(matz_name_sep).should.equal '%E3%81%BE%E3%81%A4+%E3%82%82%E3%81%A8'
+      end
+    end
+
+    should "unescape multibyte characters correctly if $KCODE is set to 'U'" do
+      kcodeu do
+        Rack::Utils.unescape('%E3%81%BE%E3%81%A4+%E3%82%82%E3%81%A8').should.equal(
+          "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0])
+      end
+    end
+  end
+
+  should "escape objects that responds to to_s" do
+    kcodeu do
+      Rack::Utils.escape(:id).should.equal "id"
+    end
+  end
+
+  if "".respond_to?(:encode)
+    should "escape non-UTF8 strings" do
+      Rack::Utils.escape("ø".encode("ISO-8859-1")).should.equal "%F8"
+    end
+  end
+  
+  should "not hang on escaping long strings that end in % (http://redmine.ruby-lang.org/issues/5149)" do
+    lambda {
+      timeout(1) do
+        lambda {
+          URI.decode_www_form_component "A string that causes catastrophic backtracking as it gets longer %"
+        }.should.raise(ArgumentError)
+      end
+    }.should.not.raise(Timeout::Error)
+  end
+
+  should "escape path spaces with %20" do
+    Rack::Utils.escape_path("foo bar").should.equal  "foo%20bar"
+  end
+
+  should "unescape correctly" do
+    Rack::Utils.unescape("fo%3Co%3Ebar").should.equal "fo<o>bar"
+    Rack::Utils.unescape("a+space").should.equal "a space"
+    Rack::Utils.unescape("a%20space").should.equal "a space"
+    Rack::Utils.unescape("q1%212%22%27w%245%267%2Fz8%29%3F%5C").
+      should.equal "q1!2\"'w$5&7/z8)?\\"
+  end
+
+  should "parse query strings correctly" do
+    Rack::Utils.parse_query("foo=bar").
+      should.equal "foo" => "bar"
+    Rack::Utils.parse_query("foo=\"bar\"").
+      should.equal "foo" => "\"bar\""
+    Rack::Utils.parse_query("foo=bar&foo=quux").
+      should.equal "foo" => ["bar", "quux"]
+    Rack::Utils.parse_query("foo=1&bar=2").
+      should.equal "foo" => "1", "bar" => "2"
+    Rack::Utils.parse_query("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F").
+      should.equal "my weird field" => "q1!2\"'w$5&7/z8)?"
+    Rack::Utils.parse_query("foo%3Dbaz=bar").should.equal "foo=baz" => "bar"
+    Rack::Utils.parse_query("=").should.equal "" => ""
+    Rack::Utils.parse_query("=value").should.equal "" => "value"
+    Rack::Utils.parse_query("key=").should.equal "key" => ""
+    Rack::Utils.parse_query("&key&").should.equal "key" => nil
+    Rack::Utils.parse_query(";key;", ";,").should.equal "key" => nil
+    Rack::Utils.parse_query(",key,", ";,").should.equal "key" => nil
+    Rack::Utils.parse_query(";foo=bar,;", ";,").should.equal "foo" => "bar"
+    Rack::Utils.parse_query(",foo=bar;,", ";,").should.equal "foo" => "bar"
+  end
+
+  should "parse nested query strings correctly" do
+    Rack::Utils.parse_nested_query("foo").
+      should.equal "foo" => nil
+    Rack::Utils.parse_nested_query("foo=").
+      should.equal "foo" => ""
+    Rack::Utils.parse_nested_query("foo=bar").
+      should.equal "foo" => "bar"
+    Rack::Utils.parse_nested_query("foo=\"bar\"").
+      should.equal "foo" => "\"bar\""
+
+    Rack::Utils.parse_nested_query("foo=bar&foo=quux").
+      should.equal "foo" => "quux"
+    Rack::Utils.parse_nested_query("foo&foo=").
+      should.equal "foo" => ""
+    Rack::Utils.parse_nested_query("foo=1&bar=2").
+      should.equal "foo" => "1", "bar" => "2"
+    Rack::Utils.parse_nested_query("&foo=1&&bar=2").
+      should.equal "foo" => "1", "bar" => "2"
+    Rack::Utils.parse_nested_query("foo&bar=").
+      should.equal "foo" => nil, "bar" => ""
+    Rack::Utils.parse_nested_query("foo=bar&baz=").
+      should.equal "foo" => "bar", "baz" => ""
+    Rack::Utils.parse_nested_query("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F").
+      should.equal "my weird field" => "q1!2\"'w$5&7/z8)?"
+
+    Rack::Utils.parse_nested_query("a=b&pid%3D1234=1023").
+      should.equal "pid=1234" => "1023", "a" => "b"
+
+    Rack::Utils.parse_nested_query("foo[]").
+      should.equal "foo" => [nil]
+    Rack::Utils.parse_nested_query("foo[]=").
+      should.equal "foo" => [""]
+    Rack::Utils.parse_nested_query("foo[]=bar").
+      should.equal "foo" => ["bar"]
+
+    Rack::Utils.parse_nested_query("foo[]=1&foo[]=2").
+      should.equal "foo" => ["1", "2"]
+    Rack::Utils.parse_nested_query("foo=bar&baz[]=1&baz[]=2&baz[]=3").
+      should.equal "foo" => "bar", "baz" => ["1", "2", "3"]
+    Rack::Utils.parse_nested_query("foo[]=bar&baz[]=1&baz[]=2&baz[]=3").
+      should.equal "foo" => ["bar"], "baz" => ["1", "2", "3"]
+
+    Rack::Utils.parse_nested_query("x[y][z]=1").
+      should.equal "x" => {"y" => {"z" => "1"}}
+    Rack::Utils.parse_nested_query("x[y][z][]=1").
+      should.equal "x" => {"y" => {"z" => ["1"]}}
+    Rack::Utils.parse_nested_query("x[y][z]=1&x[y][z]=2").
+      should.equal "x" => {"y" => {"z" => "2"}}
+    Rack::Utils.parse_nested_query("x[y][z][]=1&x[y][z][]=2").
+      should.equal "x" => {"y" => {"z" => ["1", "2"]}}
+
+    Rack::Utils.parse_nested_query("x[y][][z]=1").
+      should.equal "x" => {"y" => [{"z" => "1"}]}
+    Rack::Utils.parse_nested_query("x[y][][z][]=1").
+      should.equal "x" => {"y" => [{"z" => ["1"]}]}
+    Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][w]=2").
+      should.equal "x" => {"y" => [{"z" => "1", "w" => "2"}]}
+
+    Rack::Utils.parse_nested_query("x[y][][v][w]=1").
+      should.equal "x" => {"y" => [{"v" => {"w" => "1"}}]}
+    Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][v][w]=2").
+      should.equal "x" => {"y" => [{"z" => "1", "v" => {"w" => "2"}}]}
+
+    Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][z]=2").
+      should.equal "x" => {"y" => [{"z" => "1"}, {"z" => "2"}]}
+    Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][w]=a&x[y][][z]=2&x[y][][w]=3").
+      should.equal "x" => {"y" => [{"z" => "1", "w" => "a"}, {"z" => "2", "w" => "3"}]}
+
+    lambda { Rack::Utils.parse_nested_query("x[y]=1&x[y]z=2") }.
+      should.raise(TypeError).
+      message.should.equal "expected Hash (got String) for param `y'"
+
+    lambda { Rack::Utils.parse_nested_query("x[y]=1&x[]=1") }.
+      should.raise(TypeError).
+      message.should.match(/expected Array \(got [^)]*\) for param `x'/)
+
+    lambda { Rack::Utils.parse_nested_query("x[y]=1&x[y][][w]=2") }.
+      should.raise(TypeError).
+      message.should.equal "expected Array (got String) for param `y'"
+  end
+
+  should "build query strings correctly" do
+    Rack::Utils.build_query("foo" => "bar").should.be equal_query_to("foo=bar")
+    Rack::Utils.build_query("foo" => ["bar", "quux"]).
+      should.be equal_query_to("foo=bar&foo=quux")
+    Rack::Utils.build_query("foo" => "1", "bar" => "2").
+      should.be equal_query_to("foo=1&bar=2")
+    Rack::Utils.build_query("my weird field" => "q1!2\"'w$5&7/z8)?").
+      should.be equal_query_to("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F")
+  end
+
+  should "build nested query strings correctly" do
+    Rack::Utils.build_nested_query("foo" => nil).should.equal "foo"
+    Rack::Utils.build_nested_query("foo" => "").should.equal "foo="
+    Rack::Utils.build_nested_query("foo" => "bar").should.equal "foo=bar"
+
+    Rack::Utils.build_nested_query("foo" => "1", "bar" => "2").
+      should.be equal_query_to("foo=1&bar=2")
+    Rack::Utils.build_nested_query("my weird field" => "q1!2\"'w$5&7/z8)?").
+      should.be equal_query_to("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F")
+
+    Rack::Utils.build_nested_query("foo" => [nil]).
+      should.equal "foo[]"
+    Rack::Utils.build_nested_query("foo" => [""]).
+      should.equal "foo[]="
+    Rack::Utils.build_nested_query("foo" => ["bar"]).
+      should.equal "foo[]=bar"
+
+    # The ordering of the output query string is unpredictable with 1.8's
+    # unordered hash. Test that build_nested_query performs the inverse
+    # function of parse_nested_query.
+    [{"foo" => nil, "bar" => ""},
+      {"foo" => "bar", "baz" => ""},
+      {"foo" => ["1", "2"]},
+      {"foo" => "bar", "baz" => ["1", "2", "3"]},
+      {"foo" => ["bar"], "baz" => ["1", "2", "3"]},
+      {"foo" => ["1", "2"]},
+      {"foo" => "bar", "baz" => ["1", "2", "3"]},
+      {"x" => {"y" => {"z" => "1"}}},
+      {"x" => {"y" => {"z" => ["1"]}}},
+      {"x" => {"y" => {"z" => ["1", "2"]}}},
+      {"x" => {"y" => [{"z" => "1"}]}},
+      {"x" => {"y" => [{"z" => ["1"]}]}},
+      {"x" => {"y" => [{"z" => "1", "w" => "2"}]}},
+      {"x" => {"y" => [{"v" => {"w" => "1"}}]}},
+      {"x" => {"y" => [{"z" => "1", "v" => {"w" => "2"}}]}},
+      {"x" => {"y" => [{"z" => "1"}, {"z" => "2"}]}},
+      {"x" => {"y" => [{"z" => "1", "w" => "a"}, {"z" => "2", "w" => "3"}]}}
+    ].each { |params|
+      qs = Rack::Utils.build_nested_query(params)
+      Rack::Utils.parse_nested_query(qs).should.equal params
+    }
+
+    lambda { Rack::Utils.build_nested_query("foo=bar") }.
+      should.raise(ArgumentError).
+      message.should.equal "value must be a Hash"
+  end
+
+  should "parse query strings that have a non-existent value" do
+    key = "post/2011/08/27/Deux-%22rat%C3%A9s%22-de-l-Universit"
+    Rack::Utils.parse_query(key).should.equal Rack::Utils.unescape(key) => nil
+  end
+
+  should "build query strings without = with non-existent values" do
+    key = "post/2011/08/27/Deux-%22rat%C3%A9s%22-de-l-Universit"
+    key = Rack::Utils.unescape(key)
+    Rack::Utils.build_query(key => nil).should.equal Rack::Utils.escape(key)
+  end
+
+  should "parse q-values" do
+    # XXX handle accept-extension
+    Rack::Utils.q_values("foo;q=0.5,bar,baz;q=0.9").should.equal [
+      [ 'foo', 0.5 ],
+      [ 'bar', 1.0 ],
+      [ 'baz', 0.9 ]
+    ]
+  end
+
+  should "select best quality match" do
+    Rack::Utils.best_q_match("text/html", %w[text/html]).should.equal "text/html"
+
+    # More specific matches are preferred
+    Rack::Utils.best_q_match("text/*;q=0.5,text/html;q=1.0", %w[text/html]).should.equal "text/html"
+
+    # Higher quality matches are preferred
+    Rack::Utils.best_q_match("text/*;q=0.5,text/plain;q=1.0", %w[text/plain text/html]).should.equal "text/plain"
+
+    # All else equal, the available mimes are preferred in order
+    Rack::Utils.best_q_match("text/*", %w[text/html text/plain]).should.equal "text/html"
+    Rack::Utils.best_q_match("text/plain,text/html", %w[text/html text/plain]).should.equal "text/html"
+  end
+
+  should "escape html entities [&><'\"/]" do
+    Rack::Utils.escape_html("foo").should.equal "foo"
+    Rack::Utils.escape_html("f&o").should.equal "f&o"
+    Rack::Utils.escape_html("f<o").should.equal "f<o"
+    Rack::Utils.escape_html("f>o").should.equal "f>o"
+    Rack::Utils.escape_html("f'o").should.equal "f&#x27;o"
+    Rack::Utils.escape_html('f"o').should.equal "f"o"
+    Rack::Utils.escape_html("f/o").should.equal "f&#x2F;o"
+    Rack::Utils.escape_html("<foo></foo>").should.equal "<foo><&#x2F;foo>"
+  end
+
+  should "escape html entities even on MRI when it's bugged" do
+    test_escape = lambda do
+      kcodeu do
+        Rack::Utils.escape_html("\300<").should.equal "\300<"
+      end
+    end
+
+    if RUBY_VERSION.to_f < 1.9
+      test_escape.call
+    else
+      test_escape.should.raise(ArgumentError)
+    end
+  end
+
+  if "".respond_to?(:encode)
+    should "escape html entities in unicode strings" do
+      # the following will cause warnings if the regex is poorly encoded:
+      Rack::Utils.escape_html("☃").should.equal "☃"
+    end
+  end
+
+  should "figure out which encodings are acceptable" do
+    helper = lambda do |a, b|
+      Rack::Request.new(Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => a))
+      Rack::Utils.select_best_encoding(a, b)
+    end
+
+    helper.call(%w(), [["x", 1]]).should.equal(nil)
+    helper.call(%w(identity), [["identity", 0.0]]).should.equal(nil)
+    helper.call(%w(identity), [["*", 0.0]]).should.equal(nil)
+
+    helper.call(%w(identity), [["compress", 1.0], ["gzip", 1.0]]).should.equal("identity")
+
+    helper.call(%w(compress gzip identity), [["compress", 1.0], ["gzip", 1.0]]).should.equal("compress")
+    helper.call(%w(compress gzip identity), [["compress", 0.5], ["gzip", 1.0]]).should.equal("gzip")
+
+    helper.call(%w(foo bar identity), []).should.equal("identity")
+    helper.call(%w(foo bar identity), [["*", 1.0]]).should.equal("foo")
+    helper.call(%w(foo bar identity), [["*", 1.0], ["foo", 0.9]]).should.equal("bar")
+
+    helper.call(%w(foo bar identity), [["foo", 0], ["bar", 0]]).should.equal("identity")
+    helper.call(%w(foo bar baz identity), [["*", 0], ["identity", 0.1]]).should.equal("identity")
+  end
+
+  should "return the bytesize of String" do
+    Rack::Utils.bytesize("FOO\xE2\x82\xAC").should.equal 6
+  end
+
+  should "should perform constant time string comparison" do
+    Rack::Utils.secure_compare('a', 'a').should.equal true
+    Rack::Utils.secure_compare('a', 'b').should.equal false
+  end
+
+  should "return status code for integer" do
+    Rack::Utils.status_code(200).should.equal 200
+  end
+
+  should "return status code for string" do
+    Rack::Utils.status_code("200").should.equal 200
+  end
+
+  should "return status code for symbol" do
+    Rack::Utils.status_code(:ok).should.equal 200
+  end
+
+  should "return rfc2822 format from rfc2822 helper" do
+    Rack::Utils.rfc2822(Time.at(0).gmtime).should == "Thu, 01 Jan 1970 00:00:00 -0000"
+  end
+
+  should "return rfc2109 format from rfc2109 helper" do
+    Rack::Utils.rfc2109(Time.at(0).gmtime).should == "Thu, 01-Jan-1970 00:00:00 GMT"
+  end
+end
+
+describe Rack::Utils, "byte_range" do
+  should "ignore missing or syntactically invalid byte ranges" do
+    Rack::Utils.byte_ranges({},500).should.equal nil
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "foobar"},500).should.equal nil
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "furlongs=123-456"},500).should.equal nil
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes="},500).should.equal nil
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=-"},500).should.equal nil
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=123,456"},500).should.equal nil
+    # A range of non-positive length is syntactically invalid and ignored:
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=456-123"},500).should.equal nil
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=456-455"},500).should.equal nil
+  end
+
+  should "parse simple byte ranges" do
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=123-456"},500).should.equal [(123..456)]
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=123-"},500).should.equal [(123..499)]
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=-100"},500).should.equal [(400..499)]
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=0-0"},500).should.equal [(0..0)]
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=499-499"},500).should.equal [(499..499)]
+  end
+
+  should "parse several byte ranges" do
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=500-600,601-999"},1000).should.equal [(500..600),(601..999)]
+  end
+
+  should "truncate byte ranges" do
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=123-999"},500).should.equal [(123..499)]
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=600-999"},500).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=-999"},500).should.equal [(0..499)]
+  end
+
+  should "ignore unsatisfiable byte ranges" do
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=500-501"},500).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=500-"},500).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=999-"},500).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=-0"},500).should.equal []
+  end
+
+  should "handle byte ranges of empty files" do
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=123-456"},0).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=0-"},0).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=-100"},0).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=0-0"},0).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=-0"},0).should.equal []
+  end
+end
+
+describe Rack::Utils::HeaderHash do
+  should "retain header case" do
+    h = Rack::Utils::HeaderHash.new("Content-MD5" => "d5ff4e2a0 ...")
+    h['ETag'] = 'Boo!'
+    h.to_hash.should.equal "Content-MD5" => "d5ff4e2a0 ...", "ETag" => 'Boo!'
+  end
+
+  should "check existence of keys case insensitively" do
+    h = Rack::Utils::HeaderHash.new("Content-MD5" => "d5ff4e2a0 ...")
+    h.should.include 'content-md5'
+    h.should.not.include 'ETag'
+  end
+
+  should "merge case-insensitively" do
+    h = Rack::Utils::HeaderHash.new("ETag" => 'HELLO', "content-length" => '123')
+    merged = h.merge("Etag" => 'WORLD', 'Content-Length' => '321', "Foo" => 'BAR')
+    merged.should.equal "Etag"=>'WORLD', "Content-Length"=>'321', "Foo"=>'BAR'
+  end
+
+  should "overwrite case insensitively and assume the new key's case" do
+    h = Rack::Utils::HeaderHash.new("Foo-Bar" => "baz")
+    h["foo-bar"] = "bizzle"
+    h["FOO-BAR"].should.equal "bizzle"
+    h.length.should.equal 1
+    h.to_hash.should.equal "foo-bar" => "bizzle"
+  end
+
+  should "be converted to real Hash" do
+    h = Rack::Utils::HeaderHash.new("foo" => "bar")
+    h.to_hash.should.be.instance_of Hash
+  end
+
+  should "convert Array values to Strings when converting to Hash" do
+    h = Rack::Utils::HeaderHash.new("foo" => ["bar", "baz"])
+    h.to_hash.should.equal({ "foo" => "bar\nbaz" })
+  end
+
+  should "replace hashes correctly" do
+    h = Rack::Utils::HeaderHash.new("Foo-Bar" => "baz")
+    j = {"foo" => "bar"}
+    h.replace(j)
+    h["foo"].should.equal "bar"
+  end
+
+  should "be able to delete the given key case-sensitively" do
+    h = Rack::Utils::HeaderHash.new("foo" => "bar")
+    h.delete("foo")
+    h["foo"].should.be.nil
+    h["FOO"].should.be.nil
+  end
+
+  should "be able to delete the given key case-insensitively" do
+    h = Rack::Utils::HeaderHash.new("foo" => "bar")
+    h.delete("FOO")
+    h["foo"].should.be.nil
+    h["FOO"].should.be.nil
+  end
+
+  should "return the deleted value when #delete is called on an existing key" do
+    h = Rack::Utils::HeaderHash.new("foo" => "bar")
+    h.delete("Foo").should.equal("bar")
+  end
+
+  should "return nil when #delete is called on a non-existant key" do
+    h = Rack::Utils::HeaderHash.new("foo" => "bar")
+    h.delete("Hello").should.be.nil
+  end
+
+  should "avoid unnecessary object creation if possible" do
+    a = Rack::Utils::HeaderHash.new("foo" => "bar")
+    b = Rack::Utils::HeaderHash.new(a)
+    b.object_id.should.equal(a.object_id)
+    b.should.equal(a)
+  end
+
+  should "convert Array values to Strings when responding to #each" do
+    h = Rack::Utils::HeaderHash.new("foo" => ["bar", "baz"])
+    h.each do |k,v|
+      k.should.equal("foo")
+      v.should.equal("bar\nbaz")
+    end
+  end
+
+  should "not create headers out of thin air" do
+    h = Rack::Utils::HeaderHash.new
+    h['foo']
+    h['foo'].should.be.nil
+    h.should.not.include 'foo'
+  end
+end
+
+describe Rack::Utils::Context do
+  class ContextTest
+    attr_reader :app
+    def initialize app; @app=app; end
+    def call env; context env; end
+    def context env, app=@app; app.call(env); end
+  end
+  test_target1 = proc{|e| e.to_s+' world' }
+  test_target2 = proc{|e| e.to_i+2 }
+  test_target3 = proc{|e| nil }
+  test_target4 = proc{|e| [200,{'Content-Type'=>'text/plain', 'Content-Length'=>'0'},['']] }
+  test_app = ContextTest.new test_target4
+
+  should "set context correctly" do
+    test_app.app.should.equal test_target4
+    c1 = Rack::Utils::Context.new(test_app, test_target1)
+    c1.for.should.equal test_app
+    c1.app.should.equal test_target1
+    c2 = Rack::Utils::Context.new(test_app, test_target2)
+    c2.for.should.equal test_app
+    c2.app.should.equal test_target2
+  end
+
+  should "alter app on recontexting" do
+    c1 = Rack::Utils::Context.new(test_app, test_target1)
+    c2 = c1.recontext(test_target2)
+    c2.for.should.equal test_app
+    c2.app.should.equal test_target2
+    c3 = c2.recontext(test_target3)
+    c3.for.should.equal test_app
+    c3.app.should.equal test_target3
+  end
+
+  should "run different apps" do
+    c1 = Rack::Utils::Context.new test_app, test_target1
+    c2 = c1.recontext test_target2
+    c3 = c2.recontext test_target3
+    c4 = c3.recontext test_target4
+    a4 = Rack::Lint.new c4
+    a5 = Rack::Lint.new test_app
+    r1 = c1.call('hello')
+    r1.should.equal 'hello world'
+    r2 = c2.call(2)
+    r2.should.equal 4
+    r3 = c3.call(:misc_symbol)
+    r3.should.be.nil
+    r4 = Rack::MockRequest.new(a4).get('/')
+    r4.status.should.equal 200
+    r5 = Rack::MockRequest.new(a5).get('/')
+    r5.status.should.equal 200
+    r4.body.should.equal r5.body
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_webrick.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_webrick.rb
new file mode 100644
index 0000000..5d64772
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/spec_webrick.rb
@@ -0,0 +1,143 @@
+require 'rack/mock'
+require File.expand_path('../testrequest', __FILE__)
+
+Thread.abort_on_exception = true
+
+describe Rack::Handler::WEBrick do
+  extend TestRequest::Helpers
+
+  @server = WEBrick::HTTPServer.new(:Host => @host='127.0.0.1',
+                                    :Port => @port=9202,
+                                    :Logger => WEBrick::Log.new(nil, WEBrick::BasicLog::WARN),
+                                    :AccessLog => [])
+  @server.mount "/test", Rack::Handler::WEBrick,
+    Rack::Lint.new(TestRequest.new)
+  Thread.new { @server.start }
+  trap(:INT) { @server.shutdown }
+
+  should "respond" do
+    lambda {
+      GET("/test")
+    }.should.not.raise
+  end
+
+  should "be a WEBrick" do
+    GET("/test")
+    status.should.equal 200
+    response["SERVER_SOFTWARE"].should =~ /WEBrick/
+    response["HTTP_VERSION"].should.equal "HTTP/1.1"
+    response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
+    response["SERVER_PORT"].should.equal "9202"
+    response["SERVER_NAME"].should.equal "127.0.0.1"
+  end
+
+  should "have rack headers" do
+    GET("/test")
+    response["rack.version"].should.equal [1,2]
+    response["rack.multithread"].should.be.true
+    response["rack.multiprocess"].should.be.false
+    response["rack.run_once"].should.be.false
+  end
+
+  should "have CGI headers on GET" do
+    GET("/test")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test"
+    response["PATH_INFO"].should.be.equal ""
+    response["QUERY_STRING"].should.equal ""
+    response["test.postdata"].should.equal ""
+
+    GET("/test/foo?quux=1")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test/foo"
+    response["PATH_INFO"].should.equal "/foo"
+    response["QUERY_STRING"].should.equal "quux=1"
+
+    GET("/test/foo%25encoding?quux=1")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test/foo%25encoding"
+    response["PATH_INFO"].should.equal "/foo%25encoding"
+    response["QUERY_STRING"].should.equal "quux=1"
+  end
+
+  should "have CGI headers on POST" do
+    POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
+    status.should.equal 200
+    response["REQUEST_METHOD"].should.equal "POST"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test"
+    response["PATH_INFO"].should.equal ""
+    response["QUERY_STRING"].should.equal ""
+    response["HTTP_X_TEST_HEADER"].should.equal "42"
+    response["test.postdata"].should.equal "rack-form-data=23"
+  end
+
+  should "support HTTP auth" do
+    GET("/test", {:user => "ruth", :passwd => "secret"})
+    response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
+  end
+
+  should "set status" do
+    GET("/test?secret")
+    status.should.equal 403
+    response["rack.url_scheme"].should.equal "http"
+  end
+
+  should "correctly set cookies" do
+    @server.mount "/cookie-test", Rack::Handler::WEBrick,
+    Rack::Lint.new(lambda { |req|
+                     res = Rack::Response.new
+                     res.set_cookie "one", "1"
+                     res.set_cookie "two", "2"
+                     res.finish
+                   })
+
+    Net::HTTP.start(@host, @port) { |http|
+      res = http.get("/cookie-test")
+      res.code.to_i.should.equal 200
+      res.get_fields("set-cookie").should.equal ["one=1", "two=2"]
+    }
+  end
+
+  should "provide a .run" do
+    block_ran = false
+    catch(:done) {
+      Rack::Handler::WEBrick.run(lambda {},
+                                 {
+                                   :Host => '127.0.0.1',
+                                   :Port => 9210,
+                                   :Logger => WEBrick::Log.new(nil, WEBrick::BasicLog::WARN),
+                                   :AccessLog => []}) { |server|
+        block_ran = true
+        server.should.be.kind_of WEBrick::HTTPServer
+        @s = server
+        throw :done
+      }
+    }
+    block_ran.should.be.true
+    @s.shutdown
+  end
+
+  should "return repeated headers" do
+    @server.mount "/headers", Rack::Handler::WEBrick,
+    Rack::Lint.new(lambda { |req|
+        [
+          401,
+          { "Content-Type" => "text/plain",
+            "WWW-Authenticate" => "Bar realm=X\nBaz realm=Y" },
+          [""]
+        ]
+      })
+
+    Net::HTTP.start(@host, @port) { |http|
+      res = http.get("/headers")
+      res.code.to_i.should.equal 401
+      res["www-authenticate"].should.equal "Bar realm=X, Baz realm=Y"
+    }
+  end
+
+  @server.shutdown
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/static/another/index.html b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/static/another/index.html
new file mode 100644
index 0000000..d93e6fc
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/static/another/index.html
@@ -0,0 +1 @@
+another index!
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/static/index.html b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/static/index.html
new file mode 100644
index 0000000..fc2d9ad
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/static/index.html
@@ -0,0 +1 @@
+index!
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/testrequest.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/testrequest.rb
new file mode 100644
index 0000000..c5e339a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/testrequest.rb
@@ -0,0 +1,78 @@
+require 'yaml'
+require 'net/http'
+require 'rack/lint'
+
+class TestRequest
+  NOSERIALIZE = [Method, Proc, Rack::Lint::InputWrapper]
+
+  def call(env)
+    status = env["QUERY_STRING"] =~ /secret/ ? 403 : 200
+    env["test.postdata"] = env["rack.input"].read
+    minienv = env.dup
+    # This may in the future want to replace with a dummy value instead.
+    minienv.delete_if { |k,v| NOSERIALIZE.any? { |c| v.kind_of?(c) } }
+    body = minienv.to_yaml
+    size = body.respond_to?(:bytesize) ? body.bytesize : body.size
+    [status, {"Content-Type" => "text/yaml", "Content-Length" => size.to_s}, [body]]
+  end
+
+  module Helpers
+    attr_reader :status, :response
+
+    ROOT = File.expand_path(File.dirname(__FILE__) + "/..")
+    ENV["RUBYOPT"] = "-I#{ROOT}/lib -rubygems"
+
+    def root
+      ROOT
+    end
+
+    def rackup
+      "#{ROOT}/bin/rackup"
+    end
+
+    def GET(path, header={})
+      Net::HTTP.start(@host, @port) { |http|
+        user = header.delete(:user)
+        passwd = header.delete(:passwd)
+
+        get = Net::HTTP::Get.new(path, header)
+        get.basic_auth user, passwd  if user && passwd
+        http.request(get) { |response|
+          @status = response.code.to_i
+          begin
+            @response = YAML.load(response.body)
+          rescue TypeError, ArgumentError
+            @response = nil
+          end
+        }
+      }
+    end
+
+    def POST(path, formdata={}, header={})
+      Net::HTTP.start(@host, @port) { |http|
+        user = header.delete(:user)
+        passwd = header.delete(:passwd)
+
+        post = Net::HTTP::Post.new(path, header)
+        post.form_data = formdata
+        post.basic_auth user, passwd  if user && passwd
+        http.request(post) { |response|
+          @status = response.code.to_i
+          @response = YAML.load(response.body)
+        }
+      }
+    end
+  end
+end
+
+class StreamingRequest
+  def self.call(env)
+    [200, {"Content-Type" => "text/plain"}, new]
+  end
+
+  def each
+    yield "hello there!\n"
+    sleep 5
+    yield "that is all.\n"
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/unregistered_handler/rack/handler/unregistered.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/unregistered_handler/rack/handler/unregistered.rb
new file mode 100644
index 0000000..6dd9436
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/unregistered_handler/rack/handler/unregistered.rb
@@ -0,0 +1,7 @@
+module Rack
+  module Handler
+    # this class doesn't do anything, we're just seeing if we get it.
+    class Unregistered
+    end
+  end
+end
\ No newline at end of file
diff --git a/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/unregistered_handler/rack/handler/unregistered_long_one.rb b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/unregistered_handler/rack/handler/unregistered_long_one.rb
new file mode 100644
index 0000000..1920685
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/rack-1.5.2/test/unregistered_handler/rack/handler/unregistered_long_one.rb
@@ -0,0 +1,7 @@
+module Rack
+  module Handler
+    # this class doesn't do anything, we're just seeing if we get it.
+    class UnregisteredLongOne
+    end
+  end
+end
\ No newline at end of file
diff --git a/vendor/rdtool-0.6.38/COPYING.txt b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/COPYING.txt
similarity index 100%
copy from vendor/rdtool-0.6.38/COPYING.txt
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/COPYING.txt
diff --git a/vendor/rdtool-0.6.38/Gemfile b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/Gemfile
similarity index 100%
copy from vendor/rdtool-0.6.38/Gemfile
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/Gemfile
diff --git a/vendor/rdtool-0.6.38/HISTORY b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/HISTORY
similarity index 100%
copy from vendor/rdtool-0.6.38/HISTORY
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/HISTORY
diff --git a/vendor/rdtool-0.6.38/LGPL-2.1 b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/LGPL-2.1
similarity index 100%
copy from vendor/rdtool-0.6.38/LGPL-2.1
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/LGPL-2.1
diff --git a/vendor/rdtool-0.6.38/LICENSE.txt b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/LICENSE.txt
similarity index 100%
copy from vendor/rdtool-0.6.38/LICENSE.txt
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/LICENSE.txt
diff --git a/vendor/rdtool-0.6.38/README.html b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/README.html
similarity index 100%
copy from vendor/rdtool-0.6.38/README.html
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/README.html
diff --git a/vendor/rdtool-0.6.38/README.ja.html b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/README.ja.html
similarity index 100%
copy from vendor/rdtool-0.6.38/README.ja.html
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/README.ja.html
diff --git a/vendor/rdtool-0.6.38/README.rd b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/README.rd
similarity index 100%
copy from vendor/rdtool-0.6.38/README.rd
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/README.rd
diff --git a/vendor/rdtool-0.6.38/README.rd.ja b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/README.rd.ja
similarity index 100%
copy from vendor/rdtool-0.6.38/README.rd.ja
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/README.rd.ja
diff --git a/vendor/rdtool-0.6.38/Rakefile b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/Rakefile
similarity index 100%
copy from vendor/rdtool-0.6.38/Rakefile
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/Rakefile
diff --git a/vendor/rdtool-0.6.38/TODO b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/TODO
similarity index 100%
copy from vendor/rdtool-0.6.38/TODO
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/TODO
diff --git a/vendor/rdtool-0.6.38/bin/rd2 b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/bin/rd2
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/bin/rd2
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/bin/rd2
diff --git a/vendor/rdtool-0.6.38/bin/rdswap.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/bin/rdswap.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/bin/rdswap.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/bin/rdswap.rb
diff --git a/vendor/rdtool-0.6.38/doc/rd-draft.html b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/doc/rd-draft.html
similarity index 100%
copy from vendor/rdtool-0.6.38/doc/rd-draft.html
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/doc/rd-draft.html
diff --git a/vendor/rdtool-0.6.38/doc/rd-draft.ja.html b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/doc/rd-draft.ja.html
similarity index 100%
copy from vendor/rdtool-0.6.38/doc/rd-draft.ja.html
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/doc/rd-draft.ja.html
diff --git a/vendor/rdtool-0.6.38/doc/rd-draft.rd b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/doc/rd-draft.rd
similarity index 100%
copy from vendor/rdtool-0.6.38/doc/rd-draft.rd
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/doc/rd-draft.rd
diff --git a/vendor/rdtool-0.6.38/doc/rd-draft.rd.ja b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/doc/rd-draft.rd.ja
similarity index 100%
copy from vendor/rdtool-0.6.38/doc/rd-draft.rd.ja
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/doc/rd-draft.rd.ja
diff --git a/vendor/rdtool-0.6.38/lib/rd/block-element.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/block-element.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/block-element.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/block-element.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/complex-list-item.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/complex-list-item.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/complex-list-item.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/complex-list-item.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/desclist.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/desclist.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/desclist.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/desclist.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/document-struct.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/document-struct.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/document-struct.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/document-struct.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/dot.rd2rc b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/dot.rd2rc
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/dot.rd2rc
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/dot.rd2rc
diff --git a/vendor/rdtool-0.6.38/lib/rd/element.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/element.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/element.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/element.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/filter.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/filter.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/filter.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/filter.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/head-filter.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/head-filter.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/head-filter.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/head-filter.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/inline-element.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/inline-element.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/inline-element.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/inline-element.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/labeled-element.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/labeled-element.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/labeled-element.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/labeled-element.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/list.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/list.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/list.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/list.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/loose-struct.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/loose-struct.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/loose-struct.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/loose-struct.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/methodlist.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/methodlist.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/methodlist.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/methodlist.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/output-format-visitor.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/output-format-visitor.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/output-format-visitor.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/output-format-visitor.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/package.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/package.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/package.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/package.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/parser-util.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/parser-util.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/parser-util.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/parser-util.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/post-install b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/post-install
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/post-install
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/post-install
diff --git a/vendor/rdtool-0.6.38/lib/rd/pre-setup.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/pre-setup.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/pre-setup.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/pre-setup.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rbl-file.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rbl-file.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rbl-file.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rbl-file.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rbl-suite.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rbl-suite.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rbl-suite.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rbl-suite.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd-struct.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd-struct.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rd-struct.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd-struct.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2html-lib.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2html-lib.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rd2html-lib.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2html-lib.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2html-opt.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2html-opt.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rd2html-opt.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2html-opt.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2man-lib.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2man-lib.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rd2man-lib.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2man-lib.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rdblockparser.ry b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rdblockparser.ry
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rdblockparser.ry
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rdblockparser.ry
diff --git a/vendor/rdtool-0.6.38/lib/rd/rdblockparser.tab.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rdblockparser.tab.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rdblockparser.tab.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rdblockparser.tab.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rdfmt.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rdfmt.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rdfmt.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rdfmt.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rdinlineparser.ry b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rdinlineparser.ry
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rdinlineparser.ry
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rdinlineparser.ry
diff --git a/vendor/rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rdvisitor.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rdvisitor.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/rdvisitor.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/rdvisitor.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/reference-resolver.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/reference-resolver.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/reference-resolver.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/reference-resolver.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/search-file.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/search-file.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/search-file.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/search-file.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/tree.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/tree.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/tree.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/tree.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/version.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/version.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/version.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/version.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/visitor.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/visitor.rb
similarity index 100%
copy from vendor/rdtool-0.6.38/lib/rd/visitor.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/lib/rd/visitor.rb
diff --git a/vendor/rdtool-0.6.38/rdtool.gemspec b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/rdtool.gemspec
similarity index 100%
copy from vendor/rdtool-0.6.38/rdtool.gemspec
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/rdtool.gemspec
diff --git a/vendor/rdtool-0.6.38/setup.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/setup.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/setup.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/setup.rb
diff --git a/vendor/rdtool-0.6.38/test/data/includee1.html b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/includee1.html
similarity index 100%
copy from vendor/rdtool-0.6.38/test/data/includee1.html
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/includee1.html
diff --git a/vendor/rdtool-0.6.38/test/data/includee2.html b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/includee2.html
similarity index 100%
copy from vendor/rdtool-0.6.38/test/data/includee2.html
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/includee2.html
diff --git a/vendor/rdtool-0.6.38/test/data/includee3.nothtml b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/includee3.nothtml
similarity index 100%
copy from vendor/rdtool-0.6.38/test/data/includee3.nothtml
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/includee3.nothtml
diff --git a/vendor/rdtool-0.6.38/test/data/includee4.xhtml b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/includee4.xhtml
similarity index 100%
rename from vendor/rdtool-0.6.38/test/data/includee4.xhtml
rename to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/includee4.xhtml
diff --git a/vendor/rdtool-0.6.38/test/data/label.rbl b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/label.rbl
similarity index 100%
copy from vendor/rdtool-0.6.38/test/data/label.rbl
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/label.rbl
diff --git a/vendor/rdtool-0.6.38/test/data/label2.rbl b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/label2.rbl
similarity index 100%
copy from vendor/rdtool-0.6.38/test/data/label2.rbl
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/label2.rbl
diff --git a/vendor/rdtool-0.6.38/test/data/sub/includee2.html b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/sub/includee2.html
similarity index 100%
copy from vendor/rdtool-0.6.38/test/data/sub/includee2.html
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/sub/includee2.html
diff --git a/vendor/rdtool-0.6.38/test/data/sub/includee4.html b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/sub/includee4.html
similarity index 100%
rename from vendor/rdtool-0.6.38/test/data/sub/includee4.html
rename to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/data/sub/includee4.html
diff --git a/vendor/rdtool-0.6.38/test/dummy-observer.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/dummy-observer.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/dummy-observer.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/dummy-observer.rb
diff --git a/vendor/rdtool-0.6.38/test/dummy.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/dummy.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/dummy.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/dummy.rb
diff --git a/vendor/rdtool-0.6.38/test/temp-dir.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/temp-dir.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/temp-dir.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/temp-dir.rb
diff --git a/vendor/rdtool-0.6.38/test/test-block-parser.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-block-parser.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-block-parser.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-block-parser.rb
diff --git a/vendor/rdtool-0.6.38/test/test-desclist-item.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-desclist-item.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-desclist-item.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-desclist-item.rb
diff --git a/vendor/rdtool-0.6.38/test/test-document-element.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-document-element.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-document-element.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-document-element.rb
diff --git a/vendor/rdtool-0.6.38/test/test-document-struct.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-document-struct.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-document-struct.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-document-struct.rb
diff --git a/vendor/rdtool-0.6.38/test/test-element.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-element.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-element.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-element.rb
diff --git a/vendor/rdtool-0.6.38/test/test-headline.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-headline.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-headline.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-headline.rb
diff --git a/vendor/rdtool-0.6.38/test/test-inline-parser.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-inline-parser.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-inline-parser.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-inline-parser.rb
diff --git a/vendor/rdtool-0.6.38/test/test-list-item.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-list-item.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-list-item.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-list-item.rb
diff --git a/vendor/rdtool-0.6.38/test/test-list.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-list.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-list.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-list.rb
diff --git a/vendor/rdtool-0.6.38/test/test-methodlist-item.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-methodlist-item.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-methodlist-item.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-methodlist-item.rb
diff --git a/vendor/rdtool-0.6.38/test/test-nonterminal-element.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-nonterminal-element.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-nonterminal-element.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-nonterminal-element.rb
diff --git a/vendor/rdtool-0.6.38/test/test-nonterminal-inline.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-nonterminal-inline.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-nonterminal-inline.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-nonterminal-inline.rb
diff --git a/vendor/rdtool-0.6.38/test/test-output-format-visitor.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-output-format-visitor.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-output-format-visitor.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-output-format-visitor.rb
diff --git a/vendor/rdtool-0.6.38/test/test-parser-util.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-parser-util.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-parser-util.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-parser-util.rb
diff --git a/vendor/rdtool-0.6.38/test/test-rbl-file.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-rbl-file.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-rbl-file.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-rbl-file.rb
diff --git a/vendor/rdtool-0.6.38/test/test-rbl-suite.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-rbl-suite.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-rbl-suite.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-rbl-suite.rb
diff --git a/vendor/rdtool-0.6.38/test/test-rd2html-lib.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-rd2html-lib.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-rd2html-lib.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-rd2html-lib.rb
diff --git a/vendor/rdtool-0.6.38/test/test-rdtree.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-rdtree.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-rdtree.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-rdtree.rb
diff --git a/vendor/rdtool-0.6.38/test/test-rdvisitor.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-rdvisitor.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-rdvisitor.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-rdvisitor.rb
diff --git a/vendor/rdtool-0.6.38/test/test-reference-resolver.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-reference-resolver.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-reference-resolver.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-reference-resolver.rb
diff --git a/vendor/rdtool-0.6.38/test/test-reference.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-reference.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-reference.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-reference.rb
diff --git a/vendor/rdtool-0.6.38/test/test-search-file.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-search-file.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-search-file.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-search-file.rb
diff --git a/vendor/rdtool-0.6.38/test/test-terminal-inline.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-terminal-inline.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-terminal-inline.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-terminal-inline.rb
diff --git a/vendor/rdtool-0.6.38/test/test-textblock.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-textblock.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-textblock.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-textblock.rb
diff --git a/vendor/rdtool-0.6.38/test/test-tree.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-tree.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-tree.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-tree.rb
diff --git a/vendor/rdtool-0.6.38/test/test-version.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-version.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-version.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-version.rb
diff --git a/vendor/rdtool-0.6.38/test/test-visitor.rb b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-visitor.rb
old mode 100644
new mode 100755
similarity index 100%
copy from vendor/rdtool-0.6.38/test/test-visitor.rb
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/test/test-visitor.rb
diff --git a/vendor/rdtool-0.6.38/utils/rd-mode.el b/.bundle/ruby/1.9.1/gems/rdtool-0.6.38/utils/rd-mode.el
similarity index 100%
copy from vendor/rdtool-0.6.38/utils/rd-mode.el
copy to .bundle/ruby/1.9.1/gems/rdtool-0.6.38/utils/rd-mode.el
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/LICENSE b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/LICENSE
new file mode 100644
index 0000000..7476999
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/LICENSE
@@ -0,0 +1,21 @@
+Copyright (c) 2011 Sam Stephenson
+Copyright (c) 2011 Joshua Peek
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/README.md b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/README.md
new file mode 100644
index 0000000..55ac933
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/README.md
@@ -0,0 +1,507 @@
+# Sprockets: Rack-based asset packaging
+
+Sprockets is a Ruby library for compiling and serving web assets.
+It features declarative dependency management for JavaScript and CSS
+assets, as well as a powerful preprocessor pipeline that allows you to
+write assets in languages like CoffeeScript, Sass, SCSS and LESS.
+
+# Installation #
+
+Install Sprockets from RubyGems:
+
+    $ gem install sprockets
+
+Or include it in your project's `Gemfile` with Bundler:
+
+    gem 'sprockets', '~> 2.0'
+
+# Understanding the Sprockets Environment #
+
+You'll need an instance of the `Sprockets::Environment` class to
+access and serve assets from your application. Under Rails 3.1 and
+later, `YourApp::Application.assets` is a preconfigured
+`Sprockets::Environment` instance. For Rack-based applications, create
+an instance in `config.ru`.
+
+The Sprockets `Environment` has methods for retrieving and serving
+assets, manipulating the load path, and registering processors. It is
+also a Rack application that can be mounted at a URL to serve assets
+over HTTP.
+
+## The Load Path ##
+
+The *load path* is an ordered list of directories that Sprockets uses
+to search for assets.
+
+In the simplest case, a Sprockets environment's load path will consist
+of a single directory containing your application's asset source
+files. When mounted, the environment will serve assets from this
+directory as if they were static files in your public root.
+
+The power of the load path is that it lets you organize your source
+files into multiple directories -- even directories that live outside
+your application -- and combine those directories into a single
+virtual filesystem. That means you can easily bundle JavaScript, CSS
+and images into a Ruby library and import them into your application.
+
+### Manipulating the Load Path ###
+
+To add a directory to your environment's load path, use the
+`append_path` and `prepend_path` methods. Directories at the beginning
+of the load path have precedence over subsequent directories.
+
+    environment = Sprockets::Environment.new
+    environment.append_path 'app/assets/javascripts'
+    environment.append_path 'lib/assets/javascripts'
+    environment.append_path 'vendor/assets/jquery'
+
+In general, you should append to the path by default and reserve
+prepending for cases where you need to override existing assets.
+
+## Accessing Assets ##
+
+Once you've set up your environment's load path, you can mount the
+environment as a Rack server and request assets via HTTP. You can also
+access assets programmatically from within your application.
+
+### Logical Paths ###
+
+Assets in Sprockets are always referenced by their *logical path*.
+
+The logical path is the path of the asset source file relative to its
+containing directory in the load path. For example, if your load path
+contains the directory `app/assets/javascripts`:
+
+<table>
+  <tr>
+    <th>Asset source file</th>
+    <th>Logical path</th>
+  </tr>
+  <tr>
+    <td>app/assets/javascripts/application.js</td>
+    <td>application.js</td>
+  </tr>
+  <tr>
+    <td>app/assets/javascripts/models/project.js</td>
+    <td>models/project.js</td>
+  </tr>
+</table>
+
+In this way, all directories in the load path are merged to create a
+virtual filesystem whose entries are logical paths.
+
+### Serving Assets Over HTTP ###
+
+When you mount an environment, all of its assets are accessible as
+logical paths underneath the *mount point*. For example, if you mount
+your environment at `/assets` and request the URL
+`/assets/application.js`, Sprockets will search your load path for the
+file named `application.js` and serve it.
+
+Under Rails 3.1 and later, your Sprockets environment is automatically
+mounted at `/assets`. If you are using Sprockets with a Rack
+application, you will need to mount the environment yourself. A good
+way to do this is with the `map` method in `config.ru`:
+
+    require 'sprockets'
+    map '/assets' do
+      environment = Sprockets::Environment.new
+      environment.append_path 'app/assets/javascripts'
+      environment.append_path 'app/assets/stylesheets'
+      run environment
+    end
+
+    map '/' do
+      run YourRackApp
+    end
+
+### Accessing Assets Programmatically ###
+
+You can use the `find_asset` method (aliased as `[]`) to retrieve an
+asset from a Sprockets environment. Pass it a logical path and you'll
+get a `Sprockets::BundledAsset` instance back:
+
+    environment['application.js']
+    # => #<Sprockets::BundledAsset ...>
+
+Call `to_s` on the resulting asset to access its contents, `length` to
+get its length in bytes, `mtime` to query its last-modified time, and
+`pathname` to get its full path on the filesystem.
+
+# Using Engines #
+
+Asset source files can be written in another language, like SCSS or
+CoffeeScript, and automatically compiled to CSS or JavaScript by
+Sprockets. Compilers for these languages are called *engines*.
+
+Engines are specified by additional extensions on the asset source
+filename. For example, a CSS file written in SCSS might have the name
+`layout.css.scss`, while a JavaScript file written in CoffeeScript
+might have the name `dialog.js.coffee`.
+
+## Styling with Sass and SCSS ##
+
+[Sass](http://sass-lang.com/) is a language that compiles to CSS and
+adds features like nested rules, variables, mixins and selector
+inheritance.
+
+If the `sass` gem is available to your application, you can use Sass
+to write CSS assets in Sprockets.
+
+Sprockets supports both Sass syntaxes. For the original
+whitespace-sensitive syntax, use the extension `.css.sass`. For the
+new SCSS syntax, use the extension `.css.scss`.
+
+## Styling with LESS ##
+
+[LESS](http://lesscss.org/) extends CSS with dynamic behavior such as
+variables, mixins, operations and functions.
+
+If the `less` gem is available to your application, you can use LESS
+to write CSS assets in Sprockets. Note that the LESS compiler is
+written in JavaScript and the `less` gem (on MRI) uses `therubyracer`
+which embeds the V8 JavaScript runtime in Ruby, while on JRuby you're
+going to need `therubyrhino` gem installed.
+
+To write CSS assets with LESS, use the extension `.css.less`.
+
+## Scripting with CoffeeScript ##
+
+[CoffeeScript](http://jashkenas.github.com/coffee-script/) is a
+language that compiles to the "good parts" of JavaScript, featuring a
+cleaner syntax with array comprehensions, classes, and function
+binding.
+
+If the `coffee-script` gem is available to your application, you can
+use CoffeeScript to write JavaScript assets in Sprockets. Note that
+the CoffeeScript compiler is written in JavaScript, and you will need
+an [ExecJS](https://github.com/sstephenson/execjs)-supported runtime
+on your system to invoke it.
+
+To write JavaScript assets with CoffeeScript, use the extension
+`.js.coffee`.
+
+## JavaScript Templating with EJS and Eco ##
+
+Sprockets supports *JavaScript templates* for client-side rendering of
+strings or markup. JavaScript templates have the special format
+extension `.jst` and are compiled to JavaScript functions.
+
+When loaded, a JavaScript template function can be accessed by its
+logical path as a property on the global `JST` object. Invoke a
+template function to render the template as a string. The resulting
+string can then be inserted into the DOM.
+
+    <!-- templates/hello.jst.ejs -->
+    <div>Hello, <span><%= name %></span>!</div>
+
+    // application.js
+    //= require templates/hello
+    $("#hello").html(JST["templates/hello"]({ name: "Sam" }));
+
+Sprockets supports two JavaScript template languages:
+[EJS](https://github.com/sstephenson/ruby-ejs), for embedded
+JavaScript, and [Eco](https://github.com/sstephenson/ruby-eco), for
+embedded CoffeeScript. Both languages use the familiar `<% … %>`
+syntax for embedding logic in templates.
+
+If the `ejs` gem is available to your application, you can use EJS
+templates in Sprockets. EJS templates have the extension `.jst.ejs`.
+
+If the `eco` gem is available to your application, you can use [Eco
+templates](https://github.com/sstephenson/eco) in Sprockets. Eco
+templates have the extension `.jst.eco`. Note that the `eco` gem
+depends on the CoffeeScript compiler, so the same caveats apply as
+outlined above for the CoffeeScript engine.
+
+## Invoking Ruby with ERB ##
+
+Sprockets provides an ERB engine for preprocessing assets using
+embedded Ruby code. Append `.erb` to a CSS or JavaScript asset's
+filename to enable the ERB engine.
+
+**Note**: Sprockets processes multiple engine extensions in order from
+  right to left, so you can use multiple engines with a single
+  asset. For example, to have a CoffeeScript asset that is first
+  preprocessed with ERB, use the extension `.js.coffee.erb`.
+
+Ruby code embedded in an asset is evaluated in the context of a
+`Sprockets::Context` instance for the given asset. Common uses for ERB
+include:
+
+- embedding another asset as a Base64-encoded `data:` URI with the
+  `asset_data_uri` helper
+- inserting the URL to another asset, such as with the `asset_path`
+  helper provided by the Sprockets Rails plugin
+- embedding other application resources, such as a localized string
+  database, in a JavaScript asset via JSON
+- embedding version constants loaded from another file
+
+See the [Helper Methods](#FIXME) section for more information about
+interacting with `Sprockets::Context` instances via ERB.
+
+### String Interpolation Syntax ###
+
+If you need access to Ruby from an asset but cannot use ERB's `<% …
+%>` syntax, Sprockets also supports Ruby string interpolation syntax
+(`#{ … }`) with the `.str` engine extension.
+
+# Managing and Bundling Dependencies #
+
+You can create *asset bundles* -- ordered concatenations of asset
+source files -- by specifying dependencies in a special comment syntax
+at the top of each source file.
+
+Sprockets reads these comments, called *directives*, and processes
+them to recursively build a dependency graph. When you request an
+asset with dependencies, the dependencies will be included in order at
+the top of the file.
+
+## The Directive Processor ##
+
+Sprockets runs the *directive processor* on each CSS and JavaScript
+source file. The directive processor scans for comment lines beginning
+with `=` in comment blocks at the top of the file.
+
+    //= require jquery
+    //= require jquery-ui
+    //= require backbone
+    //= require_tree .
+
+The first word immediately following `=` specifies the directive
+name. Any words following the directive name are treated as
+arguments. Arguments may be placed in single or double quotes if they
+contain spaces, similar to commands in the Unix shell.
+
+**Note**: Non-directive comment lines will be preserved in the final
+  asset, but directive comments are stripped after
+  processing. Sprockets will not look for directives in comment blocks
+  that occur after the first line of code.
+
+### Supported Comment Types ###
+
+The directive processor understands comment blocks in three formats:
+
+    /* Multi-line comment blocks (CSS, SCSS, JavaScript)
+     *= require foo
+     */
+
+    // Single-line comment blocks (SCSS, JavaScript)
+    //= require foo
+
+    # Single-line comment blocks (CoffeeScript)
+    #= require foo
+
+## Sprockets Directives ##
+
+You can use the following directives to declare dependencies in asset
+source files.
+
+For directives that take a *path* argument, you may specify either a
+logical path or a relative path. Relative paths begin with `./` and
+reference files relative to the location of the current file.
+
+### The `require` Directive ###
+
+`require` *path* inserts the contents of the asset source file
+specified by *path*. If the file is required multiple times, it will
+appear in the bundle only once.
+
+### The `include` Directive ###
+
+`include` *path* works like `require`, but inserts the contents of the
+specified source file even if it has already been included or
+required.
+
+### The `require_directory` Directive ###
+
+`require_directory` *path* requires all source files of the same
+format in the directory specified by *path*. Files are required in
+alphabetical order.
+
+### The `require_tree` Directive ###
+
+`require_tree` *path* works like `require_directory`, but operates
+recursively to require all files in all subdirectories of the
+directory specified by *path*.
+
+### The `require_self` Directive ###
+
+`require_self` tells Sprockets to insert the body of the current
+source file before any subsequent `require` or `include` directives.
+
+### The `depend_on` Directive ###
+
+`depend_on` *path* declares a dependency on the given *path* without
+including it in the bundle. This is useful when you need to expire an
+asset's cache in response to a change in another file.
+
+### The `stub` Directive ###
+
+`stub` *path* allows dependency to be excluded from the asset bundle.
+The *path* must be a valid asset and may or may not already be part
+of the bundle. Once stubbed, it is blacklisted and can't be brought
+back by any other `require`.
+
+# Development #
+
+## Contributing ##
+
+The Sprockets source code is [hosted on
+GitHub](https://github.com/sstephenson/sprockets). You can check out a
+copy of the latest code using Git:
+
+    $ git clone https://github.com/sstephenson/sprockets.git
+
+If you've found a bug or have a question, please open an issue on the
+[Sprockets issue
+tracker](https://github.com/sstephenson/sprockets/issues). Or, clone
+the Sprockets repository, write a failing test case, fix the bug and
+submit a pull request.
+
+## Version History ##
+
+**2.10.0** (May 24, 2013)
+
+* Support for `bower.json`
+
+**2.9.3** (April 20, 2013)
+
+* Fixed sass caching bug
+
+**2.9.2** (April 8, 2013)
+
+* Improve file freshness check performance
+* Directive processor encoding fixes
+
+**2.9.1** (April 6, 2013)
+
+* Support for Uglifier 2.x
+
+**2.9.0** (February 25, 2013)
+
+* Write out gzipped variants of bundled assets.
+
+**2.8.2** (December 10, 2012)
+
+* Fixed top level Sass constant references
+* Fixed manifest logger when environment is disabled
+
+**2.8.1** (October 31, 2012)
+
+* Fixed Sass importer bug
+
+**2.8.0** (October 16, 2012)
+
+* Allow manifest location to be seperated from output directory
+* Pass logical path and absolute path to each_logical_path iterator
+
+**2.7.0** (October 10, 2012)
+
+* Added --css-compressor and --js-compressor command line flags
+* Added css/js compressor shorthand
+* Change default manifest.json filename to be a randomized manifest-16HEXBYTES.json
+* Allow nil environment to be passed to manifest
+* Allow manifest instance to be set on rake task
+
+**2.6.0** (September 19, 2012)
+
+* Added bower component.json require support
+
+**2.5.0** (September 4, 2012)
+
+* Fixed Ruby 2.0 RegExp warning
+* Provide stubbed implementation of context *_path helpers
+* Add SassCompressor
+
+**2.4.5** (July 10, 2012)
+
+* Tweaked some logger levels
+
+**2.4.4** (July 2, 2012)
+
+* Canonicalize logical path extensions
+* Check absolute paths passed to depend_on
+
+**2.4.3** (May 16, 2012)
+
+* Exposed :sprockets in sass options
+* Include dependency paths in asset mtime
+
+**2.4.2** (May 7, 2012)
+
+* Fixed MultiJson feature detect
+
+**2.4.1** (April 26, 2012)
+
+* Fixed MultiJson API change
+* Fixed gzip mtime
+
+**2.4.0** (March 27, 2012)
+
+* Added global path registry
+* Added global processor registry
+
+**2.3.2** (March 26, 2012)
+
+* Fix Context#logical_path with dots
+
+**2.3.1** (February 11, 2012)
+
+* Added bytesize to manifest
+* Added Asset#bytesize alias
+* Security: Check path for forbidden access after unescaping
+
+**2.3.0** (January 16, 2012)
+
+* Added special Sass importer that automatically tracks any `@import`ed files.
+
+**2.2.0** (January 10, 2012)
+
+* Added `sprockets` command line utility.
+* Added rake/sprocketstask.
+* Added json manifest log of compiled assets.
+* Added `stub` directive that allows you to exclude files from the bundle.
+* Added per environment external encoding (Environment#default_external_encoding). Defaults to UTF-8. Fixes issues where LANG is not set correctly and Rubys default external is set to ASCII.
+
+**2.1.2** (November 20, 2011)
+
+* Disabled If-Modified-Since server checks. Fixes some browser caching issues when serving the asset body only. If-None-Match caching is sufficent.
+
+**2.1.1** (November 18, 2011)
+
+* Fix windows absolute path check bug.
+
+**2.1.0** (November 11, 2011)
+
+* Directive comment lines are now turned into empty lines instead of removed. This way line numbers in
+  CoffeeScript syntax errors are correct.
+* Performance and caching bug fixes.
+
+**2.0.3** (October 17, 2011)
+
+* Detect format extensions from right to left.
+* Make JST namespace configurable.
+
+**2.0.2** (October 4, 2011)
+
+* Fixed loading stale cache from bundler gems.
+
+**2.0.1** (September 30, 2011)
+
+* Fixed bug with fingerprinting file names with multiple dots.
+* Decode URIs as default internal.
+* Fix symlinked asset directories.
+
+**2.0.0** (August 29, 2011)
+
+* Initial public release.
+
+# License #
+
+Copyright © 2011 Sam Stephenson <<sstephenson at gmail.com>>
+
+Copyright © 2011 Joshua Peek <<josh at joshpeek.com>>
+
+Sprockets is distributed under an MIT-style license. See LICENSE for
+details.
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/bin/sprockets b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/bin/sprockets
new file mode 100755
index 0000000..a3fb651
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/bin/sprockets
@@ -0,0 +1,88 @@
+#!/usr/bin/env ruby
+
+require 'sprockets'
+require 'optparse'
+require 'shellwords'
+
+unless ARGV.delete("--noenv")
+  if File.exist?(path = "./.sprocketsrc")
+    rcflags = Shellwords.split(File.read(path))
+    ARGV.unshift(*rcflags)
+  end
+end
+
+filenames = []
+environment = Sprockets::Environment.new(Dir.pwd)
+manifest = nil
+
+(ENV['SPROCKETS_PATH'] || "").split(File::PATH_SEPARATOR).each do |path|
+  environment.append_path path
+end
+
+OptionParser.new do |opts|
+  opts.summary_width = 28
+  opts.banner = "Usage: sprockets [options] filename [filename ...]"
+
+  def opts.show_usage
+    puts self
+    exit 1
+  end
+
+  opts.on("-r", "--require LIBRARY", "Require the LIBRARY before doing anything") do |lib|
+    require lib
+  end
+
+  opts.on("-I DIRECTORY", "--include=DIRECTORY", "Adds the directory to the Sprockets load path") do |directory|
+    environment.append_path directory
+  end
+
+  opts.on("-o DIRECTORY", "--output=DIRECTORY", "Copy provided assets into DIRECTORY") do |directory|
+    manifest = Sprockets::Manifest.new(environment, directory)
+  end
+
+  opts.on("--css-compressor=COMPRESSOR", "Use CSS compressor") do |compressor|
+    environment.css_compressor = compressor.to_sym
+  end
+
+  opts.on("--js-compressor=COMPRESSOR", "Use JavaScript compressor") do |compressor|
+    environment.js_compressor = compressor.to_sym
+  end
+
+  opts.on("--noenv", "Disables .sprocketsrc file") do
+  end
+
+  opts.on_tail("-h", "--help", "Shows this help message") do
+    opts.show_usage
+  end
+
+  opts.on_tail("-v", "--version", "Shows version") do
+    puts Sprockets::VERSION
+    exit
+  end
+
+  opts.show_usage if ARGV.empty?
+
+  begin
+    opts.order(ARGV) do |filename|
+      filenames << File.expand_path(filename)
+    end
+  rescue OptionParser::ParseError => e
+    opts.warn e.message
+    opts.show_usage
+  end
+end
+
+if environment.paths.empty?
+  warn "No load paths given"
+  warn "Usage: sprockets -Ijavascripts/ filename"
+  exit 1
+end
+
+if manifest
+  manifest.compile(filenames)
+elsif filenames.length == 1
+  puts environment.find_asset(filenames.first).to_s
+else
+  warn "Only one file can be compiled to stdout at a time"
+  exit 1
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/rake/sprocketstask.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/rake/sprocketstask.rb
new file mode 100644
index 0000000..7fb9c91
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/rake/sprocketstask.rb
@@ -0,0 +1,151 @@
+require 'rake'
+require 'rake/tasklib'
+
+require 'sprockets'
+require 'logger'
+
+module Rake
+  # Simple Sprockets compilation Rake task macro.
+  #
+  #   Rake::SprocketsTask.new do |t|
+  #     t.environment = Sprockets::Environment.new
+  #     t.output      = "./public/assets"
+  #     t.assets      = %w( application.js application.css )
+  #   end
+  #
+  class SprocketsTask < Rake::TaskLib
+    # Name of the task. Defaults to "assets".
+    #
+    # The name will also be used to suffix the clean and clobber
+    # tasks, "clean_assets" and "clobber_assets".
+    attr_accessor :name
+
+    # `Environment` instance used for finding assets.
+    #
+    # You'll most likely want to reassign `environment` to your own.
+    #
+    #   Rake::SprocketsTask.new do |t|
+    #     t.environment = Foo::Assets
+    #   end
+    #
+    def environment
+      if !@environment.is_a?(Sprockets::Base) && @environment.respond_to?(:call)
+        @environment = @environment.call
+      else
+        @environment
+      end
+    end
+    attr_writer :environment
+
+    # Returns cached indexed environment
+    def index
+      @index ||= environment.index if environment
+    end
+
+    # `Manifest` instance used for already compiled assets.
+    #
+    # Will be created by default if an environment and output
+    # directory are given
+    def manifest
+      if !@manifest.is_a?(Sprockets::Manifest) && @manifest.respond_to?(:call)
+        @manifest = @manifest.call
+      else
+        @manifest
+      end
+    end
+    attr_writer :manifest
+
+    # Directory to write compiled assets too. As well as the manifest file.
+    #
+    #   t.output = "./public/assets"
+    #
+    attr_accessor :output
+
+    # Array of asset logical paths to compile.
+    #
+    #   t.assets = %w( application.js jquery.js application.css )
+    #
+    attr_accessor :assets
+
+    # Number of old assets to keep.
+    attr_accessor :keep
+
+    # Logger to use during rake tasks. Defaults to using stderr.
+    #
+    #   t.logger = Logger.new($stdout)
+    #
+    attr_accessor :logger
+
+    # Returns logger level Integer.
+    def log_level
+      @logger.level
+    end
+
+    # Set logger level with constant or symbol.
+    #
+    #   t.log_level = Logger::INFO
+    #   t.log_level = :debug
+    #
+    def log_level=(level)
+      if level.is_a?(Integer)
+        @logger.level = level
+      else
+        @logger.level = Logger.const_get(level.to_s.upcase)
+      end
+    end
+
+    def initialize(name = :assets)
+      @name         = name
+      @environment  = lambda { Sprockets::Environment.new(Dir.pwd) }
+      @manifest     = lambda { Sprockets::Manifest.new(index, output) }
+      @logger       = Logger.new($stderr)
+      @logger.level = Logger::INFO
+      @keep         = 2
+
+      yield self if block_given?
+
+      define
+    end
+
+    # Define tasks
+    def define
+      desc name == :assets ? "Compile assets" : "Compile #{name} assets"
+      task name do
+        with_logger do
+          manifest.compile(assets)
+        end
+      end
+
+      desc name == :assets ? "Remove all assets" : "Remove all #{name} assets"
+      task "clobber_#{name}" do
+        with_logger do
+          manifest.clobber
+        end
+      end
+
+      task :clobber => ["clobber_#{name}"]
+
+      desc name == :assets ? "Clean old assets" : "Clean old #{name} assets"
+      task "clean_#{name}" do
+        with_logger do
+          manifest.clean(keep)
+        end
+      end
+
+      task :clean => ["clean_#{name}"]
+    end
+
+    private
+      # Sub out environment logger with our rake task logger that
+      # writes to stderr.
+      def with_logger
+        if env = manifest.environment
+          old_logger = env.logger
+          env.logger = @logger
+        end
+        yield
+      ensure
+        env.logger = old_logger if env
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets.rb
new file mode 100644
index 0000000..fa05242
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets.rb
@@ -0,0 +1,108 @@
+require 'sprockets/version'
+
+module Sprockets
+  # Environment
+  autoload :Base,                    "sprockets/base"
+  autoload :Environment,             "sprockets/environment"
+  autoload :Index,                   "sprockets/index"
+  autoload :Manifest,                "sprockets/manifest"
+
+  # Assets
+  autoload :Asset,                   "sprockets/asset"
+  autoload :BundledAsset,            "sprockets/bundled_asset"
+  autoload :ProcessedAsset,          "sprockets/processed_asset"
+  autoload :StaticAsset,             "sprockets/static_asset"
+
+  # Processing
+  autoload :Context,                 "sprockets/context"
+  autoload :EcoTemplate,             "sprockets/eco_template"
+  autoload :EjsTemplate,             "sprockets/ejs_template"
+  autoload :JstProcessor,            "sprockets/jst_processor"
+  autoload :Processor,               "sprockets/processor"
+  autoload :SassCacheStore,          "sprockets/sass_cache_store"
+  autoload :SassFunctions,           "sprockets/sass_functions"
+  autoload :SassImporter,            "sprockets/sass_importer"
+  autoload :SassTemplate,            "sprockets/sass_template"
+  autoload :ScssTemplate,            "sprockets/scss_template"
+
+  # Internal utilities
+  autoload :ArgumentError,           "sprockets/errors"
+  autoload :AssetAttributes,         "sprockets/asset_attributes"
+  autoload :CircularDependencyError, "sprockets/errors"
+  autoload :ContentTypeMismatch,     "sprockets/errors"
+  autoload :EngineError,             "sprockets/errors"
+  autoload :Error,                   "sprockets/errors"
+  autoload :FileNotFound,            "sprockets/errors"
+  autoload :Utils,                   "sprockets/utils"
+
+  module Cache
+    autoload :FileStore, "sprockets/cache/file_store"
+  end
+
+  # Extend Sprockets module to provide global registry
+  require 'hike'
+  require 'sprockets/engines'
+  require 'sprockets/mime'
+  require 'sprockets/processing'
+  require 'sprockets/compressing'
+  require 'sprockets/paths'
+  extend Engines, Mime, Processing, Compressing, Paths
+
+  @trail             = Hike::Trail.new(File.expand_path('..', __FILE__))
+  @mime_types        = {}
+  @engines           = {}
+  @preprocessors     = Hash.new { |h, k| h[k] = [] }
+  @postprocessors    = Hash.new { |h, k| h[k] = [] }
+  @bundle_processors = Hash.new { |h, k| h[k] = [] }
+  @compressors       = Hash.new { |h, k| h[k] = {} }
+
+  register_mime_type 'text/css', '.css'
+  register_mime_type 'application/javascript', '.js'
+
+  require 'sprockets/directive_processor'
+  register_preprocessor 'text/css',               DirectiveProcessor
+  register_preprocessor 'application/javascript', DirectiveProcessor
+
+  require 'sprockets/safety_colons'
+  register_postprocessor 'application/javascript', SafetyColons
+
+  require 'sprockets/charset_normalizer'
+  register_bundle_processor 'text/css', CharsetNormalizer
+
+  require 'sprockets/sass_compressor'
+  register_compressor 'text/css', :sass, SassCompressor
+  register_compressor 'text/css', :scss, SassCompressor
+
+  require 'sprockets/yui_compressor'
+  register_compressor 'text/css', :yui, YUICompressor
+
+  require 'sprockets/closure_compressor'
+  register_compressor 'application/javascript', :closure, ClosureCompressor
+
+  require 'sprockets/uglifier_compressor'
+  register_compressor 'application/javascript', :uglifier, UglifierCompressor
+  register_compressor 'application/javascript', :uglify, UglifierCompressor
+
+  require 'sprockets/yui_compressor'
+  register_compressor 'application/javascript', :yui, YUICompressor
+
+  # Cherry pick the default Tilt engines that make sense for
+  # Sprockets. We don't need ones that only generate html like HAML.
+
+  # Mmm, CoffeeScript
+  register_engine '.coffee', Tilt::CoffeeScriptTemplate
+
+  # JST engines
+  register_engine '.jst',    JstProcessor
+  register_engine '.eco',    EcoTemplate
+  register_engine '.ejs',    EjsTemplate
+
+  # CSS engines
+  register_engine '.less',   Tilt::LessTemplate
+  register_engine '.sass',   SassTemplate
+  register_engine '.scss',   ScssTemplate
+
+  # Other
+  register_engine '.erb',    Tilt::ERBTemplate
+  register_engine '.str',    Tilt::StringTemplate
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/asset.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/asset.rb
new file mode 100644
index 0000000..cabf717
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/asset.rb
@@ -0,0 +1,267 @@
+require 'time'
+require 'set'
+
+module Sprockets
+  # `Asset` is the base class for `BundledAsset` and `StaticAsset`.
+  class Asset
+    # Internal initializer to load `Asset` from serialized `Hash`.
+    def self.from_hash(environment, hash)
+      return unless hash.is_a?(Hash)
+
+      klass = case hash['class']
+        when 'BundledAsset'
+          BundledAsset
+        when 'ProcessedAsset'
+          ProcessedAsset
+        when 'StaticAsset'
+          StaticAsset
+        else
+          nil
+        end
+
+      if klass
+        asset = klass.allocate
+        asset.init_with(environment, hash)
+        asset
+      end
+    rescue UnserializeError
+      nil
+    end
+
+    attr_reader :logical_path, :pathname
+    attr_reader :content_type, :mtime, :length, :digest
+    alias_method :bytesize, :length
+
+    def initialize(environment, logical_path, pathname)
+      raise ArgumentError, "Asset logical path has no extension: #{logical_path}" if File.extname(logical_path) == ""
+
+      @root         = environment.root
+      @logical_path = logical_path.to_s
+      @pathname     = Pathname.new(pathname)
+      @content_type = environment.content_type_of(pathname)
+      # drop precision to 1 second, same pattern followed elsewhere
+      @mtime        = Time.at(environment.stat(pathname).mtime.to_i)
+      @length       = environment.stat(pathname).size
+      @digest       = environment.file_digest(pathname).hexdigest
+    end
+
+    # Initialize `Asset` from serialized `Hash`.
+    def init_with(environment, coder)
+      @root = environment.root
+
+      @logical_path = coder['logical_path']
+      @content_type = coder['content_type']
+      @digest       = coder['digest']
+
+      if pathname = coder['pathname']
+        # Expand `$root` placeholder and wrapper string in a `Pathname`
+        @pathname = Pathname.new(expand_root_path(pathname))
+      end
+
+      if mtime = coder['mtime']
+        @mtime = Time.at(mtime)
+      end
+
+      if length = coder['length']
+        # Convert length to an `Integer`
+        @length = Integer(length)
+      end
+    end
+
+    # Copy serialized attributes to the coder object
+    def encode_with(coder)
+      coder['class']        = self.class.name.sub(/Sprockets::/, '')
+      coder['logical_path'] = logical_path
+      coder['pathname']     = relativize_root_path(pathname).to_s
+      coder['content_type'] = content_type
+      coder['mtime']        = mtime.to_i
+      coder['length']       = length
+      coder['digest']       = digest
+    end
+
+    # Return logical path with digest spliced in.
+    #
+    #   "foo/bar-37b51d194a7513e45b56f6524f2d51f2.js"
+    #
+    def digest_path
+      logical_path.sub(/\.(\w+)$/) { |ext| "-#{digest}#{ext}" }
+    end
+
+    # Return an `Array` of `Asset` files that are declared dependencies.
+    def dependencies
+      []
+    end
+
+    # Expand asset into an `Array` of parts.
+    #
+    # Appending all of an assets body parts together should give you
+    # the asset's contents as a whole.
+    #
+    # This allows you to link to individual files for debugging
+    # purposes.
+    def to_a
+      [self]
+    end
+
+    # `body` is aliased to source by default if it can't have any dependencies.
+    def body
+      source
+    end
+
+    # Return `String` of concatenated source.
+    def to_s
+      source
+    end
+
+    # Add enumerator to allow `Asset` instances to be used as Rack
+    # compatible body objects.
+    def each
+      yield to_s
+    end
+
+    # Checks if Asset is fresh by comparing the actual mtime and
+    # digest to the inmemory model.
+    #
+    # Used to test if cached models need to be rebuilt.
+    def fresh?(environment)
+      # Check current mtime and digest
+      dependency_fresh?(environment, self)
+    end
+
+    # Checks if Asset is stale by comparing the actual mtime and
+    # digest to the inmemory model.
+    #
+    # Subclass must override `fresh?` or `stale?`.
+    def stale?(environment)
+      !fresh?(environment)
+    end
+
+    # Save asset to disk.
+    def write_to(filename, options = {})
+      # Gzip contents if filename has '.gz'
+      options[:compress] ||= File.extname(filename) == '.gz'
+
+      FileUtils.mkdir_p File.dirname(filename)
+
+      File.open("#{filename}+", 'wb') do |f|
+        if options[:compress]
+          # Run contents through `Zlib`
+          gz = Zlib::GzipWriter.new(f, Zlib::BEST_COMPRESSION)
+          gz.mtime = mtime.to_i
+          gz.write to_s
+          gz.close
+        else
+          # Write out as is
+          f.write to_s
+        end
+      end
+
+      # Atomic write
+      FileUtils.mv("#{filename}+", filename)
+
+      # Set mtime correctly
+      File.utime(mtime, mtime, filename)
+
+      nil
+    ensure
+      # Ensure tmp file gets cleaned up
+      FileUtils.rm("#{filename}+") if File.exist?("#{filename}+")
+    end
+
+    # Pretty inspect
+    def inspect
+      "#<#{self.class}:0x#{object_id.to_s(16)} " +
+        "pathname=#{pathname.to_s.inspect}, " +
+        "mtime=#{mtime.inspect}, " +
+        "digest=#{digest.inspect}" +
+        ">"
+    end
+
+    def hash
+      digest.hash
+    end
+
+    # Assets are equal if they share the same path, mtime and digest.
+    def eql?(other)
+      other.class == self.class &&
+        other.logical_path == self.logical_path &&
+        other.mtime.to_i == self.mtime.to_i &&
+        other.digest == self.digest
+    end
+    alias_method :==, :eql?
+
+    protected
+      # Internal: String paths that are marked as dependencies after processing.
+      #
+      # Default to an empty `Array`.
+      def dependency_paths
+        @dependency_paths ||= []
+      end
+
+      # Internal: `ProccessedAsset`s that are required after processing.
+      #
+      # Default to an empty `Array`.
+      def required_assets
+        @required_assets ||= []
+      end
+
+      # Get pathname with its root stripped.
+      def relative_pathname
+        @relative_pathname ||= Pathname.new(relativize_root_path(pathname))
+      end
+
+      # Replace `$root` placeholder with actual environment root.
+      def expand_root_path(path)
+        path.to_s.sub(/^\$root/, @root)
+      end
+
+      # Replace actual environment root with `$root` placeholder.
+      def relativize_root_path(path)
+        path.to_s.sub(/^#{Regexp.escape(@root)}/, '$root')
+      end
+
+      # Check if dependency is fresh.
+      #
+      # `dep` is a `Hash` with `path`, `mtime` and `hexdigest` keys.
+      #
+      # A `Hash` is used rather than other `Asset` object because we
+      # want to test non-asset files and directories.
+      def dependency_fresh?(environment, dep)
+        path, mtime, hexdigest = dep.pathname.to_s, dep.mtime, dep.digest
+
+        stat = environment.stat(path)
+
+        # If path no longer exists, its definitely stale.
+        if stat.nil?
+          return false
+        end
+
+        # Compare dependency mtime to the actual mtime. If the
+        # dependency mtime is newer than the actual mtime, the file
+        # hasn't changed since we created this `Asset` instance.
+        #
+        # However, if the mtime is newer it doesn't mean the asset is
+        # stale. Many deployment environments may recopy or recheckout
+        # assets on each deploy. In this case the mtime would be the
+        # time of deploy rather than modified time.
+        #
+        # Note: to_i is used in eql? and write_to we assume fidelity of 1 second
+        #  if people save files more frequently than 1 second sprockets may
+        #  not pick it up, by design
+        if mtime.to_i >= stat.mtime.to_i
+          return true
+        end
+
+        digest = environment.file_digest(path)
+
+        # If the mtime is newer, do a full digest comparsion. Return
+        # fresh if the digests match.
+        if hexdigest == digest.hexdigest
+          return true
+        end
+
+        # Otherwise, its stale.
+        false
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/asset_attributes.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/asset_attributes.rb
new file mode 100644
index 0000000..cf705ec
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/asset_attributes.rb
@@ -0,0 +1,133 @@
+require 'pathname'
+
+module Sprockets
+  # `AssetAttributes` is a wrapper similar to `Pathname` that provides
+  # some helper accessors.
+  #
+  # These methods should be considered internalish.
+  class AssetAttributes
+    attr_reader :environment, :pathname
+
+    def initialize(environment, path)
+      @environment = environment
+      @pathname = path.is_a?(Pathname) ? path : Pathname.new(path.to_s)
+    end
+
+    # Returns paths search the load path for.
+    def search_paths
+      paths = [pathname.to_s]
+
+      path_without_extensions = extensions.inject(pathname) { |p, ext| p.sub(ext, '') }
+
+      # optimization: bower.json can only be nested one level deep
+      if !path_without_extensions.to_s.index('/')
+        paths << path_without_extensions.join("bower.json").to_s
+        # DEPRECATED bower configuration file
+        paths << path_without_extensions.join("component.json").to_s
+      end
+
+      if pathname.basename(extensions.join).to_s != 'index'
+        paths << path_without_extensions.join("index#{extensions.join}").to_s
+      end
+
+      paths
+    end
+
+    # Reverse guess logical path for fully expanded path.
+    #
+    # This has some known issues. For an example if a file is
+    # shaddowed in the path, but is required relatively, its logical
+    # path will be incorrect.
+    def logical_path
+      if root_path = environment.paths.detect { |path| pathname.to_s[path] }
+        path = pathname.to_s.sub("#{root_path}/", '')
+        path = pathname.relative_path_from(Pathname.new(root_path)).to_s
+        path = engine_extensions.inject(path) { |p, ext| p.sub(ext, '') }
+        path = "#{path}#{engine_format_extension}" unless format_extension
+        path
+      else
+        raise FileOutsidePaths, "#{pathname} isn't in paths: #{environment.paths.join(', ')}"
+      end
+    end
+
+    # Returns `Array` of extension `String`s.
+    #
+    #     "foo.js.coffee"
+    #     # => [".js", ".coffee"]
+    #
+    def extensions
+      @extensions ||= @pathname.basename.to_s.scan(/\.[^.]+/)
+    end
+
+    # Returns the format extension.
+    #
+    #     "foo.js.coffee"
+    #     # => ".js"
+    #
+    def format_extension
+      extensions.reverse.detect { |ext|
+        @environment.mime_types(ext) && !@environment.engines(ext)
+      }
+    end
+
+    # Returns an `Array` of engine extensions.
+    #
+    #     "foo.js.coffee.erb"
+    #     # => [".coffee", ".erb"]
+    #
+    def engine_extensions
+      exts = extensions
+
+      if offset = extensions.index(format_extension)
+        exts = extensions[offset+1..-1]
+      end
+
+      exts.select { |ext| @environment.engines(ext) }
+    end
+
+    # Returns engine classes.
+    def engines
+      engine_extensions.map { |ext| @environment.engines(ext) }
+    end
+
+    # Returns all processors to run on the path.
+    def processors
+      environment.preprocessors(content_type) +
+        engines.reverse +
+        environment.postprocessors(content_type)
+    end
+
+    # Returns the content type for the pathname. Falls back to `application/octet-stream`.
+    def content_type
+      @content_type ||= begin
+        if format_extension.nil?
+          engine_content_type || 'application/octet-stream'
+        else
+          @environment.mime_types(format_extension) ||
+            engine_content_type ||
+            'application/octet-stream'
+        end
+      end
+    end
+
+    private
+      # Returns implicit engine content type.
+      #
+      # `.coffee` files carry an implicit `application/javascript`
+      # content type.
+      def engine_content_type
+        engines.reverse.each do |engine|
+          if engine.respond_to?(:default_mime_type) && engine.default_mime_type
+            return engine.default_mime_type
+          end
+        end
+        nil
+      end
+
+      def engine_format_extension
+        if content_type = engine_content_type
+          environment.extension_for_mime_type(content_type)
+        end
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/base.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/base.rb
new file mode 100644
index 0000000..8b94b5f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/base.rb
@@ -0,0 +1,447 @@
+require 'sprockets/asset_attributes'
+require 'sprockets/bundled_asset'
+require 'sprockets/caching'
+require 'sprockets/errors'
+require 'sprockets/processed_asset'
+require 'sprockets/server'
+require 'sprockets/static_asset'
+require 'multi_json'
+require 'pathname'
+
+module Sprockets
+  # `Base` class for `Environment` and `Index`.
+  class Base
+    include Caching, Paths, Mime, Processing, Compressing, Engines, Server
+
+    # Returns a `Digest` implementation class.
+    #
+    # Defaults to `Digest::MD5`.
+    attr_reader :digest_class
+
+    # Assign a `Digest` implementation class. This maybe any Ruby
+    # `Digest::` implementation such as `Digest::MD5` or
+    # `Digest::SHA1`.
+    #
+    #     environment.digest_class = Digest::SHA1
+    #
+    def digest_class=(klass)
+      expire_index!
+      @digest_class = klass
+    end
+
+    # The `Environment#version` is a custom value used for manually
+    # expiring all asset caches.
+    #
+    # Sprockets is able to track most file and directory changes and
+    # will take care of expiring the cache for you. However, its
+    # impossible to know when any custom helpers change that you mix
+    # into the `Context`.
+    #
+    # It would be wise to increment this value anytime you make a
+    # configuration change to the `Environment` object.
+    attr_reader :version
+
+    # Assign an environment version.
+    #
+    #     environment.version = '2.0'
+    #
+    def version=(version)
+      expire_index!
+      @version = version
+    end
+
+    # Returns a `Digest` instance for the `Environment`.
+    #
+    # This value serves two purposes. If two `Environment`s have the
+    # same digest value they can be treated as equal. This is more
+    # useful for comparing environment states between processes rather
+    # than in the same. Two equal `Environment`s can share the same
+    # cached assets.
+    #
+    # The value also provides a seed digest for all `Asset`
+    # digests. Any change in the environment digest will affect all of
+    # its assets.
+    def digest
+      # Compute the initial digest using the implementation class. The
+      # Sprockets release version and custom environment version are
+      # mixed in. So any new releases will affect all your assets.
+      @digest ||= digest_class.new.update(VERSION).update(version.to_s)
+
+      # Returned a dupped copy so the caller can safely mutate it with `.update`
+      @digest.dup
+    end
+
+    # Get and set `Logger` instance.
+    attr_accessor :logger
+
+    # Get `Context` class.
+    #
+    # This class maybe mutated and mixed in with custom helpers.
+    #
+    #     environment.context_class.instance_eval do
+    #       include MyHelpers
+    #       def asset_url; end
+    #     end
+    #
+    attr_reader :context_class
+
+    # Get persistent cache store
+    attr_reader :cache
+
+    # Set persistent cache store
+    #
+    # The cache store must implement a pair of getters and
+    # setters. Either `get(key)`/`set(key, value)`,
+    # `[key]`/`[key]=value`, `read(key)`/`write(key, value)`.
+    def cache=(cache)
+      expire_index!
+      @cache = cache
+    end
+
+    def prepend_path(path)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def append_path(path)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def clear_paths
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    # Finds the expanded real path for a given logical path by
+    # searching the environment's paths.
+    #
+    #     resolve("application.js")
+    #     # => "/path/to/app/javascripts/application.js.coffee"
+    #
+    # A `FileNotFound` exception is raised if the file does not exist.
+    def resolve(logical_path, options = {})
+      # If a block is given, preform an iterable search
+      if block_given?
+        args = attributes_for(logical_path).search_paths + [options]
+        @trail.find(*args) do |path|
+          pathname = Pathname.new(path)
+          if %w( bower.json component.json ).include?(pathname.basename.to_s)
+            bower = json_decode(pathname.read)
+            case bower['main']
+            when String
+              yield pathname.dirname.join(bower['main'])
+            when Array
+              extname = File.extname(logical_path)
+              bower['main'].each do |fn|
+                if extname == "" || extname == File.extname(fn)
+                  yield pathname.dirname.join(fn)
+                end
+              end
+            end
+          else
+            yield pathname
+          end
+        end
+      else
+        resolve(logical_path, options) do |pathname|
+          return pathname
+        end
+        raise FileNotFound, "couldn't find file '#{logical_path}'"
+      end
+    end
+
+    # Register a new mime type.
+    def register_mime_type(mime_type, ext)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      @trail.append_extension(ext)
+      super
+    end
+
+    # Registers a new Engine `klass` for `ext`.
+    def register_engine(ext, klass)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      add_engine_to_trail(ext, klass)
+      super
+    end
+
+    def register_preprocessor(mime_type, klass, &block)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def unregister_preprocessor(mime_type, klass)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def register_postprocessor(mime_type, klass, &block)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def unregister_postprocessor(mime_type, klass)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def register_bundle_processor(mime_type, klass, &block)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def unregister_bundle_processor(mime_type, klass)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    # Return an `Index`. Must be implemented by the subclass.
+    def index
+      raise NotImplementedError
+    end
+
+    if defined? Encoding.default_external
+      # Define `default_external_encoding` accessor on 1.9.
+      # Defaults to UTF-8.
+      attr_accessor :default_external_encoding
+    end
+
+    # Works like `Dir.entries`.
+    #
+    # Subclasses may cache this method.
+    def entries(pathname)
+      @trail.entries(pathname)
+    end
+
+    # Works like `File.stat`.
+    #
+    # Subclasses may cache this method.
+    def stat(path)
+      @trail.stat(path)
+    end
+
+    # Read and compute digest of filename.
+    #
+    # Subclasses may cache this method.
+    def file_digest(path)
+      if stat = self.stat(path)
+        # If its a file, digest the contents
+        if stat.file?
+          digest.file(path.to_s)
+
+        # If its a directive, digest the list of filenames
+        elsif stat.directory?
+          contents = self.entries(path).join(',')
+          digest.update(contents)
+        end
+      end
+    end
+
+    # Internal. Return a `AssetAttributes` for `path`.
+    def attributes_for(path)
+      AssetAttributes.new(self, path)
+    end
+
+    # Internal. Return content type of `path`.
+    def content_type_of(path)
+      attributes_for(path).content_type
+    end
+
+    # Find asset by logical path or expanded path.
+    def find_asset(path, options = {})
+      logical_path = path
+      pathname     = Pathname.new(path)
+
+      if pathname.absolute?
+        return unless stat(pathname)
+        logical_path = attributes_for(pathname).logical_path
+      else
+        begin
+          pathname = resolve(logical_path)
+
+          # If logical path is missing a mime type extension, append
+          # the absolute path extname so it has one.
+          #
+          # Ensures some consistency between finding "foo/bar" vs
+          # "foo/bar.js".
+          if File.extname(logical_path) == ""
+            expanded_logical_path = attributes_for(pathname).logical_path
+            logical_path += File.extname(expanded_logical_path)
+          end
+        rescue FileNotFound
+          return nil
+        end
+      end
+
+      build_asset(logical_path, pathname, options)
+    end
+
+    # Preferred `find_asset` shorthand.
+    #
+    #     environment['application.js']
+    #
+    def [](*args)
+      find_asset(*args)
+    end
+
+    def each_entry(root, &block)
+      return to_enum(__method__, root) unless block_given?
+      root = Pathname.new(root) unless root.is_a?(Pathname)
+
+      paths = []
+      entries(root).sort.each do |filename|
+        path = root.join(filename)
+        paths << path
+
+        if stat(path).directory?
+          each_entry(path) do |subpath|
+            paths << subpath
+          end
+        end
+      end
+
+      paths.sort_by(&:to_s).each(&block)
+
+      nil
+    end
+
+    def each_file
+      return to_enum(__method__) unless block_given?
+      paths.each do |root|
+        each_entry(root) do |path|
+          if !stat(path).directory?
+            yield path
+          end
+        end
+      end
+      nil
+    end
+
+    def each_logical_path(*args, &block)
+      return to_enum(__method__, *args) unless block_given?
+      filters = args.flatten
+      files = {}
+      each_file do |filename|
+        if logical_path = logical_path_for_filename(filename, filters)
+          unless files[logical_path]
+            if block.arity == 2
+              yield logical_path, filename.to_s
+            else
+              yield logical_path
+            end
+          end
+
+          files[logical_path] = true
+        end
+      end
+      nil
+    end
+
+    # Pretty inspect
+    def inspect
+      "#<#{self.class}:0x#{object_id.to_s(16)} " +
+        "root=#{root.to_s.inspect}, " +
+        "paths=#{paths.inspect}, " +
+        "digest=#{digest.to_s.inspect}" +
+        ">"
+    end
+
+    protected
+      # Clear index after mutating state. Must be implemented by the subclass.
+      def expire_index!
+        raise NotImplementedError
+      end
+
+      def build_asset(logical_path, pathname, options)
+        pathname = Pathname.new(pathname)
+
+        # If there are any processors to run on the pathname, use
+        # `BundledAsset`. Otherwise use `StaticAsset` and treat is as binary.
+        if attributes_for(pathname).processors.any?
+          if options[:bundle] == false
+            circular_call_protection(pathname.to_s) do
+              ProcessedAsset.new(index, logical_path, pathname)
+            end
+          else
+            BundledAsset.new(index, logical_path, pathname)
+          end
+        else
+          StaticAsset.new(index, logical_path, pathname)
+        end
+      end
+
+      def cache_key_for(path, options)
+        "#{path}:#{options[:bundle] ? '1' : '0'}"
+      end
+
+      def circular_call_protection(path)
+        reset = Thread.current[:sprockets_circular_calls].nil?
+        calls = Thread.current[:sprockets_circular_calls] ||= Set.new
+        if calls.include?(path)
+          raise CircularDependencyError, "#{path} has already been required"
+        end
+        calls << path
+        yield
+      ensure
+        Thread.current[:sprockets_circular_calls] = nil if reset
+      end
+
+      def logical_path_for_filename(filename, filters)
+        logical_path = attributes_for(filename).logical_path.to_s
+
+        if matches_filter(filters, logical_path, filename)
+          return logical_path
+        end
+
+        # If filename is an index file, retest with alias
+        if File.basename(logical_path)[/[^\.]+/, 0] == 'index'
+          path = logical_path.sub(/\/index\./, '.')
+          if matches_filter(filters, path, filename)
+            return path
+          end
+        end
+
+        nil
+      end
+
+      def matches_filter(filters, logical_path, filename)
+        return true if filters.empty?
+
+        filters.any? do |filter|
+          if filter.is_a?(Regexp)
+            filter.match(logical_path)
+          elsif filter.respond_to?(:call)
+            if filter.arity == 1
+              filter.call(logical_path)
+            else
+              filter.call(logical_path, filename.to_s)
+            end
+          else
+            File.fnmatch(filter.to_s, logical_path)
+          end
+        end
+      end
+
+      # Feature detect newer MultiJson API
+      if MultiJson.respond_to?(:dump)
+        def json_decode(obj)
+          MultiJson.load(obj)
+        end
+      else
+        def json_decode(obj)
+          MultiJson.decode(obj)
+        end
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/bundled_asset.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/bundled_asset.rb
new file mode 100644
index 0000000..1b2e810
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/bundled_asset.rb
@@ -0,0 +1,78 @@
+require 'sprockets/asset'
+require 'sprockets/errors'
+require 'fileutils'
+require 'set'
+require 'zlib'
+
+module Sprockets
+  # `BundledAsset`s are used for files that need to be processed and
+  # concatenated with other assets. Use for `.js` and `.css` files.
+  class BundledAsset < Asset
+    attr_reader :source
+
+    def initialize(environment, logical_path, pathname)
+      super(environment, logical_path, pathname)
+
+      @processed_asset  = environment.find_asset(pathname, :bundle => false)
+      @required_assets  = @processed_asset.required_assets
+      @dependency_paths = @processed_asset.dependency_paths
+
+      # Explode Asset into parts and gather the dependency bodies
+      @source = to_a.map { |dependency| dependency.to_s }.join
+
+      # Run bundle processors on concatenated source
+      context = environment.context_class.new(environment, logical_path, pathname)
+      @source = context.evaluate(pathname, :data => @source,
+                  :processors => environment.bundle_processors(content_type))
+
+      @mtime  = (to_a + @dependency_paths).map(&:mtime).max
+      @length = Rack::Utils.bytesize(source)
+      @digest = environment.digest.update(source).hexdigest
+    end
+
+    # Initialize `BundledAsset` from serialized `Hash`.
+    def init_with(environment, coder)
+      super
+
+      @processed_asset = environment.find_asset(pathname, :bundle => false)
+      @required_assets = @processed_asset.required_assets
+
+      if @processed_asset.dependency_digest != coder['required_assets_digest']
+        raise UnserializeError, "processed asset belongs to a stale environment"
+      end
+
+      @source = coder['source']
+    end
+
+    # Serialize custom attributes in `BundledAsset`.
+    def encode_with(coder)
+      super
+
+      coder['source'] = source
+      coder['required_assets_digest'] = @processed_asset.dependency_digest
+    end
+
+    # Get asset's own processed contents. Excludes any of its required
+    # dependencies but does run any processors or engines on the
+    # original file.
+    def body
+      @processed_asset.source
+    end
+
+    # Return an `Array` of `Asset` files that are declared dependencies.
+    def dependencies
+      to_a.reject { |a| a.eql?(@processed_asset) }
+    end
+
+    # Expand asset into an `Array` of parts.
+    def to_a
+      required_assets
+    end
+
+    # Checks if Asset is stale by comparing the actual mtime and
+    # digest to the inmemory model.
+    def fresh?(environment)
+      @processed_asset.fresh?(environment)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/cache/file_store.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/cache/file_store.rb
new file mode 100644
index 0000000..bcb4694
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/cache/file_store.rb
@@ -0,0 +1,32 @@
+require 'digest/md5'
+require 'fileutils'
+require 'pathname'
+
+module Sprockets
+  module Cache
+    # A simple file system cache store.
+    #
+    #     environment.cache = Sprockets::Cache::FileStore.new("/tmp")
+    #
+    class FileStore
+      def initialize(root)
+        @root = Pathname.new(root)
+      end
+
+      # Lookup value in cache
+      def [](key)
+        pathname = @root.join(key)
+        pathname.exist? ? pathname.open('rb') { |f| Marshal.load(f) } : nil
+      end
+
+      # Save value to cache
+      def []=(key, value)
+        # Ensure directory exists
+        FileUtils.mkdir_p @root.join(key).dirname
+
+        @root.join(key).open('w') { |f| Marshal.dump(value, f)}
+        value
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/caching.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/caching.rb
new file mode 100644
index 0000000..7ca020d
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/caching.rb
@@ -0,0 +1,96 @@
+module Sprockets
+  # `Caching` is an internal mixin whose public methods are exposed on
+  # the `Environment` and `Index` classes.
+  module Caching
+    # Low level cache getter for `key`. Checks a number of supported
+    # cache interfaces.
+    def cache_get(key)
+      # `Cache#get(key)` for Memcache
+      if cache.respond_to?(:get)
+        cache.get(key)
+
+      # `Cache#[key]` so `Hash` can be used
+      elsif cache.respond_to?(:[])
+        cache[key]
+
+      # `Cache#read(key)` for `ActiveSupport::Cache` support
+      elsif cache.respond_to?(:read)
+        cache.read(key)
+
+      else
+        nil
+      end
+    end
+
+    # Low level cache setter for `key`. Checks a number of supported
+    # cache interfaces.
+    def cache_set(key, value)
+      # `Cache#set(key, value)` for Memcache
+      if cache.respond_to?(:set)
+        cache.set(key, value)
+
+      # `Cache#[key]=value` so `Hash` can be used
+      elsif cache.respond_to?(:[]=)
+        cache[key] = value
+
+      # `Cache#write(key, value)` for `ActiveSupport::Cache` support
+      elsif cache.respond_to?(:write)
+        cache.write(key, value)
+      end
+
+      value
+    end
+
+    protected
+      # Cache helper method. Takes a `path` argument which maybe a
+      # logical path or fully expanded path. The `&block` is passed
+      # for finding and building the asset if its not in cache.
+      def cache_asset(path)
+        # If `cache` is not set, return fast
+        if cache.nil?
+          yield
+
+        # Check cache for `path`
+        elsif (asset = Asset.from_hash(self, cache_get_hash(path.to_s))) && asset.fresh?(self)
+          asset
+
+         # Otherwise yield block that slowly finds and builds the asset
+        elsif asset = yield
+          hash = {}
+          asset.encode_with(hash)
+
+          # Save the asset to its path
+          cache_set_hash(path.to_s, hash)
+
+          # Since path maybe a logical or full pathname, save the
+          # asset its its full path too
+          if path.to_s != asset.pathname.to_s
+            cache_set_hash(asset.pathname.to_s, hash)
+          end
+
+          asset
+        end
+      end
+
+    private
+      # Strips `Environment#root` from key to make the key work
+      # consisently across different servers. The key is also hashed
+      # so it does not exceed 250 characters.
+      def expand_cache_key(key)
+        File.join('sprockets', digest_class.hexdigest(key.sub(root, '')))
+      end
+
+      def cache_get_hash(key)
+        hash = cache_get(expand_cache_key(key))
+        if hash.is_a?(Hash) && digest.hexdigest == hash['_version']
+          hash
+        end
+      end
+
+      def cache_set_hash(key, hash)
+        hash['_version'] = digest.hexdigest
+        cache_set(expand_cache_key(key), hash)
+        hash
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/charset_normalizer.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/charset_normalizer.rb
new file mode 100644
index 0000000..daa4e38
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/charset_normalizer.rb
@@ -0,0 +1,41 @@
+require 'tilt'
+
+module Sprockets
+  # Some browsers have issues with stylesheets that contain multiple
+  # `@charset` definitions. The issue surfaces while using Sass since
+  # it inserts a `@charset` at the top of each file. Then Sprockets
+  # concatenates them together.
+  #
+  # The `CharsetNormalizer` processor strips out multiple `@charset`
+  # definitions.
+  #
+  # The current implementation is naive. It picks the first `@charset`
+  # it sees and strips the others. This works for most people because
+  # the other definitions are usually `UTF-8`. A more sophisticated
+  # approach would be to re-encode stylesheets with mixed encodings.
+  #
+  # This behavior can be disabled with:
+  #
+  #     environment.unregister_bundle_processor 'text/css', Sprockets::CharsetNormalizer
+  #
+  class CharsetNormalizer < Tilt::Template
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      charset = nil
+
+      # Find and strip out any `@charset` definitions
+      filtered_data = data.gsub(/^@charset "([^"]+)";$/) {
+        charset ||= $1; ""
+      }
+
+      if charset
+        # If there was a charset, move it to the top
+        "@charset \"#{charset}\";#{filtered_data}"
+      else
+        data
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/closure_compressor.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/closure_compressor.rb
new file mode 100644
index 0000000..567ca16
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/closure_compressor.rb
@@ -0,0 +1,22 @@
+require 'tilt'
+
+module Sprockets
+  class ClosureCompressor < Tilt::Template
+    self.default_mime_type = 'application/javascript'
+
+    def self.engine_initialized?
+      defined?(::Closure::Compiler)
+    end
+
+    def initialize_engine
+      require_template_library 'closure-compiler'
+    end
+
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      Closure::Compiler.new.compile(data)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/compressing.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/compressing.rb
new file mode 100644
index 0000000..6634125
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/compressing.rb
@@ -0,0 +1,73 @@
+module Sprockets
+  # `Compressing` is an internal mixin whose public methods are exposed on
+  # the `Environment` and `Index` classes.
+  module Compressing
+    def compressors
+      deep_copy_hash(@compressors)
+    end
+
+    def register_compressor(mime_type, sym, klass)
+      @compressors[mime_type][sym] = klass
+    end
+
+    # Return CSS compressor or nil if none is set
+    def css_compressor
+      @css_compressor if defined? @css_compressor
+    end
+
+    # Assign a compressor to run on `text/css` assets.
+    #
+    # The compressor object must respond to `compress`.
+    def css_compressor=(compressor)
+      unregister_bundle_processor 'text/css', css_compressor if css_compressor
+      @css_compressor = nil
+      return unless compressor
+
+      if compressor.is_a?(Symbol)
+        compressor = compressors['text/css'][compressor] || raise(Error, "unknown compressor: #{compressor}")
+      end
+
+      if compressor.respond_to?(:compress)
+        klass = Class.new(Processor) do
+          @name = "css_compressor"
+          @processor = proc { |context, data| compressor.compress(data) }
+        end
+        @css_compressor = :css_compressor
+      else
+        @css_compressor = klass = compressor
+      end
+
+      register_bundle_processor 'text/css', klass
+    end
+
+    # Return JS compressor or nil if none is set
+    def js_compressor
+      @js_compressor if defined? @js_compressor
+    end
+
+    # Assign a compressor to run on `application/javascript` assets.
+    #
+    # The compressor object must respond to `compress`.
+    def js_compressor=(compressor)
+      unregister_bundle_processor 'application/javascript', js_compressor if js_compressor
+      @js_compressor = nil
+      return unless compressor
+
+      if compressor.is_a?(Symbol)
+        compressor = compressors['application/javascript'][compressor] || raise(Error, "unknown compressor: #{compressor}")
+      end
+
+      if compressor.respond_to?(:compress)
+        klass = Class.new(Processor) do
+          @name = "js_compressor"
+          @processor = proc { |context, data| compressor.compress(data) }
+        end
+        @js_compressor = :js_compressor
+      else
+        @js_compressor = klass = compressor
+      end
+
+      register_bundle_processor 'application/javascript', klass
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/context.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/context.rb
new file mode 100644
index 0000000..9b13406
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/context.rb
@@ -0,0 +1,289 @@
+require 'base64'
+require 'rack/utils'
+require 'sprockets/errors'
+require 'sprockets/utils'
+require 'pathname'
+require 'set'
+
+module Sprockets
+  # `Context` provides helper methods to all `Tilt` processors. They
+  # are typically accessed by ERB templates. You can mix in custom
+  # helpers by injecting them into `Environment#context_class`. Do not
+  # mix them into `Context` directly.
+  #
+  #     environment.context_class.class_eval do
+  #       include MyHelper
+  #       def asset_url; end
+  #     end
+  #
+  #     <%= asset_url "foo.png" %>
+  #
+  # The `Context` also collects dependencies declared by
+  # assets. See `DirectiveProcessor` for an example of this.
+  class Context
+    attr_reader :environment, :pathname
+    attr_reader :_required_paths, :_stubbed_assets
+    attr_reader :_dependency_paths, :_dependency_assets
+    attr_writer :__LINE__
+
+    def initialize(environment, logical_path, pathname)
+      @environment  = environment
+      @logical_path = logical_path
+      @pathname     = pathname
+      @__LINE__     = nil
+
+      @_required_paths    = []
+      @_stubbed_assets    = Set.new
+      @_dependency_paths  = Set.new
+      @_dependency_assets = Set.new([pathname.to_s])
+    end
+
+    # Returns the environment path that contains the file.
+    #
+    # If `app/javascripts` and `app/stylesheets` are in your path, and
+    # current file is `app/javascripts/foo/bar.js`, `root_path` would
+    # return `app/javascripts`.
+    def root_path
+      environment.paths.detect { |path| pathname.to_s[path] }
+    end
+
+    # Returns logical path without any file extensions.
+    #
+    #     'app/javascripts/application.js'
+    #     # => 'application'
+    #
+    def logical_path
+      @logical_path.chomp(File.extname(@logical_path))
+    end
+
+    # Returns content type of file
+    #
+    #     'application/javascript'
+    #     'text/css'
+    #
+    def content_type
+      environment.content_type_of(pathname)
+    end
+
+    # Given a logical path, `resolve` will find and return the fully
+    # expanded path. Relative paths will also be resolved. An optional
+    # `:content_type` restriction can be supplied to restrict the
+    # search.
+    #
+    #     resolve("foo.js")
+    #     # => "/path/to/app/javascripts/foo.js"
+    #
+    #     resolve("./bar.js")
+    #     # => "/path/to/app/javascripts/bar.js"
+    #
+    def resolve(path, options = {}, &block)
+      pathname   = Pathname.new(path)
+      attributes = environment.attributes_for(pathname)
+
+      if pathname.absolute?
+        if environment.stat(pathname)
+          pathname
+        else
+          raise FileNotFound, "couldn't find file '#{pathname}'"
+        end
+
+      elsif content_type = options[:content_type]
+        content_type = self.content_type if content_type == :self
+
+        if attributes.format_extension
+          if content_type != attributes.content_type
+            raise ContentTypeMismatch, "#{path} is " +
+              "'#{attributes.content_type}', not '#{content_type}'"
+          end
+        end
+
+        resolve(path) do |candidate|
+          if self.content_type == environment.content_type_of(candidate)
+            return candidate
+          end
+        end
+
+        raise FileNotFound, "couldn't find file '#{path}'"
+      else
+        environment.resolve(path, {:base_path => self.pathname.dirname}.merge(options), &block)
+      end
+    end
+
+    # `depend_on` allows you to state a dependency on a file without
+    # including it.
+    #
+    # This is used for caching purposes. Any changes made to
+    # the dependency file with invalidate the cache of the
+    # source file.
+    def depend_on(path)
+      @_dependency_paths << resolve(path).to_s
+      nil
+    end
+
+    # `depend_on_asset` allows you to state an asset dependency
+    # without including it.
+    #
+    # This is used for caching purposes. Any changes that would
+    # invalidate the dependency asset will invalidate the source
+    # file. Unlike `depend_on`, this will include recursively include
+    # the target asset's dependencies.
+    def depend_on_asset(path)
+      filename = resolve(path).to_s
+      @_dependency_assets << filename
+      nil
+    end
+
+    # `require_asset` declares `path` as a dependency of the file. The
+    # dependency will be inserted before the file and will only be
+    # included once.
+    #
+    # If ERB processing is enabled, you can use it to dynamically
+    # require assets.
+    #
+    #     <%= require_asset "#{framework}.js" %>
+    #
+    def require_asset(path)
+      pathname = resolve(path, :content_type => :self)
+      depend_on_asset(pathname)
+      @_required_paths << pathname.to_s
+      nil
+    end
+
+    # `stub_asset` blacklists `path` from being included in the bundle.
+    # `path` must be an asset which may or may not already be included
+    # in the bundle.
+    def stub_asset(path)
+      @_stubbed_assets << resolve(path, :content_type => :self).to_s
+      nil
+    end
+
+    # Tests if target path is able to be safely required into the
+    # current concatenation.
+    def asset_requirable?(path)
+      pathname = resolve(path)
+      content_type = environment.content_type_of(pathname)
+      stat = environment.stat(path)
+      return false unless stat && stat.file?
+      self.content_type.nil? || self.content_type == content_type
+    end
+
+    # Reads `path` and runs processors on the file.
+    #
+    # This allows you to capture the result of an asset and include it
+    # directly in another.
+    #
+    #     <%= evaluate "bar.js" %>
+    #
+    def evaluate(path, options = {})
+      pathname   = resolve(path)
+      attributes = environment.attributes_for(pathname)
+      processors = options[:processors] || attributes.processors
+
+      if options[:data]
+        result = options[:data]
+      else
+        if environment.respond_to?(:default_external_encoding)
+          mime_type = environment.mime_types(pathname.extname)
+          encoding  = environment.encoding_for_mime_type(mime_type)
+          result    = Sprockets::Utils.read_unicode(pathname, encoding)
+        else
+          result = Sprockets::Utils.read_unicode(pathname)
+        end
+      end
+
+      processors.each do |processor|
+        begin
+          template = processor.new(pathname.to_s) { result }
+          result = template.render(self, {})
+        rescue Exception => e
+          annotate_exception! e
+          raise
+        end
+      end
+
+      result
+    end
+
+    # Returns a Base64-encoded `data:` URI with the contents of the
+    # asset at the specified path, and marks that path as a dependency
+    # of the current file.
+    #
+    # Use `asset_data_uri` from ERB with CSS or JavaScript assets:
+    #
+    #     #logo { background: url(<%= asset_data_uri 'logo.png' %>) }
+    #
+    #     $('<img>').attr('src', '<%= asset_data_uri 'avatar.jpg' %>')
+    #
+    def asset_data_uri(path)
+      depend_on_asset(path)
+      asset  = environment.find_asset(path)
+      base64 = Base64.encode64(asset.to_s).gsub(/\s+/, "")
+      "data:#{asset.content_type};base64,#{Rack::Utils.escape(base64)}"
+    end
+
+    # Expands logical path to full url to asset.
+    #
+    # NOTE: This helper is currently not implemented and should be
+    # customized by the application. Though, in the future, some
+    # basics implemention may be provided with different methods that
+    # are required to be overridden.
+    def asset_path(path, options = {})
+      message = <<-EOS
+Custom asset_path helper is not implemented
+
+Extend your environment context with a custom method.
+
+    environment.context_class.class_eval do
+      def asset_path(path, options = {})
+      end
+    end
+      EOS
+      raise NotImplementedError, message
+    end
+
+    # Expand logical image asset path.
+    def image_path(path)
+      asset_path(path, :type => :image)
+    end
+
+    # Expand logical video asset path.
+    def video_path(path)
+      asset_path(path, :type => :video)
+    end
+
+    # Expand logical audio asset path.
+    def audio_path(path)
+      asset_path(path, :type => :audio)
+    end
+
+    # Expand logical font asset path.
+    def font_path(path)
+      asset_path(path, :type => :font)
+    end
+
+    # Expand logical javascript asset path.
+    def javascript_path(path)
+      asset_path(path, :type => :javascript)
+    end
+
+    # Expand logical stylesheet asset path.
+    def stylesheet_path(path)
+      asset_path(path, :type => :stylesheet)
+    end
+
+    private
+      # Annotates exception backtrace with the original template that
+      # the exception was raised in.
+      def annotate_exception!(exception)
+        location = pathname.to_s
+        location << ":#{@__LINE__}" if @__LINE__
+
+        exception.extend(Sprockets::EngineError)
+        exception.sprockets_annotation = "  (in #{location})"
+      end
+
+      def logger
+        environment.logger
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/directive_processor.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/directive_processor.rb
new file mode 100644
index 0000000..5d29f32
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/directive_processor.rb
@@ -0,0 +1,408 @@
+require 'pathname'
+require 'shellwords'
+require 'tilt'
+require 'yaml'
+
+module Sprockets
+  # The `DirectiveProcessor` is responsible for parsing and evaluating
+  # directive comments in a source file.
+  #
+  # A directive comment starts with a comment prefix, followed by an "=",
+  # then the directive name, then any arguments.
+  #
+  #     // JavaScript
+  #     //= require "foo"
+  #
+  #     # CoffeeScript
+  #     #= require "bar"
+  #
+  #     /* CSS
+  #      *= require "baz"
+  #      */
+  #
+  # The Processor is implemented as a `Tilt::Template` and is loosely
+  # coupled to Sprockets. This makes it possible to disable or modify
+  # the processor to do whatever you'd like. You could add your own
+  # custom directives or invent your own directive syntax.
+  #
+  # `Environment#processors` includes `DirectiveProcessor` by default.
+  #
+  # To remove the processor entirely:
+  #
+  #     env.unregister_processor('text/css', Sprockets::DirectiveProcessor)
+  #     env.unregister_processor('application/javascript', Sprockets::DirectiveProcessor)
+  #
+  # Then inject your own preprocessor:
+  #
+  #     env.register_processor('text/css', MyProcessor)
+  #
+  class DirectiveProcessor < Tilt::Template
+    # Directives will only be picked up if they are in the header
+    # of the source file. C style (/* */), JavaScript (//), and
+    # Ruby (#) comments are supported.
+    #
+    # Directives in comments after the first non-whitespace line
+    # of code will not be processed.
+    #
+    HEADER_PATTERN = /
+      \A (
+        (?m:\s*) (
+          (\/\* (?m:.*?) \*\/) |
+          (\#\#\# (?m:.*?) \#\#\#) |
+          (\/\/ .* \n?)+ |
+          (\# .* \n?)+
+        )
+      )+
+    /x
+
+    # Directives are denoted by a `=` followed by the name, then
+    # argument list.
+    #
+    # A few different styles are allowed:
+    #
+    #     // =require foo
+    #     //= require foo
+    #     //= require "foo"
+    #
+    DIRECTIVE_PATTERN = /
+      ^ \W* = \s* (\w+.*?) (\*\/)? $
+    /x
+
+    attr_reader :pathname
+    attr_reader :header, :body
+
+    def prepare
+      @pathname = Pathname.new(file)
+
+      @header = data[HEADER_PATTERN, 0] || ""
+      @body   = $' || data
+      # Ensure body ends in a new line
+      @body  += "\n" if @body != "" && @body !~ /\n\Z/m
+
+      @included_pathnames = []
+      @compat             = false
+    end
+
+    # Implemented for Tilt#render.
+    #
+    # `context` is a `Context` instance with methods that allow you to
+    # access the environment and append to the bundle. See `Context`
+    # for the complete API.
+    def evaluate(context, locals, &block)
+      @context = context
+
+      @result = ""
+      @result.force_encoding(body.encoding) if body.respond_to?(:encoding)
+
+      @has_written_body = false
+
+      process_directives
+      process_source
+
+      @result
+    end
+
+    # Returns the header String with any directives stripped.
+    def processed_header
+      lineno = 0
+      @processed_header ||= header.lines.map { |line|
+        lineno += 1
+        # Replace directive line with a clean break
+        directives.assoc(lineno) ? "\n" : line
+      }.join.chomp
+    end
+
+    # Returns the source String with any directives stripped.
+    def processed_source
+      @processed_source ||= processed_header + body
+    end
+
+    # Returns an Array of directive structures. Each structure
+    # is an Array with the line number as the first element, the
+    # directive name as the second element, followed by any
+    # arguments.
+    #
+    #     [[1, "require", "foo"], [2, "require", "bar"]]
+    #
+    def directives
+      @directives ||= header.lines.each_with_index.map { |line, index|
+        if directive = line[DIRECTIVE_PATTERN, 1]
+          name, *args = Shellwords.shellwords(directive)
+          if respond_to?("process_#{name}_directive", true)
+            [index + 1, name, *args]
+          end
+        end
+      }.compact
+    end
+
+    protected
+      attr_reader :included_pathnames
+      attr_reader :context
+
+      # Gathers comment directives in the source and processes them.
+      # Any directive method matching `process_*_directive` will
+      # automatically be available. This makes it easy to extend the
+      # processor.
+      #
+      # To implement a custom directive called `require_glob`, subclass
+      # `Sprockets::DirectiveProcessor`, then add a method called
+      # `process_require_glob_directive`.
+      #
+      #     class DirectiveProcessor < Sprockets::DirectiveProcessor
+      #       def process_require_glob_directive
+      #         Dir["#{pathname.dirname}/#{glob}"].sort.each do |filename|
+      #           require(filename)
+      #         end
+      #       end
+      #     end
+      #
+      # Replace the current processor on the environment with your own:
+      #
+      #     env.unregister_processor('text/css', Sprockets::DirectiveProcessor)
+      #     env.register_processor('text/css', DirectiveProcessor)
+      #
+      def process_directives
+        directives.each do |line_number, name, *args|
+          context.__LINE__ = line_number
+          send("process_#{name}_directive", *args)
+          context.__LINE__ = nil
+        end
+      end
+
+      def process_source
+        unless @has_written_body || processed_header.empty?
+          @result << processed_header << "\n"
+        end
+
+        included_pathnames.each do |pathname|
+          @result << context.evaluate(pathname)
+        end
+
+        unless @has_written_body
+          @result << body
+        end
+
+        if compat? && constants.any?
+          @result.gsub!(/<%=(.*?)%>/) { constants[$1.strip] }
+        end
+      end
+
+      # The `require` directive functions similar to Ruby's own `require`.
+      # It provides a way to declare a dependency on a file in your path
+      # and ensures its only loaded once before the source file.
+      #
+      # `require` works with files in the environment path:
+      #
+      #     //= require "foo.js"
+      #
+      # Extensions are optional. If your source file is ".js", it
+      # assumes you are requiring another ".js".
+      #
+      #     //= require "foo"
+      #
+      # Relative paths work too. Use a leading `./` to denote a relative
+      # path:
+      #
+      #     //= require "./bar"
+      #
+      def process_require_directive(path)
+        if @compat
+          if path =~ /<([^>]+)>/
+            path = $1
+          else
+            path = "./#{path}" unless relative?(path)
+          end
+        end
+
+        context.require_asset(path)
+      end
+
+      # `require_self` causes the body of the current file to be
+      # inserted before any subsequent `require` or `include`
+      # directives. Useful in CSS files, where it's common for the
+      # index file to contain global styles that need to be defined
+      # before other dependencies are loaded.
+      #
+      #     /*= require "reset"
+      #      *= require_self
+      #      *= require_tree .
+      #      */
+      #
+      def process_require_self_directive
+        if @has_written_body
+          raise ArgumentError, "require_self can only be called once per source file"
+        end
+
+        context.require_asset(pathname)
+        process_source
+        included_pathnames.clear
+        @has_written_body = true
+      end
+
+      # The `include` directive works similar to `require` but
+      # inserts the contents of the dependency even if it already
+      # has been required.
+      #
+      #     //= include "header"
+      #
+      def process_include_directive(path)
+        pathname = context.resolve(path)
+        context.depend_on_asset(pathname)
+        included_pathnames << pathname
+      end
+
+      # `require_directory` requires all the files inside a single
+      # directory. It's similar to `path/*` since it does not follow
+      # nested directories.
+      #
+      #     //= require_directory "./javascripts"
+      #
+      def process_require_directory_directive(path = ".")
+        if relative?(path)
+          root = pathname.dirname.join(path).expand_path
+
+          unless (stats = stat(root)) && stats.directory?
+            raise ArgumentError, "require_directory argument must be a directory"
+          end
+
+          context.depend_on(root)
+
+          entries(root).each do |pathname|
+            pathname = root.join(pathname)
+            if pathname.to_s == self.file
+              next
+            elsif context.asset_requirable?(pathname)
+              context.require_asset(pathname)
+            end
+          end
+        else
+          # The path must be relative and start with a `./`.
+          raise ArgumentError, "require_directory argument must be a relative path"
+        end
+      end
+
+      # `require_tree` requires all the nested files in a directory.
+      # Its glob equivalent is `path/**/*`.
+      #
+      #     //= require_tree "./public"
+      #
+      def process_require_tree_directive(path = ".")
+        if relative?(path)
+          root = pathname.dirname.join(path).expand_path
+
+          unless (stats = stat(root)) && stats.directory?
+            raise ArgumentError, "require_tree argument must be a directory"
+          end
+
+          context.depend_on(root)
+
+          each_entry(root) do |pathname|
+            if pathname.to_s == self.file
+              next
+            elsif stat(pathname).directory?
+              context.depend_on(pathname)
+            elsif context.asset_requirable?(pathname)
+              context.require_asset(pathname)
+            end
+          end
+        else
+          # The path must be relative and start with a `./`.
+          raise ArgumentError, "require_tree argument must be a relative path"
+        end
+      end
+
+      # Allows you to state a dependency on a file without
+      # including it.
+      #
+      # This is used for caching purposes. Any changes made to
+      # the dependency file will invalidate the cache of the
+      # source file.
+      #
+      # This is useful if you are using ERB and File.read to pull
+      # in contents from another file.
+      #
+      #     //= depend_on "foo.png"
+      #
+      def process_depend_on_directive(path)
+        context.depend_on(path)
+      end
+
+      # Allows you to state a dependency on an asset without including
+      # it.
+      #
+      # This is used for caching purposes. Any changes that would
+      # invalid the asset dependency will invalidate the cache our the
+      # source file.
+      #
+      # Unlike `depend_on`, the path must be a requirable asset.
+      #
+      #     //= depend_on_asset "bar.js"
+      #
+      def process_depend_on_asset_directive(path)
+        context.depend_on_asset(path)
+      end
+
+      # Allows dependency to be excluded from the asset bundle.
+      #
+      # The `path` must be a valid asset and may or may not already
+      # be part of the bundle. Once stubbed, it is blacklisted and
+      # can't be brought back by any other `require`.
+      #
+      #     //= stub "jquery"
+      #
+      def process_stub_directive(path)
+        context.stub_asset(path)
+      end
+
+      # Enable Sprockets 1.x compat mode.
+      #
+      # Makes it possible to use the same JavaScript source
+      # file in both Sprockets 1 and 2.
+      #
+      #     //= compat
+      #
+      def process_compat_directive
+        @compat = true
+      end
+
+      # Checks if Sprockets 1.x compat mode enabled
+      def compat?
+        @compat
+      end
+
+      # Sprockets 1.x allowed for constant interpolation if a
+      # constants.yml was present. This is only available if
+      # compat mode is on.
+      def constants
+        if compat?
+          pathname = Pathname.new(context.root_path).join("constants.yml")
+          stat(pathname) ? YAML.load_file(pathname) : {}
+        else
+          {}
+        end
+      end
+
+      # `provide` is stubbed out for Sprockets 1.x compat.
+      # Mutating the path when an asset is being built is
+      # not permitted.
+      def process_provide_directive(path)
+      end
+
+    private
+      def relative?(path)
+        path =~ /^\.($|\.?\/)/
+      end
+
+      def stat(path)
+        context.environment.stat(path)
+      end
+
+      def entries(path)
+        context.environment.entries(path)
+      end
+
+      def each_entry(root, &block)
+        context.environment.each_entry(root, &block)
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/eco_template.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/eco_template.rb
new file mode 100644
index 0000000..da003cc
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/eco_template.rb
@@ -0,0 +1,38 @@
+require 'tilt'
+
+module Sprockets
+  # Tilt engine class for the Eco compiler. Depends on the `eco` gem.
+  #
+  # For more infomation see:
+  #
+  #   https://github.com/sstephenson/ruby-eco
+  #   https://github.com/sstephenson/eco
+  #
+  class EcoTemplate < Tilt::Template
+    # Check to see if Eco is loaded
+    def self.engine_initialized?
+      defined? ::Eco
+    end
+
+    # Autoload eco library. If the library isn't loaded, Tilt will produce
+    # a thread safetly warning. If you intend to use `.eco` files, you
+    # should explicitly require it.
+    def initialize_engine
+      require_template_library 'eco'
+    end
+
+    def prepare
+    end
+
+    # Compile template data with Eco compiler.
+    #
+    # Returns a JS function definition String. The result should be
+    # assigned to a JS variable.
+    #
+    #     # => "function(...) {...}"
+    #
+    def evaluate(scope, locals, &block)
+      Eco.compile(data)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/ejs_template.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/ejs_template.rb
new file mode 100644
index 0000000..65ddaa6
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/ejs_template.rb
@@ -0,0 +1,37 @@
+require 'tilt'
+
+module Sprockets
+  # Tilt engine class for the EJS compiler. Depends on the `ejs` gem.
+  #
+  # For more infomation see:
+  #
+  #   https://github.com/sstephenson/ruby-ejs
+  #
+  class EjsTemplate < Tilt::Template
+    # Check to see if EJS is loaded
+    def self.engine_initialized?
+      defined? ::EJS
+    end
+
+    # Autoload ejs library. If the library isn't loaded, Tilt will produce
+    # a thread safetly warning. If you intend to use `.ejs` files, you
+    # should explicitly require it.
+    def initialize_engine
+      require_template_library 'ejs'
+    end
+
+    def prepare
+    end
+
+    # Compile template data with EJS compiler.
+    #
+    # Returns a JS function definition String. The result should be
+    # assigned to a JS variable.
+    #
+    #     # => "function(obj){...}"
+    #
+    def evaluate(scope, locals, &block)
+      EJS.compile(data)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/engines.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/engines.rb
new file mode 100644
index 0000000..6a5b28f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/engines.rb
@@ -0,0 +1,74 @@
+require 'sprockets/eco_template'
+require 'sprockets/ejs_template'
+require 'sprockets/jst_processor'
+require 'sprockets/utils'
+require 'tilt'
+
+module Sprockets
+  # `Engines` provides a global and `Environment` instance registry.
+  #
+  # An engine is a type of processor that is bound to an filename
+  # extension. `application.js.coffee` indicates that the
+  # `CoffeeScriptTemplate` engine will be ran on the file.
+  #
+  # Extensions can be stacked and will be evaulated from right to
+  # left. `application.js.coffee.erb` will first run `ERBTemplate`
+  # then `CoffeeScriptTemplate`.
+  #
+  # All `Engine`s must follow the `Tilt::Template` interface. It is
+  # recommended to subclass `Tilt::Template`.
+  #
+  # Its recommended that you register engine changes on your local
+  # `Environment` instance.
+  #
+  #     environment.register_engine '.foo', FooProcessor
+  #
+  # The global registry is exposed for plugins to register themselves.
+  #
+  #     Sprockets.register_engine '.sass', SassTemplate
+  #
+  module Engines
+    # Returns a `Hash` of `Engine`s registered on the `Environment`.
+    # If an `ext` argument is supplied, the `Engine` associated with
+    # that extension will be returned.
+    #
+    #     environment.engines
+    #     # => {".coffee" => CoffeeScriptTemplate, ".sass" => SassTemplate, ...}
+    #
+    #     environment.engines('.coffee')
+    #     # => CoffeeScriptTemplate
+    #
+    def engines(ext = nil)
+      if ext
+        ext = Sprockets::Utils.normalize_extension(ext)
+        @engines[ext]
+      else
+        @engines.dup
+      end
+    end
+
+    # Returns an `Array` of engine extension `String`s.
+    #
+    #     environment.engine_extensions
+    #     # => ['.coffee', '.sass', ...]
+    def engine_extensions
+      @engines.keys
+    end
+
+    # Registers a new Engine `klass` for `ext`. If the `ext` already
+    # has an engine registered, it will be overridden.
+    #
+    #     environment.register_engine '.coffee', CoffeeScriptTemplate
+    #
+    def register_engine(ext, klass)
+      ext = Sprockets::Utils.normalize_extension(ext)
+      @engines[ext] = klass
+    end
+
+    private
+      def deep_copy_hash(hash)
+        initial = Hash.new { |h, k| h[k] = [] }
+        hash.inject(initial) { |h, (k, a)| h[k] = a.dup; h }
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/environment.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/environment.rb
new file mode 100644
index 0000000..874c66a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/environment.rb
@@ -0,0 +1,88 @@
+require 'sprockets/base'
+require 'sprockets/context'
+require 'sprockets/index'
+
+require 'hike'
+require 'logger'
+require 'pathname'
+require 'tilt'
+
+module Sprockets
+  class Environment < Base
+    # `Environment` should initialized with your application's root
+    # directory. This should be the same as your Rails or Rack root.
+    #
+    #     env = Environment.new(Rails.root)
+    #
+    def initialize(root = ".")
+      @trail = Hike::Trail.new(root)
+
+      self.logger = Logger.new($stderr)
+      self.logger.level = Logger::FATAL
+
+      if respond_to?(:default_external_encoding)
+        self.default_external_encoding = Encoding::UTF_8
+      end
+
+      # Create a safe `Context` subclass to mutate
+      @context_class = Class.new(Context)
+
+      # Set MD5 as the default digest
+      require 'digest/md5'
+      @digest_class = ::Digest::MD5
+      @version = ''
+
+      @mime_types        = Sprockets.registered_mime_types
+      @engines           = Sprockets.engines
+      @preprocessors     = Sprockets.preprocessors
+      @postprocessors    = Sprockets.postprocessors
+      @bundle_processors = Sprockets.bundle_processors
+      @compressors       = Sprockets.compressors
+
+      Sprockets.paths.each do |path|
+        append_path(path)
+      end
+
+      @engines.each do |ext, klass|
+        add_engine_to_trail(ext, klass)
+      end
+
+      @mime_types.each do |ext, type|
+        @trail.append_extension(ext)
+      end
+
+      expire_index!
+
+      yield self if block_given?
+    end
+
+    # Returns a cached version of the environment.
+    #
+    # All its file system calls are cached which makes `index` much
+    # faster. This behavior is ideal in production since the file
+    # system only changes between deploys.
+    def index
+      Index.new(self)
+    end
+
+    # Cache `find_asset` calls
+    def find_asset(path, options = {})
+      options[:bundle] = true unless options.key?(:bundle)
+
+      # Ensure inmemory cached assets are still fresh on every lookup
+      if (asset = @assets[cache_key_for(path, options)]) && asset.fresh?(self)
+        asset
+      elsif asset = index.find_asset(path, options)
+        # Cache is pushed upstream by Index#find_asset
+        asset
+      end
+    end
+
+    protected
+      def expire_index!
+        # Clear digest to be recomputed
+        @digest = nil
+        @assets = {}
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/errors.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/errors.rb
new file mode 100644
index 0000000..f7a00c4
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/errors.rb
@@ -0,0 +1,20 @@
+# Define some basic Sprockets error classes
+module Sprockets
+  class Error           < StandardError; end
+  class ArgumentError           < Error; end
+  class CircularDependencyError < Error; end
+  class ContentTypeMismatch     < Error; end
+  class EncodingError           < Error; end
+  class FileNotFound            < Error; end
+  class FileOutsidePaths        < Error; end
+  class NotImplementedError     < Error; end
+  class UnserializeError        < Error; end
+
+  module EngineError
+    attr_accessor :sprockets_annotation
+
+    def message
+      [super, sprockets_annotation].compact.join("\n")
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/index.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/index.rb
new file mode 100644
index 0000000..8aa6ad6
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/index.rb
@@ -0,0 +1,100 @@
+require 'sprockets/base'
+
+module Sprockets
+  # `Index` is a special cached version of `Environment`.
+  #
+  # The expection is that all of its file system methods are cached
+  # for the instances lifetime. This makes `Index` much faster. This
+  # behavior is ideal in production environments where the file system
+  # is immutable.
+  #
+  # `Index` should not be initialized directly. Instead use
+  # `Environment#index`.
+  class Index < Base
+    def initialize(environment)
+      @environment = environment
+
+      if environment.respond_to?(:default_external_encoding)
+        @default_external_encoding = environment.default_external_encoding
+      end
+
+      # Copy environment attributes
+      @logger            = environment.logger
+      @context_class     = environment.context_class
+      @cache             = environment.cache
+      @trail             = environment.trail.index
+      @digest            = environment.digest
+      @digest_class      = environment.digest_class
+      @version           = environment.version
+      @mime_types        = environment.mime_types
+      @engines           = environment.engines
+      @preprocessors     = environment.preprocessors
+      @postprocessors    = environment.postprocessors
+      @bundle_processors = environment.bundle_processors
+      @compressors       = environment.compressors
+
+      # Initialize caches
+      @assets  = {}
+      @digests = {}
+    end
+
+    # No-op return self as index
+    def index
+      self
+    end
+
+    # Cache calls to `file_digest`
+    def file_digest(pathname)
+      key = pathname.to_s
+      if @digests.key?(key)
+        @digests[key]
+      else
+        @digests[key] = super
+      end
+    end
+
+    # Cache `find_asset` calls
+    def find_asset(path, options = {})
+      options[:bundle] = true unless options.key?(:bundle)
+      if asset = @assets[cache_key_for(path, options)]
+        asset
+      elsif asset = super
+        logical_path_cache_key = cache_key_for(path, options)
+        full_path_cache_key    = cache_key_for(asset.pathname, options)
+
+        # Cache on Index
+        @assets[logical_path_cache_key] = @assets[full_path_cache_key] = asset
+
+        # Push cache upstream to Environment
+        @environment.instance_eval do
+          @assets[logical_path_cache_key] = @assets[full_path_cache_key] = asset
+        end
+
+        asset
+      end
+    end
+
+    protected
+      # Index is immutable, any methods that try to clear the cache
+      # should bomb.
+      def expire_index!
+        raise TypeError, "can't modify immutable index"
+      end
+
+      # Cache asset building in memory and in persisted cache.
+      def build_asset(path, pathname, options)
+        # Memory cache
+        key = cache_key_for(pathname, options)
+        if @assets.key?(key)
+          @assets[key]
+        else
+          @assets[key] = begin
+            # Persisted cache
+            cache_asset(key) do
+              super
+            end
+          end
+        end
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/jst_processor.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/jst_processor.rb
new file mode 100644
index 0000000..4d85915
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/jst_processor.rb
@@ -0,0 +1,29 @@
+require 'tilt'
+
+module Sprockets
+  class JstProcessor < Tilt::Template
+    self.default_mime_type = 'application/javascript'
+
+    def self.default_namespace
+      'this.JST'
+    end
+
+    def prepare
+      @namespace = self.class.default_namespace
+    end
+
+    attr_reader :namespace
+
+    def evaluate(scope, locals, &block)
+      <<-JST
+(function() { #{namespace} || (#{namespace} = {}); #{namespace}[#{scope.logical_path.inspect}] = #{indent(data)};
+}).call(this);
+      JST
+    end
+
+    private
+      def indent(string)
+        string.gsub(/$(.)/m, "\\1  ").strip
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/manifest.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/manifest.rb
new file mode 100644
index 0000000..dcc30ba
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/manifest.rb
@@ -0,0 +1,261 @@
+require 'multi_json'
+require 'securerandom'
+require 'time'
+
+module Sprockets
+  # The Manifest logs the contents of assets compiled to a single
+  # directory. It records basic attributes about the asset for fast
+  # lookup without having to compile. A pointer from each logical path
+  # indicates with fingerprinted asset is the current one.
+  #
+  # The JSON is part of the public API and should be considered
+  # stable. This should make it easy to read from other programming
+  # languages and processes that don't have sprockets loaded. See
+  # `#assets` and `#files` for more infomation about the structure.
+  class Manifest
+    attr_reader :environment, :path, :dir
+
+    # Create new Manifest associated with an `environment`. `path` is
+    # a full path to the manifest json file. The file may or may not
+    # already exist. The dirname of the `path` will be used to write
+    # compiled assets to. Otherwise, if the path is a directory, the
+    # filename will default a random "manifest-123.json" file in that
+    # directory.
+    #
+    #   Manifest.new(environment, "./public/assets/manifest.json")
+    #
+    def initialize(*args)
+      if args.first.is_a?(Base) || args.first.nil?
+        @environment = args.shift
+      end
+
+      @dir, @path = args[0], args[1]
+
+      # Expand paths
+      @dir  = File.expand_path(@dir) if @dir
+      @path = File.expand_path(@path) if @path
+
+      # If path is given as the second arg
+      if @dir && File.extname(@dir) != ""
+        @dir, @path = nil, @dir
+      end
+
+      # Default dir to the directory of the path
+      @dir ||= File.dirname(@path) if @path
+
+      # If directory is given w/o path, pick a random manifest.json location
+      if @dir && @path.nil?
+        # Find the first manifest.json in the directory
+        paths = Dir[File.join(@dir, "manifest*.json")]
+        if paths.any?
+          @path = paths.first
+        else
+          @path = File.join(@dir, "manifest-#{SecureRandom.hex(16)}.json")
+        end
+      end
+
+      unless @dir && @path
+        raise ArgumentError, "manifest requires output path"
+      end
+
+      data = nil
+
+      begin
+        if File.exist?(@path)
+          data = json_decode(File.read(@path))
+        end
+      rescue MultiJson::DecodeError => e
+        logger.error "#{@path} is invalid: #{e.class} #{e.message}"
+      end
+
+      @data = data.is_a?(Hash) ? data : {}
+    end
+
+    # Returns internal assets mapping. Keys are logical paths which
+    # map to the latest fingerprinted filename.
+    #
+    #   Logical path (String): Fingerprint path (String)
+    #
+    #   { "application.js" => "application-2e8e9a7c6b0aafa0c9bdeec90ea30213.js",
+    #     "jquery.js"      => "jquery-ae0908555a245f8266f77df5a8edca2e.js" }
+    #
+    def assets
+      @data['assets'] ||= {}
+    end
+
+    # Returns internal file directory listing. Keys are filenames
+    # which map to an attributes array.
+    #
+    #   Fingerprint path (String):
+    #     logical_path: Logical path (String)
+    #     mtime: ISO8601 mtime (String)
+    #     digest: Base64 hex digest (String)
+    #
+    #  { "application-2e8e9a7c6b0aafa0c9bdeec90ea30213.js" =>
+    #      { 'logical_path' => "application.js",
+    #        'mtime' => "2011-12-13T21:47:08-06:00",
+    #        'digest' => "2e8e9a7c6b0aafa0c9bdeec90ea30213" } }
+    #
+    def files
+      @data['files'] ||= {}
+    end
+
+    # Compile and write asset to directory. The asset is written to a
+    # fingerprinted filename like
+    # `application-2e8e9a7c6b0aafa0c9bdeec90ea30213.js`. An entry is
+    # also inserted into the manifest file.
+    #
+    #   compile("application.js")
+    #
+    def compile(*args)
+      unless environment
+        raise Error, "manifest requires environment for compilation"
+      end
+
+      paths = environment.each_logical_path(*args).to_a +
+        args.flatten.select { |fn| Pathname.new(fn).absolute? if fn.is_a?(String)}
+
+      paths.each do |path|
+        if asset = find_asset(path)
+          files[asset.digest_path] = {
+            'logical_path' => asset.logical_path,
+            'mtime'        => asset.mtime.iso8601,
+            'size'         => asset.bytesize,
+            'digest'       => asset.digest
+          }
+          assets[asset.logical_path] = asset.digest_path
+
+          target = File.join(dir, asset.digest_path)
+
+          if File.exist?(target)
+            logger.debug "Skipping #{target}, already exists"
+          else
+            logger.info "Writing #{target}"
+            asset.write_to target
+            asset.write_to "#{target}.gz" if asset.is_a?(BundledAsset)
+          end
+
+          save
+          asset
+        end
+      end
+    end
+
+    # Removes file from directory and from manifest. `filename` must
+    # be the name with any directory path.
+    #
+    #   manifest.remove("application-2e8e9a7c6b0aafa0c9bdeec90ea30213.js")
+    #
+    def remove(filename)
+      path = File.join(dir, filename)
+      gzip = "#{path}.gz"
+      logical_path = files[filename]['logical_path']
+
+      if assets[logical_path] == filename
+        assets.delete(logical_path)
+      end
+
+      files.delete(filename)
+      FileUtils.rm(path) if File.exist?(path)
+      FileUtils.rm(gzip) if File.exist?(gzip)
+
+      save
+
+      logger.info "Removed #{filename}"
+
+      nil
+    end
+
+    # Cleanup old assets in the compile directory. By default it will
+    # keep the latest version plus 2 backups.
+    def clean(keep = 2)
+      self.assets.keys.each do |logical_path|
+        # Get assets sorted by ctime, newest first
+        assets = backups_for(logical_path)
+
+        # Keep the last N backups
+        assets = assets[keep..-1] || []
+
+        # Remove old assets
+        assets.each { |path, _| remove(path) }
+      end
+    end
+
+    # Wipe directive
+    def clobber
+      FileUtils.rm_r(@dir) if File.exist?(@dir)
+      logger.info "Removed #{@dir}"
+      nil
+    end
+
+    protected
+      # Finds all the backup assets for a logical path. The latest
+      # version is always excluded. The return array is sorted by the
+      # assets mtime in descending order (Newest to oldest).
+      def backups_for(logical_path)
+        files.select { |filename, attrs|
+          # Matching logical paths
+          attrs['logical_path'] == logical_path &&
+            # Excluding whatever asset is the current
+            assets[logical_path] != filename
+        }.sort_by { |filename, attrs|
+          # Sort by timestamp
+          Time.parse(attrs['mtime'])
+        }.reverse
+      end
+
+      # Basic wrapper around Environment#find_asset. Logs compile time.
+      def find_asset(logical_path)
+        asset = nil
+        ms = benchmark do
+          asset = environment.find_asset(logical_path)
+        end
+        logger.debug "Compiled #{logical_path}  (#{ms}ms)"
+        asset
+      end
+
+      # Persist manfiest back to FS
+      def save
+        FileUtils.mkdir_p dir
+        File.open(path, 'w') do |f|
+          f.write json_encode(@data)
+        end
+      end
+
+    private
+      # Feature detect newer MultiJson API
+      if MultiJson.respond_to?(:dump)
+        def json_decode(obj)
+          MultiJson.load(obj)
+        end
+
+        def json_encode(obj)
+          MultiJson.dump(obj)
+        end
+      else
+        def json_decode(obj)
+          MultiJson.decode(obj)
+        end
+
+        def json_encode(obj)
+          MultiJson.encode(obj)
+        end
+      end
+
+      def logger
+        if environment
+          environment.logger
+        else
+          logger = Logger.new($stderr)
+          logger.level = Logger::FATAL
+          logger
+        end
+      end
+
+      def benchmark
+        start_time = Time.now.to_f
+        yield
+        ((Time.now.to_f - start_time) * 1000).to_i
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/mime.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/mime.rb
new file mode 100644
index 0000000..d4949bb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/mime.rb
@@ -0,0 +1,49 @@
+require 'rack/mime'
+
+module Sprockets
+  module Mime
+    # Returns a `Hash` of registered mime types registered on the
+    # environment and those part of `Rack::Mime`.
+    #
+    # If an `ext` is given, it will lookup the mime type for that extension.
+    def mime_types(ext = nil)
+      if ext.nil?
+        Rack::Mime::MIME_TYPES.merge(@mime_types)
+      else
+        ext = Sprockets::Utils.normalize_extension(ext)
+        @mime_types[ext] || Rack::Mime::MIME_TYPES[ext]
+      end
+    end
+
+    # Returns a `Hash` of explicitly registered mime types.
+    def registered_mime_types
+      @mime_types.dup
+    end
+
+    if {}.respond_to?(:key)
+      def extension_for_mime_type(type)
+        mime_types.key(type)
+      end
+    else
+      def extension_for_mime_type(type)
+        mime_types.index(type)
+      end
+    end
+
+    # Register a new mime type.
+    def register_mime_type(mime_type, ext)
+      ext = Sprockets::Utils.normalize_extension(ext)
+      @mime_types[ext] = mime_type
+    end
+
+    if defined? Encoding
+      # Returns the correct encoding for a given mime type, while falling
+      # back on the default external encoding, if it exists.
+      def encoding_for_mime_type(type)
+        encoding = Encoding::BINARY if type =~ %r{^(image|audio|video)/}
+        encoding ||= default_external_encoding if respond_to?(:default_external_encoding)
+        encoding
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/paths.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/paths.rb
new file mode 100644
index 0000000..f17b801
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/paths.rb
@@ -0,0 +1,58 @@
+module Sprockets
+  module Paths
+    # Returns `Environment` root.
+    #
+    # All relative paths are expanded with root as its base. To be
+    # useful set this to your applications root directory. (`Rails.root`)
+    def root
+      @trail.root.dup
+    end
+
+    # Returns an `Array` of path `String`s.
+    #
+    # These paths will be used for asset logical path lookups.
+    #
+    # Note that a copy of the `Array` is returned so mutating will
+    # have no affect on the environment. See `append_path`,
+    # `prepend_path`, and `clear_paths`.
+    def paths
+      @trail.paths.dup
+    end
+
+    # Prepend a `path` to the `paths` list.
+    #
+    # Paths at the end of the `Array` have the least priority.
+    def prepend_path(path)
+      @trail.prepend_path(path)
+    end
+
+    # Append a `path` to the `paths` list.
+    #
+    # Paths at the beginning of the `Array` have a higher priority.
+    def append_path(path)
+      @trail.append_path(path)
+    end
+
+    # Clear all paths and start fresh.
+    #
+    # There is no mechanism for reordering paths, so its best to
+    # completely wipe the paths list and reappend them in the order
+    # you want.
+    def clear_paths
+      @trail.paths.dup.each { |path| @trail.remove_path(path) }
+    end
+
+    # Returns an `Array` of extensions.
+    #
+    # These extensions maybe omitted from logical path searches.
+    #
+    #     # => [".js", ".css", ".coffee", ".sass", ...]
+    #
+    def extensions
+      @trail.extensions.dup
+    end
+
+    protected
+      attr_reader :trail
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/processed_asset.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/processed_asset.rb
new file mode 100644
index 0000000..1793675
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/processed_asset.rb
@@ -0,0 +1,152 @@
+require 'sprockets/asset'
+require 'sprockets/utils'
+
+module Sprockets
+  class ProcessedAsset < Asset
+    def initialize(environment, logical_path, pathname)
+      super
+
+      start_time = Time.now.to_f
+
+      context = environment.context_class.new(environment, logical_path, pathname)
+      @source = context.evaluate(pathname)
+      @length = Rack::Utils.bytesize(source)
+      @digest = environment.digest.update(source).hexdigest
+
+      build_required_assets(environment, context)
+      build_dependency_paths(environment, context)
+
+      @dependency_digest = compute_dependency_digest(environment)
+
+      elapsed_time = ((Time.now.to_f - start_time) * 1000).to_i
+      environment.logger.debug "Compiled #{logical_path}  (#{elapsed_time}ms)  (pid #{Process.pid})"
+    end
+
+    # Interal: Used to check equality
+    attr_reader :dependency_digest
+
+    attr_reader :source
+
+    # Initialize `BundledAsset` from serialized `Hash`.
+    def init_with(environment, coder)
+      super
+
+      @source = coder['source']
+      @dependency_digest = coder['dependency_digest']
+
+      @required_assets = coder['required_paths'].map { |p|
+        p = expand_root_path(p)
+
+        unless environment.paths.detect { |path| p[path] }
+          raise UnserializeError, "#{p} isn't in paths"
+        end
+
+        p == pathname.to_s ? self : environment.find_asset(p, :bundle => false)
+      }
+      @dependency_paths = coder['dependency_paths'].map { |h|
+        DependencyFile.new(expand_root_path(h['path']), h['mtime'], h['digest'])
+      }
+    end
+
+    # Serialize custom attributes in `BundledAsset`.
+    def encode_with(coder)
+      super
+
+      coder['source'] = source
+      coder['dependency_digest'] = dependency_digest
+
+      coder['required_paths'] = required_assets.map { |a|
+        relativize_root_path(a.pathname).to_s
+      }
+      coder['dependency_paths'] = dependency_paths.map { |d|
+        { 'path' => relativize_root_path(d.pathname).to_s,
+          'mtime' => d.mtime.iso8601,
+          'digest' => d.digest }
+      }
+    end
+
+    # Checks if Asset is stale by comparing the actual mtime and
+    # digest to the inmemory model.
+    def fresh?(environment)
+      # Check freshness of all declared dependencies
+      @dependency_paths.all? { |dep| dependency_fresh?(environment, dep) }
+    end
+
+    protected
+      class DependencyFile < Struct.new(:pathname, :mtime, :digest)
+        def initialize(pathname, mtime, digest)
+          pathname = Pathname.new(pathname) unless pathname.is_a?(Pathname)
+          mtime    = Time.parse(mtime) if mtime.is_a?(String)
+          super
+        end
+
+        def eql?(other)
+          other.is_a?(DependencyFile) &&
+            pathname.eql?(other.pathname) &&
+            mtime.eql?(other.mtime) &&
+            digest.eql?(other.digest)
+        end
+
+        def hash
+          pathname.to_s.hash
+        end
+      end
+
+    private
+      def build_required_assets(environment, context)
+        @required_assets = resolve_dependencies(environment, context._required_paths + [pathname.to_s]) -
+          resolve_dependencies(environment, context._stubbed_assets.to_a)
+      end
+
+      def resolve_dependencies(environment, paths)
+        assets = []
+        cache  = {}
+
+        paths.each do |path|
+          if path == self.pathname.to_s
+            unless cache[self]
+              cache[self] = true
+              assets << self
+            end
+          elsif asset = environment.find_asset(path, :bundle => false)
+            asset.required_assets.each do |asset_dependency|
+              unless cache[asset_dependency]
+                cache[asset_dependency] = true
+                assets << asset_dependency
+              end
+            end
+          end
+        end
+
+        assets
+      end
+
+      def build_dependency_paths(environment, context)
+        dependency_paths = {}
+
+        context._dependency_paths.each do |path|
+          dep = DependencyFile.new(path, environment.stat(path).mtime, environment.file_digest(path).hexdigest)
+          dependency_paths[dep] = true
+        end
+
+        context._dependency_assets.each do |path|
+          if path == self.pathname.to_s
+            dep = DependencyFile.new(pathname, environment.stat(path).mtime, environment.file_digest(path).hexdigest)
+            dependency_paths[dep] = true
+          elsif asset = environment.find_asset(path, :bundle => false)
+            asset.dependency_paths.each do |d|
+              dependency_paths[d] = true
+            end
+          end
+        end
+
+        @dependency_paths = dependency_paths.keys
+      end
+
+      def compute_dependency_digest(environment)
+        required_assets.inject(environment.digest) { |digest, asset|
+          digest.update asset.digest
+        }.hexdigest
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/processing.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/processing.rb
new file mode 100644
index 0000000..faeb4e9
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/processing.rb
@@ -0,0 +1,206 @@
+require 'sprockets/engines'
+require 'sprockets/mime'
+require 'sprockets/processor'
+require 'sprockets/utils'
+
+module Sprockets
+  # `Processing` is an internal mixin whose public methods are exposed on
+  # the `Environment` and `Index` classes.
+  module Processing
+    # Returns an `Array` of format extension `String`s.
+    #
+    #     format_extensions
+    #     # => ['.js', '.css']
+    #
+    def format_extensions
+      @trail.extensions - @engines.keys
+    end
+
+    # Deprecated alias for `preprocessors`.
+    def processors(*args)
+      preprocessors(*args)
+    end
+
+    # Returns an `Array` of `Processor` classes. If a `mime_type`
+    # argument is supplied, the processors registered under that
+    # extension will be returned.
+    #
+    # Preprocessors are ran before Postprocessors and Engine
+    # processors.
+    #
+    # All `Processor`s must follow the `Tilt::Template` interface. It is
+    # recommended to subclass `Tilt::Template`.
+    def preprocessors(mime_type = nil)
+      if mime_type
+        @preprocessors[mime_type].dup
+      else
+        deep_copy_hash(@preprocessors)
+      end
+    end
+
+    # Returns an `Array` of `Processor` classes. If a `mime_type`
+    # argument is supplied, the processors registered under that
+    # extension will be returned.
+    #
+    # Postprocessors are ran after Preprocessors and Engine processors.
+    #
+    # All `Processor`s must follow the `Tilt::Template` interface. It is
+    # recommended to subclass `Tilt::Template`.
+    def postprocessors(mime_type = nil)
+      if mime_type
+        @postprocessors[mime_type].dup
+      else
+        deep_copy_hash(@postprocessors)
+      end
+    end
+
+    # Deprecated alias for `register_preprocessor`.
+    def register_processor(*args, &block)
+      register_preprocessor(*args, &block)
+    end
+
+    # Registers a new Preprocessor `klass` for `mime_type`.
+    #
+    #     register_preprocessor 'text/css', Sprockets::DirectiveProcessor
+    #
+    # A block can be passed for to create a shorthand processor.
+    #
+    #     register_preprocessor 'text/css', :my_processor do |context, data|
+    #       data.gsub(...)
+    #     end
+    #
+    def register_preprocessor(mime_type, klass, &block)
+      if block_given?
+        name  = klass.to_s
+        klass = Class.new(Processor) do
+          @name      = name
+          @processor = block
+        end
+      end
+
+      @preprocessors[mime_type].push(klass)
+    end
+
+    # Registers a new Postprocessor `klass` for `mime_type`.
+    #
+    #     register_postprocessor 'text/css', Sprockets::CharsetNormalizer
+    #
+    # A block can be passed for to create a shorthand processor.
+    #
+    #     register_postprocessor 'text/css', :my_processor do |context, data|
+    #       data.gsub(...)
+    #     end
+    #
+    def register_postprocessor(mime_type, klass, &block)
+      if block_given?
+        name  = klass.to_s
+        klass = Class.new(Processor) do
+          @name      = name
+          @processor = block
+        end
+      end
+
+      @postprocessors[mime_type].push(klass)
+    end
+
+    # Deprecated alias for `unregister_preprocessor`.
+    def unregister_processor(*args)
+      unregister_preprocessor(*args)
+    end
+
+    # Remove Preprocessor `klass` for `mime_type`.
+    #
+    #     unregister_preprocessor 'text/css', Sprockets::DirectiveProcessor
+    #
+    def unregister_preprocessor(mime_type, klass)
+      if klass.is_a?(String) || klass.is_a?(Symbol)
+        klass = @preprocessors[mime_type].detect { |cls|
+          cls.respond_to?(:name) &&
+            cls.name == "Sprockets::Processor (#{klass})"
+        }
+      end
+
+      @preprocessors[mime_type].delete(klass)
+    end
+
+    # Remove Postprocessor `klass` for `mime_type`.
+    #
+    #     unregister_postprocessor 'text/css', Sprockets::DirectiveProcessor
+    #
+    def unregister_postprocessor(mime_type, klass)
+      if klass.is_a?(String) || klass.is_a?(Symbol)
+        klass = @postprocessors[mime_type].detect { |cls|
+          cls.respond_to?(:name) &&
+            cls.name == "Sprockets::Processor (#{klass})"
+        }
+      end
+
+      @postprocessors[mime_type].delete(klass)
+    end
+
+    # Returns an `Array` of `Processor` classes. If a `mime_type`
+    # argument is supplied, the processors registered under that
+    # extension will be returned.
+    #
+    # Bundle Processors are ran on concatenated assets rather than
+    # individual files.
+    #
+    # All `Processor`s must follow the `Tilt::Template` interface. It is
+    # recommended to subclass `Tilt::Template`.
+    def bundle_processors(mime_type = nil)
+      if mime_type
+        @bundle_processors[mime_type].dup
+      else
+        deep_copy_hash(@bundle_processors)
+      end
+    end
+
+    # Registers a new Bundle Processor `klass` for `mime_type`.
+    #
+    #     register_bundle_processor  'text/css', Sprockets::CharsetNormalizer
+    #
+    # A block can be passed for to create a shorthand processor.
+    #
+    #     register_bundle_processor :my_processor do |context, data|
+    #       data.gsub(...)
+    #     end
+    #
+    def register_bundle_processor(mime_type, klass, &block)
+      if block_given?
+        name  = klass.to_s
+        klass = Class.new(Processor) do
+          @name      = name
+          @processor = block
+        end
+      end
+
+      @bundle_processors[mime_type].push(klass)
+    end
+
+    # Remove Bundle Processor `klass` for `mime_type`.
+    #
+    #     unregister_bundle_processor 'text/css', Sprockets::CharsetNormalizer
+    #
+    def unregister_bundle_processor(mime_type, klass)
+      if klass.is_a?(String) || klass.is_a?(Symbol)
+        klass = @bundle_processors[mime_type].detect { |cls|
+          cls.respond_to?(:name) &&
+            cls.name == "Sprockets::Processor (#{klass})"
+        }
+      end
+
+      @bundle_processors[mime_type].delete(klass)
+    end
+
+    private
+      def add_engine_to_trail(ext, klass)
+        @trail.append_extension(ext.to_s)
+
+        if klass.respond_to?(:default_mime_type) && klass.default_mime_type
+          if format_ext = extension_for_mime_type(klass.default_mime_type)
+            @trail.alias_extension(ext.to_s, format_ext)
+          end
+        end
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/processor.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/processor.rb
new file mode 100644
index 0000000..6da376d
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/processor.rb
@@ -0,0 +1,32 @@
+require 'tilt'
+
+module Sprockets
+  # `Processor` creates an anonymous processor class from a block.
+  #
+  #     register_preprocessor :my_processor do |context, data|
+  #       # ...
+  #     end
+  #
+  class Processor < Tilt::Template
+    # `processor` is a lambda or block
+    def self.processor
+      @processor
+    end
+
+    def self.name
+      "Sprockets::Processor (#{@name})"
+    end
+
+    def self.to_s
+      name
+    end
+
+    def prepare
+    end
+
+    # Call processor block with `context` and `data`.
+    def evaluate(context, locals)
+      self.class.processor.call(context, data)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/safety_colons.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/safety_colons.rb
new file mode 100644
index 0000000..19dcd59
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/safety_colons.rb
@@ -0,0 +1,28 @@
+require 'tilt'
+
+module Sprockets
+  # For JS developers who are colonfobic, concatenating JS files using
+  # the module pattern usually leads to syntax errors.
+  #
+  # The `SafetyColons` processor will insert missing semicolons to the
+  # end of the file.
+  #
+  # This behavior can be disabled with:
+  #
+  #     environment.unregister_postprocessor 'application/javascript', Sprockets::SafetyColons
+  #
+  class SafetyColons < Tilt::Template
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      # If the file is blank or ends in a semicolon, leave it as is
+      if data =~ /\A\s*\Z/m || data =~ /;\s*\Z/m
+        data
+      else
+        # Otherwise, append a semicolon and newline
+        "#{data};\n"
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_cache_store.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_cache_store.rb
new file mode 100644
index 0000000..d969a5c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_cache_store.rb
@@ -0,0 +1,29 @@
+require 'sass'
+
+module Sprockets
+  class SassCacheStore < ::Sass::CacheStores::Base
+    attr_reader :environment
+
+    def initialize(environment)
+      @environment = environment
+    end
+
+    def _store(key, version, sha, contents)
+      environment.cache_set("sass/#{key}", {:version => version, :sha => sha, :contents => contents})
+    end
+
+    def _retrieve(key, version, sha)
+      if obj = environment.cache_get("sass/#{key}")
+        return unless obj[:version] == version
+        return unless obj[:sha] == sha
+        obj[:contents]
+      else
+        nil
+      end
+    end
+
+    def path_to(key)
+      key
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_compressor.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_compressor.rb
new file mode 100644
index 0000000..112d4ee
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_compressor.rb
@@ -0,0 +1,27 @@
+require 'tilt'
+
+module Sprockets
+  class SassCompressor < Tilt::Template
+    self.default_mime_type = 'text/css'
+
+    def self.engine_initialized?
+      defined?(::Sass::Engine)
+    end
+
+    def initialize_engine
+      require_template_library 'sass'
+    end
+
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      ::Sass::Engine.new(data, {
+        :syntax => :scss,
+        :cache => false,
+        :read_cache => false,
+        :style => :compressed
+      }).render
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_functions.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_functions.rb
new file mode 100644
index 0000000..3e0e812
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_functions.rb
@@ -0,0 +1,70 @@
+require 'sass'
+
+module Sprockets
+  module SassFunctions
+    def asset_path(path)
+      Sass::Script::String.new(sprockets_context.asset_path(path.value), :string)
+    end
+
+    def asset_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.asset_path(path.value) + ")")
+    end
+
+    def image_path(path)
+      Sass::Script::String.new(sprockets_context.image_path(path.value), :string)
+    end
+
+    def image_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.image_path(path.value) + ")")
+    end
+
+    def video_path(path)
+      Sass::Script::String.new(sprockets_context.video_path(path.value), :string)
+    end
+
+    def video_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.video_path(path.value) + ")")
+    end
+
+    def audio_path(path)
+      Sass::Script::String.new(sprockets_context.audio_path(path.value), :string)
+    end
+
+    def audio_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.audio_path(path.value) + ")")
+    end
+
+    def font_path(path)
+      Sass::Script::String.new(sprockets_context.font_path(path.value), :string)
+    end
+
+    def font_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.font_path(path.value) + ")")
+    end
+
+    def javascript_path(path)
+      Sass::Script::String.new(sprockets_context.javascript_path(path.value), :string)
+    end
+
+    def javascript_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.javascript_path(path.value) + ")")
+    end
+
+    def stylesheet_path(path)
+      Sass::Script::String.new(sprockets_context.stylesheet_path(path.value), :string)
+    end
+
+    def stylesheet_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.stylesheet_path(path.value) + ")")
+    end
+
+    protected
+      def sprockets_context
+        options[:sprockets][:context]
+      end
+
+      def sprockets_environment
+        options[:sprockets][:environment]
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_importer.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_importer.rb
new file mode 100644
index 0000000..de1a347
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_importer.rb
@@ -0,0 +1,29 @@
+require 'sass'
+
+module Sprockets
+  # This custom importer adds sprockets dependency tracking on to Sass
+  # `@import` statements. This makes the Sprockets and Sass caching
+  # systems work together.
+  class SassImporter < Sass::Importers::Filesystem
+    def initialize(context, root)
+      @context = context
+      super root.to_s
+    end
+
+    def find_relative(*args)
+      engine = super
+      if engine && (filename = engine.options[:filename])
+        @context.depend_on(filename)
+      end
+      engine
+    end
+
+    def find(*args)
+      engine = super
+      if engine && (filename = engine.options[:filename])
+        @context.depend_on(filename)
+      end
+      engine
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_template.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_template.rb
new file mode 100644
index 0000000..5f1ba1a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/sass_template.rb
@@ -0,0 +1,60 @@
+require 'tilt'
+
+module Sprockets
+  # This custom Tilt handler replaces the one built into Tilt. The
+  # main difference is that it uses a custom importer that plays nice
+  # with sprocket's caching system.
+  #
+  # See `SassImporter` for more infomation.
+  class SassTemplate < Tilt::Template
+    self.default_mime_type = 'text/css'
+
+    def self.engine_initialized?
+      defined?(::Sass::Engine) && defined?(::Sass::Script::Functions) &&
+        ::Sass::Script::Functions < Sprockets::SassFunctions
+    end
+
+    def initialize_engine
+      # Double check constant to avoid tilt warning
+      unless defined? ::Sass
+        require_template_library 'sass'
+      end
+
+      # Install custom functions. It'd be great if this didn't need to
+      # be installed globally, but could be passed into Engine as an
+      # option.
+      ::Sass::Script::Functions.send :include, Sprockets::SassFunctions
+    end
+
+    def prepare
+    end
+
+    def syntax
+      :sass
+    end
+
+    def evaluate(context, locals, &block)
+      # Use custom importer that knows about Sprockets Caching
+      cache_store = SassCacheStore.new(context.environment)
+
+      options = {
+        :filename => eval_file,
+        :line => line,
+        :syntax => syntax,
+        :cache_store => cache_store,
+        :importer => SassImporter.new(context, context.pathname),
+        :load_paths => context.environment.paths.map { |path| SassImporter.new(context, path) },
+        :sprockets => {
+          :context => context,
+          :environment => context.environment
+        }
+      }
+
+      ::Sass::Engine.new(data, options).render
+    rescue ::Sass::SyntaxError => e
+      # Annotates exception message with parse line number
+      context.__LINE__ = e.sass_backtrace.first[:line]
+      raise e
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/scss_template.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/scss_template.rb
new file mode 100644
index 0000000..511558c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/scss_template.rb
@@ -0,0 +1,13 @@
+require 'sprockets/sass_template'
+
+module Sprockets
+  # Scss handler to replace Tilt's builtin one. See `SassTemplate` and
+  # `SassImporter` for more infomation.
+  class ScssTemplate < SassTemplate
+    self.default_mime_type = 'text/css'
+
+    def syntax
+      :scss
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/server.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/server.rb
new file mode 100644
index 0000000..e9c2e59
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/server.rb
@@ -0,0 +1,247 @@
+require 'time'
+require 'uri'
+
+module Sprockets
+  # `Server` is a concern mixed into `Environment` and
+  # `Index` that provides a Rack compatible `call`
+  # interface and url generation helpers.
+  module Server
+    # `call` implements the Rack 1.x specification which accepts an
+    # `env` Hash and returns a three item tuple with the status code,
+    # headers, and body.
+    #
+    # Mapping your environment at a url prefix will serve all assets
+    # in the path.
+    #
+    #     map "/assets" do
+    #       run Sprockets::Environment.new
+    #     end
+    #
+    # A request for `"/assets/foo/bar.js"` will search your
+    # environment for `"foo/bar.js"`.
+    def call(env)
+      start_time = Time.now.to_f
+      time_elapsed = lambda { ((Time.now.to_f - start_time) * 1000).to_i }
+
+      msg = "Served asset #{env['PATH_INFO']} -"
+
+      # Mark session as "skipped" so no `Set-Cookie` header is set
+      env['rack.session.options'] ||= {}
+      env['rack.session.options'][:defer] = true
+      env['rack.session.options'][:skip] = true
+
+      # Extract the path from everything after the leading slash
+      path = unescape(env['PATH_INFO'].to_s.sub(/^\//, ''))
+
+      # URLs containing a `".."` are rejected for security reasons.
+      if forbidden_request?(path)
+        return forbidden_response
+      end
+
+      # Strip fingerprint
+      if fingerprint = path_fingerprint(path)
+        path = path.sub("-#{fingerprint}", '')
+      end
+
+      # Look up the asset.
+      asset = find_asset(path, :bundle => !body_only?(env))
+
+      # `find_asset` returns nil if the asset doesn't exist
+      if asset.nil?
+        logger.info "#{msg} 404 Not Found (#{time_elapsed.call}ms)"
+
+        # Return a 404 Not Found
+        not_found_response
+
+      # Check request headers `HTTP_IF_NONE_MATCH` against the asset digest
+      elsif etag_match?(asset, env)
+        logger.info "#{msg} 304 Not Modified (#{time_elapsed.call}ms)"
+
+        # Return a 304 Not Modified
+        not_modified_response(asset, env)
+
+      else
+        logger.info "#{msg} 200 OK (#{time_elapsed.call}ms)"
+
+        # Return a 200 with the asset contents
+        ok_response(asset, env)
+      end
+    rescue Exception => e
+      logger.error "Error compiling asset #{path}:"
+      logger.error "#{e.class.name}: #{e.message}"
+
+      case content_type_of(path)
+      when "application/javascript"
+        # Re-throw JavaScript asset exceptions to the browser
+        logger.info "#{msg} 500 Internal Server Error\n\n"
+        return javascript_exception_response(e)
+      when "text/css"
+        # Display CSS asset exceptions in the browser
+        logger.info "#{msg} 500 Internal Server Error\n\n"
+        return css_exception_response(e)
+      else
+        raise
+      end
+    end
+
+    private
+      def forbidden_request?(path)
+        # Prevent access to files elsewhere on the file system
+        #
+        #     http://example.org/assets/../../../etc/passwd
+        #
+        path.include?("..")
+      end
+
+      # Returns a 403 Forbidden response tuple
+      def forbidden_response
+        [ 403, { "Content-Type" => "text/plain", "Content-Length" => "9" }, [ "Forbidden" ] ]
+      end
+
+      # Returns a 404 Not Found response tuple
+      def not_found_response
+        [ 404, { "Content-Type" => "text/plain", "Content-Length" => "9", "X-Cascade" => "pass" }, [ "Not found" ] ]
+      end
+
+      # Returns a JavaScript response that re-throws a Ruby exception
+      # in the browser
+      def javascript_exception_response(exception)
+        err  = "#{exception.class.name}: #{exception.message}"
+        body = "throw Error(#{err.inspect})"
+        [ 200, { "Content-Type" => "application/javascript", "Content-Length" => Rack::Utils.bytesize(body).to_s }, [ body ] ]
+      end
+
+      # Returns a CSS response that hides all elements on the page and
+      # displays the exception
+      def css_exception_response(exception)
+        message   = "\n#{exception.class.name}: #{exception.message}"
+        backtrace = "\n  #{exception.backtrace.first}"
+
+        body = <<-CSS
+          html {
+            padding: 18px 36px;
+          }
+
+          head {
+            display: block;
+          }
+
+          body {
+            margin: 0;
+            padding: 0;
+          }
+
+          body > * {
+            display: none !important;
+          }
+
+          head:after, body:before, body:after {
+            display: block !important;
+          }
+
+          head:after {
+            font-family: sans-serif;
+            font-size: large;
+            font-weight: bold;
+            content: "Error compiling CSS asset";
+          }
+
+          body:before, body:after {
+            font-family: monospace;
+            white-space: pre-wrap;
+          }
+
+          body:before {
+            font-weight: bold;
+            content: "#{escape_css_content(message)}";
+          }
+
+          body:after {
+            content: "#{escape_css_content(backtrace)}";
+          }
+        CSS
+
+        [ 200, { "Content-Type" => "text/css;charset=utf-8", "Content-Length" => Rack::Utils.bytesize(body).to_s }, [ body ] ]
+      end
+
+      # Escape special characters for use inside a CSS content("...") string
+      def escape_css_content(content)
+        content.
+          gsub('\\', '\\\\005c ').
+          gsub("\n", '\\\\000a ').
+          gsub('"',  '\\\\0022 ').
+          gsub('/',  '\\\\002f ')
+      end
+
+      # Compare the requests `HTTP_IF_NONE_MATCH` against the assets digest
+      def etag_match?(asset, env)
+        env["HTTP_IF_NONE_MATCH"] == etag(asset)
+      end
+
+      # Test if `?body=1` or `body=true` query param is set
+      def body_only?(env)
+        env["QUERY_STRING"].to_s =~ /body=(1|t)/
+      end
+
+      # Returns a 304 Not Modified response tuple
+      def not_modified_response(asset, env)
+        [ 304, {}, [] ]
+      end
+
+      # Returns a 200 OK response tuple
+      def ok_response(asset, env)
+        [ 200, headers(env, asset, asset.length), asset ]
+      end
+
+      def headers(env, asset, length)
+        Hash.new.tap do |headers|
+          # Set content type and length headers
+          headers["Content-Type"]   = asset.content_type
+          headers["Content-Length"] = length.to_s
+
+          # Set caching headers
+          headers["Cache-Control"]  = "public"
+          headers["Last-Modified"]  = asset.mtime.httpdate
+          headers["ETag"]           = etag(asset)
+
+          # If the request url contains a fingerprint, set a long
+          # expires on the response
+          if path_fingerprint(env["PATH_INFO"])
+            headers["Cache-Control"] << ", max-age=31536000"
+
+          # Otherwise set `must-revalidate` since the asset could be modified.
+          else
+            headers["Cache-Control"] << ", must-revalidate"
+          end
+        end
+      end
+
+      # Gets digest fingerprint.
+      #
+      #     "foo-0aa2105d29558f3eb790d411d7d8fb66.js"
+      #     # => "0aa2105d29558f3eb790d411d7d8fb66"
+      #
+      def path_fingerprint(path)
+        path[/-([0-9a-f]{7,40})\.[^.]+$/, 1]
+      end
+
+      # URI.unescape is deprecated on 1.9. We need to use URI::Parser
+      # if its available.
+      if defined? URI::DEFAULT_PARSER
+        def unescape(str)
+          str = URI::DEFAULT_PARSER.unescape(str)
+          str.force_encoding(Encoding.default_internal) if Encoding.default_internal
+          str
+        end
+      else
+        def unescape(str)
+          URI.unescape(str)
+        end
+      end
+
+      # Helper to quote the assets digest for use as an ETag.
+      def etag(asset)
+        %("#{asset.digest}")
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/static_asset.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/static_asset.rb
new file mode 100644
index 0000000..70533bb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/static_asset.rb
@@ -0,0 +1,58 @@
+require 'sprockets/asset'
+require 'fileutils'
+require 'zlib'
+
+module Sprockets
+  # `StaticAsset`s are used for files that are served verbatim without
+  # any processing or concatenation. These are typical images and
+  # other binary files.
+  class StaticAsset < Asset
+    # Returns file contents as its `source`.
+    def source
+      # File is read everytime to avoid memory bloat of large binary files
+      pathname.open('rb') { |f| f.read }
+    end
+
+    # Implemented for Rack SendFile support.
+    def to_path
+      pathname.to_s
+    end
+
+    # Save asset to disk.
+    def write_to(filename, options = {})
+      # Gzip contents if filename has '.gz'
+      options[:compress] ||= File.extname(filename) == '.gz'
+
+      FileUtils.mkdir_p File.dirname(filename)
+
+      if options[:compress]
+        # Open file and run it through `Zlib`
+        pathname.open('rb') do |rd|
+          File.open("#{filename}+", 'wb') do |wr|
+            gz = Zlib::GzipWriter.new(wr, Zlib::BEST_COMPRESSION)
+            gz.mtime = mtime.to_i
+            buf = ""
+            while rd.read(16384, buf)
+              gz.write(buf)
+            end
+            gz.close
+          end
+        end
+      else
+        # If no compression needs to be done, we can just copy it into place.
+        FileUtils.cp(pathname, "#{filename}+")
+      end
+
+      # Atomic write
+      FileUtils.mv("#{filename}+", filename)
+
+      # Set mtime correctly
+      File.utime(mtime, mtime, filename)
+
+      nil
+    ensure
+      # Ensure tmp file gets cleaned up
+      FileUtils.rm("#{filename}+") if File.exist?("#{filename}+")
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/uglifier_compressor.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/uglifier_compressor.rb
new file mode 100644
index 0000000..4d1e56c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/uglifier_compressor.rb
@@ -0,0 +1,29 @@
+require 'tilt'
+
+module Sprockets
+  class UglifierCompressor < Tilt::Template
+    self.default_mime_type = 'application/javascript'
+
+    def self.engine_initialized?
+      defined?(::Uglifier)
+    end
+
+    def initialize_engine
+      require_template_library 'uglifier'
+    end
+
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      # Feature detect Uglifier 2.0 option support
+      if Uglifier::DEFAULTS[:copyright]
+        # Uglifier < 2.x
+        Uglifier.new(:copyright => false).compile(data)
+      else
+        # Uglifier >= 2.x
+        Uglifier.new(:comments => :none).compile(data)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/utils.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/utils.rb
new file mode 100644
index 0000000..409aaf5
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/utils.rb
@@ -0,0 +1,69 @@
+module Sprockets
+  # `Utils`, we didn't know where else to put it!
+  module Utils
+    # If theres encoding support (aka Ruby 1.9)
+    if "".respond_to?(:valid_encoding?)
+      # Define UTF-8 BOM pattern matcher.
+      # Avoid using a Regexp literal because it inheirts the files
+      # encoding and we want to avoid syntax errors in other interpreters.
+      UTF8_BOM_PATTERN = Regexp.new("\\A\uFEFF".encode('utf-8'))
+
+      def self.read_unicode(pathname, external_encoding = Encoding.default_external)
+        pathname.open("r:#{external_encoding}") do |f|
+          f.read.tap do |data|
+            # Eager validate the file's encoding. In most cases we
+            # expect it to be UTF-8 unless `default_external` is set to
+            # something else. An error is usually raised if the file is
+            # saved as UTF-16 when we expected UTF-8.
+            if !data.valid_encoding?
+              raise EncodingError, "#{pathname} has a invalid " +
+                "#{data.encoding} byte sequence"
+
+            # If the file is UTF-8 and theres a BOM, strip it for safe concatenation.
+            elsif data.encoding.name == "UTF-8" && data =~ UTF8_BOM_PATTERN
+              data.sub!(UTF8_BOM_PATTERN, "")
+            end
+          end
+        end
+      end
+
+    else
+      # Define UTF-8 and UTF-16 BOM pattern matchers.
+      # Avoid using a Regexp literal to prevent syntax errors in other interpreters.
+      UTF8_BOM_PATTERN  = Regexp.new("\\A\\xEF\\xBB\\xBF")
+      UTF16_BOM_PATTERN = Regexp.new("\\A(\\xFE\\xFF|\\xFF\\xFE)")
+
+      def self.read_unicode(pathname)
+        pathname.read.tap do |data|
+          # If the file is UTF-8 and theres a BOM, strip it for safe concatenation.
+          if data =~ UTF8_BOM_PATTERN
+            data.sub!(UTF8_BOM_PATTERN, "")
+
+          # If we find a UTF-16 BOM, theres nothing we can do on
+          # 1.8. Only UTF-8 is supported.
+          elsif data =~ UTF16_BOM_PATTERN
+            raise EncodingError, "#{pathname} has a UTF-16 BOM. " +
+              "Resave the file as UTF-8 or upgrade to Ruby 1.9."
+          end
+        end
+      end
+    end
+
+    # Prepends a leading "." to an extension if its missing.
+    #
+    #     normalize_extension("js")
+    #     # => ".js"
+    #
+    #     normalize_extension(".css")
+    #     # => ".css"
+    #
+    def self.normalize_extension(extension)
+      extension = extension.to_s
+      if extension[/^\./]
+        extension
+      else
+        ".#{extension}"
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/version.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/version.rb
new file mode 100644
index 0000000..fc2acb9
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/version.rb
@@ -0,0 +1,3 @@
+module Sprockets
+  VERSION = "2.10.0"
+end
diff --git a/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/yui_compressor.rb b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/yui_compressor.rb
new file mode 100644
index 0000000..c0d6656
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/sprockets-2.10.0/lib/sprockets/yui_compressor.rb
@@ -0,0 +1,27 @@
+require 'tilt'
+
+module Sprockets
+  class YUICompressor < Tilt::Template
+    def self.engine_initialized?
+      defined?(::YUI)
+    end
+
+    def initialize_engine
+      require_template_library 'yui/compressor'
+    end
+
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      case context.content_type
+      when 'application/javascript'
+        YUI::JavaScriptCompressor.new.compress(data)
+      when 'text/css'
+        YUI::CssCompressor.new.compress(data)
+      else
+        data
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/.document b/.bundle/ruby/1.9.1/gems/thor-0.18.1/.document
new file mode 100644
index 0000000..3ce5450
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/.document
@@ -0,0 +1,5 @@
+lib/*.rb
+lib/**/*.rb
+-
+CHANGELOG.rdoc
+LICENSE.md
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/CHANGELOG.md b/.bundle/ruby/1.9.1/gems/thor-0.18.1/CHANGELOG.md
new file mode 100644
index 0000000..38687db
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/CHANGELOG.md
@@ -0,0 +1,139 @@
+## 0.18.1, release 2013-03-30
+* Revert regressions found in 0.18.0
+
+## 0.18.0, release 2013-03-26
+* Remove rake2thor
+* Only display colors if output medium supports colors
+* Pass parent_options to subcommands
+* Fix non-dash-prefixed aliases
+* Make error messages more helpful
+* Rename "task" to "command"
+* Add the method to allow for custom package name
+
+## 0.17.0, release 2013-01-24
+* Add better support for tasks that accept arbitrary additional arguments (e.g. things like `bundle exec`)
+* Add #stop_on_unknown_option!
+* Only strip from stdin.gets if it wasn't ended with EOF
+* Allow "send" as a task name
+* Allow passing options as arguments after "--"
+* Autoload Thor::Group
+
+## 0.16.0, release 2012-08-14
+* Add enum to string arguments
+
+## 0.15.4, release 2012-06-29
+* Fix regression when destination root contains reserved regexp characters
+
+## 0.15.3, release 2012-06-18
+* Support strict_args_position! for backwards compatibility
+* Escape Dir glob characters in paths
+
+## 0.15.2, released 2012-05-07
+* Added print_in_columns
+* Exposed terminal_width as a public API
+
+## 0.15.1, release 2012-05-06
+* Fix Ruby 1.8 truncation bug with unicode chars
+* Fix shell delegate methods to pass their block
+* Don't output trailing spaces when printing the last column in a table
+
+## 0.15, released 2012-04-29
+* Alias method_options to options
+* Refactor say to allow multiple colors
+* Exposed error as a public API
+* Exposed file_collision as a public API
+* Exposed print_wrapped as a public API
+* Exposed set_color as a public API
+* Fix number-formatting bugs in print_table
+* Fix "indent" typo in print_table
+* Fix Errno::EPIPE when piping tasks to `head`
+* More friendly error messages
+
+## 0.14, released 2010-07-25
+* Added CreateLink class and #link_file method
+* Made Thor::Actions#run use system as default method for system calls
+* Allow use of private methods from superclass as tasks
+* Added mute(&block) method which allows to run block without any output
+* Removed config[:pretend]
+* Enabled underscores for command line switches
+* Added Thor::Base.basename which is used by both Thor.banner and Thor::Group.banner
+* Deprecated invoke() without arguments
+* Added :only and :except to check_unknown_options
+
+## 0.13, released 2010-02-03
+* Added :lazy_default which is only triggered if a switch is given
+* Added Thor::Shell::HTML
+* Added subcommands
+* Decoupled Thor::Group and Thor, so it's easier to vendor
+* Added check_unknown_options! in case you want error messages to be raised in valid switches
+* run(command) should return the results of command
+
+## 0.12, released 2010-01-02
+* Methods generated by attr_* are automatically not marked as tasks
+* inject_into_file does not add the same content twice, unless :force is set
+* Removed rr in favor to rspec mock framework
+* Improved output for thor -T
+* [#7] Do not force white color on status
+* [#8] Yield a block with the filename on directory
+
+## 0.11, released 2009-07-01
+* Added a rake compatibility layer. It allows you to use spec and rdoc tasks on
+  Thor classes.
+* BACKWARDS INCOMPATIBLE: aliases are not generated automatically anymore
+  since it may cause wrong behavior in the invocation system.
+* thor help now show information about any class/task. All those calls are
+  possible:
+
+      thor help describe
+      thor help describe:amazing
+  Or even with default namespaces:
+
+      thor help :spec
+* Thor::Runner now invokes the default task if none is supplied:
+
+      thor describe # invokes the default task, usually help
+* Thor::Runner now works with mappings:
+
+      thor describe -h
+* Added some documentation and code refactoring.
+
+## 0.9.8, released 2008-10-20
+* Fixed some tiny issues that were introduced lately.
+
+## 0.9.7, released 2008-10-13
+* Setting global method options on the initialize method works as expected:
+  All other tasks will accept these global options in addition to their own.
+* Added 'group' notion to Thor task sets (class Thor); by default all tasks
+  are in the 'standard' group. Running 'thor -T' will only show the standard
+  tasks - adding --all will show all tasks. You can also filter on a specific
+  group using the --group option: thor -T --group advanced
+
+## 0.9.6, released 2008-09-13
+* Generic improvements
+
+## 0.9.5, released 2008-08-27
+* Improve Windows compatibility
+* Update (incorrect) README and task.thor sample file
+* Options hash is now frozen (once returned)
+* Allow magic predicates on options object. For instance: `options.force?`
+* Add support for :numeric type
+* BACKWARDS INCOMPATIBLE: Refactor Thor::Options. You cannot access shorthand forms in options hash anymore (for instance, options[:f])
+* Allow specifying optional args with default values: method_options(:user => "mislav")
+* Don't write options for nil or false values. This allows, for example, turning color off when running specs.
+* Exit with the status of the spec command to help CI stuff out some.
+
+## 0.9.4, released 2008-08-13
+* Try to add Windows compatibility.
+* BACKWARDS INCOMPATIBLE: options hash is now accessed as a property in your class and is not passed as last argument anymore
+* Allow options at the beginning of the argument list as well as the end.
+* Make options available with symbol keys in addition to string keys.
+* Allow true to be passed to Thor#method_options to denote a boolean option.
+* If loading a thor file fails, don't give up, just print a warning and keep going.
+* Make sure that we re-raise errors if they happened further down the pipe than we care about.
+* Only delete the old file on updating when the installation of the new one is a success
+* Make it Ruby 1.8.5 compatible.
+* Don't raise an error if a boolean switch is defined multiple times.
+* Thor::Options now doesn't parse through things that look like options but aren't.
+* Add URI detection to install task, and make sure we don't append ".thor" to URIs
+* Add rake2thor to the gem binfiles.
+* Make sure local Thorfiles override system-wide ones.
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/LICENSE.md b/.bundle/ruby/1.9.1/gems/thor-0.18.1/LICENSE.md
new file mode 100644
index 0000000..ef80540
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/LICENSE.md
@@ -0,0 +1,20 @@
+Copyright (c) 2008 Yehuda Katz, Eric Hodel, et al.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/README.md b/.bundle/ruby/1.9.1/gems/thor-0.18.1/README.md
new file mode 100644
index 0000000..1ad690a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/README.md
@@ -0,0 +1,35 @@
+[![Gem Version](https://badge.fury.io/rb/thor.png)](https://rubygems.org/gems/thor)
+[![Build Status](https://secure.travis-ci.org/wycats/thor.png?branch=master)](http://travis-ci.org/wycats/thor)
+[![Dependency Status](https://gemnasium.com/wycats/thor.png?travis)](https://gemnasium.com/wycats/thor)
+[![Code Climate](https://codeclimate.com/github/wycats/thor.png)](https://codeclimate.com/github/wycats/thor)
+[![Coverage Status](https://coveralls.io/repos/wycats/thor/badge.png?branch=master)](https://coveralls.io/r/wycats/thor)
+
+Thor
+====
+
+Description
+-----------
+Thor is a simple and efficient tool for building self-documenting command line
+utilities.  It removes the pain of parsing command line options, writing
+"USAGE:" banners, and can also be used as an alternative to the [Rake][rake]
+build tool.  The syntax is Rake-like, so it should be familiar to most Rake
+users.
+
+[rake]: https://github.com/jimweirich/rake
+
+Installation
+------------
+    gem install thor
+
+Usage and documentation
+-----------------------
+Please see the [wiki][] for basic usage and other documentation on using Thor. You can also checkout the [official homepage][homepage].
+
+[wiki]: https://github.com/wycats/thor/wiki
+[homepage]: http://whatisthor.com/
+
+License
+-------
+Released under the MIT License.  See the [LICENSE][] file for further details.
+
+[license]: LICENSE.md
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/Thorfile b/.bundle/ruby/1.9.1/gems/thor-0.18.1/Thorfile
new file mode 100644
index 0000000..9f62810
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/Thorfile
@@ -0,0 +1,30 @@
+# encoding: utf-8
+$:.unshift File.expand_path("../lib", __FILE__)
+
+require 'bundler'
+require 'thor/rake_compat'
+
+class Default < Thor
+  include Thor::RakeCompat
+  Bundler::GemHelper.install_tasks
+
+  desc "build", "Build thor-#{Thor::VERSION}.gem into the pkg directory"
+  def build
+    Rake::Task["build"].execute
+  end
+
+  desc "install", "Build and install thor-#{Thor::VERSION}.gem into system gems"
+  def install
+    Rake::Task["install"].execute
+  end
+
+  desc "release", "Create tag v#{Thor::VERSION} and build and push thor-#{Thor::VERSION}.gem to Rubygems"
+  def release
+    Rake::Task["release"].execute
+  end
+
+  desc "spec", "Run RSpec code examples"
+  def spec
+    exec "rspec --color --format=documentation spec"
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/bin/thor b/.bundle/ruby/1.9.1/gems/thor-0.18.1/bin/thor
new file mode 100755
index 0000000..16323b1
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/bin/thor
@@ -0,0 +1,6 @@
+#!/usr/bin/env ruby
+# -*- mode: ruby -*-
+
+require 'thor/runner'
+$thor_runner = true
+Thor::Runner.start
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor.rb
new file mode 100644
index 0000000..d7a7461
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor.rb
@@ -0,0 +1,473 @@
+require 'set'
+require 'thor/base'
+
+class Thor
+  class << self
+    # Allows for custom "Command" package naming.
+    #
+    # === Parameters
+    # name<String>
+    # options<Hash>
+    #
+    def package_name(name, options={})
+      @package_name = name.nil? || name == '' ? nil : name
+    end
+
+    # Sets the default command when thor is executed without an explicit command to be called.
+    #
+    # ==== Parameters
+    # meth<Symbol>:: name of the default command
+    #
+    def default_command(meth=nil)
+      @default_command = case meth
+      when :none
+        'help'
+      when nil
+        @default_command || from_superclass(:default_command, 'help')
+      else
+        meth.to_s
+      end
+    end
+    alias default_task default_command
+
+    # Registers another Thor subclass as a command.
+    #
+    # ==== Parameters
+    # klass<Class>:: Thor subclass to register
+    # command<String>:: Subcommand name to use
+    # usage<String>:: Short usage for the subcommand
+    # description<String>:: Description for the subcommand
+    def register(klass, subcommand_name, usage, description, options={})
+      if klass <= Thor::Group
+        desc usage, description, options
+        define_method(subcommand_name) { |*args| invoke(klass, args) }
+      else
+        desc usage, description, options
+        subcommand subcommand_name, klass
+      end
+    end
+
+    # Defines the usage and the description of the next command.
+    #
+    # ==== Parameters
+    # usage<String>
+    # description<String>
+    # options<String>
+    #
+    def desc(usage, description, options={})
+      if options[:for]
+        command = find_and_refresh_command(options[:for])
+        command.usage = usage             if usage
+        command.description = description if description
+      else
+        @usage, @desc, @hide = usage, description, options[:hide] || false
+      end
+    end
+
+    # Defines the long description of the next command.
+    #
+    # ==== Parameters
+    # long description<String>
+    #
+    def long_desc(long_description, options={})
+      if options[:for]
+        command = find_and_refresh_command(options[:for])
+        command.long_description = long_description if long_description
+      else
+        @long_desc = long_description
+      end
+    end
+
+    # Maps an input to a command. If you define:
+    #
+    #   map "-T" => "list"
+    #
+    # Running:
+    #
+    #   thor -T
+    #
+    # Will invoke the list command.
+    #
+    # ==== Parameters
+    # Hash[String|Array => Symbol]:: Maps the string or the strings in the array to the given command.
+    #
+    def map(mappings=nil)
+      @map ||= from_superclass(:map, {})
+
+      if mappings
+        mappings.each do |key, value|
+          if key.respond_to?(:each)
+            key.each {|subkey| @map[subkey] = value}
+          else
+            @map[key] = value
+          end
+        end
+      end
+
+      @map
+    end
+
+    # Declares the options for the next command to be declared.
+    #
+    # ==== Parameters
+    # Hash[Symbol => Object]:: The hash key is the name of the option and the value
+    # is the type of the option. Can be :string, :array, :hash, :boolean, :numeric
+    # or :required (string). If you give a value, the type of the value is used.
+    #
+    def method_options(options=nil)
+      @method_options ||= {}
+      build_options(options, @method_options) if options
+      @method_options
+    end
+
+    alias options method_options
+
+    # Adds an option to the set of method options. If :for is given as option,
+    # it allows you to change the options from a previous defined command.
+    #
+    #   def previous_command
+    #     # magic
+    #   end
+    #
+    #   method_option :foo => :bar, :for => :previous_command
+    #
+    #   def next_command
+    #     # magic
+    #   end
+    #
+    # ==== Parameters
+    # name<Symbol>:: The name of the argument.
+    # options<Hash>:: Described below.
+    #
+    # ==== Options
+    # :desc     - Description for the argument.
+    # :required - If the argument is required or not.
+    # :default  - Default value for this argument. It cannot be required and have default values.
+    # :aliases  - Aliases for this option.
+    # :type     - The type of the argument, can be :string, :hash, :array, :numeric or :boolean.
+    # :banner   - String to show on usage notes.
+    # :hide     - If you want to hide this option from the help.
+    #
+    def method_option(name, options={})
+      scope = if options[:for]
+        find_and_refresh_command(options[:for]).options
+      else
+        method_options
+      end
+
+      build_option(name, options, scope)
+    end
+    alias option method_option
+
+    # Prints help information for the given command.
+    #
+    # ==== Parameters
+    # shell<Thor::Shell>
+    # command_name<String>
+    #
+    def command_help(shell, command_name)
+      meth = normalize_command_name(command_name)
+      command = all_commands[meth]
+      handle_no_command_error(meth) unless command
+
+      shell.say "Usage:"
+      shell.say "  #{banner(command)}"
+      shell.say
+      class_options_help(shell, nil => command.options.map { |_, o| o })
+      if command.long_description
+        shell.say "Description:"
+        shell.print_wrapped(command.long_description, :indent => 2)
+      else
+        shell.say command.description
+      end
+    end
+    alias task_help command_help
+
+    # Prints help information for this class.
+    #
+    # ==== Parameters
+    # shell<Thor::Shell>
+    #
+    def help(shell, subcommand = false)
+      list = printable_commands(true, subcommand)
+      Thor::Util.thor_classes_in(self).each do |klass|
+        list += klass.printable_commands(false)
+      end
+      list.sort!{ |a,b| a[0] <=> b[0] }
+
+      if @package_name
+        shell.say "#{@package_name} commands:"
+      else
+        shell.say "Commands:"
+      end
+
+      shell.print_table(list, :indent => 2, :truncate => true)
+      shell.say
+      class_options_help(shell)
+    end
+
+    # Returns commands ready to be printed.
+    def printable_commands(all = true, subcommand = false)
+      (all ? all_commands : commands).map do |_, command|
+        next if command.hidden?
+        item = []
+        item << banner(command, false, subcommand)
+        item << (command.description ? "# #{command.description.gsub(/\s+/m,' ')}" : "")
+        item
+      end.compact
+    end
+    alias printable_tasks printable_commands
+
+    def subcommands
+      @subcommands ||= from_superclass(:subcommands, [])
+    end
+    alias subtasks subcommands
+
+    def subcommand(subcommand, subcommand_class)
+      self.subcommands << subcommand.to_s
+      subcommand_class.subcommand_help subcommand
+
+      define_method(subcommand) do |*args|
+        args, opts = Thor::Arguments.split(args)
+        invoke subcommand_class, args, opts, :invoked_via_subcommand => true, :class_options => options
+      end
+    end
+    alias subtask subcommand
+
+    # Extend check unknown options to accept a hash of conditions.
+    #
+    # === Parameters
+    # options<Hash>: A hash containing :only and/or :except keys
+    def check_unknown_options!(options={})
+      @check_unknown_options ||= Hash.new
+      options.each do |key, value|
+        if value
+          @check_unknown_options[key] = Array(value)
+        else
+          @check_unknown_options.delete(key)
+        end
+      end
+      @check_unknown_options
+    end
+
+    # Overwrite check_unknown_options? to take subcommands and options into account.
+    def check_unknown_options?(config) #:nodoc:
+      options = check_unknown_options
+      return false unless options
+
+      command = config[:current_command]
+      return true unless command
+
+      name = command.name
+
+      if subcommands.include?(name)
+        false
+      elsif options[:except]
+        !options[:except].include?(name.to_sym)
+      elsif options[:only]
+        options[:only].include?(name.to_sym)
+      else
+        true
+      end
+    end
+
+    # Stop parsing of options as soon as an unknown option or a regular
+    # argument is encountered.  All remaining arguments are passed to the command.
+    # This is useful if you have a command that can receive arbitrary additional
+    # options, and where those additional options should not be handled by
+    # Thor.
+    #
+    # ==== Example
+    #
+    # To better understand how this is useful, let's consider a command that calls
+    # an external command.  A user may want to pass arbitrary options and
+    # arguments to that command.  The command itself also accepts some options,
+    # which should be handled by Thor.
+    #
+    #   class_option "verbose",  :type => :boolean
+    #   stop_on_unknown_option! :exec
+    #   check_unknown_options!  :except => :exec
+    #
+    #   desc "exec", "Run a shell command"
+    #   def exec(*args)
+    #     puts "diagnostic output" if options[:verbose]
+    #     Kernel.exec(*args)
+    #   end
+    #
+    # Here +exec+ can be called with +--verbose+ to get diagnostic output,
+    # e.g.:
+    #
+    #   $ thor exec --verbose echo foo
+    #   diagnostic output
+    #   foo
+    #
+    # But if +--verbose+ is given after +echo+, it is passed to +echo+ instead:
+    #
+    #   $ thor exec echo --verbose foo
+    #   --verbose foo
+    #
+    # ==== Parameters
+    # Symbol ...:: A list of commands that should be affected.
+    def stop_on_unknown_option!(*command_names)
+      @stop_on_unknown_option ||= Set.new
+      @stop_on_unknown_option.merge(command_names)
+    end
+
+    def stop_on_unknown_option?(command) #:nodoc:
+      !!@stop_on_unknown_option && @stop_on_unknown_option.include?(command.name.to_sym)
+    end
+
+  protected
+
+    # The method responsible for dispatching given the args.
+    def dispatch(meth, given_args, given_opts, config) #:nodoc:
+      # There is an edge case when dispatching from a subcommand.
+      # A problem occurs invoking the default command. This case occurs
+      # when arguments are passed and a default command is defined, and
+      # the first given_args does not match the default command.
+      # Thor use "help" by default so we skip that case.
+      # Note the call to retrieve_command_name. It's called with
+      # given_args.dup since that method calls args.shift. Then lookup
+      # the command normally. If the first item in given_args is not
+      # a command then use the default command. The given_args will be
+      # intact later since dup was used.
+      if config[:invoked_via_subcommand] && given_args.size >= 1 && default_command != "help" && given_args.first != default_command
+        meth ||= retrieve_command_name(given_args.dup)
+        command = all_commands[normalize_command_name(meth)]
+        command ||= all_commands[normalize_command_name(default_command)]
+      else
+        meth ||= retrieve_command_name(given_args)
+        command = all_commands[normalize_command_name(meth)]
+      end
+
+      if command
+        args, opts = Thor::Options.split(given_args)
+        if stop_on_unknown_option?(command) && !args.empty?
+          # given_args starts with a non-option, so we treat everything as
+          # ordinary arguments
+          args.concat opts
+          opts.clear
+        end
+      else
+        args, opts = given_args, nil
+        command = Thor::DynamicCommand.new(meth)
+      end
+
+      opts = given_opts || opts || []
+      config.merge!(:current_command => command, :command_options => command.options)
+
+      instance = new(args, opts, config)
+      yield instance if block_given?
+      args = instance.args
+      trailing = args[Range.new(arguments.size, -1)]
+      instance.invoke_command(command, trailing || [])
+    end
+
+    # The banner for this class. You can customize it if you are invoking the
+    # thor class by another ways which is not the Thor::Runner. It receives
+    # the command that is going to be invoked and a boolean which indicates if
+    # the namespace should be displayed as arguments.
+    #
+    def banner(command, namespace = nil, subcommand = false)
+      "#{basename} #{command.formatted_usage(self, $thor_runner, subcommand)}"
+    end
+
+    def baseclass #:nodoc:
+      Thor
+    end
+
+    def create_command(meth) #:nodoc:
+      if @usage && @desc
+        base_class = @hide ? Thor::HiddenCommand : Thor::Command
+        commands[meth] = base_class.new(meth, @desc, @long_desc, @usage, method_options)
+        @usage, @desc, @long_desc, @method_options, @hide = nil
+        true
+      elsif self.all_commands[meth] || meth == "method_missing"
+        true
+      else
+        puts "[WARNING] Attempted to create command #{meth.inspect} without usage or description. " <<
+             "Call desc if you want this method to be available as command or declare it inside a " <<
+             "no_commands{} block. Invoked from #{caller[1].inspect}."
+        false
+      end
+    end
+    alias create_task create_command
+
+    def initialize_added #:nodoc:
+      class_options.merge!(method_options)
+      @method_options = nil
+    end
+
+    # Retrieve the command name from given args.
+    def retrieve_command_name(args) #:nodoc:
+      meth = args.first.to_s unless args.empty?
+      if meth && (map[meth] || meth !~ /^\-/)
+        args.shift
+      else
+        nil
+      end
+    end
+    alias retrieve_task_name retrieve_command_name
+
+    # receives a (possibly nil) command name and returns a name that is in
+    # the commands hash. In addition to normalizing aliases, this logic
+    # will determine if a shortened command is an unambiguous substring of
+    # a command or alias.
+    #
+    # +normalize_command_name+ also converts names like +animal-prison+
+    # into +animal_prison+.
+    def normalize_command_name(meth) #:nodoc:
+      return default_command.to_s.gsub('-', '_') unless meth
+
+      possibilities = find_command_possibilities(meth)
+      if possibilities.size > 1
+        raise ArgumentError, "Ambiguous command #{meth} matches [#{possibilities.join(', ')}]"
+      elsif possibilities.size < 1
+        meth = meth || default_command
+      elsif map[meth]
+        meth = map[meth]
+      else
+        meth = possibilities.first
+      end
+
+      meth.to_s.gsub('-','_') # treat foo-bar as foo_bar
+    end
+    alias normalize_task_name normalize_command_name
+
+    # this is the logic that takes the command name passed in by the user
+    # and determines whether it is an unambiguous substrings of a command or
+    # alias name.
+    def find_command_possibilities(meth)
+      len = meth.to_s.length
+      possibilities = all_commands.merge(map).keys.select { |n| meth == n[0, len] }.sort
+      unique_possibilities = possibilities.map { |k| map[k] || k }.uniq
+
+      if possibilities.include?(meth)
+        [meth]
+      elsif unique_possibilities.size == 1
+        unique_possibilities
+      else
+        possibilities
+      end
+    end
+    alias find_task_possibilities find_command_possibilities
+
+    def subcommand_help(cmd)
+      desc "help [COMMAND]", "Describe subcommands or one specific subcommand"
+      class_eval <<-RUBY
+        def help(command = nil, subcommand = true); super; end
+      RUBY
+    end
+    alias subtask_help subcommand_help
+
+  end
+
+  include Thor::Base
+
+  map HELP_MAPPINGS => :help
+
+  desc "help [COMMAND]", "Describe available commands or one specific command"
+  def help(command = nil, subcommand = false)
+    command ? self.class.command_help(shell, command) : self.class.help(shell, subcommand)
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions.rb
new file mode 100644
index 0000000..d55b77b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions.rb
@@ -0,0 +1,318 @@
+require 'fileutils'
+require 'uri'
+require 'thor/core_ext/io_binary_read'
+require 'thor/actions/create_file'
+require 'thor/actions/create_link'
+require 'thor/actions/directory'
+require 'thor/actions/empty_directory'
+require 'thor/actions/file_manipulation'
+require 'thor/actions/inject_into_file'
+
+class Thor
+  module Actions
+    attr_accessor :behavior
+
+    def self.included(base) #:nodoc:
+      base.extend ClassMethods
+    end
+
+    module ClassMethods
+      # Hold source paths for one Thor instance. source_paths_for_search is the
+      # method responsible to gather source_paths from this current class,
+      # inherited paths and the source root.
+      #
+      def source_paths
+        @_source_paths ||= []
+      end
+
+      # Stores and return the source root for this class
+      def source_root(path=nil)
+        @_source_root = path if path
+        @_source_root
+      end
+
+      # Returns the source paths in the following order:
+      #
+      #   1) This class source paths
+      #   2) Source root
+      #   3) Parents source paths
+      #
+      def source_paths_for_search
+        paths = []
+        paths += self.source_paths
+        paths << self.source_root if self.source_root
+        paths += from_superclass(:source_paths, [])
+        paths
+      end
+
+      # Add runtime options that help actions execution.
+      #
+      def add_runtime_options!
+        class_option :force, :type => :boolean, :aliases => "-f", :group => :runtime,
+                             :desc => "Overwrite files that already exist"
+
+        class_option :pretend, :type => :boolean, :aliases => "-p", :group => :runtime,
+                               :desc => "Run but do not make any changes"
+
+        class_option :quiet, :type => :boolean, :aliases => "-q", :group => :runtime,
+                             :desc => "Suppress status output"
+
+        class_option :skip, :type => :boolean, :aliases => "-s", :group => :runtime,
+                            :desc => "Skip files that already exist"
+      end
+    end
+
+    # Extends initializer to add more configuration options.
+    #
+    # ==== Configuration
+    # behavior<Symbol>:: The actions default behavior. Can be :invoke or :revoke.
+    #                    It also accepts :force, :skip and :pretend to set the behavior
+    #                    and the respective option.
+    #
+    # destination_root<String>:: The root directory needed for some actions.
+    #
+    def initialize(args=[], options={}, config={})
+      self.behavior = case config[:behavior].to_s
+      when "force", "skip"
+        _cleanup_options_and_set(options, config[:behavior])
+        :invoke
+      when "revoke"
+        :revoke
+      else
+        :invoke
+      end
+
+      super
+      self.destination_root = config[:destination_root]
+    end
+
+    # Wraps an action object and call it accordingly to the thor class behavior.
+    #
+    def action(instance) #:nodoc:
+      if behavior == :revoke
+        instance.revoke!
+      else
+        instance.invoke!
+      end
+    end
+
+    # Returns the root for this thor class (also aliased as destination root).
+    #
+    def destination_root
+      @destination_stack.last
+    end
+
+    # Sets the root for this thor class. Relatives path are added to the
+    # directory where the script was invoked and expanded.
+    #
+    def destination_root=(root)
+      @destination_stack ||= []
+      @destination_stack[0] = File.expand_path(root || '')
+    end
+
+    # Returns the given path relative to the absolute root (ie, root where
+    # the script started).
+    #
+    def relative_to_original_destination_root(path, remove_dot=true)
+      path = path.dup
+      if path.gsub!(@destination_stack[0], '.')
+        remove_dot ? (path[2..-1] || '') : path
+      else
+        path
+      end
+    end
+
+    # Holds source paths in instance so they can be manipulated.
+    #
+    def source_paths
+      @source_paths ||= self.class.source_paths_for_search
+    end
+
+    # Receives a file or directory and search for it in the source paths.
+    #
+    def find_in_source_paths(file)
+      relative_root = relative_to_original_destination_root(destination_root, false)
+
+      source_paths.each do |source|
+        source_file = File.expand_path(file, File.join(source, relative_root))
+        return source_file if File.exists?(source_file)
+      end
+
+      message = "Could not find #{file.inspect} in any of your source paths. "
+
+      unless self.class.source_root
+        message << "Please invoke #{self.class.name}.source_root(PATH) with the PATH containing your templates. "
+      end
+
+      if source_paths.empty?
+        message << "Currently you have no source paths."
+      else
+        message << "Your current source paths are: \n#{source_paths.join("\n")}"
+      end
+
+      raise Error, message
+    end
+
+    # Do something in the root or on a provided subfolder. If a relative path
+    # is given it's referenced from the current root. The full path is yielded
+    # to the block you provide. The path is set back to the previous path when
+    # the method exits.
+    #
+    # ==== Parameters
+    # dir<String>:: the directory to move to.
+    # config<Hash>:: give :verbose => true to log and use padding.
+    #
+    def inside(dir='', config={}, &block)
+      verbose = config.fetch(:verbose, false)
+      pretend = options[:pretend]
+
+      say_status :inside, dir, verbose
+      shell.padding += 1 if verbose
+      @destination_stack.push File.expand_path(dir, destination_root)
+
+      # If the directory doesnt exist and we're not pretending
+      if !File.exist?(destination_root) && !pretend
+        FileUtils.mkdir_p(destination_root)
+      end
+
+      if pretend
+        # In pretend mode, just yield down to the block
+        block.arity == 1 ? yield(destination_root) : yield
+      else
+        FileUtils.cd(destination_root) { block.arity == 1 ? yield(destination_root) : yield }
+      end
+
+      @destination_stack.pop
+      shell.padding -= 1 if verbose
+    end
+
+    # Goes to the root and execute the given block.
+    #
+    def in_root
+      inside(@destination_stack.first) { yield }
+    end
+
+    # Loads an external file and execute it in the instance binding.
+    #
+    # ==== Parameters
+    # path<String>:: The path to the file to execute. Can be a web address or
+    #                a relative path from the source root.
+    #
+    # ==== Examples
+    #
+    #   apply "http://gist.github.com/103208"
+    #
+    #   apply "recipes/jquery.rb"
+    #
+    def apply(path, config={})
+      verbose = config.fetch(:verbose, true)
+      is_uri  = path =~ /^https?\:\/\//
+      path    = find_in_source_paths(path) unless is_uri
+
+      say_status :apply, path, verbose
+      shell.padding += 1 if verbose
+
+      if is_uri
+        contents = open(path, "Accept" => "application/x-thor-template") {|io| io.read }
+      else
+        contents = open(path) {|io| io.read }
+      end
+
+      instance_eval(contents, path)
+      shell.padding -= 1 if verbose
+    end
+
+    # Executes a command returning the contents of the command.
+    #
+    # ==== Parameters
+    # command<String>:: the command to be executed.
+    # config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output. Specify :with
+    #                to append an executable to command executation.
+    #
+    # ==== Example
+    #
+    #   inside('vendor') do
+    #     run('ln -s ~/edge rails')
+    #   end
+    #
+    def run(command, config={})
+      return unless behavior == :invoke
+
+      destination = relative_to_original_destination_root(destination_root, false)
+      desc = "#{command} from #{destination.inspect}"
+
+      if config[:with]
+        desc = "#{File.basename(config[:with].to_s)} #{desc}"
+        command = "#{config[:with]} #{command}"
+      end
+
+      say_status :run, desc, config.fetch(:verbose, true)
+
+      unless options[:pretend]
+        config[:capture] ? `#{command}` : system("#{command}")
+      end
+    end
+
+    # Executes a ruby script (taking into account WIN32 platform quirks).
+    #
+    # ==== Parameters
+    # command<String>:: the command to be executed.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    def run_ruby_script(command, config={})
+      return unless behavior == :invoke
+      run command, config.merge(:with => Thor::Util.ruby_command)
+    end
+
+    # Run a thor command. A hash of options can be given and it's converted to
+    # switches.
+    #
+    # ==== Parameters
+    # command<String>:: the command to be invoked
+    # args<Array>:: arguments to the command
+    # config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output.
+    #                Other options are given as parameter to Thor.
+    #
+    #
+    # ==== Examples
+    #
+    #   thor :install, "http://gist.github.com/103208"
+    #   #=> thor install http://gist.github.com/103208
+    #
+    #   thor :list, :all => true, :substring => 'rails'
+    #   #=> thor list --all --substring=rails
+    #
+    def thor(command, *args)
+      config  = args.last.is_a?(Hash) ? args.pop : {}
+      verbose = config.key?(:verbose) ? config.delete(:verbose) : true
+      pretend = config.key?(:pretend) ? config.delete(:pretend) : false
+      capture = config.key?(:capture) ? config.delete(:capture) : false
+
+      args.unshift(command)
+      args.push Thor::Options.to_switches(config)
+      command = args.join(' ').strip
+
+      run command, :with => :thor, :verbose => verbose, :pretend => pretend, :capture => capture
+    end
+
+    protected
+
+      # Allow current root to be shared between invocations.
+      #
+      def _shared_configuration #:nodoc:
+        super.merge!(:destination_root => self.destination_root)
+      end
+
+      def _cleanup_options_and_set(options, key) #:nodoc:
+        case options
+        when Array
+          %w(--force -f --skip -s).each { |i| options.delete(i) }
+          options << "--#{key}"
+        when Hash
+          [:force, :skip, "force", "skip"].each { |i| options.delete(i) }
+          options.merge!(key => true)
+        end
+      end
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/create_file.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/create_file.rb
new file mode 100644
index 0000000..ed5973a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/create_file.rb
@@ -0,0 +1,105 @@
+require 'thor/actions/empty_directory'
+
+class Thor
+  module Actions
+
+    # Create a new file relative to the destination root with the given data,
+    # which is the return value of a block or a data string.
+    #
+    # ==== Parameters
+    # destination<String>:: the relative path to the destination root.
+    # data<String|NilClass>:: the data to append to the file.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   create_file "lib/fun_party.rb" do
+    #     hostname = ask("What is the virtual hostname I should use?")
+    #     "vhost.name = #{hostname}"
+    #   end
+    #
+    #   create_file "config/apache.conf", "your apache config"
+    #
+    def create_file(destination, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      data = args.first
+      action CreateFile.new(self, destination, block || data.to_s, config)
+    end
+    alias :add_file :create_file
+
+    # CreateFile is a subset of Template, which instead of rendering a file with
+    # ERB, it gets the content from the user.
+    #
+    class CreateFile < EmptyDirectory #:nodoc:
+      attr_reader :data
+
+      def initialize(base, destination, data, config={})
+        @data = data
+        super(base, destination, config)
+      end
+
+      # Checks if the content of the file at the destination is identical to the rendered result.
+      #
+      # ==== Returns
+      # Boolean:: true if it is identical, false otherwise.
+      #
+      def identical?
+        exists? && File.binread(destination) == render
+      end
+
+      # Holds the content to be added to the file.
+      #
+      def render
+        @render ||= if data.is_a?(Proc)
+          data.call
+        else
+          data
+        end
+      end
+
+      def invoke!
+        invoke_with_conflict_check do
+          FileUtils.mkdir_p(File.dirname(destination))
+          File.open(destination, 'wb') { |f| f.write render }
+        end
+        given_destination
+      end
+
+      protected
+
+        # Now on conflict we check if the file is identical or not.
+        #
+        def on_conflict_behavior(&block)
+          if identical?
+            say_status :identical, :blue
+          else
+            options = base.options.merge(config)
+            force_or_skip_or_conflict(options[:force], options[:skip], &block)
+          end
+        end
+
+        # If force is true, run the action, otherwise check if it's not being
+        # skipped. If both are false, show the file_collision menu, if the menu
+        # returns true, force it, otherwise skip.
+        #
+        def force_or_skip_or_conflict(force, skip, &block)
+          if force
+            say_status :force, :yellow
+            block.call unless pretend?
+          elsif skip
+            say_status :skip, :yellow
+          else
+            say_status :conflict, :red
+            force_or_skip_or_conflict(force_on_collision?, true, &block)
+          end
+        end
+
+        # Shows the file collision menu to the user and gets the result.
+        #
+        def force_on_collision?
+          base.shell.file_collision(destination){ render }
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/create_link.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/create_link.rb
new file mode 100644
index 0000000..fba3915
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/create_link.rb
@@ -0,0 +1,60 @@
+require 'thor/actions/create_file'
+
+class Thor
+  module Actions
+
+    # Create a new file relative to the destination root from the given source.
+    #
+    # ==== Parameters
+    # destination<String>:: the relative path to the destination root.
+    # source<String|NilClass>:: the relative path to the source root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #   :: give :symbolic => false for hard link.
+    #
+    # ==== Examples
+    #
+    #   create_link "config/apache.conf", "/etc/apache.conf"
+    #
+    def create_link(destination, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      source = args.first
+      action CreateLink.new(self, destination, source, config)
+    end
+    alias :add_link :create_link
+
+    # CreateLink is a subset of CreateFile, which instead of taking a block of
+    # data, just takes a source string from the user.
+    #
+    class CreateLink < CreateFile #:nodoc:
+      attr_reader :data
+
+      # Checks if the content of the file at the destination is identical to the rendered result.
+      #
+      # ==== Returns
+      # Boolean:: true if it is identical, false otherwise.
+      #
+      def identical?
+        exists? && File.identical?(render, destination)
+      end
+
+      def invoke!
+        invoke_with_conflict_check do
+          FileUtils.mkdir_p(File.dirname(destination))
+          # Create a symlink by default
+          config[:symbolic] = true if config[:symbolic].nil?
+          File.unlink(destination) if exists?
+          if config[:symbolic]
+            File.symlink(render, destination)
+          else
+            File.link(render, destination)
+          end
+        end
+        given_destination
+      end
+
+      def exists?
+        super || File.symlink?(destination)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/directory.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/directory.rb
new file mode 100644
index 0000000..7f8fd97
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/directory.rb
@@ -0,0 +1,119 @@
+require 'thor/actions/empty_directory'
+
+class Thor
+  module Actions
+    # Copies recursively the files from source directory to root directory.
+    # If any of the files finishes with .tt, it's considered to be a template
+    # and is placed in the destination without the extension .tt. If any
+    # empty directory is found, it's copied and all .empty_directory files are
+    # ignored. If any file name is wrapped within % signs, the text within
+    # the % signs will be executed as a method and replaced with the returned
+    # value. Let's suppose a doc directory with the following files:
+    #
+    #   doc/
+    #     components/.empty_directory
+    #     README
+    #     rdoc.rb.tt
+    #     %app_name%.rb
+    #
+    # When invoked as:
+    #
+    #   directory "doc"
+    #
+    # It will create a doc directory in the destination with the following
+    # files (assuming that the `app_name` method returns the value "blog"):
+    #
+    #   doc/
+    #     components/
+    #     README
+    #     rdoc.rb
+    #     blog.rb
+    #
+    # <b>Encoded path note:</b> Since Thor internals use Object#respond_to? to check if it can
+    # expand %something%, this `something` should be a public method in the class calling
+    # #directory. If a method is private, Thor stack raises PrivateMethodEncodedError.
+    #
+    # ==== Parameters
+    # source<String>:: the relative path to the source root.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #                If :recursive => false, does not look for paths recursively.
+    #                If :mode => :preserve, preserve the file mode from the source.
+    #                If :exclude_pattern => /regexp/, prevents copying files that match that regexp.
+    #
+    # ==== Examples
+    #
+    #   directory "doc"
+    #   directory "doc", "docs", :recursive => false
+    #
+    def directory(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first || source
+      action Directory.new(self, source, destination || source, config, &block)
+    end
+
+    class Directory < EmptyDirectory #:nodoc:
+      attr_reader :source
+
+      def initialize(base, source, destination=nil, config={}, &block)
+        @source = File.expand_path(base.find_in_source_paths(source.to_s))
+        @block  = block
+        super(base, destination, { :recursive => true }.merge(config))
+      end
+
+      def invoke!
+        base.empty_directory given_destination, config
+        execute!
+      end
+
+      def revoke!
+        execute!
+      end
+
+      protected
+
+        def execute!
+          lookup = Util.escape_globs(source)
+          lookup = config[:recursive] ? File.join(lookup, '**') : lookup
+          lookup = file_level_lookup(lookup)
+
+          files(lookup).sort.each do |file_source|
+            next if File.directory?(file_source)
+            next if config[:exclude_pattern] && file_source.match(config[:exclude_pattern])
+            file_destination = File.join(given_destination, file_source.gsub(source, '.'))
+            file_destination.gsub!('/./', '/')
+
+            case file_source
+            when /\.empty_directory$/
+              dirname = File.dirname(file_destination).gsub(/\/\.$/, '')
+              next if dirname == given_destination
+              base.empty_directory(dirname, config)
+            when /\.tt$/
+              destination = base.template(file_source, file_destination[0..-4], config, &@block)
+            else
+              destination = base.copy_file(file_source, file_destination, config, &@block)
+            end
+          end
+        end
+
+        if RUBY_VERSION < '2.0'
+          def file_level_lookup(previous_lookup)
+            File.join(previous_lookup, '{*,.[a-z]*}')
+          end
+
+          def files(lookup)
+            Dir[lookup]
+          end
+        else
+          def file_level_lookup(previous_lookup)
+            File.join(previous_lookup, '*')
+          end
+
+          def files(lookup)
+            Dir.glob(lookup, File::FNM_DOTMATCH)
+          end
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/empty_directory.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/empty_directory.rb
new file mode 100644
index 0000000..d9970ab
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/empty_directory.rb
@@ -0,0 +1,137 @@
+class Thor
+  module Actions
+
+    # Creates an empty directory.
+    #
+    # ==== Parameters
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   empty_directory "doc"
+    #
+    def empty_directory(destination, config={})
+      action EmptyDirectory.new(self, destination, config)
+    end
+
+    # Class which holds create directory logic. This is the base class for
+    # other actions like create_file and directory.
+    #
+    # This implementation is based in Templater actions, created by Jonas Nicklas
+    # and Michael S. Klishin under MIT LICENSE.
+    #
+    class EmptyDirectory #:nodoc:
+      attr_reader :base, :destination, :given_destination, :relative_destination, :config
+
+      # Initializes given the source and destination.
+      #
+      # ==== Parameters
+      # base<Thor::Base>:: A Thor::Base instance
+      # source<String>:: Relative path to the source of this file
+      # destination<String>:: Relative path to the destination of this file
+      # config<Hash>:: give :verbose => false to not log the status.
+      #
+      def initialize(base, destination, config={})
+        @base, @config   = base, { :verbose => true }.merge(config)
+        self.destination = destination
+      end
+
+      # Checks if the destination file already exists.
+      #
+      # ==== Returns
+      # Boolean:: true if the file exists, false otherwise.
+      #
+      def exists?
+        ::File.exists?(destination)
+      end
+
+      def invoke!
+        invoke_with_conflict_check do
+          ::FileUtils.mkdir_p(destination)
+        end
+      end
+
+      def revoke!
+        say_status :remove, :red
+        ::FileUtils.rm_rf(destination) if !pretend? && exists?
+        given_destination
+      end
+
+      protected
+
+        # Shortcut for pretend.
+        #
+        def pretend?
+          base.options[:pretend]
+        end
+
+        # Sets the absolute destination value from a relative destination value.
+        # It also stores the given and relative destination. Let's suppose our
+        # script is being executed on "dest", it sets the destination root to
+        # "dest". The destination, given_destination and relative_destination
+        # are related in the following way:
+        #
+        #   inside "bar" do
+        #     empty_directory "baz"
+        #   end
+        #
+        #   destination          #=> dest/bar/baz
+        #   relative_destination #=> bar/baz
+        #   given_destination    #=> baz
+        #
+        def destination=(destination)
+          if destination
+            @given_destination = convert_encoded_instructions(destination.to_s)
+            @destination = ::File.expand_path(@given_destination, base.destination_root)
+            @relative_destination = base.relative_to_original_destination_root(@destination)
+          end
+        end
+
+        # Filenames in the encoded form are converted. If you have a file:
+        #
+        #   %file_name%.rb
+        #
+        # It calls #file_name from the base and replaces %-string with the
+        # return value (should be String) of #file_name:
+        #
+        #   user.rb
+        #
+        # The method referenced can be either public or private.
+        #
+        def convert_encoded_instructions(filename)
+          filename.gsub(/%(.*?)%/) do |initial_string|
+            method = $1.strip
+            base.respond_to?(method, true) ? base.send(method) : initial_string
+          end
+        end
+
+        # Receives a hash of options and just execute the block if some
+        # conditions are met.
+        #
+        def invoke_with_conflict_check(&block)
+          if exists?
+            on_conflict_behavior(&block)
+          else
+            say_status :create, :green
+            block.call unless pretend?
+          end
+
+          destination
+        end
+
+        # What to do when the destination file already exists.
+        #
+        def on_conflict_behavior(&block)
+          say_status :exist, :blue
+        end
+
+        # Shortcut to say_status shell method.
+        #
+        def say_status(status, color)
+          base.shell.say_status status, relative_destination, color if config[:verbose]
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/file_manipulation.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/file_manipulation.rb
new file mode 100644
index 0000000..a652244
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/file_manipulation.rb
@@ -0,0 +1,314 @@
+require 'erb'
+require 'open-uri'
+
+class Thor
+  module Actions
+
+    # Copies the file from the relative source to the relative destination. If
+    # the destination is not given it's assumed to be equal to the source.
+    #
+    # ==== Parameters
+    # source<String>:: the relative path to the source root.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status, and
+    #                :mode => :preserve, to preserve the file mode from the source.
+
+    #
+    # ==== Examples
+    #
+    #   copy_file "README", "doc/README"
+    #
+    #   copy_file "doc/README"
+    #
+    def copy_file(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first || source
+      source = File.expand_path(find_in_source_paths(source.to_s))
+
+      create_file destination, nil, config do
+        content = File.binread(source)
+        content = block.call(content) if block
+        content
+      end
+      if config[:mode] == :preserve
+        mode = File.stat(source).mode
+        chmod(destination, mode, config)
+      end
+    end
+
+    # Links the file from the relative source to the relative destination. If
+    # the destination is not given it's assumed to be equal to the source.
+    #
+    # ==== Parameters
+    # source<String>:: the relative path to the source root.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   link_file "README", "doc/README"
+    #
+    #   link_file "doc/README"
+    #
+    def link_file(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first || source
+      source = File.expand_path(find_in_source_paths(source.to_s))
+
+      create_link destination, source, config
+    end
+
+    # Gets the content at the given address and places it at the given relative
+    # destination. If a block is given instead of destination, the content of
+    # the url is yielded and used as location.
+    #
+    # ==== Parameters
+    # source<String>:: the address of the given content.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   get "http://gist.github.com/103208", "doc/README"
+    #
+    #   get "http://gist.github.com/103208" do |content|
+    #     content.split("\n").first
+    #   end
+    #
+    def get(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first
+
+      source = File.expand_path(find_in_source_paths(source.to_s)) unless source =~ /^https?\:\/\//
+      render = open(source) {|input| input.binmode.read }
+
+      destination ||= if block_given?
+        block.arity == 1 ? block.call(render) : block.call
+      else
+        File.basename(source)
+      end
+
+      create_file destination, render, config
+    end
+
+    # Gets an ERB template at the relative source, executes it and makes a copy
+    # at the relative destination. If the destination is not given it's assumed
+    # to be equal to the source removing .tt from the filename.
+    #
+    # ==== Parameters
+    # source<String>:: the relative path to the source root.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   template "README", "doc/README"
+    #
+    #   template "doc/README"
+    #
+    def template(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first || source.sub(/\.tt$/, '')
+
+      source  = File.expand_path(find_in_source_paths(source.to_s))
+      context = instance_eval('binding')
+
+      create_file destination, nil, config do
+        content = ERB.new(::File.binread(source), nil, '-', '@output_buffer').result(context)
+        content = block.call(content) if block
+        content
+      end
+    end
+
+    # Changes the mode of the given file or directory.
+    #
+    # ==== Parameters
+    # mode<Integer>:: the file mode
+    # path<String>:: the name of the file to change mode
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   chmod "script/server", 0755
+    #
+    def chmod(path, mode, config={})
+      return unless behavior == :invoke
+      path = File.expand_path(path, destination_root)
+      say_status :chmod, relative_to_original_destination_root(path), config.fetch(:verbose, true)
+      FileUtils.chmod_R(mode, path) unless options[:pretend]
+    end
+
+    # Prepend text to a file. Since it depends on insert_into_file, it's reversible.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # data<String>:: the data to prepend to the file, can be also given as a block.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   prepend_to_file 'config/environments/test.rb', 'config.gem "rspec"'
+    #
+    #   prepend_to_file 'config/environments/test.rb' do
+    #     'config.gem "rspec"'
+    #   end
+    #
+    def prepend_to_file(path, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      config.merge!(:after => /\A/)
+      insert_into_file(path, *(args << config), &block)
+    end
+    alias_method :prepend_file, :prepend_to_file
+
+    # Append text to a file. Since it depends on insert_into_file, it's reversible.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # data<String>:: the data to append to the file, can be also given as a block.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   append_to_file 'config/environments/test.rb', 'config.gem "rspec"'
+    #
+    #   append_to_file 'config/environments/test.rb' do
+    #     'config.gem "rspec"'
+    #   end
+    #
+    def append_to_file(path, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      config.merge!(:before => /\z/)
+      insert_into_file(path, *(args << config), &block)
+    end
+    alias_method :append_file, :append_to_file
+
+    # Injects text right after the class definition. Since it depends on
+    # insert_into_file, it's reversible.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # klass<String|Class>:: the class to be manipulated
+    # data<String>:: the data to append to the class, can be also given as a block.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   inject_into_class "app/controllers/application_controller.rb", ApplicationController, "  filter_parameter :password\n"
+    #
+    #   inject_into_class "app/controllers/application_controller.rb", ApplicationController do
+    #     "  filter_parameter :password\n"
+    #   end
+    #
+    def inject_into_class(path, klass, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      config.merge!(:after => /class #{klass}\n|class #{klass} .*\n/)
+      insert_into_file(path, *(args << config), &block)
+    end
+
+    # Run a regular expression replacement on a file.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # flag<Regexp|String>:: the regexp or string to be replaced
+    # replacement<String>:: the replacement, can be also given as a block
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   gsub_file 'app/controllers/application_controller.rb', /#\s*(filter_parameter_logging :password)/, '\1'
+    #
+    #   gsub_file 'README', /rake/, :green do |match|
+    #     match << " no more. Use thor!"
+    #   end
+    #
+    def gsub_file(path, flag, *args, &block)
+      return unless behavior == :invoke
+      config = args.last.is_a?(Hash) ? args.pop : {}
+
+      path = File.expand_path(path, destination_root)
+      say_status :gsub, relative_to_original_destination_root(path), config.fetch(:verbose, true)
+
+      unless options[:pretend]
+        content = File.binread(path)
+        content.gsub!(flag, *args, &block)
+        File.open(path, 'wb') { |file| file.write(content) }
+      end
+    end
+
+    # Uncomment all lines matching a given regex.  It will leave the space
+    # which existed before the comment hash in tact but will remove any spacing
+    # between the comment hash and the beginning of the line.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # flag<Regexp|String>:: the regexp or string used to decide which lines to uncomment
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   uncomment_lines 'config/initializers/session_store.rb', /active_record/
+    #
+    def uncomment_lines(path, flag, *args)
+      flag = flag.respond_to?(:source) ? flag.source : flag
+
+      gsub_file(path, /^(\s*)#[[:blank:]]*(.*#{flag})/, '\1\2', *args)
+    end
+
+    # Comment all lines matching a given regex.  It will leave the space
+    # which existed before the beginning of the line in tact and will insert
+    # a single space after the comment hash.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # flag<Regexp|String>:: the regexp or string used to decide which lines to comment
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   comment_lines 'config/initializers/session_store.rb', /cookie_store/
+    #
+    def comment_lines(path, flag, *args)
+      flag = flag.respond_to?(:source) ? flag.source : flag
+
+      gsub_file(path, /^(\s*)([^#|\n]*#{flag})/, '\1# \2', *args)
+    end
+
+    # Removes a file at the given location.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   remove_file 'README'
+    #   remove_file 'app/controllers/application_controller.rb'
+    #
+    def remove_file(path, config={})
+      return unless behavior == :invoke
+      path  = File.expand_path(path, destination_root)
+
+      say_status :remove, relative_to_original_destination_root(path), config.fetch(:verbose, true)
+      ::FileUtils.rm_rf(path) if !options[:pretend] && File.exists?(path)
+    end
+    alias :remove_dir :remove_file
+
+  private
+    attr_accessor :output_buffer
+    def concat(string)
+      @output_buffer.concat(string)
+    end
+
+    def capture(*args, &block)
+      with_output_buffer { block.call(*args) }
+    end
+
+    def with_output_buffer(buf = '') #:nodoc:
+      self.output_buffer, old_buffer = buf, output_buffer
+      yield
+      output_buffer
+    ensure
+      self.output_buffer = old_buffer
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/inject_into_file.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/inject_into_file.rb
new file mode 100644
index 0000000..c48cfab
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/actions/inject_into_file.rb
@@ -0,0 +1,109 @@
+require 'thor/actions/empty_directory'
+
+class Thor
+  module Actions
+
+    # Injects the given content into a file. Different from gsub_file, this
+    # method is reversible.
+    #
+    # ==== Parameters
+    # destination<String>:: Relative path to the destination root
+    # data<String>:: Data to add to the file. Can be given as a block.
+    # config<Hash>:: give :verbose => false to not log the status and the flag
+    #                for injection (:after or :before) or :force => true for
+    #                insert two or more times the same content.
+    #
+    # ==== Examples
+    #
+    #   insert_into_file "config/environment.rb", "config.gem :thor", :after => "Rails::Initializer.run do |config|\n"
+    #
+    #   insert_into_file "config/environment.rb", :after => "Rails::Initializer.run do |config|\n" do
+    #     gems = ask "Which gems would you like to add?"
+    #     gems.split(" ").map{ |gem| "  config.gem :#{gem}" }.join("\n")
+    #   end
+    #
+    def insert_into_file(destination, *args, &block)
+      if block_given?
+        data, config = block, args.shift
+      else
+        data, config = args.shift, args.shift
+      end
+      action InjectIntoFile.new(self, destination, data, config)
+    end
+    alias_method :inject_into_file, :insert_into_file
+
+    class InjectIntoFile < EmptyDirectory #:nodoc:
+      attr_reader :replacement, :flag, :behavior
+
+      def initialize(base, destination, data, config)
+        super(base, destination, { :verbose => true }.merge(config))
+
+        @behavior, @flag = if @config.key?(:after)
+          [:after, @config.delete(:after)]
+        else
+          [:before, @config.delete(:before)]
+        end
+
+        @replacement = data.is_a?(Proc) ? data.call : data
+        @flag = Regexp.escape(@flag) unless @flag.is_a?(Regexp)
+      end
+
+      def invoke!
+        say_status :invoke
+
+        content = if @behavior == :after
+          '\0' + replacement
+        else
+          replacement + '\0'
+        end
+
+        replace!(/#{flag}/, content, config[:force])
+      end
+
+      def revoke!
+        say_status :revoke
+
+        regexp = if @behavior == :after
+          content = '\1\2'
+          /(#{flag})(.*)(#{Regexp.escape(replacement)})/m
+        else
+          content = '\2\3'
+          /(#{Regexp.escape(replacement)})(.*)(#{flag})/m
+        end
+
+        replace!(regexp, content, true)
+      end
+
+      protected
+
+        def say_status(behavior)
+          status = if behavior == :invoke
+            if flag == /\A/
+               :prepend
+            elsif flag == /\z/
+              :append
+            else
+              :insert
+            end
+          else
+            :subtract
+          end
+
+          super(status, config[:verbose])
+        end
+
+        # Adds the content to the file.
+        #
+        def replace!(regexp, string, force)
+          unless base.options[:pretend]
+            content = File.binread(destination)
+            if force || !content.include?(replacement)
+              content.gsub!(regexp, string)
+              File.open(destination, 'wb') { |file| file.write(content) }
+            end
+          end
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/base.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/base.rb
new file mode 100644
index 0000000..4b5d5bd
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/base.rb
@@ -0,0 +1,652 @@
+require 'thor/command'
+require 'thor/core_ext/hash_with_indifferent_access'
+require 'thor/core_ext/ordered_hash'
+require 'thor/error'
+require 'thor/invocation'
+require 'thor/parser'
+require 'thor/shell'
+require 'thor/util'
+
+class Thor
+  autoload :Actions,    'thor/actions'
+  autoload :RakeCompat, 'thor/rake_compat'
+  autoload :Group,      'thor/group'
+
+  # Shortcuts for help.
+  HELP_MAPPINGS       = %w(-h -? --help -D)
+
+  # Thor methods that should not be overwritten by the user.
+  THOR_RESERVED_WORDS = %w(invoke shell options behavior root destination_root relative_root
+                           action add_file create_file in_root inside run run_ruby_script)
+
+  module Base
+    attr_accessor :options, :parent_options, :args
+
+    # It receives arguments in an Array and two hashes, one for options and
+    # other for configuration.
+    #
+    # Notice that it does not check if all required arguments were supplied.
+    # It should be done by the parser.
+    #
+    # ==== Parameters
+    # args<Array[Object]>:: An array of objects. The objects are applied to their
+    #                       respective accessors declared with <tt>argument</tt>.
+    #
+    # options<Hash>:: An options hash that will be available as self.options.
+    #                 The hash given is converted to a hash with indifferent
+    #                 access, magic predicates (options.skip?) and then frozen.
+    #
+    # config<Hash>:: Configuration for this Thor class.
+    #
+    def initialize(args=[], options={}, config={})
+      parse_options = self.class.class_options
+
+      # The start method splits inbound arguments at the first argument
+      # that looks like an option (starts with - or --). It then calls
+      # new, passing in the two halves of the arguments Array as the
+      # first two parameters.
+
+      if options.is_a?(Array)
+        command_options = config.delete(:command_options) # hook for start
+        parse_options = parse_options.merge(command_options) if command_options
+        array_options, hash_options = options, {}
+      else
+        # Handle the case where the class was explicitly instantiated
+        # with pre-parsed options.
+        array_options, hash_options = [], options
+      end
+
+      # Let Thor::Options parse the options first, so it can remove
+      # declared options from the array. This will leave us with
+      # a list of arguments that weren't declared.
+      stop_on_unknown = self.class.stop_on_unknown_option? config[:current_command]
+      opts = Thor::Options.new(parse_options, hash_options, stop_on_unknown)
+      self.options = opts.parse(array_options)
+      self.options = config[:class_options].merge(self.options) if config[:class_options]
+
+      # If unknown options are disallowed, make sure that none of the
+      # remaining arguments looks like an option.
+      opts.check_unknown! if self.class.check_unknown_options?(config)
+
+      # Add the remaining arguments from the options parser to the
+      # arguments passed in to initialize. Then remove any positional
+      # arguments declared using #argument (this is primarily used
+      # by Thor::Group). Tis will leave us with the remaining
+      # positional arguments.
+      to_parse  = args
+      to_parse += opts.remaining unless self.class.strict_args_position?(config)
+
+      thor_args = Thor::Arguments.new(self.class.arguments)
+      thor_args.parse(to_parse).each { |k,v| __send__("#{k}=", v) }
+      @args = thor_args.remaining
+    end
+
+    class << self
+      def included(base) #:nodoc:
+        base.send :extend,  ClassMethods
+        base.send :include, Invocation
+        base.send :include, Shell
+      end
+
+      # Returns the classes that inherits from Thor or Thor::Group.
+      #
+      # ==== Returns
+      # Array[Class]
+      #
+      def subclasses
+        @subclasses ||= []
+      end
+
+      # Returns the files where the subclasses are kept.
+      #
+      # ==== Returns
+      # Hash[path<String> => Class]
+      #
+      def subclass_files
+        @subclass_files ||= Hash.new{ |h,k| h[k] = [] }
+      end
+
+      # Whenever a class inherits from Thor or Thor::Group, we should track the
+      # class and the file on Thor::Base. This is the method responsable for it.
+      #
+      def register_klass_file(klass) #:nodoc:
+        file = caller[1].match(/(.*):\d+/)[1]
+        Thor::Base.subclasses << klass unless Thor::Base.subclasses.include?(klass)
+
+        file_subclasses = Thor::Base.subclass_files[File.expand_path(file)]
+        file_subclasses << klass unless file_subclasses.include?(klass)
+      end
+    end
+
+    module ClassMethods
+      def attr_reader(*) #:nodoc:
+        no_commands { super }
+      end
+
+      def attr_writer(*) #:nodoc:
+        no_commands { super }
+      end
+
+      def attr_accessor(*) #:nodoc:
+        no_commands { super }
+      end
+
+      # If you want to raise an error for unknown options, call check_unknown_options!
+      # This is disabled by default to allow dynamic invocations.
+      def check_unknown_options!
+        @check_unknown_options = true
+      end
+
+      def check_unknown_options #:nodoc:
+        @check_unknown_options ||= from_superclass(:check_unknown_options, false)
+      end
+
+      def check_unknown_options?(config) #:nodoc:
+        !!check_unknown_options
+      end
+
+      # If true, option parsing is suspended as soon as an unknown option or a
+      # regular argument is encountered.  All remaining arguments are passed to
+      # the command as regular arguments.
+      def stop_on_unknown_option?(command_name) #:nodoc:
+        false
+      end
+
+      # If you want only strict string args (useful when cascading thor classes),
+      # call strict_args_position! This is disabled by default to allow dynamic
+      # invocations.
+      def strict_args_position!
+        @strict_args_position = true
+      end
+
+      def strict_args_position #:nodoc:
+        @strict_args_position ||= from_superclass(:strict_args_position, false)
+      end
+
+      def strict_args_position?(config) #:nodoc:
+        !!strict_args_position
+      end
+
+      # Adds an argument to the class and creates an attr_accessor for it.
+      #
+      # Arguments are different from options in several aspects. The first one
+      # is how they are parsed from the command line, arguments are retrieved
+      # from position:
+      #
+      #   thor command NAME
+      #
+      # Instead of:
+      #
+      #   thor command --name=NAME
+      #
+      # Besides, arguments are used inside your code as an accessor (self.argument),
+      # while options are all kept in a hash (self.options).
+      #
+      # Finally, arguments cannot have type :default or :boolean but can be
+      # optional (supplying :optional => :true or :required => false), although
+      # you cannot have a required argument after a non-required argument. If you
+      # try it, an error is raised.
+      #
+      # ==== Parameters
+      # name<Symbol>:: The name of the argument.
+      # options<Hash>:: Described below.
+      #
+      # ==== Options
+      # :desc     - Description for the argument.
+      # :required - If the argument is required or not.
+      # :optional - If the argument is optional or not.
+      # :type     - The type of the argument, can be :string, :hash, :array, :numeric.
+      # :default  - Default value for this argument. It cannot be required and have default values.
+      # :banner   - String to show on usage notes.
+      #
+      # ==== Errors
+      # ArgumentError:: Raised if you supply a required argument after a non required one.
+      #
+      def argument(name, options={})
+        is_thor_reserved_word?(name, :argument)
+        no_commands { attr_accessor name }
+
+        required = if options.key?(:optional)
+          !options[:optional]
+        elsif options.key?(:required)
+          options[:required]
+        else
+          options[:default].nil?
+        end
+
+        remove_argument name
+
+        arguments.each do |argument|
+          next if argument.required?
+          raise ArgumentError, "You cannot have #{name.to_s.inspect} as required argument after " <<
+                               "the non-required argument #{argument.human_name.inspect}."
+        end if required
+
+        options[:required] = required
+
+        arguments << Thor::Argument.new(name, options)
+      end
+
+      # Returns this class arguments, looking up in the ancestors chain.
+      #
+      # ==== Returns
+      # Array[Thor::Argument]
+      #
+      def arguments
+        @arguments ||= from_superclass(:arguments, [])
+      end
+
+      # Adds a bunch of options to the set of class options.
+      #
+      #   class_options :foo => false, :bar => :required, :baz => :string
+      #
+      # If you prefer more detailed declaration, check class_option.
+      #
+      # ==== Parameters
+      # Hash[Symbol => Object]
+      #
+      def class_options(options=nil)
+        @class_options ||= from_superclass(:class_options, {})
+        build_options(options, @class_options) if options
+        @class_options
+      end
+
+      # Adds an option to the set of class options
+      #
+      # ==== Parameters
+      # name<Symbol>:: The name of the argument.
+      # options<Hash>:: Described below.
+      #
+      # ==== Options
+      # :desc::     -- Description for the argument.
+      # :required:: -- If the argument is required or not.
+      # :default::  -- Default value for this argument.
+      # :group::    -- The group for this options. Use by class options to output options in different levels.
+      # :aliases::  -- Aliases for this option. <b>Note:</b> Thor follows a convention of one-dash-one-letter options. Thus aliases like "-something" wouldn't be parsed; use either "\--something" or "-s" instead.
+      # :type::     -- The type of the argument, can be :string, :hash, :array, :numeric or :boolean.
+      # :banner::   -- String to show on usage notes.
+      # :hide::     -- If you want to hide this option from the help.
+      #
+      def class_option(name, options={})
+        build_option(name, options, class_options)
+      end
+
+      # Removes a previous defined argument. If :undefine is given, undefine
+      # accessors as well.
+      #
+      # ==== Parameters
+      # names<Array>:: Arguments to be removed
+      #
+      # ==== Examples
+      #
+      #   remove_argument :foo
+      #   remove_argument :foo, :bar, :baz, :undefine => true
+      #
+      def remove_argument(*names)
+        options = names.last.is_a?(Hash) ? names.pop : {}
+
+        names.each do |name|
+          arguments.delete_if { |a| a.name == name.to_s }
+          undef_method name, "#{name}=" if options[:undefine]
+        end
+      end
+
+      # Removes a previous defined class option.
+      #
+      # ==== Parameters
+      # names<Array>:: Class options to be removed
+      #
+      # ==== Examples
+      #
+      #   remove_class_option :foo
+      #   remove_class_option :foo, :bar, :baz
+      #
+      def remove_class_option(*names)
+        names.each do |name|
+          class_options.delete(name)
+        end
+      end
+
+      # Defines the group. This is used when thor list is invoked so you can specify
+      # that only commands from a pre-defined group will be shown. Defaults to standard.
+      #
+      # ==== Parameters
+      # name<String|Symbol>
+      #
+      def group(name=nil)
+        @group = case name
+        when nil
+          @group || from_superclass(:group, 'standard')
+        else
+          name.to_s
+        end
+      end
+
+      # Returns the commands for this Thor class.
+      #
+      # ==== Returns
+      # OrderedHash:: An ordered hash with commands names as keys and Thor::Command
+      #               objects as values.
+      #
+      def commands
+        @commands ||= Thor::CoreExt::OrderedHash.new
+      end
+      alias tasks commands
+
+      # Returns the commands for this Thor class and all subclasses.
+      #
+      # ==== Returns
+      # OrderedHash:: An ordered hash with commands names as keys and Thor::Command
+      #               objects as values.
+      #
+      def all_commands
+        @all_commands ||= from_superclass(:all_commands, Thor::CoreExt::OrderedHash.new)
+        @all_commands.merge(commands)
+      end
+      alias all_tasks all_commands
+
+      # Removes a given command from this Thor class. This is usually done if you
+      # are inheriting from another class and don't want it to be available
+      # anymore.
+      #
+      # By default it only remove the mapping to the command. But you can supply
+      # :undefine => true to undefine the method from the class as well.
+      #
+      # ==== Parameters
+      # name<Symbol|String>:: The name of the command to be removed
+      # options<Hash>:: You can give :undefine => true if you want commands the method
+      #                 to be undefined from the class as well.
+      #
+      def remove_command(*names)
+        options = names.last.is_a?(Hash) ? names.pop : {}
+
+        names.each do |name|
+          commands.delete(name.to_s)
+          all_commands.delete(name.to_s)
+          undef_method name if options[:undefine]
+        end
+      end
+      alias remove_task remove_command
+
+      # All methods defined inside the given block are not added as commands.
+      #
+      # So you can do:
+      #
+      #   class MyScript < Thor
+      #     no_commands do
+      #       def this_is_not_a_command
+      #       end
+      #     end
+      #   end
+      #
+      # You can also add the method and remove it from the command list:
+      #
+      #   class MyScript < Thor
+      #     def this_is_not_a_command
+      #     end
+      #     remove_command :this_is_not_a_command
+      #   end
+      #
+      def no_commands
+        @no_commands = true
+        yield
+      ensure
+        @no_commands = false
+      end
+      alias no_tasks no_commands
+
+      # Sets the namespace for the Thor or Thor::Group class. By default the
+      # namespace is retrieved from the class name. If your Thor class is named
+      # Scripts::MyScript, the help method, for example, will be called as:
+      #
+      #   thor scripts:my_script -h
+      #
+      # If you change the namespace:
+      #
+      #   namespace :my_scripts
+      #
+      # You change how your commands are invoked:
+      #
+      #   thor my_scripts -h
+      #
+      # Finally, if you change your namespace to default:
+      #
+      #   namespace :default
+      #
+      # Your commands can be invoked with a shortcut. Instead of:
+      #
+      #   thor :my_command
+      #
+      def namespace(name=nil)
+        @namespace = case name
+        when nil
+          @namespace || Thor::Util.namespace_from_thor_class(self)
+        else
+          @namespace = name.to_s
+        end
+      end
+
+      # Parses the command and options from the given args, instantiate the class
+      # and invoke the command. This method is used when the arguments must be parsed
+      # from an array. If you are inside Ruby and want to use a Thor class, you
+      # can simply initialize it:
+      #
+      #   script = MyScript.new(args, options, config)
+      #   script.invoke(:command, first_arg, second_arg, third_arg)
+      #
+      def start(given_args=ARGV, config={})
+        config[:shell] ||= Thor::Base.shell.new
+        dispatch(nil, given_args.dup, nil, config)
+      rescue Thor::Error => e
+        ENV["THOR_DEBUG"] == "1" ? (raise e) : config[:shell].error(e.message)
+        exit(1) if exit_on_failure?
+      rescue Errno::EPIPE
+        # This happens if a thor command is piped to something like `head`,
+        # which closes the pipe when it's done reading. This will also
+        # mean that if the pipe is closed, further unnecessary
+        # computation will not occur.
+        exit(0)
+      end
+
+      # Allows to use private methods from parent in child classes as commands.
+      #
+      # ==== Parameters
+      #   names<Array>:: Method names to be used as commands
+      #
+      # ==== Examples
+      #
+      #   public_command :foo
+      #   public_command :foo, :bar, :baz
+      #
+      def public_command(*names)
+        names.each do |name|
+          class_eval "def #{name}(*); super end"
+        end
+      end
+      alias public_task public_command
+
+      def handle_no_command_error(command, has_namespace = $thor_runner) #:nodoc:
+        if has_namespace
+          raise UndefinedCommandError, "Could not find command #{command.inspect} in #{namespace.inspect} namespace."
+        else
+          raise UndefinedCommandError, "Could not find command #{command.inspect}."
+        end
+      end
+      alias handle_no_task_error handle_no_command_error
+
+      def handle_argument_error(command, error, args, arity) #:nodoc:
+        msg = "ERROR: #{basename} #{command.name} was called with "
+        msg << 'no arguments'               if  args.empty?
+        msg << 'arguments ' << args.inspect if !args.empty?
+        msg << "\nUsage: #{self.banner(command).inspect}."
+        raise InvocationError, msg
+      end
+
+      protected
+
+        # Prints the class options per group. If an option does not belong to
+        # any group, it's printed as Class option.
+        #
+        def class_options_help(shell, groups={}) #:nodoc:
+          # Group options by group
+          class_options.each do |_, value|
+            groups[value.group] ||= []
+            groups[value.group] << value
+          end
+
+          # Deal with default group
+          global_options = groups.delete(nil) || []
+          print_options(shell, global_options)
+
+          # Print all others
+          groups.each do |group_name, options|
+            print_options(shell, options, group_name)
+          end
+        end
+
+        # Receives a set of options and print them.
+        def print_options(shell, options, group_name=nil)
+          return if options.empty?
+
+          list = []
+          padding = options.collect{ |o| o.aliases.size }.max.to_i * 4
+
+          options.each do |option|
+            unless option.hide
+              item = [ option.usage(padding) ]
+              item.push(option.description ? "# #{option.description}" : "")
+
+              list << item
+              list << [ "", "# Default: #{option.default}" ] if option.show_default?
+              list << [ "", "# Possible values: #{option.enum.join(', ')}" ] if option.enum
+            end
+          end
+
+          shell.say(group_name ? "#{group_name} options:" : "Options:")
+          shell.print_table(list, :indent => 2)
+          shell.say ""
+        end
+
+        # Raises an error if the word given is a Thor reserved word.
+        def is_thor_reserved_word?(word, type) #:nodoc:
+          return false unless THOR_RESERVED_WORDS.include?(word.to_s)
+          raise "#{word.inspect} is a Thor reserved word and cannot be defined as #{type}"
+        end
+
+        # Build an option and adds it to the given scope.
+        #
+        # ==== Parameters
+        # name<Symbol>:: The name of the argument.
+        # options<Hash>:: Described in both class_option and method_option.
+        # scope<Hash>:: Options hash that is being built up
+        def build_option(name, options, scope) #:nodoc:
+          scope[name] = Thor::Option.new(name, options)
+        end
+
+        # Receives a hash of options, parse them and add to the scope. This is a
+        # fast way to set a bunch of options:
+        #
+        #   build_options :foo => true, :bar => :required, :baz => :string
+        #
+        # ==== Parameters
+        # Hash[Symbol => Object]
+        def build_options(options, scope) #:nodoc:
+          options.each do |key, value|
+            scope[key] = Thor::Option.parse(key, value)
+          end
+        end
+
+        # Finds a command with the given name. If the command belongs to the current
+        # class, just return it, otherwise dup it and add the fresh copy to the
+        # current command hash.
+        def find_and_refresh_command(name) #:nodoc:
+          command = if command = commands[name.to_s]
+            command
+          elsif command = all_commands[name.to_s]
+            commands[name.to_s] = command.clone
+          else
+            raise ArgumentError, "You supplied :for => #{name.inspect}, but the command #{name.inspect} could not be found."
+          end
+        end
+        alias find_and_refresh_task find_and_refresh_command
+
+        # Everytime someone inherits from a Thor class, register the klass
+        # and file into baseclass.
+        def inherited(klass)
+          Thor::Base.register_klass_file(klass)
+          klass.instance_variable_set(:@no_commands, false)
+        end
+
+        # Fire this callback whenever a method is added. Added methods are
+        # tracked as commands by invoking the create_command method.
+        def method_added(meth)
+          meth = meth.to_s
+
+          if meth == "initialize"
+            initialize_added
+            return
+          end
+
+          # Return if it's not a public instance method
+          return unless public_method_defined?(meth.to_sym)
+
+          return if @no_commands || !create_command(meth)
+
+          is_thor_reserved_word?(meth, :command)
+          Thor::Base.register_klass_file(self)
+        end
+
+        # Retrieves a value from superclass. If it reaches the baseclass,
+        # returns default.
+        def from_superclass(method, default=nil)
+          if self == baseclass || !superclass.respond_to?(method, true)
+            default
+          else
+            value = superclass.send(method)
+
+            if value
+              if value.is_a?(TrueClass) || value.is_a?(Symbol)
+                value
+              else
+                value.dup
+              end
+            end
+          end
+        end
+
+        # A flag that makes the process exit with status 1 if any error happens.
+        def exit_on_failure?
+          false
+        end
+
+        #
+        # The basename of the program invoking the thor class.
+        #
+        def basename
+          File.basename($0).split(' ').first
+        end
+
+        # SIGNATURE: Sets the baseclass. This is where the superclass lookup
+        # finishes.
+        def baseclass #:nodoc:
+        end
+
+        # SIGNATURE: Creates a new command if valid_command? is true. This method is
+        # called when a new method is added to the class.
+        def create_command(meth) #:nodoc:
+        end
+        alias create_task create_command
+
+        # SIGNATURE: Defines behavior when the initialize method is added to the
+        # class.
+        def initialize_added #:nodoc:
+        end
+
+        # SIGNATURE: The hook invoked by start.
+        def dispatch(command, given_args, given_opts, config) #:nodoc:
+          raise NotImplementedError
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/command.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/command.rb
new file mode 100644
index 0000000..e56bd44
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/command.rb
@@ -0,0 +1,136 @@
+class Thor
+  class Command < Struct.new(:name, :description, :long_description, :usage, :options)
+    FILE_REGEXP = /^#{Regexp.escape(File.dirname(__FILE__))}/
+
+    def initialize(name, description, long_description, usage, options=nil)
+      super(name.to_s, description, long_description, usage, options || {})
+    end
+
+    def initialize_copy(other) #:nodoc:
+      super(other)
+      self.options = other.options.dup if other.options
+    end
+
+    def hidden?
+      false
+    end
+
+    # By default, a command invokes a method in the thor class. You can change this
+    # implementation to create custom commands.
+    def run(instance, args=[])
+      arity = nil
+
+      if private_method?(instance)
+        instance.class.handle_no_command_error(name)
+      elsif public_method?(instance)
+        arity = instance.method(name).arity
+        instance.__send__(name, *args)
+      elsif local_method?(instance, :method_missing)
+        instance.__send__(:method_missing, name.to_sym, *args)
+      else
+        instance.class.handle_no_command_error(name)
+      end
+    rescue ArgumentError => e
+      handle_argument_error?(instance, e, caller) ?
+        instance.class.handle_argument_error(self, e, args, arity) : (raise e)
+    rescue NoMethodError => e
+      handle_no_method_error?(instance, e, caller) ?
+        instance.class.handle_no_command_error(name) : (raise e)
+    end
+
+    # Returns the formatted usage by injecting given required arguments
+    # and required options into the given usage.
+    def formatted_usage(klass, namespace = true, subcommand = false)
+      if namespace
+        namespace = klass.namespace
+        formatted = "#{namespace.gsub(/^(default)/,'')}:"
+      end
+      formatted = "#{klass.namespace.split(':').last} " if subcommand
+
+      formatted ||= ""
+
+      # Add usage with required arguments
+      formatted << if klass && !klass.arguments.empty?
+        usage.to_s.gsub(/^#{name}/) do |match|
+          match << " " << klass.arguments.map{ |a| a.usage }.compact.join(' ')
+        end
+      else
+        usage.to_s
+      end
+
+      # Add required options
+      formatted << " #{required_options}"
+
+      # Strip and go!
+      formatted.strip
+    end
+
+  protected
+
+    def not_debugging?(instance)
+      !(instance.class.respond_to?(:debugging) && instance.class.debugging)
+    end
+
+    def required_options
+      @required_options ||= options.map{ |_, o| o.usage if o.required? }.compact.sort.join(" ")
+    end
+
+    # Given a target, checks if this class name is a public method.
+    def public_method?(instance) #:nodoc:
+      !(instance.public_methods & [name.to_s, name.to_sym]).empty?
+    end
+
+    def private_method?(instance)
+      !(instance.private_methods & [name.to_s, name.to_sym]).empty?
+    end
+
+    def local_method?(instance, name)
+      methods = instance.public_methods(false) + instance.private_methods(false) + instance.protected_methods(false)
+      !(methods & [name.to_s, name.to_sym]).empty?
+    end
+
+    def sans_backtrace(backtrace, caller) #:nodoc:
+      saned  = backtrace.reject { |frame| frame =~ FILE_REGEXP || (frame =~ /\.java:/ && RUBY_PLATFORM =~ /java/) }
+      saned -= caller
+    end
+
+    def handle_argument_error?(instance, error, caller)
+      not_debugging?(instance) && error.message =~ /wrong number of arguments/ && begin
+        saned = sans_backtrace(error.backtrace, caller)
+        # Ruby 1.9 always include the called method in the backtrace
+        saned.empty? || (saned.size == 1 && RUBY_VERSION >= "1.9")
+      end
+    end
+
+    def handle_no_method_error?(instance, error, caller)
+      not_debugging?(instance) &&
+        error.message =~ /^undefined method `#{name}' for #{Regexp.escape(instance.to_s)}$/
+    end
+  end
+  Task = Command
+
+  # A command that is hidden in help messages but still invocable.
+  class HiddenCommand < Command
+    def hidden?
+      true
+    end
+  end
+  HiddenTask = HiddenCommand
+
+  # A dynamic command that handles method missing scenarios.
+  class DynamicCommand < Command
+    def initialize(name, options=nil)
+      super(name.to_s, "A dynamically-generated command", name.to_s, name.to_s, options)
+    end
+
+    def run(instance, args=[])
+      if (instance.methods & [name.to_s, name.to_sym]).empty?
+        super
+      else
+        instance.class.handle_no_command_error(name)
+      end
+    end
+  end
+  DynamicTask = DynamicCommand
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/core_ext/hash_with_indifferent_access.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/core_ext/hash_with_indifferent_access.rb
new file mode 100644
index 0000000..0a583e6
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/core_ext/hash_with_indifferent_access.rb
@@ -0,0 +1,80 @@
+class Thor
+  module CoreExt #:nodoc:
+
+    # A hash with indifferent access and magic predicates.
+    #
+    #   hash = Thor::CoreExt::HashWithIndifferentAccess.new 'foo' => 'bar', 'baz' => 'bee', 'force' => true
+    #
+    #   hash[:foo]  #=> 'bar'
+    #   hash['foo'] #=> 'bar'
+    #   hash.foo?   #=> true
+    #
+    class HashWithIndifferentAccess < ::Hash #:nodoc:
+
+      def initialize(hash={})
+        super()
+        hash.each do |key, value|
+          self[convert_key(key)] = value
+        end
+      end
+
+      def [](key)
+        super(convert_key(key))
+      end
+
+      def []=(key, value)
+        super(convert_key(key), value)
+      end
+
+      def delete(key)
+        super(convert_key(key))
+      end
+
+      def values_at(*indices)
+        indices.collect { |key| self[convert_key(key)] }
+      end
+
+      def merge(other)
+        dup.merge!(other)
+      end
+
+      def merge!(other)
+        other.each do |key, value|
+          self[convert_key(key)] = value
+        end
+        self
+      end
+
+      # Convert to a Hash with String keys.
+      def to_hash
+        Hash.new(default).merge!(self)
+      end
+
+      protected
+
+        def convert_key(key)
+          key.is_a?(Symbol) ? key.to_s : key
+        end
+
+        # Magic predicates. For instance:
+        #
+        #   options.force?                  # => !!options['force']
+        #   options.shebang                 # => "/usr/lib/local/ruby"
+        #   options.test_framework?(:rspec) # => options[:test_framework] == :rspec
+        #
+        def method_missing(method, *args, &block)
+          method = method.to_s
+          if method =~ /^(\w+)\?$/
+            if args.empty?
+              !!self[$1]
+            else
+              self[$1] == args.first
+            end
+          else
+            self[method]
+          end
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/core_ext/io_binary_read.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/core_ext/io_binary_read.rb
new file mode 100644
index 0000000..a824f1b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/core_ext/io_binary_read.rb
@@ -0,0 +1,12 @@
+class IO #:nodoc:
+  class << self
+
+    def binread(file, *args)
+      raise ArgumentError, "wrong number of arguments (#{1 + args.size} for 1..3)" unless args.size < 3
+      File.open(file, 'rb') do |f|
+        f.read(*args)
+      end
+    end unless method_defined? :binread
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/core_ext/ordered_hash.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/core_ext/ordered_hash.rb
new file mode 100644
index 0000000..27fea5b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/core_ext/ordered_hash.rb
@@ -0,0 +1,100 @@
+class Thor
+  module CoreExt #:nodoc:
+
+    if RUBY_VERSION >= '1.9'
+      class OrderedHash < ::Hash
+      end
+    else
+      # This class is based on the Ruby 1.9 ordered hashes.
+      #
+      # It keeps the semantics and most of the efficiency of normal hashes
+      # while also keeping track of the order in which elements were set.
+      #
+      class OrderedHash #:nodoc:
+        include Enumerable
+
+        Node = Struct.new(:key, :value, :next, :prev)
+
+        def initialize
+          @hash = {}
+        end
+
+        def [](key)
+          @hash[key] && @hash[key].value
+        end
+
+        def []=(key, value)
+          if node = @hash[key]
+            node.value = value
+          else
+            node = Node.new(key, value)
+
+            if @first.nil?
+              @first = @last = node
+            else
+              node.prev = @last
+              @last.next = node
+              @last = node
+            end
+          end
+
+          @hash[key] = node
+          value
+        end
+
+        def delete(key)
+          if node = @hash[key]
+            prev_node = node.prev
+            next_node = node.next
+
+            next_node.prev = prev_node if next_node
+            prev_node.next = next_node if prev_node
+
+            @first = next_node if @first == node
+            @last = prev_node  if @last  == node
+
+            value = node.value
+          end
+
+          @hash.delete(key)
+          value
+        end
+
+        def keys
+          self.map { |k, v| k }
+        end
+
+        def values
+          self.map { |k, v| v }
+        end
+
+        def each
+          return unless @first
+          yield [@first.key, @first.value]
+          node = @first
+          yield [node.key, node.value] while node = node.next
+          self
+        end
+
+        def merge(other)
+          hash = self.class.new
+
+          self.each do |key, value|
+            hash[key] = value
+          end
+
+          other.each do |key, value|
+            hash[key] = value
+          end
+
+          hash
+        end
+
+        def empty?
+          @hash.empty?
+        end
+      end
+    end
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/error.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/error.rb
new file mode 100644
index 0000000..31e0c4b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/error.rb
@@ -0,0 +1,28 @@
+class Thor
+  # Thor::Error is raised when it's caused by wrong usage of thor classes. Those
+  # errors have their backtrace suppressed and are nicely shown to the user.
+  #
+  # Errors that are caused by the developer, like declaring a method which
+  # overwrites a thor keyword, it SHOULD NOT raise a Thor::Error. This way, we
+  # ensure that developer errors are shown with full backtrace.
+  class Error < StandardError
+  end
+
+  # Raised when a command was not found.
+  class UndefinedCommandError < Error
+  end
+  UndefinedTaskError = UndefinedCommandError
+
+  # Raised when a command was found, but not invoked properly.
+  class InvocationError < Error
+  end
+
+  class UnknownArgumentError < Error
+  end
+
+  class RequiredArgumentMissingError < InvocationError
+  end
+
+  class MalformattedArgumentError < InvocationError
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/group.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/group.rb
new file mode 100644
index 0000000..2aaee73
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/group.rb
@@ -0,0 +1,282 @@
+require 'thor/base'
+
+# Thor has a special class called Thor::Group. The main difference to Thor class
+# is that it invokes all commands at once. It also include some methods that allows
+# invocations to be done at the class method, which are not available to Thor
+# commands.
+class Thor::Group
+  class << self
+    # The description for this Thor::Group. If none is provided, but a source root
+    # exists, tries to find the USAGE one folder above it, otherwise searches
+    # in the superclass.
+    #
+    # ==== Parameters
+    # description<String>:: The description for this Thor::Group.
+    #
+    def desc(description=nil)
+      @desc = case description
+      when nil
+        @desc || from_superclass(:desc, nil)
+      else
+        description
+      end
+    end
+
+    # Prints help information.
+    #
+    # ==== Options
+    # short:: When true, shows only usage.
+    #
+    def help(shell)
+      shell.say "Usage:"
+      shell.say "  #{banner}\n"
+      shell.say
+      class_options_help(shell)
+      shell.say self.desc if self.desc
+    end
+
+    # Stores invocations for this class merging with superclass values.
+    #
+    def invocations #:nodoc:
+      @invocations ||= from_superclass(:invocations, {})
+    end
+
+    # Stores invocation blocks used on invoke_from_option.
+    #
+    def invocation_blocks #:nodoc:
+      @invocation_blocks ||= from_superclass(:invocation_blocks, {})
+    end
+
+    # Invoke the given namespace or class given. It adds an instance
+    # method that will invoke the klass and command. You can give a block to
+    # configure how it will be invoked.
+    #
+    # The namespace/class given will have its options showed on the help
+    # usage. Check invoke_from_option for more information.
+    #
+    def invoke(*names, &block)
+      options = names.last.is_a?(Hash) ? names.pop : {}
+      verbose = options.fetch(:verbose, true)
+
+      names.each do |name|
+        invocations[name] = false
+        invocation_blocks[name] = block if block_given?
+
+        class_eval <<-METHOD, __FILE__, __LINE__
+          def _invoke_#{name.to_s.gsub(/\W/, '_')}
+            klass, command = self.class.prepare_for_invocation(nil, #{name.inspect})
+
+            if klass
+              say_status :invoke, #{name.inspect}, #{verbose.inspect}
+              block = self.class.invocation_blocks[#{name.inspect}]
+              _invoke_for_class_method klass, command, &block
+            else
+              say_status :error, %(#{name.inspect} [not found]), :red
+            end
+          end
+        METHOD
+      end
+    end
+
+    # Invoke a thor class based on the value supplied by the user to the
+    # given option named "name". A class option must be created before this
+    # method is invoked for each name given.
+    #
+    # ==== Examples
+    #
+    #   class GemGenerator < Thor::Group
+    #     class_option :test_framework, :type => :string
+    #     invoke_from_option :test_framework
+    #   end
+    #
+    # ==== Boolean options
+    #
+    # In some cases, you want to invoke a thor class if some option is true or
+    # false. This is automatically handled by invoke_from_option. Then the
+    # option name is used to invoke the generator.
+    #
+    # ==== Preparing for invocation
+    #
+    # In some cases you want to customize how a specified hook is going to be
+    # invoked. You can do that by overwriting the class method
+    # prepare_for_invocation. The class method must necessarily return a klass
+    # and an optional command.
+    #
+    # ==== Custom invocations
+    #
+    # You can also supply a block to customize how the option is going to be
+    # invoked. The block receives two parameters, an instance of the current
+    # class and the klass to be invoked.
+    #
+    def invoke_from_option(*names, &block)
+      options = names.last.is_a?(Hash) ? names.pop : {}
+      verbose = options.fetch(:verbose, :white)
+
+      names.each do |name|
+        unless class_options.key?(name)
+          raise ArgumentError, "You have to define the option #{name.inspect} " <<
+                               "before setting invoke_from_option."
+        end
+
+        invocations[name] = true
+        invocation_blocks[name] = block if block_given?
+
+        class_eval <<-METHOD, __FILE__, __LINE__
+          def _invoke_from_option_#{name.to_s.gsub(/\W/, '_')}
+            return unless options[#{name.inspect}]
+
+            value = options[#{name.inspect}]
+            value = #{name.inspect} if TrueClass === value
+            klass, command = self.class.prepare_for_invocation(#{name.inspect}, value)
+
+            if klass
+              say_status :invoke, value, #{verbose.inspect}
+              block = self.class.invocation_blocks[#{name.inspect}]
+              _invoke_for_class_method klass, command, &block
+            else
+              say_status :error, %(\#{value} [not found]), :red
+            end
+          end
+        METHOD
+      end
+    end
+
+    # Remove a previously added invocation.
+    #
+    # ==== Examples
+    #
+    #   remove_invocation :test_framework
+    #
+    def remove_invocation(*names)
+      names.each do |name|
+        remove_command(name)
+        remove_class_option(name)
+        invocations.delete(name)
+        invocation_blocks.delete(name)
+      end
+    end
+
+    # Overwrite class options help to allow invoked generators options to be
+    # shown recursively when invoking a generator.
+    #
+    def class_options_help(shell, groups={}) #:nodoc:
+      get_options_from_invocations(groups, class_options) do |klass|
+        klass.send(:get_options_from_invocations, groups, class_options)
+      end
+      super(shell, groups)
+    end
+
+    # Get invocations array and merge options from invocations. Those
+    # options are added to group_options hash. Options that already exists
+    # in base_options are not added twice.
+    #
+    def get_options_from_invocations(group_options, base_options) #:nodoc:
+      invocations.each do |name, from_option|
+        value = if from_option
+          option = class_options[name]
+          option.type == :boolean ? name : option.default
+        else
+          name
+        end
+        next unless value
+
+        klass, _ = prepare_for_invocation(name, value)
+        next unless klass && klass.respond_to?(:class_options)
+
+        value = value.to_s
+        human_name = value.respond_to?(:classify) ? value.classify : value
+
+        group_options[human_name] ||= []
+        group_options[human_name] += klass.class_options.values.select do |class_option|
+          base_options[class_option.name.to_sym].nil? && class_option.group.nil? &&
+          !group_options.values.flatten.any? { |i| i.name == class_option.name }
+        end
+
+        yield klass if block_given?
+      end
+    end
+
+    # Returns commands ready to be printed.
+    def printable_commands(*)
+      item = []
+      item << banner
+      item << (desc ? "# #{desc.gsub(/\s+/m,' ')}" : "")
+      [item]
+    end
+    alias printable_tasks printable_commands
+
+    def handle_argument_error(command, error, args, arity) #:nodoc:
+      msg = "#{basename} #{command.name} takes #{arity} argument"
+      msg << "s" if arity > 1
+      msg << ", but it should not."
+      raise error, msg
+    end
+
+    protected
+
+      # The method responsible for dispatching given the args.
+      def dispatch(command, given_args, given_opts, config) #:nodoc:
+        if Thor::HELP_MAPPINGS.include?(given_args.first)
+          help(config[:shell])
+          return
+        end
+
+        args, opts = Thor::Options.split(given_args)
+        opts = given_opts || opts
+
+        instance = new(args, opts, config)
+        yield instance if block_given?
+
+        if command
+          instance.invoke_command(all_commands[command])
+        else
+          instance.invoke_all
+        end
+      end
+
+      # The banner for this class. You can customize it if you are invoking the
+      # thor class by another ways which is not the Thor::Runner.
+      def banner
+        "#{basename} #{self_command.formatted_usage(self, false)}"
+      end
+
+      # Represents the whole class as a command.
+      def self_command #:nodoc:
+        Thor::DynamicCommand.new(self.namespace, class_options)
+      end
+      alias self_task self_command
+
+      def baseclass #:nodoc:
+        Thor::Group
+      end
+
+      def create_command(meth) #:nodoc:
+        commands[meth.to_s] = Thor::Command.new(meth, nil, nil, nil, nil)
+        true
+      end
+      alias create_task create_command
+  end
+
+  include Thor::Base
+
+  protected
+
+  # Shortcut to invoke with padding and block handling. Use internally by
+  # invoke and invoke_from_option class methods.
+  def _invoke_for_class_method(klass, command=nil, *args, &block) #:nodoc:
+    with_padding do
+      if block
+        case block.arity
+        when 3
+          block.call(self, klass, command)
+        when 2
+          block.call(self, klass)
+        when 1
+          instance_exec(klass, &block)
+        end
+      else
+        invoke klass, command, *args
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/invocation.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/invocation.rb
new file mode 100644
index 0000000..a9adeb5
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/invocation.rb
@@ -0,0 +1,172 @@
+class Thor
+  module Invocation
+    def self.included(base) #:nodoc:
+      base.extend ClassMethods
+    end
+
+    module ClassMethods
+      # This method is responsible for receiving a name and find the proper
+      # class and command for it. The key is an optional parameter which is
+      # available only in class methods invocations (i.e. in Thor::Group).
+      def prepare_for_invocation(key, name) #:nodoc:
+        case name
+        when Symbol, String
+          Thor::Util.find_class_and_command_by_namespace(name.to_s, !key)
+        else
+          name
+        end
+      end
+    end
+
+    # Make initializer aware of invocations and the initialization args.
+    def initialize(args=[], options={}, config={}, &block) #:nodoc:
+      @_invocations = config[:invocations] || Hash.new { |h,k| h[k] = [] }
+      @_initializer = [ args, options, config ]
+      super
+    end
+
+    # Receives a name and invokes it. The name can be a string (either "command" or
+    # "namespace:command"), a Thor::Command, a Class or a Thor instance. If the
+    # command cannot be guessed by name, it can also be supplied as second argument.
+    #
+    # You can also supply the arguments, options and configuration values for
+    # the command to be invoked, if none is given, the same values used to
+    # initialize the invoker are used to initialize the invoked.
+    #
+    # When no name is given, it will invoke the default command of the current class.
+    #
+    # ==== Examples
+    #
+    #   class A < Thor
+    #     def foo
+    #       invoke :bar
+    #       invoke "b:hello", ["José"]
+    #     end
+    #
+    #     def bar
+    #       invoke "b:hello", ["José"]
+    #     end
+    #   end
+    #
+    #   class B < Thor
+    #     def hello(name)
+    #       puts "hello #{name}"
+    #     end
+    #   end
+    #
+    # You can notice that the method "foo" above invokes two commands: "bar",
+    # which belongs to the same class and "hello" which belongs to the class B.
+    #
+    # By using an invocation system you ensure that a command is invoked only once.
+    # In the example above, invoking "foo" will invoke "b:hello" just once, even
+    # if it's invoked later by "bar" method.
+    #
+    # When class A invokes class B, all arguments used on A initialization are
+    # supplied to B. This allows lazy parse of options. Let's suppose you have
+    # some rspec commands:
+    #
+    #   class Rspec < Thor::Group
+    #     class_option :mock_framework, :type => :string, :default => :rr
+    #
+    #     def invoke_mock_framework
+    #       invoke "rspec:#{options[:mock_framework]}"
+    #     end
+    #   end
+    #
+    # As you noticed, it invokes the given mock framework, which might have its
+    # own options:
+    #
+    #   class Rspec::RR < Thor::Group
+    #     class_option :style, :type => :string, :default => :mock
+    #   end
+    #
+    # Since it's not rspec concern to parse mock framework options, when RR
+    # is invoked all options are parsed again, so RR can extract only the options
+    # that it's going to use.
+    #
+    # If you want Rspec::RR to be initialized with its own set of options, you
+    # have to do that explicitly:
+    #
+    #   invoke "rspec:rr", [], :style => :foo
+    #
+    # Besides giving an instance, you can also give a class to invoke:
+    #
+    #   invoke Rspec::RR, [], :style => :foo
+    #
+    def invoke(name=nil, *args)
+      if name.nil?
+        warn "[Thor] Calling invoke() without argument is deprecated. Please use invoke_all instead.\n#{caller.join("\n")}"
+        return invoke_all
+      end
+
+      args.unshift(nil) if Array === args.first || NilClass === args.first
+      command, args, opts, config = args
+
+      klass, command = _retrieve_class_and_command(name, command)
+      raise "Expected Thor class, got #{klass}" unless klass <= Thor::Base
+
+      args, opts, config = _parse_initialization_options(args, opts, config)
+      klass.send(:dispatch, command, args, opts, config) do |instance|
+        instance.parent_options = options
+      end
+    end
+
+    # Invoke the given command if the given args.
+    def invoke_command(command, *args) #:nodoc:
+      current = @_invocations[self.class]
+
+      unless current.include?(command.name)
+        current << command.name
+        command.run(self, *args)
+      end
+    end
+    alias invoke_task invoke_command
+
+    # Invoke all commands for the current instance.
+    def invoke_all #:nodoc:
+      self.class.all_commands.map { |_, command| invoke_command(command) }
+    end
+
+    # Invokes using shell padding.
+    def invoke_with_padding(*args)
+      with_padding { invoke(*args) }
+    end
+
+    protected
+
+      # Configuration values that are shared between invocations.
+      def _shared_configuration #:nodoc:
+        { :invocations => @_invocations }
+      end
+
+      # This method simply retrieves the class and command to be invoked.
+      # If the name is nil or the given name is a command in the current class,
+      # use the given name and return self as class. Otherwise, call
+      # prepare_for_invocation in the current class.
+      def _retrieve_class_and_command(name, sent_command=nil) #:nodoc:
+        case
+        when name.nil?
+          [self.class, nil]
+        when self.class.all_commands[name.to_s]
+          [self.class, name.to_s]
+        else
+          klass, command = self.class.prepare_for_invocation(nil, name)
+          [klass, command || sent_command]
+        end
+      end
+      alias _retrieve_class_and_task _retrieve_class_and_command
+
+      # Initialize klass using values stored in the @_initializer.
+      def _parse_initialization_options(args, opts, config) #:nodoc:
+        stored_args, stored_opts, stored_config = @_initializer
+
+        args ||= stored_args.dup
+        opts ||= stored_opts.dup
+
+        config ||= {}
+        config = stored_config.merge(_shared_configuration).merge!(config)
+
+        [ args, opts, config ]
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser.rb
new file mode 100644
index 0000000..57a3f6e
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser.rb
@@ -0,0 +1,4 @@
+require 'thor/parser/argument'
+require 'thor/parser/arguments'
+require 'thor/parser/option'
+require 'thor/parser/options'
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser/argument.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser/argument.rb
new file mode 100644
index 0000000..39ef9f2
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser/argument.rb
@@ -0,0 +1,74 @@
+class Thor
+  class Argument #:nodoc:
+    VALID_TYPES = [ :numeric, :hash, :array, :string ]
+
+    attr_reader :name, :description, :enum, :required, :type, :default, :banner
+    alias :human_name :name
+
+    def initialize(name, options={})
+      class_name = self.class.name.split("::").last
+
+      type = options[:type]
+
+      raise ArgumentError, "#{class_name} name can't be nil."                         if name.nil?
+      raise ArgumentError, "Type :#{type} is not valid for #{class_name.downcase}s."  if type && !valid_type?(type)
+
+      @name        = name.to_s
+      @description = options[:desc]
+      @required    = options.key?(:required) ? options[:required] : true
+      @type        = (type || :string).to_sym
+      @default     = options[:default]
+      @banner      = options[:banner] || default_banner
+      @enum        = options[:enum]
+
+      validate! # Trigger specific validations
+    end
+
+    def usage
+      required? ? banner : "[#{banner}]"
+    end
+
+    def required?
+      required
+    end
+
+    def show_default?
+      case default
+      when Array, String, Hash
+        !default.empty?
+      else
+        default
+      end
+    end
+
+    protected
+
+      def validate!
+        if required? && !default.nil?
+          raise ArgumentError, "An argument cannot be required and have default value."
+        elsif @enum && !@enum.is_a?(Array)
+          raise ArgumentError, "An argument cannot have an enum other than an array."
+        end
+      end
+
+      def valid_type?(type)
+        self.class::VALID_TYPES.include?(type.to_sym)
+      end
+
+      def default_banner
+        case type
+        when :boolean
+          nil
+        when :string, :default
+          human_name.upcase
+        when :numeric
+          "N"
+        when :hash
+          "key:value"
+        when :array
+          "one two three"
+        end
+      end
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser/arguments.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser/arguments.rb
new file mode 100644
index 0000000..f86166d
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser/arguments.rb
@@ -0,0 +1,171 @@
+class Thor
+  class Arguments #:nodoc:
+    NUMERIC = /(\d*\.\d+|\d+)/
+
+    # Receives an array of args and returns two arrays, one with arguments
+    # and one with switches.
+    #
+    def self.split(args)
+      arguments = []
+
+      args.each do |item|
+        break if item =~ /^-/
+        arguments << item
+      end
+
+      return arguments, args[Range.new(arguments.size, -1)]
+    end
+
+    def self.parse(*args)
+      to_parse = args.pop
+      new(*args).parse(to_parse)
+    end
+
+    # Takes an array of Thor::Argument objects.
+    #
+    def initialize(arguments=[])
+      @assigns, @non_assigned_required = {}, []
+      @switches = arguments
+
+      arguments.each do |argument|
+        if argument.default != nil
+          @assigns[argument.human_name] = argument.default
+        elsif argument.required?
+          @non_assigned_required << argument
+        end
+      end
+    end
+
+    def parse(args)
+      @pile = args.dup
+
+      @switches.each do |argument|
+        break unless peek
+        @non_assigned_required.delete(argument)
+        @assigns[argument.human_name] = send(:"parse_#{argument.type}", argument.human_name)
+      end
+
+      check_requirement!
+      @assigns
+    end
+
+    def remaining
+      @pile
+    end
+
+    private
+
+      def no_or_skip?(arg)
+        arg =~ /^--(no|skip)-([-\w]+)$/
+        $2
+      end
+
+      def last?
+        @pile.empty?
+      end
+
+      def peek
+        @pile.first
+      end
+
+      def shift
+        @pile.shift
+      end
+
+      def unshift(arg)
+        unless arg.kind_of?(Array)
+          @pile.unshift(arg)
+        else
+          @pile = arg + @pile
+        end
+      end
+
+      def current_is_value?
+        peek && peek.to_s !~ /^-/
+      end
+
+      # Runs through the argument array getting strings that contains ":" and
+      # mark it as a hash:
+      #
+      #   [ "name:string", "age:integer" ]
+      #
+      # Becomes:
+      #
+      #   { "name" => "string", "age" => "integer" }
+      #
+      def parse_hash(name)
+        return shift if peek.is_a?(Hash)
+        hash = {}
+
+        while current_is_value? && peek.include?(?:)
+          key, value = shift.split(':',2)
+          hash[key] = value
+        end
+        hash
+      end
+
+      # Runs through the argument array getting all strings until no string is
+      # found or a switch is found.
+      #
+      #   ["a", "b", "c"]
+      #
+      # And returns it as an array:
+      #
+      #   ["a", "b", "c"]
+      #
+      def parse_array(name)
+        return shift if peek.is_a?(Array)
+        array = []
+
+        while current_is_value?
+          array << shift
+        end
+        array
+      end
+
+      # Check if the peek is numeric format and return a Float or Integer.
+      # Otherwise raises an error.
+      #
+      def parse_numeric(name)
+        return shift if peek.is_a?(Numeric)
+
+        unless peek =~ NUMERIC && $& == peek
+          raise MalformattedArgumentError, "Expected numeric value for '#{name}'; got #{peek.inspect}"
+        end
+
+        $&.index('.') ? shift.to_f : shift.to_i
+      end
+
+      # Parse string:
+      # for --string-arg, just return the current value in the pile
+      # for --no-string-arg, nil
+      #
+      def parse_string(name)
+        if no_or_skip?(name)
+          nil
+        else
+          value = shift
+          if @switches.is_a?(Hash) && switch = @switches[name]
+            if switch.enum && !switch.enum.include?(value)
+              raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
+            end
+          end
+          value
+        end
+      end
+
+      # Raises an error if @non_assigned_required array is not empty.
+      #
+      def check_requirement!
+        unless @non_assigned_required.empty?
+          names = @non_assigned_required.map do |o|
+            o.respond_to?(:switch_name) ? o.switch_name : o.human_name
+          end.join("', '")
+
+          class_name = self.class.name.split('::').last.downcase
+          raise RequiredArgumentMissingError, "No value provided for required #{class_name} '#{names}'"
+        end
+      end
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser/option.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser/option.rb
new file mode 100644
index 0000000..4781069
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser/option.rb
@@ -0,0 +1,121 @@
+class Thor
+  class Option < Argument #:nodoc:
+    attr_reader :aliases, :group, :lazy_default, :hide
+
+    VALID_TYPES = [:boolean, :numeric, :hash, :array, :string]
+
+    def initialize(name, options={})
+      options[:required] = false unless options.key?(:required)
+      super
+      @lazy_default = options[:lazy_default]
+      @group        = options[:group].to_s.capitalize if options[:group]
+      @aliases      = Array(options[:aliases])
+      @hide         = options[:hide]
+    end
+
+    # This parse quick options given as method_options. It makes several
+    # assumptions, but you can be more specific using the option method.
+    #
+    #   parse :foo => "bar"
+    #   #=> Option foo with default value bar
+    #
+    #   parse [:foo, :baz] => "bar"
+    #   #=> Option foo with default value bar and alias :baz
+    #
+    #   parse :foo => :required
+    #   #=> Required option foo without default value
+    #
+    #   parse :foo => 2
+    #   #=> Option foo with default value 2 and type numeric
+    #
+    #   parse :foo => :numeric
+    #   #=> Option foo without default value and type numeric
+    #
+    #   parse :foo => true
+    #   #=> Option foo with default value true and type boolean
+    #
+    # The valid types are :boolean, :numeric, :hash, :array and :string. If none
+    # is given a default type is assumed. This default type accepts arguments as
+    # string (--foo=value) or booleans (just --foo).
+    #
+    # By default all options are optional, unless :required is given.
+    #
+    def self.parse(key, value)
+      if key.is_a?(Array)
+        name, *aliases = key
+      else
+        name, aliases = key, []
+      end
+
+      name    = name.to_s
+      default = value
+
+      type = case value
+      when Symbol
+        default = nil
+        if VALID_TYPES.include?(value)
+          value
+        elsif required = (value == :required)
+          :string
+        end
+      when TrueClass, FalseClass
+        :boolean
+      when Numeric
+        :numeric
+      when Hash, Array, String
+        value.class.name.downcase.to_sym
+      end
+      self.new(name.to_s, :required => required, :type => type, :default => default, :aliases => aliases)
+    end
+
+    def switch_name
+      @switch_name ||= dasherized? ? name : dasherize(name)
+    end
+
+    def human_name
+      @human_name ||= dasherized? ? undasherize(name) : name
+    end
+
+    def usage(padding=0)
+      sample = if banner && !banner.to_s.empty?
+        "#{switch_name}=#{banner}"
+      else
+        switch_name
+      end
+
+      sample = "[#{sample}]" unless required?
+
+      if aliases.empty?
+        (" " * padding) << sample
+      else
+        "#{aliases.join(', ')}, #{sample}"
+      end
+    end
+
+    VALID_TYPES.each do |type|
+      class_eval <<-RUBY, __FILE__, __LINE__ + 1
+        def #{type}?
+          self.type == #{type.inspect}
+        end
+      RUBY
+    end
+
+  protected
+
+    def validate!
+      raise ArgumentError, "An option cannot be boolean and required." if boolean? && required?
+    end
+
+    def dasherized?
+      name.index('-') == 0
+    end
+
+    def undasherize(str)
+      str.sub(/^-{1,2}/, '')
+    end
+
+    def dasherize(str)
+      (str.length > 1 ? "--" : "-") + str.gsub('_', '-')
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser/options.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser/options.rb
new file mode 100644
index 0000000..9542e81
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/parser/options.rb
@@ -0,0 +1,218 @@
+class Thor
+  class Options < Arguments #:nodoc:
+    LONG_RE     = /^(--\w+(?:-\w+)*)$/
+    SHORT_RE    = /^(-[a-z])$/i
+    EQ_RE       = /^(--\w+(?:-\w+)*|-[a-z])=(.*)$/i
+    SHORT_SQ_RE = /^-([a-z]{2,})$/i # Allow either -x -v or -xv style for single char args
+    SHORT_NUM   = /^(-[a-z])#{NUMERIC}$/i
+    OPTS_END    = '--'.freeze
+
+    # Receives a hash and makes it switches.
+    def self.to_switches(options)
+      options.map do |key, value|
+        case value
+        when true
+          "--#{key}"
+        when Array
+          "--#{key} #{value.map{ |v| v.inspect }.join(' ')}"
+        when Hash
+          "--#{key} #{value.map{ |k,v| "#{k}:#{v}" }.join(' ')}"
+        when nil, false
+          ""
+        else
+          "--#{key} #{value.inspect}"
+        end
+      end.join(" ")
+    end
+
+    # Takes a hash of Thor::Option and a hash with defaults.
+    #
+    # If +stop_on_unknown+ is true, #parse will stop as soon as it encounters
+    # an unknown option or a regular argument.
+    def initialize(hash_options={}, defaults={}, stop_on_unknown=false)
+      @stop_on_unknown = stop_on_unknown
+      options = hash_options.values
+      super(options)
+
+      # Add defaults
+      defaults.each do |key, value|
+        @assigns[key.to_s] = value
+        @non_assigned_required.delete(hash_options[key])
+      end
+
+      @shorts, @switches, @extra = {}, {}, []
+
+      options.each do |option|
+        @switches[option.switch_name] = option
+
+        option.aliases.each do |short|
+          name = short.to_s.sub(/^(?!\-)/, '-')
+          @shorts[name] ||= option.switch_name
+        end
+      end
+    end
+
+    def remaining
+      @extra
+    end
+
+    def peek
+      return super unless @parsing_options
+
+      result = super
+      if result == OPTS_END
+        shift
+        @parsing_options = false
+        super
+      else
+        result
+      end
+    end
+
+    def parse(args)
+      @pile = args.dup
+      @parsing_options = true
+
+      while peek
+        if parsing_options?
+          match, is_switch = current_is_switch?
+          shifted = shift
+
+          if is_switch
+            case shifted
+            when SHORT_SQ_RE
+              unshift($1.split('').map { |f| "-#{f}" })
+              next
+            when EQ_RE, SHORT_NUM
+              unshift($2)
+              switch = $1
+            when LONG_RE, SHORT_RE
+              switch = $1
+            end
+
+            switch = normalize_switch(switch)
+            option = switch_option(switch)
+            @assigns[option.human_name] = parse_peek(switch, option)
+          elsif @stop_on_unknown
+            @parsing_options = false
+            @extra << shifted
+            @extra << shift while peek
+            break
+          elsif match
+            @extra << shifted
+            @extra << shift while peek && peek !~ /^-/
+          else
+            @extra << shifted
+          end
+        else
+          @extra << shift
+        end
+      end
+
+      check_requirement!
+
+      assigns = Thor::CoreExt::HashWithIndifferentAccess.new(@assigns)
+      assigns.freeze
+      assigns
+    end
+
+    def check_unknown!
+      # an unknown option starts with - or -- and has no more --'s afterward.
+      unknown = @extra.select { |str| str =~ /^--?(?:(?!--).)*$/ }
+      raise UnknownArgumentError, "Unknown switches '#{unknown.join(', ')}'" unless unknown.empty?
+    end
+
+    protected
+
+      # Check if the current value in peek is a registered switch.
+      #
+      # Two booleans are returned.  The first is true if the current value
+      # starts with a hyphen; the second is true if it is a registered switch.
+      def current_is_switch?
+        case peek
+        when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM
+          [true, switch?($1)]
+        when SHORT_SQ_RE
+          [true, $1.split('').any? { |f| switch?("-#{f}") }]
+        else
+          [false, false]
+        end
+      end
+
+      def current_is_switch_formatted?
+        case peek
+        when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM, SHORT_SQ_RE
+          true
+        else
+          false
+        end
+      end
+
+      def current_is_value?
+        peek && (!parsing_options? || super)
+      end
+
+      def switch?(arg)
+        switch_option(normalize_switch(arg))
+      end
+
+      def switch_option(arg)
+        if match = no_or_skip?(arg)
+          @switches[arg] || @switches["--#{match}"]
+        else
+          @switches[arg]
+        end
+      end
+
+      # Check if the given argument is actually a shortcut.
+      #
+      def normalize_switch(arg)
+        (@shorts[arg] || arg).tr('_', '-')
+      end
+
+      def parsing_options?
+        peek
+        @parsing_options
+      end
+
+      # Parse boolean values which can be given as --foo=true, --foo or --no-foo.
+      #
+      def parse_boolean(switch)
+        if current_is_value?
+          if ["true", "TRUE", "t", "T", true].include?(peek)
+            shift
+            true
+          elsif ["false", "FALSE", "f", "F", false].include?(peek)
+            shift
+            false
+          else
+            true
+          end
+        else
+          @switches.key?(switch) || !no_or_skip?(switch)
+        end
+      end
+
+      # Parse the value at the peek analyzing if it requires an input or not.
+      #
+      def parse_peek(switch, option)
+        if parsing_options? && (current_is_switch_formatted? || last?)
+          if option.boolean?
+            # No problem for boolean types
+          elsif no_or_skip?(switch)
+            return nil # User set value to nil
+          elsif option.string? && !option.required?
+            # Return the default if there is one, else the human name
+            return option.lazy_default || option.default || option.human_name
+          elsif option.lazy_default
+            return option.lazy_default
+          else
+            raise MalformattedArgumentError, "No value provided for option '#{switch}'"
+          end
+        end
+
+        @non_assigned_required.delete(option)
+        send(:"parse_#{option.type}", switch)
+      end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/rake_compat.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/rake_compat.rb
new file mode 100644
index 0000000..fcb3b24
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/rake_compat.rb
@@ -0,0 +1,72 @@
+require 'rake'
+require 'rake/dsl_definition'
+
+class Thor
+  # Adds a compatibility layer to your Thor classes which allows you to use
+  # rake package tasks. For example, to use rspec rake tasks, one can do:
+  #
+  #   require 'thor/rake_compat'
+  #   require 'rspec/core/rake_task'
+  #
+  #   class Default < Thor
+  #     include Thor::RakeCompat
+  #
+  #     RSpec::Core::RakeTask.new(:spec) do |t|
+  #       t.spec_opts = ['--options', "./.rspec"]
+  #       t.spec_files = FileList['spec/**/*_spec.rb']
+  #     end
+  #   end
+  #
+  module RakeCompat
+    include Rake::DSL if defined?(Rake::DSL)
+
+    def self.rake_classes
+      @rake_classes ||= []
+    end
+
+    def self.included(base)
+      # Hack. Make rakefile point to invoker, so rdoc task is generated properly.
+      rakefile = File.basename(caller[0].match(/(.*):\d+/)[1])
+      Rake.application.instance_variable_set(:@rakefile, rakefile)
+      self.rake_classes << base
+    end
+  end
+end
+
+# override task on (main), for compatibility with Rake 0.9
+self.instance_eval do
+  alias rake_namespace namespace
+
+  def task(*)
+    task = super
+
+    if klass = Thor::RakeCompat.rake_classes.last
+      non_namespaced_name = task.name.split(':').last
+
+      description = non_namespaced_name
+      description << task.arg_names.map{ |n| n.to_s.upcase }.join(' ')
+      description.strip!
+
+      klass.desc description, Rake.application.last_description || non_namespaced_name
+      Rake.application.last_description = nil
+      klass.send :define_method, non_namespaced_name do |*args|
+        Rake::Task[task.name.to_sym].invoke(*args)
+      end
+    end
+
+    task
+  end
+
+  def namespace(name)
+    if klass = Thor::RakeCompat.rake_classes.last
+      const_name = Thor::Util.camel_case(name.to_s).to_sym
+      klass.const_set(const_name, Class.new(Thor))
+      new_klass = klass.const_get(const_name)
+      Thor::RakeCompat.rake_classes << new_klass
+    end
+
+    super
+    Thor::RakeCompat.rake_classes.pop
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/runner.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/runner.rb
new file mode 100644
index 0000000..e51ceb5
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/runner.rb
@@ -0,0 +1,322 @@
+require 'thor'
+require 'thor/group'
+require 'thor/core_ext/io_binary_read'
+
+require 'fileutils'
+require 'open-uri'
+require 'yaml'
+require 'digest/md5'
+require 'pathname'
+
+class Thor::Runner < Thor #:nodoc:
+  map "-T" => :list, "-i" => :install, "-u" => :update, "-v" => :version
+
+  # Override Thor#help so it can give information about any class and any method.
+  #
+  def help(meth = nil)
+    if meth && !self.respond_to?(meth)
+      initialize_thorfiles(meth)
+      klass, command = Thor::Util.find_class_and_command_by_namespace(meth)
+      self.class.handle_no_command_error(command, false) if klass.nil?
+      klass.start(["-h", command].compact, :shell => self.shell)
+    else
+      super
+    end
+  end
+
+  # If a command is not found on Thor::Runner, method missing is invoked and
+  # Thor::Runner is then responsible for finding the command in all classes.
+  #
+  def method_missing(meth, *args)
+    meth = meth.to_s
+    initialize_thorfiles(meth)
+    klass, command = Thor::Util.find_class_and_command_by_namespace(meth)
+    self.class.handle_no_command_error(command, false) if klass.nil?
+    args.unshift(command) if command
+    klass.start(args, :shell => self.shell)
+  end
+
+  desc "install NAME", "Install an optionally named Thor file into your system commands"
+  method_options :as => :string, :relative => :boolean, :force => :boolean
+  def install(name)
+    initialize_thorfiles
+
+    # If a directory name is provided as the argument, look for a 'main.thor'
+    # command in said directory.
+    begin
+      if File.directory?(File.expand_path(name))
+        base, package = File.join(name, "main.thor"), :directory
+        contents      = open(base) {|input| input.read }
+      else
+        base, package = name, :file
+        contents      = open(name) {|input| input.read }
+      end
+    rescue OpenURI::HTTPError
+      raise Error, "Error opening URI '#{name}'"
+    rescue Errno::ENOENT
+      raise Error, "Error opening file '#{name}'"
+    end
+
+    say "Your Thorfile contains:"
+    say contents
+
+    unless options["force"]
+      return false if no?("Do you wish to continue [y/N]?")
+    end
+
+    as = options["as"] || begin
+      first_line = contents.split("\n")[0]
+      (match = first_line.match(/\s*#\s*module:\s*([^\n]*)/)) ? match[1].strip : nil
+    end
+
+    unless as
+      basename = File.basename(name)
+      as = ask("Please specify a name for #{name} in the system repository [#{basename}]:")
+      as = basename if as.empty?
+    end
+
+    location = if options[:relative] || name =~ /^https?:\/\//
+      name
+    else
+      File.expand_path(name)
+    end
+
+    thor_yaml[as] = {
+      :filename   => Digest::MD5.hexdigest(name + as),
+      :location   => location,
+      :namespaces => Thor::Util.namespaces_in_content(contents, base)
+    }
+
+    save_yaml(thor_yaml)
+    say "Storing thor file in your system repository"
+    destination = File.join(thor_root, thor_yaml[as][:filename])
+
+    if package == :file
+      File.open(destination, "w") { |f| f.puts contents }
+    else
+      FileUtils.cp_r(name, destination)
+    end
+
+    thor_yaml[as][:filename] # Indicate success
+  end
+
+  desc "version", "Show Thor version"
+  def version
+    require 'thor/version'
+    say "Thor #{Thor::VERSION}"
+  end
+
+  desc "uninstall NAME", "Uninstall a named Thor module"
+  def uninstall(name)
+    raise Error, "Can't find module '#{name}'" unless thor_yaml[name]
+    say "Uninstalling #{name}."
+    FileUtils.rm_rf(File.join(thor_root, "#{thor_yaml[name][:filename]}"))
+
+    thor_yaml.delete(name)
+    save_yaml(thor_yaml)
+
+    puts "Done."
+  end
+
+  desc "update NAME", "Update a Thor file from its original location"
+  def update(name)
+    raise Error, "Can't find module '#{name}'" if !thor_yaml[name] || !thor_yaml[name][:location]
+
+    say "Updating '#{name}' from #{thor_yaml[name][:location]}"
+
+    old_filename = thor_yaml[name][:filename]
+    self.options = self.options.merge("as" => name)
+
+    if File.directory? File.expand_path(name)
+      FileUtils.rm_rf(File.join(thor_root, old_filename))
+
+      thor_yaml.delete(old_filename)
+      save_yaml(thor_yaml)
+
+      filename = install(name)
+    else
+      filename = install(thor_yaml[name][:location])
+    end
+
+    unless filename == old_filename
+      File.delete(File.join(thor_root, old_filename))
+    end
+  end
+
+  desc "installed", "List the installed Thor modules and commands"
+  method_options :internal => :boolean
+  def installed
+    initialize_thorfiles(nil, true)
+    display_klasses(true, options["internal"])
+  end
+
+  desc "list [SEARCH]", "List the available thor commands (--substring means .*SEARCH)"
+  method_options :substring => :boolean, :group => :string, :all => :boolean, :debug => :boolean
+  def list(search="")
+    initialize_thorfiles
+
+    search = ".*#{search}" if options["substring"]
+    search = /^#{search}.*/i
+    group  = options[:group] || "standard"
+
+    klasses = Thor::Base.subclasses.select do |k|
+      (options[:all] || k.group == group) && k.namespace =~ search
+    end
+
+    display_klasses(false, false, klasses)
+  end
+
+  private
+
+    def self.banner(command, all = false, subcommand = false)
+      "thor " + command.formatted_usage(self, all, subcommand)
+    end
+
+    def thor_root
+      Thor::Util.thor_root
+    end
+
+    def thor_yaml
+      @thor_yaml ||= begin
+        yaml_file = File.join(thor_root, "thor.yml")
+        yaml = YAML.load_file(yaml_file) if File.exists?(yaml_file)
+        yaml || {}
+      end
+    end
+
+    # Save the yaml file. If none exists in thor root, creates one.
+    #
+    def save_yaml(yaml)
+      yaml_file = File.join(thor_root, "thor.yml")
+
+      unless File.exists?(yaml_file)
+        FileUtils.mkdir_p(thor_root)
+        yaml_file = File.join(thor_root, "thor.yml")
+        FileUtils.touch(yaml_file)
+      end
+
+      File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml }
+    end
+
+    def self.exit_on_failure?
+      true
+    end
+
+    # Load the Thorfiles. If relevant_to is supplied, looks for specific files
+    # in the thor_root instead of loading them all.
+    #
+    # By default, it also traverses the current path until find Thor files, as
+    # described in thorfiles. This look up can be skipped by suppliying
+    # skip_lookup true.
+    #
+    def initialize_thorfiles(relevant_to=nil, skip_lookup=false)
+      thorfiles(relevant_to, skip_lookup).each do |f|
+        Thor::Util.load_thorfile(f, nil, options[:debug]) unless Thor::Base.subclass_files.keys.include?(File.expand_path(f))
+      end
+    end
+
+    # Finds Thorfiles by traversing from your current directory down to the root
+    # directory of your system. If at any time we find a Thor file, we stop.
+    #
+    # We also ensure that system-wide Thorfiles are loaded first, so local
+    # Thorfiles can override them.
+    #
+    # ==== Example
+    #
+    # If we start at /Users/wycats/dev/thor ...
+    #
+    # 1. /Users/wycats/dev/thor
+    # 2. /Users/wycats/dev
+    # 3. /Users/wycats <-- we find a Thorfile here, so we stop
+    #
+    # Suppose we start at c:\Documents and Settings\james\dev\thor ...
+    #
+    # 1. c:\Documents and Settings\james\dev\thor
+    # 2. c:\Documents and Settings\james\dev
+    # 3. c:\Documents and Settings\james
+    # 4. c:\Documents and Settings
+    # 5. c:\ <-- no Thorfiles found!
+    #
+    def thorfiles(relevant_to=nil, skip_lookup=false)
+      thorfiles = []
+
+      unless skip_lookup
+        Pathname.pwd.ascend do |path|
+          thorfiles = Thor::Util.globs_for(path).map { |g| Dir[g] }.flatten
+          break unless thorfiles.empty?
+        end
+      end
+
+      files  = (relevant_to ? thorfiles_relevant_to(relevant_to) : Thor::Util.thor_root_glob)
+      files += thorfiles
+      files -= ["#{thor_root}/thor.yml"]
+
+      files.map! do |file|
+        File.directory?(file) ? File.join(file, "main.thor") : file
+      end
+    end
+
+    # Load Thorfiles relevant to the given method. If you provide "foo:bar" it
+    # will load all thor files in the thor.yaml that has "foo" e "foo:bar"
+    # namespaces registered.
+    #
+    def thorfiles_relevant_to(meth)
+      lookup = [ meth, meth.split(":")[0...-1].join(":") ]
+
+      files = thor_yaml.select do |k, v|
+        v[:namespaces] && !(v[:namespaces] & lookup).empty?
+      end
+
+      files.map { |k, v| File.join(thor_root, "#{v[:filename]}") }
+    end
+
+    # Display information about the given klasses. If with_module is given,
+    # it shows a table with information extracted from the yaml file.
+    #
+    def display_klasses(with_modules=false, show_internal=false, klasses=Thor::Base.subclasses)
+      klasses -= [Thor, Thor::Runner, Thor::Group] unless show_internal
+
+      raise Error, "No Thor commands available" if klasses.empty?
+      show_modules if with_modules && !thor_yaml.empty?
+
+      list = Hash.new { |h,k| h[k] = [] }
+      groups = klasses.select { |k| k.ancestors.include?(Thor::Group) }
+
+      # Get classes which inherit from Thor
+      (klasses - groups).each { |k| list[k.namespace.split(":").first] += k.printable_commands(false) }
+
+      # Get classes which inherit from Thor::Base
+      groups.map! { |k| k.printable_commands(false).first }
+      list["root"] = groups
+
+      # Order namespaces with default coming first
+      list = list.sort{ |a,b| a[0].sub(/^default/, '') <=> b[0].sub(/^default/, '') }
+      list.each { |n, commands| display_commands(n, commands) unless commands.empty? }
+    end
+
+    def display_commands(namespace, list) #:nodoc:
+      list.sort!{ |a,b| a[0] <=> b[0] }
+
+      say shell.set_color(namespace, :blue, true)
+      say "-" * namespace.size
+
+      print_table(list, :truncate => true)
+      say
+    end
+    alias display_tasks display_commands
+
+    def show_modules #:nodoc:
+      info  = []
+      labels = ["Modules", "Namespaces"]
+
+      info << labels
+      info << [ "-" * labels[0].size, "-" * labels[1].size ]
+
+      thor_yaml.each do |name, hash|
+        info << [ name, hash[:namespaces].join(", ") ]
+      end
+
+      print_table info
+      say ""
+    end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell.rb
new file mode 100644
index 0000000..a718c53
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell.rb
@@ -0,0 +1,88 @@
+require 'rbconfig'
+
+class Thor
+  module Base
+    # Returns the shell used in all Thor classes. If you are in a Unix platform
+    # it will use a colored log, otherwise it will use a basic one without color.
+    #
+    def self.shell
+      @shell ||= if ENV['THOR_SHELL'] && ENV['THOR_SHELL'].size > 0
+        Thor::Shell.const_get(ENV['THOR_SHELL'])
+      elsif ((RbConfig::CONFIG['host_os'] =~ /mswin|mingw/) && !(ENV['ANSICON']))
+        Thor::Shell::Basic
+      else
+        Thor::Shell::Color
+      end
+    end
+
+    # Sets the shell used in all Thor classes.
+    #
+    def self.shell=(klass)
+      @shell = klass
+    end
+  end
+
+  module Shell
+    SHELL_DELEGATED_METHODS = [:ask, :error, :set_color, :yes?, :no?, :say, :say_status, :print_in_columns, :print_table, :print_wrapped, :file_collision, :terminal_width]
+
+    autoload :Basic, 'thor/shell/basic'
+    autoload :Color, 'thor/shell/color'
+    autoload :HTML,  'thor/shell/html'
+
+    # Add shell to initialize config values.
+    #
+    # ==== Configuration
+    # shell<Object>:: An instance of the shell to be used.
+    #
+    # ==== Examples
+    #
+    #   class MyScript < Thor
+    #     argument :first, :type => :numeric
+    #   end
+    #
+    #   MyScript.new [1.0], { :foo => :bar }, :shell => Thor::Shell::Basic.new
+    #
+    def initialize(args=[], options={}, config={})
+      super
+      self.shell = config[:shell]
+      self.shell.base ||= self if self.shell.respond_to?(:base)
+    end
+
+    # Holds the shell for the given Thor instance. If no shell is given,
+    # it gets a default shell from Thor::Base.shell.
+    def shell
+      @shell ||= Thor::Base.shell.new
+    end
+
+    # Sets the shell for this thor class.
+    def shell=(shell)
+      @shell = shell
+    end
+
+    # Common methods that are delegated to the shell.
+    SHELL_DELEGATED_METHODS.each do |method|
+      module_eval <<-METHOD, __FILE__, __LINE__
+        def #{method}(*args,&block)
+          shell.#{method}(*args,&block)
+        end
+      METHOD
+    end
+
+    # Yields the given block with padding.
+    def with_padding
+      shell.padding += 1
+      yield
+    ensure
+      shell.padding -= 1
+    end
+
+    protected
+
+      # Allow shell to be shared between invocations.
+      #
+      def _shared_configuration #:nodoc:
+        super.merge!(:shell => self.shell)
+      end
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell/basic.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell/basic.rb
new file mode 100644
index 0000000..1e1e9be
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell/basic.rb
@@ -0,0 +1,393 @@
+require 'tempfile'
+
+class Thor
+  module Shell
+    class Basic
+      attr_accessor :base
+      attr_reader   :padding
+
+      # Initialize base, mute and padding to nil.
+      #
+      def initialize #:nodoc:
+        @base, @mute, @padding = nil, false, 0
+      end
+
+      # Mute everything that's inside given block
+      #
+      def mute
+        @mute = true
+        yield
+      ensure
+        @mute = false
+      end
+
+      # Check if base is muted
+      #
+      def mute?
+        @mute
+      end
+
+      # Sets the output padding, not allowing less than zero values.
+      #
+      def padding=(value)
+        @padding = [0, value].max
+      end
+
+      # Asks something to the user and receives a response.
+      #
+      # If asked to limit the correct responses, you can pass in an
+      # array of acceptable answers.  If one of those is not supplied,
+      # they will be shown a message stating that one of those answers
+      # must be given and re-asked the question.
+      #
+      # ==== Example
+      # ask("What is your name?")
+      #
+      # ask("What is your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])
+      #
+      def ask(statement, *args)
+        options = args.last.is_a?(Hash) ? args.pop : {}
+
+        options[:limited_to] ? ask_filtered(statement, options[:limited_to], *args) : ask_simply(statement, *args)
+      end
+
+      # Say (print) something to the user. If the sentence ends with a whitespace
+      # or tab character, a new line is not appended (print + flush). Otherwise
+      # are passed straight to puts (behavior got from Highline).
+      #
+      # ==== Example
+      # say("I know you knew that.")
+      #
+      def say(message="", color=nil, force_new_line=(message.to_s !~ /( |\t)\Z/))
+        message = message.to_s
+
+        message = set_color(message, *color) if color && can_display_colors?
+
+        spaces = "  " * padding
+
+        if force_new_line
+          stdout.puts(spaces + message)
+        else
+          stdout.print(spaces + message)
+        end
+        stdout.flush
+      end
+
+      # Say a status with the given color and appends the message. Since this
+      # method is used frequently by actions, it allows nil or false to be given
+      # in log_status, avoiding the message from being shown. If a Symbol is
+      # given in log_status, it's used as the color.
+      #
+      def say_status(status, message, log_status=true)
+        return if quiet? || log_status == false
+        spaces = "  " * (padding + 1)
+        color  = log_status.is_a?(Symbol) ? log_status : :green
+
+        status = status.to_s.rjust(12)
+        status = set_color status, color, true if color
+
+        stdout.puts "#{status}#{spaces}#{message}"
+        stdout.flush
+      end
+
+      # Make a question the to user and returns true if the user replies "y" or
+      # "yes".
+      #
+      def yes?(statement, color=nil)
+        !!(ask(statement, color) =~ is?(:yes))
+      end
+
+      # Make a question the to user and returns true if the user replies "n" or
+      # "no".
+      #
+      def no?(statement, color=nil)
+        !yes?(statement, color)
+      end
+
+      # Prints values in columns
+      #
+      # ==== Parameters
+      # Array[String, String, ...]
+      #
+      def print_in_columns(array)
+        return if array.empty?
+        colwidth = (array.map{|el| el.to_s.size}.max || 0) + 2
+        array.each_with_index do |value, index|
+          # Don't output trailing spaces when printing the last column
+          if ((((index + 1) % (terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
+            stdout.puts value
+          else
+            stdout.printf("%-#{colwidth}s", value)
+          end
+        end
+      end
+
+      # Prints a table.
+      #
+      # ==== Parameters
+      # Array[Array[String, String, ...]]
+      #
+      # ==== Options
+      # indent<Integer>:: Indent the first column by indent value.
+      # colwidth<Integer>:: Force the first column to colwidth spaces wide.
+      #
+      def print_table(array, options={})
+        return if array.empty?
+
+        formats, indent, colwidth = [], options[:indent].to_i, options[:colwidth]
+        options[:truncate] = terminal_width if options[:truncate] == true
+
+        formats << "%-#{colwidth + 2}s" if colwidth
+        start = colwidth ? 1 : 0
+
+        colcount = array.max{|a,b| a.size <=> b.size }.size
+
+        maximas = []
+
+        start.upto(colcount - 1) do |index|
+          maxima = array.map {|row| row[index] ? row[index].to_s.size : 0 }.max
+          maximas << maxima
+          if index == colcount - 1
+            # Don't output 2 trailing spaces when printing the last column
+            formats << "%-s"
+          else
+            formats << "%-#{maxima + 2}s"
+          end
+        end
+
+        formats[0] = formats[0].insert(0, " " * indent)
+        formats << "%s"
+
+        array.each do |row|
+          sentence = ""
+
+          row.each_with_index do |column, index|
+            maxima = maximas[index]
+
+            if column.is_a?(Numeric)
+              if index == row.size - 1
+                # Don't output 2 trailing spaces when printing the last column
+                f = "%#{maxima}s"
+              else
+                f = "%#{maxima}s  "
+              end
+            else
+              f = formats[index]
+            end
+            sentence << f % column.to_s
+          end
+
+          sentence = truncate(sentence, options[:truncate]) if options[:truncate]
+          stdout.puts sentence
+        end
+      end
+
+      # Prints a long string, word-wrapping the text to the current width of the
+      # terminal display. Ideal for printing heredocs.
+      #
+      # ==== Parameters
+      # String
+      #
+      # ==== Options
+      # indent<Integer>:: Indent each line of the printed paragraph by indent value.
+      #
+      def print_wrapped(message, options={})
+        indent = options[:indent] || 0
+        width = terminal_width - indent
+        paras = message.split("\n\n")
+
+        paras.map! do |unwrapped|
+          unwrapped.strip.gsub(/\n/, " ").squeeze(" ").
+          gsub(/.{1,#{width}}(?:\s|\Z)/){($& + 5.chr).
+          gsub(/\n\005/,"\n").gsub(/\005/,"\n")}
+        end
+
+        paras.each do |para|
+          para.split("\n").each do |line|
+            stdout.puts line.insert(0, " " * indent)
+          end
+          stdout.puts unless para == paras.last
+        end
+      end
+
+      # Deals with file collision and returns true if the file should be
+      # overwritten and false otherwise. If a block is given, it uses the block
+      # response as the content for the diff.
+      #
+      # ==== Parameters
+      # destination<String>:: the destination file to solve conflicts
+      # block<Proc>:: an optional block that returns the value to be used in diff
+      #
+      def file_collision(destination)
+        return true if @always_force
+        options = block_given? ? "[Ynaqdh]" : "[Ynaqh]"
+
+        while true
+          answer = ask %[Overwrite #{destination}? (enter "h" for help) #{options}]
+
+          case answer
+          when is?(:yes), is?(:force), ""
+            return true
+          when is?(:no), is?(:skip)
+            return false
+          when is?(:always)
+            return @always_force = true
+          when is?(:quit)
+            say 'Aborting...'
+            raise SystemExit
+          when is?(:diff)
+            show_diff(destination, yield) if block_given?
+            say 'Retrying...'
+          else
+            say file_collision_help
+          end
+        end
+      end
+
+      # This code was copied from Rake, available under MIT-LICENSE
+      # Copyright (c) 2003, 2004 Jim Weirich
+      def terminal_width
+        if ENV['THOR_COLUMNS']
+          result = ENV['THOR_COLUMNS'].to_i
+        else
+          result = unix? ? dynamic_width : 80
+        end
+        (result < 10) ? 80 : result
+      rescue
+        80
+      end
+
+      # Called if something goes wrong during the execution. This is used by Thor
+      # internally and should not be used inside your scripts. If something went
+      # wrong, you can always raise an exception. If you raise a Thor::Error, it
+      # will be rescued and wrapped in the method below.
+      #
+      def error(statement)
+        stderr.puts statement
+      end
+
+      # Apply color to the given string with optional bold. Disabled in the
+      # Thor::Shell::Basic class.
+      #
+      def set_color(string, *args) #:nodoc:
+        string
+      end
+
+    protected
+
+      def can_display_colors?
+        false
+      end
+
+      def lookup_color(color)
+        return color unless color.is_a?(Symbol)
+        self.class.const_get(color.to_s.upcase)
+      end
+
+      def stdout
+        $stdout
+      end
+
+      def stdin
+        $stdin
+      end
+
+      def stderr
+        $stderr
+      end
+
+      def is?(value) #:nodoc:
+        value = value.to_s
+
+        if value.size == 1
+          /\A#{value}\z/i
+        else
+          /\A(#{value}|#{value[0,1]})\z/i
+        end
+      end
+
+      def file_collision_help #:nodoc:
+<<HELP
+Y - yes, overwrite
+n - no, do not overwrite
+a - all, overwrite this and all others
+q - quit, abort
+d - diff, show the differences between the old and the new
+h - help, show this help
+HELP
+      end
+
+      def show_diff(destination, content) #:nodoc:
+        diff_cmd = ENV['THOR_DIFF'] || ENV['RAILS_DIFF'] || 'diff -u'
+
+        Tempfile.open(File.basename(destination), File.dirname(destination)) do |temp|
+          temp.write content
+          temp.rewind
+          system %(#{diff_cmd} "#{destination}" "#{temp.path}")
+        end
+      end
+
+      def quiet? #:nodoc:
+        mute? || (base && base.options[:quiet])
+      end
+
+      # Calculate the dynamic width of the terminal
+      def dynamic_width
+        @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
+      end
+
+      def dynamic_width_stty
+        %x{stty size 2>/dev/null}.split[1].to_i
+      end
+
+      def dynamic_width_tput
+        %x{tput cols 2>/dev/null}.to_i
+      end
+
+      def unix?
+        RUBY_PLATFORM =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
+      end
+
+      def truncate(string, width)
+        as_unicode do
+          chars = string.chars.to_a
+          if chars.length <= width
+            chars.join
+          else
+            ( chars[0, width-3].join ) + "..."
+          end
+        end
+      end
+
+      if "".respond_to?(:encode)
+        def as_unicode
+          yield
+        end
+      else
+        def as_unicode
+          old, $KCODE = $KCODE, "U"
+          yield
+        ensure
+          $KCODE = old
+        end
+      end
+
+      def ask_simply(statement, color=nil)
+        say("#{statement} ", color)
+        stdin.gets.tap{|text| text.strip! if text}
+      end
+
+      def ask_filtered(statement, answer_set, *args)
+        correct_answer = nil
+        until correct_answer
+          answer = ask_simply("#{statement} #{answer_set.inspect}", *args)
+          correct_answer = answer_set.include?(answer) ? answer : nil
+          answers = answer_set.map(&:inspect).join(", ")
+          say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer
+        end
+        correct_answer
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell/color.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell/color.rb
new file mode 100644
index 0000000..fcf9c25
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell/color.rb
@@ -0,0 +1,148 @@
+require 'thor/shell/basic'
+
+class Thor
+  module Shell
+    # Inherit from Thor::Shell::Basic and add set_color behavior. Check
+    # Thor::Shell::Basic to see all available methods.
+    #
+    class Color < Basic
+      # Embed in a String to clear all previous ANSI sequences.
+      CLEAR      = "\e[0m"
+      # The start of an ANSI bold sequence.
+      BOLD       = "\e[1m"
+
+      # Set the terminal's foreground ANSI color to black.
+      BLACK      = "\e[30m"
+      # Set the terminal's foreground ANSI color to red.
+      RED        = "\e[31m"
+      # Set the terminal's foreground ANSI color to green.
+      GREEN      = "\e[32m"
+      # Set the terminal's foreground ANSI color to yellow.
+      YELLOW     = "\e[33m"
+      # Set the terminal's foreground ANSI color to blue.
+      BLUE       = "\e[34m"
+      # Set the terminal's foreground ANSI color to magenta.
+      MAGENTA    = "\e[35m"
+      # Set the terminal's foreground ANSI color to cyan.
+      CYAN       = "\e[36m"
+      # Set the terminal's foreground ANSI color to white.
+      WHITE      = "\e[37m"
+
+      # Set the terminal's background ANSI color to black.
+      ON_BLACK   = "\e[40m"
+      # Set the terminal's background ANSI color to red.
+      ON_RED     = "\e[41m"
+      # Set the terminal's background ANSI color to green.
+      ON_GREEN   = "\e[42m"
+      # Set the terminal's background ANSI color to yellow.
+      ON_YELLOW  = "\e[43m"
+      # Set the terminal's background ANSI color to blue.
+      ON_BLUE    = "\e[44m"
+      # Set the terminal's background ANSI color to magenta.
+      ON_MAGENTA = "\e[45m"
+      # Set the terminal's background ANSI color to cyan.
+      ON_CYAN    = "\e[46m"
+      # Set the terminal's background ANSI color to white.
+      ON_WHITE   = "\e[47m"
+
+      # Set color by using a string or one of the defined constants. If a third
+      # option is set to true, it also adds bold to the string. This is based
+      # on Highline implementation and it automatically appends CLEAR to the end
+      # of the returned String.
+      #
+      # Pass foreground, background and bold options to this method as
+      # symbols.
+      #
+      # Example:
+      #
+      #   set_color "Hi!", :red, :on_white, :bold
+      #
+      # The available colors are:
+      #
+      #   :bold
+      #   :black
+      #   :red
+      #   :green
+      #   :yellow
+      #   :blue
+      #   :magenta
+      #   :cyan
+      #   :white
+      #   :on_black
+      #   :on_red
+      #   :on_green
+      #   :on_yellow
+      #   :on_blue
+      #   :on_magenta
+      #   :on_cyan
+      #   :on_white
+      def set_color(string, *colors)
+        if colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
+          ansi_colors = colors.map { |color| lookup_color(color) }
+          "#{ansi_colors.join}#{string}#{CLEAR}"
+        else
+          # The old API was `set_color(color, bold=boolean)`. We
+          # continue to support the old API because you should never
+          # break old APIs unnecessarily :P
+          foreground, bold = colors
+          foreground = self.class.const_get(foreground.to_s.upcase) if foreground.is_a?(Symbol)
+
+          bold       = bold ? BOLD : ""
+          "#{bold}#{foreground}#{string}#{CLEAR}"
+        end
+      end
+
+      protected
+
+        def can_display_colors?
+          stdout.tty?
+        end
+
+        # Overwrite show_diff to show diff with colors if Diff::LCS is
+        # available.
+        #
+        def show_diff(destination, content) #:nodoc:
+          if diff_lcs_loaded? && ENV['THOR_DIFF'].nil? && ENV['RAILS_DIFF'].nil?
+            actual  = File.binread(destination).to_s.split("\n")
+            content = content.to_s.split("\n")
+
+            Diff::LCS.sdiff(actual, content).each do |diff|
+              output_diff_line(diff)
+            end
+          else
+            super
+          end
+        end
+
+        def output_diff_line(diff) #:nodoc:
+          case diff.action
+          when '-'
+            say "- #{diff.old_element.chomp}", :red, true
+          when '+'
+            say "+ #{diff.new_element.chomp}", :green, true
+          when '!'
+            say "- #{diff.old_element.chomp}", :red, true
+            say "+ #{diff.new_element.chomp}", :green, true
+          else
+            say "  #{diff.old_element.chomp}", nil, true
+          end
+        end
+
+        # Check if Diff::LCS is loaded. If it is, use it to create pretty output
+        # for diff.
+        #
+        def diff_lcs_loaded? #:nodoc:
+          return true  if defined?(Diff::LCS)
+          return @diff_lcs_loaded unless @diff_lcs_loaded.nil?
+
+          @diff_lcs_loaded = begin
+            require 'diff/lcs'
+            true
+          rescue LoadError
+            false
+          end
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell/html.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell/html.rb
new file mode 100644
index 0000000..2a1bb38
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/shell/html.rb
@@ -0,0 +1,127 @@
+require 'thor/shell/basic'
+
+class Thor
+  module Shell
+    # Inherit from Thor::Shell::Basic and add set_color behavior. Check
+    # Thor::Shell::Basic to see all available methods.
+    #
+    class HTML < Basic
+      # The start of an HTML bold sequence.
+      BOLD       = "font-weight: bold"
+
+      # Set the terminal's foreground HTML color to black.
+      BLACK      = 'color: black'
+      # Set the terminal's foreground HTML color to red.
+      RED        = 'color: red'
+      # Set the terminal's foreground HTML color to green.
+      GREEN      = 'color: green'
+      # Set the terminal's foreground HTML color to yellow.
+      YELLOW     = 'color: yellow'
+      # Set the terminal's foreground HTML color to blue.
+      BLUE       = 'color: blue'
+      # Set the terminal's foreground HTML color to magenta.
+      MAGENTA    = 'color: magenta'
+      # Set the terminal's foreground HTML color to cyan.
+      CYAN       = 'color: cyan'
+      # Set the terminal's foreground HTML color to white.
+      WHITE      = 'color: white'
+
+      # Set the terminal's background HTML color to black.
+      ON_BLACK   = 'background-color: black'
+      # Set the terminal's background HTML color to red.
+      ON_RED     = 'background-color: red'
+      # Set the terminal's background HTML color to green.
+      ON_GREEN   = 'background-color: green'
+      # Set the terminal's background HTML color to yellow.
+      ON_YELLOW  = 'background-color: yellow'
+      # Set the terminal's background HTML color to blue.
+      ON_BLUE    = 'background-color: blue'
+      # Set the terminal's background HTML color to magenta.
+      ON_MAGENTA = 'background-color: magenta'
+      # Set the terminal's background HTML color to cyan.
+      ON_CYAN    = 'background-color: cyan'
+      # Set the terminal's background HTML color to white.
+      ON_WHITE   = 'background-color: white'
+
+      # Set color by using a string or one of the defined constants. If a third
+      # option is set to true, it also adds bold to the string. This is based
+      # on Highline implementation and it automatically appends CLEAR to the end
+      # of the returned String.
+      #
+      def set_color(string, *colors)
+        if colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
+          html_colors = colors.map { |color| lookup_color(color) }
+          "<span style=\"#{html_colors.join("; ")};\">#{string}</span>"
+        else
+          color, bold = colors
+          html_color = self.class.const_get(color.to_s.upcase) if color.is_a?(Symbol)
+          styles = [html_color]
+          styles << BOLD if bold
+          "<span style=\"#{styles.join("; ")};\">#{string}</span>"
+        end
+      end
+
+      # Ask something to the user and receives a response.
+      #
+      # ==== Example
+      # ask("What is your name?")
+      #
+      # TODO: Implement #ask for Thor::Shell::HTML
+      def ask(statement, color=nil)
+        raise NotImplementedError, "Implement #ask for Thor::Shell::HTML"
+      end
+
+      protected
+
+        def can_display_colors?
+          true
+        end
+
+        # Overwrite show_diff to show diff with colors if Diff::LCS is
+        # available.
+        #
+        def show_diff(destination, content) #:nodoc:
+          if diff_lcs_loaded? && ENV['THOR_DIFF'].nil? && ENV['RAILS_DIFF'].nil?
+            actual  = File.binread(destination).to_s.split("\n")
+            content = content.to_s.split("\n")
+
+            Diff::LCS.sdiff(actual, content).each do |diff|
+              output_diff_line(diff)
+            end
+          else
+            super
+          end
+        end
+
+        def output_diff_line(diff) #:nodoc:
+          case diff.action
+          when '-'
+            say "- #{diff.old_element.chomp}", :red, true
+          when '+'
+            say "+ #{diff.new_element.chomp}", :green, true
+          when '!'
+            say "- #{diff.old_element.chomp}", :red, true
+            say "+ #{diff.new_element.chomp}", :green, true
+          else
+            say "  #{diff.old_element.chomp}", nil, true
+          end
+        end
+
+        # Check if Diff::LCS is loaded. If it is, use it to create pretty output
+        # for diff.
+        #
+        def diff_lcs_loaded? #:nodoc:
+          return true  if defined?(Diff::LCS)
+          return @diff_lcs_loaded unless @diff_lcs_loaded.nil?
+
+          @diff_lcs_loaded = begin
+            require 'diff/lcs'
+            true
+          rescue LoadError
+            false
+          end
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/util.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/util.rb
new file mode 100644
index 0000000..2510630
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/util.rb
@@ -0,0 +1,270 @@
+require 'rbconfig'
+
+class Thor
+  module Sandbox #:nodoc:
+  end
+
+  # This module holds several utilities:
+  #
+  # 1) Methods to convert thor namespaces to constants and vice-versa.
+  #
+  #   Thor::Util.namespace_from_thor_class(Foo::Bar::Baz) #=> "foo:bar:baz"
+  #
+  # 2) Loading thor files and sandboxing:
+  #
+  #   Thor::Util.load_thorfile("~/.thor/foo")
+  #
+  module Util
+
+    class << self
+
+      # Receives a namespace and search for it in the Thor::Base subclasses.
+      #
+      # ==== Parameters
+      # namespace<String>:: The namespace to search for.
+      #
+      def find_by_namespace(namespace)
+        namespace = "default#{namespace}" if namespace.empty? || namespace =~ /^:/
+        Thor::Base.subclasses.find { |klass| klass.namespace == namespace }
+      end
+
+      # Receives a constant and converts it to a Thor namespace. Since Thor
+      # commands can be added to a sandbox, this method is also responsable for
+      # removing the sandbox namespace.
+      #
+      # This method should not be used in general because it's used to deal with
+      # older versions of Thor. On current versions, if you need to get the
+      # namespace from a class, just call namespace on it.
+      #
+      # ==== Parameters
+      # constant<Object>:: The constant to be converted to the thor path.
+      #
+      # ==== Returns
+      # String:: If we receive Foo::Bar::Baz it returns "foo:bar:baz"
+      #
+      def namespace_from_thor_class(constant)
+        constant = constant.to_s.gsub(/^Thor::Sandbox::/, "")
+        constant = snake_case(constant).squeeze(":")
+        constant
+      end
+
+      # Given the contents, evaluate it inside the sandbox and returns the
+      # namespaces defined in the sandbox.
+      #
+      # ==== Parameters
+      # contents<String>
+      #
+      # ==== Returns
+      # Array[Object]
+      #
+      def namespaces_in_content(contents, file=__FILE__)
+        old_constants = Thor::Base.subclasses.dup
+        Thor::Base.subclasses.clear
+
+        load_thorfile(file, contents)
+
+        new_constants = Thor::Base.subclasses.dup
+        Thor::Base.subclasses.replace(old_constants)
+
+        new_constants.map!{ |c| c.namespace }
+        new_constants.compact!
+        new_constants
+      end
+
+      # Returns the thor classes declared inside the given class.
+      #
+      def thor_classes_in(klass)
+        stringfied_constants = klass.constants.map { |c| c.to_s }
+        Thor::Base.subclasses.select do |subclass|
+          next unless subclass.name
+          stringfied_constants.include?(subclass.name.gsub("#{klass.name}::", ''))
+        end
+      end
+
+      # Receives a string and convert it to snake case. SnakeCase returns snake_case.
+      #
+      # ==== Parameters
+      # String
+      #
+      # ==== Returns
+      # String
+      #
+      def snake_case(str)
+        return str.downcase if str =~ /^[A-Z_]+$/
+        str.gsub(/\B[A-Z]/, '_\&').squeeze('_') =~ /_*(.*)/
+        return $+.downcase
+      end
+
+      # Receives a string and convert it to camel case. camel_case returns CamelCase.
+      #
+      # ==== Parameters
+      # String
+      #
+      # ==== Returns
+      # String
+      #
+      def camel_case(str)
+        return str if str !~ /_/ && str =~ /[A-Z]+.*/
+        str.split('_').map { |i| i.capitalize }.join
+      end
+
+      # Receives a namespace and tries to retrieve a Thor or Thor::Group class
+      # from it. It first searches for a class using the all the given namespace,
+      # if it's not found, removes the highest entry and searches for the class
+      # again. If found, returns the highest entry as the class name.
+      #
+      # ==== Examples
+      #
+      #   class Foo::Bar < Thor
+      #     def baz
+      #     end
+      #   end
+      #
+      #   class Baz::Foo < Thor::Group
+      #   end
+      #
+      #   Thor::Util.namespace_to_thor_class("foo:bar")     #=> Foo::Bar, nil # will invoke default command
+      #   Thor::Util.namespace_to_thor_class("baz:foo")     #=> Baz::Foo, nil
+      #   Thor::Util.namespace_to_thor_class("foo:bar:baz") #=> Foo::Bar, "baz"
+      #
+      # ==== Parameters
+      # namespace<String>
+      #
+      def find_class_and_command_by_namespace(namespace, fallback = true)
+        if namespace.include?(?:) # look for a namespaced command
+          pieces  = namespace.split(":")
+          command = pieces.pop
+          klass   = Thor::Util.find_by_namespace(pieces.join(":"))
+        end
+        unless klass # look for a Thor::Group with the right name
+          klass, command = Thor::Util.find_by_namespace(namespace), nil
+        end
+        if !klass && fallback # try a command in the default namespace
+          command = namespace
+          klass   = Thor::Util.find_by_namespace('')
+        end
+        return klass, command
+      end
+      alias find_class_and_task_by_namespace find_class_and_command_by_namespace
+
+      # Receives a path and load the thor file in the path. The file is evaluated
+      # inside the sandbox to avoid namespacing conflicts.
+      #
+      def load_thorfile(path, content=nil, debug=false)
+        content ||= File.binread(path)
+
+        begin
+          Thor::Sandbox.class_eval(content, path)
+        rescue Exception => e
+          $stderr.puts("WARNING: unable to load thorfile #{path.inspect}: #{e.message}")
+          if debug
+            $stderr.puts(*e.backtrace)
+          else
+            $stderr.puts(e.backtrace.first)
+          end
+        end
+      end
+
+      def user_home
+        @@user_home ||= if ENV["HOME"]
+          ENV["HOME"]
+        elsif ENV["USERPROFILE"]
+          ENV["USERPROFILE"]
+        elsif ENV["HOMEDRIVE"] && ENV["HOMEPATH"]
+          File.join(ENV["HOMEDRIVE"], ENV["HOMEPATH"])
+        elsif ENV["APPDATA"]
+          ENV["APPDATA"]
+        else
+          begin
+            File.expand_path("~")
+          rescue
+            if File::ALT_SEPARATOR
+              "C:/"
+            else
+              "/"
+            end
+          end
+        end
+      end
+
+      # Returns the root where thor files are located, depending on the OS.
+      #
+      def thor_root
+        File.join(user_home, ".thor").gsub(/\\/, '/')
+      end
+
+      # Returns the files in the thor root. On Windows thor_root will be something
+      # like this:
+      #
+      #   C:\Documents and Settings\james\.thor
+      #
+      # If we don't #gsub the \ character, Dir.glob will fail.
+      #
+      def thor_root_glob
+        files = Dir["#{escape_globs(thor_root)}/*"]
+
+        files.map! do |file|
+          File.directory?(file) ? File.join(file, "main.thor") : file
+        end
+      end
+
+      # Where to look for Thor files.
+      #
+      def globs_for(path)
+        path = escape_globs(path)
+        ["#{path}/Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"]
+      end
+
+      # Return the path to the ruby interpreter taking into account multiple
+      # installations and windows extensions.
+      #
+      def ruby_command
+        @ruby_command ||= begin
+          ruby_name = RbConfig::CONFIG['ruby_install_name']
+          ruby = File.join(RbConfig::CONFIG['bindir'], ruby_name)
+          ruby << RbConfig::CONFIG['EXEEXT']
+
+          # avoid using different name than ruby (on platforms supporting links)
+          if ruby_name != 'ruby' && File.respond_to?(:readlink)
+            begin
+              alternate_ruby = File.join(RbConfig::CONFIG['bindir'], 'ruby')
+              alternate_ruby << RbConfig::CONFIG['EXEEXT']
+
+              # ruby is a symlink
+              if File.symlink? alternate_ruby
+                linked_ruby = File.readlink alternate_ruby
+
+                # symlink points to 'ruby_install_name'
+                ruby = alternate_ruby if linked_ruby == ruby_name || linked_ruby == ruby
+              end
+            rescue NotImplementedError
+              # just ignore on windows
+            end
+          end
+
+          # escape string in case path to ruby executable contain spaces.
+          ruby.sub!(/.*\s.*/m, '"\&"')
+          ruby
+        end
+      end
+
+      # Returns a string that has had any glob characters escaped.
+      # The glob characters are `* ? { } [ ]`.
+      #
+      # ==== Examples
+      #
+      #   Thor::Util.escape_globs('[apps]')   # => '\[apps\]'
+      #
+      # ==== Parameters
+      # String
+      #
+      # ==== Returns
+      # String
+      #
+      def escape_globs(path)
+        path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&')
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/version.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/version.rb
new file mode 100644
index 0000000..646cd37
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/lib/thor/version.rb
@@ -0,0 +1,3 @@
+class Thor
+  VERSION = "0.18.1"
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/create_file_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/create_file_spec.rb
new file mode 100644
index 0000000..2586704
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/create_file_spec.rb
@@ -0,0 +1,170 @@
+require 'helper'
+require 'thor/actions'
+
+describe Thor::Actions::CreateFile do
+  before do
+    ::FileUtils.rm_rf(destination_root)
+  end
+
+  def create_file(destination=nil, config={}, options={})
+    @base = MyCounter.new([1, 2], options, { :destination_root => destination_root })
+    @base.stub!(:file_name).and_return('rdoc')
+
+    @action = Thor::Actions::CreateFile.new(@base, destination, "CONFIGURATION",
+                                            { :verbose => !@silence }.merge(config))
+  end
+
+  def invoke!
+    capture(:stdout) { @action.invoke! }
+  end
+
+  def revoke!
+    capture(:stdout) { @action.revoke! }
+  end
+
+  def silence!
+    @silence = true
+  end
+
+  describe "#invoke!" do
+    it "creates a file" do
+      create_file("doc/config.rb")
+      invoke!
+      expect(File.exists?(File.join(destination_root, "doc/config.rb"))).to be_true
+    end
+
+    it "does not create a file if pretending" do
+      create_file("doc/config.rb", {}, :pretend => true)
+      invoke!
+      expect(File.exists?(File.join(destination_root, "doc/config.rb"))).to be_false
+    end
+
+    it "shows created status to the user" do
+      create_file("doc/config.rb")
+      expect(invoke!).to eq("      create  doc/config.rb\n")
+    end
+
+    it "does not show any information if log status is false" do
+      silence!
+      create_file("doc/config.rb")
+      expect(invoke!).to be_empty
+    end
+
+    it "returns the given destination" do
+      capture(:stdout) do
+        expect(create_file("doc/config.rb").invoke!).to eq("doc/config.rb")
+      end
+    end
+
+    it "converts encoded instructions" do
+      create_file("doc/%file_name%.rb.tt")
+      invoke!
+      expect(File.exists?(File.join(destination_root, "doc/rdoc.rb.tt"))).to be_true
+    end
+
+    describe "when file exists" do
+      before do
+        create_file("doc/config.rb")
+        invoke!
+      end
+
+      describe "and is identical" do
+        it "shows identical status" do
+          create_file("doc/config.rb")
+          invoke!
+          expect(invoke!).to eq("   identical  doc/config.rb\n")
+        end
+      end
+
+      describe "and is not identical" do
+        before do
+          File.open(File.join(destination_root, 'doc/config.rb'), 'w'){ |f| f.write("FOO = 3") }
+        end
+
+        it "shows forced status to the user if force is given" do
+          expect(create_file("doc/config.rb", {}, :force => true)).not_to be_identical
+          expect(invoke!).to eq("       force  doc/config.rb\n")
+        end
+
+        it "shows skipped status to the user if skip is given" do
+          expect(create_file("doc/config.rb", {}, :skip => true)).not_to be_identical
+          expect(invoke!).to eq("        skip  doc/config.rb\n")
+        end
+
+        it "shows forced status to the user if force is configured" do
+          expect(create_file("doc/config.rb", :force => true)).not_to be_identical
+          expect(invoke!).to eq("       force  doc/config.rb\n")
+        end
+
+        it "shows skipped status to the user if skip is configured" do
+          expect(create_file("doc/config.rb", :skip => true)).not_to be_identical
+          expect(invoke!).to eq("        skip  doc/config.rb\n")
+        end
+
+        it "shows conflict status to ther user" do
+          expect(create_file("doc/config.rb")).not_to be_identical
+          $stdin.should_receive(:gets).and_return('s')
+          file = File.join(destination_root, 'doc/config.rb')
+
+          content = invoke!
+          expect(content).to match(/conflict  doc\/config\.rb/)
+          expect(content).to match(/Overwrite #{file}\? \(enter "h" for help\) \[Ynaqdh\]/)
+          expect(content).to match(/skip  doc\/config\.rb/)
+        end
+
+        it "creates the file if the file collision menu returns true" do
+          create_file("doc/config.rb")
+          $stdin.should_receive(:gets).and_return('y')
+          expect(invoke!).to match(/force  doc\/config\.rb/)
+        end
+
+        it "skips the file if the file collision menu returns false" do
+          create_file("doc/config.rb")
+          $stdin.should_receive(:gets).and_return('n')
+          expect(invoke!).to match(/skip  doc\/config\.rb/)
+        end
+
+        it "executes the block given to show file content" do
+          create_file("doc/config.rb")
+          $stdin.should_receive(:gets).and_return('d')
+          $stdin.should_receive(:gets).and_return('n')
+          @base.shell.should_receive(:system).with(/diff -u/)
+          invoke!
+        end
+      end
+    end
+  end
+
+  describe "#revoke!" do
+    it "removes the destination file" do
+      create_file("doc/config.rb")
+      invoke!
+      revoke!
+      expect(File.exists?(@action.destination)).to be_false
+    end
+
+    it "does not raise an error if the file does not exist" do
+      create_file("doc/config.rb")
+      revoke!
+      expect(File.exists?(@action.destination)).to be_false
+    end
+  end
+
+  describe "#exists?" do
+    it "returns true if the destination file exists" do
+      create_file("doc/config.rb")
+      expect(@action.exists?).to be_false
+      invoke!
+      expect(@action.exists?).to be_true
+    end
+  end
+
+  describe "#identical?" do
+    it "returns true if the destination file and is identical" do
+      create_file("doc/config.rb")
+      expect(@action.identical?).to be_false
+      invoke!
+      expect(@action.identical?).to be_true
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/create_link_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/create_link_spec.rb
new file mode 100644
index 0000000..95f25d0
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/create_link_spec.rb
@@ -0,0 +1,95 @@
+require 'helper'
+require 'thor/actions'
+require 'tempfile'
+
+describe Thor::Actions::CreateLink do
+  before do
+    @hardlink_to = File.join(Dir.tmpdir, 'linkdest.rb')
+    ::FileUtils.rm_rf(destination_root)
+    ::FileUtils.rm_rf(@hardlink_to)
+  end
+
+  def create_link(destination=nil, config={}, options={})
+    @base = MyCounter.new([1,2], options, { :destination_root => destination_root })
+    @base.stub!(:file_name).and_return('rdoc')
+
+    @tempfile = Tempfile.new("config.rb")
+
+    @action = Thor::Actions::CreateLink.new(@base, destination, @tempfile.path,
+                                            { :verbose => !@silence }.merge(config))
+  end
+
+  def invoke!
+    capture(:stdout) { @action.invoke! }
+  end
+
+  def revoke!
+    capture(:stdout) { @action.revoke! }
+  end
+
+  def silence!
+    @silence = true
+  end
+
+  describe "#invoke!" do
+    it "creates a symbolic link for :symbolic => true" do
+      create_link("doc/config.rb", :symbolic => true)
+      invoke!
+      destination_path = File.join(destination_root, "doc/config.rb")
+      expect(File.exists?(destination_path)).to be_true
+      expect(File.symlink?(destination_path)).to be_true
+    end
+
+    it "creates a hard link for :symbolic => false" do
+      create_link(@hardlink_to, :symbolic => false)
+      invoke!
+      destination_path = @hardlink_to
+      expect(File.exists?(destination_path)).to be_true
+      expect(File.symlink?(destination_path)).to be_false
+    end
+
+    it "creates a symbolic link by default" do
+      create_link("doc/config.rb")
+      invoke!
+      destination_path = File.join(destination_root, "doc/config.rb")
+      expect(File.exists?(destination_path)).to be_true
+      expect(File.symlink?(destination_path)).to be_true
+    end
+
+    it "does not create a link if pretending" do
+      create_link("doc/config.rb", {}, :pretend => true)
+      invoke!
+      expect(File.exists?(File.join(destination_root, "doc/config.rb"))).to be_false
+    end
+
+    it "shows created status to the user" do
+      create_link("doc/config.rb")
+      expect(invoke!).to eq("      create  doc/config.rb\n")
+    end
+
+    it "does not show any information if log status is false" do
+      silence!
+      create_link("doc/config.rb")
+      expect(invoke!).to be_empty
+    end
+  end
+
+  describe "#identical?" do
+    it "returns true if the destination link exists and is identical" do
+      create_link("doc/config.rb")
+      expect(@action.identical?).to be_false
+      invoke!
+      expect(@action.identical?).to be_true
+    end
+  end
+
+  describe "#revoke!" do
+    it "removes the symbolic link of non-existent destination" do
+      create_link("doc/config.rb")
+      invoke!
+      File.delete(@tempfile.path)
+      revoke!
+      expect(File.symlink?(@action.destination)).to be_false
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/directory_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/directory_spec.rb
new file mode 100644
index 0000000..b7e70f2
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/directory_spec.rb
@@ -0,0 +1,169 @@
+require 'helper'
+require 'thor/actions'
+
+describe Thor::Actions::Directory do
+  before do
+    ::FileUtils.rm_rf(destination_root)
+    invoker.stub!(:file_name).and_return("rdoc")
+  end
+
+  def invoker
+    @invoker ||= WhinyGenerator.new([1,2], {}, { :destination_root => destination_root })
+  end
+
+  def revoker
+    @revoker ||= WhinyGenerator.new([1,2], {}, { :destination_root => destination_root, :behavior => :revoke })
+  end
+
+  def invoke!(*args, &block)
+    capture(:stdout){ invoker.directory(*args, &block) }
+  end
+
+  def revoke!(*args, &block)
+    capture(:stdout){ revoker.directory(*args, &block) }
+  end
+
+  def exists_and_identical?(source_path, destination_path)
+    %w(config.rb README).each do |file|
+      source      = File.join(source_root, source_path, file)
+      destination = File.join(destination_root, destination_path, file)
+
+      expect(File.exists?(destination)).to be_true
+      expect(FileUtils.identical?(source, destination)).to be_true
+    end
+  end
+
+  describe "#invoke!" do
+    it "raises an error if the source does not exist" do
+      expect {
+        invoke! "unknown"
+      }.to raise_error(Thor::Error, /Could not find "unknown" in any of your source paths/)
+    end
+
+    it "does not create a directory in pretend mode" do
+      invoke! "doc", "ghost", :pretend => true
+      expect(File.exists?("ghost")).to be_false
+    end
+
+    it "copies the whole directory recursively to the default destination" do
+      invoke! "doc"
+      exists_and_identical?("doc", "doc")
+    end
+
+    it "copies the whole directory recursively to the specified destination" do
+      invoke! "doc", "docs"
+      exists_and_identical?("doc", "docs")
+    end
+
+    it "copies only the first level files if recursive" do
+      invoke! ".", "commands", :recursive => false
+
+      file = File.join(destination_root, "commands", "group.thor")
+      expect(File.exists?(file)).to be_true
+
+      file = File.join(destination_root, "commands", "doc")
+      expect(File.exists?(file)).to be_false
+
+      file = File.join(destination_root, "commands", "doc", "README")
+      expect(File.exists?(file)).to be_false
+    end
+
+    it "ignores files within excluding/ directories when exclude_pattern is provided" do
+      invoke! "doc", "docs", :exclude_pattern => /excluding\//
+      file = File.join(destination_root, "docs", "excluding", "rdoc.rb")
+      expect(File.exists?(file)).to be_false
+    end
+
+    it "copies and evalutes files within excluding/ directory when no exclude_pattern is present" do
+      invoke! "doc", "docs"
+      file = File.join(destination_root, "docs", "excluding", "rdoc.rb")
+      expect(File.exists?(file)).to be_true
+      expect(File.read(file)).to eq("BAR = BAR\n")
+    end
+
+    it "copies files from the source relative to the current path" do
+      invoker.inside "doc" do
+        invoke! "."
+      end
+      exists_and_identical?("doc", "doc")
+    end
+
+    it "copies and evaluates templates" do
+      invoke! "doc", "docs"
+      file = File.join(destination_root, "docs", "rdoc.rb")
+      expect(File.exists?(file)).to be_true
+      expect(File.read(file)).to eq("FOO = FOO\n")
+    end
+
+    it "copies directories and preserved file mode" do
+      invoke! "preserve", "preserved", :mode => :preserve
+      original = File.join(source_root, "preserve", "script.sh")
+      copy = File.join(destination_root, "preserved", "script.sh")
+      expect(File.stat(original).mode).to eq(File.stat(copy).mode)
+    end
+
+    it "copies directories" do
+      invoke! "doc", "docs"
+      file = File.join(destination_root, "docs", "components")
+      expect(File.exists?(file)).to be_true
+      expect(File.directory?(file)).to be_true
+    end
+
+    it "does not copy .empty_directory files" do
+      invoke! "doc", "docs"
+      file = File.join(destination_root, "docs", "components", ".empty_directory")
+      expect(File.exists?(file)).to be_false
+    end
+
+    it "copies directories even if they are empty" do
+      invoke! "doc/components", "docs/components"
+      file = File.join(destination_root, "docs", "components")
+      expect(File.exists?(file)).to be_true
+    end
+
+    it "does not copy empty directories twice" do
+      content = invoke!("doc/components", "docs/components")
+      expect(content).not_to match(/exist/)
+    end
+
+    it "logs status" do
+      content = invoke!("doc")
+      expect(content).to match(/create  doc\/README/)
+      expect(content).to match(/create  doc\/config\.rb/)
+      expect(content).to match(/create  doc\/rdoc\.rb/)
+      expect(content).to match(/create  doc\/components/)
+    end
+
+    it "yields a block" do
+      checked = false
+      invoke!("doc") do |content|
+        checked ||= !!(content =~ /FOO/)
+      end
+      expect(checked).to be_true
+    end
+
+    it "works with glob characters in the path" do
+      content = invoke!("app{1}")
+      expect(content).to match(/create  app\{1\}\/README/)
+    end
+  end
+
+  describe "#revoke!" do
+    it "removes the destination file" do
+      invoke! "doc"
+      revoke! "doc"
+
+      expect(File.exists?(File.join(destination_root, "doc", "README"))).to be_false
+      expect(File.exists?(File.join(destination_root, "doc", "config.rb"))).to be_false
+      expect(File.exists?(File.join(destination_root, "doc", "components"))).to be_false
+    end
+
+    it "works with glob characters in the path" do
+      invoke! "app{1}"
+      expect(File.exists?(File.join(destination_root, "app{1}", "README"))).to be_true
+
+      revoke! "app{1}"
+      expect(File.exists?(File.join(destination_root, "app{1}", "README"))).to be_false
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/empty_directory_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/empty_directory_spec.rb
new file mode 100644
index 0000000..49a1846
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/empty_directory_spec.rb
@@ -0,0 +1,129 @@
+require 'helper'
+require 'thor/actions'
+
+describe Thor::Actions::EmptyDirectory do
+  before do
+    ::FileUtils.rm_rf(destination_root)
+  end
+
+  def empty_directory(destination, options={})
+    @action = Thor::Actions::EmptyDirectory.new(base, destination)
+  end
+
+  def invoke!
+    capture(:stdout) { @action.invoke! }
+  end
+
+  def revoke!
+    capture(:stdout) { @action.revoke! }
+  end
+
+  def base
+    @base ||= MyCounter.new([1,2], {}, { :destination_root => destination_root })
+  end
+
+  describe "#destination" do
+    it "returns the full destination with the destination_root" do
+      expect(empty_directory('doc').destination).to eq(File.join(destination_root, 'doc'))
+    end
+
+    it "takes relative root into account" do
+      base.inside('doc') do
+        expect(empty_directory('contents').destination).to eq(File.join(destination_root, 'doc', 'contents'))
+      end
+    end
+  end
+
+  describe "#relative_destination" do
+    it "returns the relative destination to the original destination root" do
+      base.inside('doc') do
+        expect(empty_directory('contents').relative_destination).to eq('doc/contents')
+      end
+    end
+  end
+
+  describe "#given_destination" do
+    it "returns the destination supplied by the user" do
+      base.inside('doc') do
+        expect(empty_directory('contents').given_destination).to eq('contents')
+      end
+    end
+  end
+
+  describe "#invoke!" do
+    it "copies the file to the specified destination" do
+      empty_directory("doc")
+      invoke!
+      expect(File.exists?(File.join(destination_root, "doc"))).to be_true
+    end
+
+    it "shows created status to the user" do
+      empty_directory("doc")
+      expect(invoke!).to eq("      create  doc\n")
+    end
+
+    it "does not create a directory if pretending" do
+      base.inside("foo", :pretend => true) do
+        empty_directory("ghost")
+      end
+      expect(File.exists?(File.join(base.destination_root, "ghost"))).to be_false
+    end
+
+    describe "when directory exists" do
+      it "shows exist status" do
+        empty_directory("doc")
+        invoke!
+        expect(invoke!).to eq("       exist  doc\n")
+      end
+    end
+  end
+
+  describe "#revoke!" do
+    it "removes the destination file" do
+      empty_directory("doc")
+      invoke!
+      revoke!
+      expect(File.exists?(@action.destination)).to be_false
+    end
+  end
+
+  describe "#exists?" do
+    it "returns true if the destination file exists" do
+      empty_directory("doc")
+      expect(@action.exists?).to be_false
+      invoke!
+      expect(@action.exists?).to be_true
+    end
+  end
+
+  context "protected methods" do
+    describe "#convert_encoded_instructions" do
+      before do
+        empty_directory("test_dir")
+        @action.base.stub!(:file_name).and_return("expected")
+      end
+
+      it "accepts and executes a 'legal' %\w+% encoded instruction" do
+        expect(@action.send(:convert_encoded_instructions, "%file_name%.txt")).to eq("expected.txt")
+      end
+
+      it "accepts and executes a private %\w+% encoded instruction" do
+        @action.base.extend Module.new {
+          private
+          def private_file_name
+            "expected"
+          end
+        }
+        expect(@action.send(:convert_encoded_instructions, "%private_file_name%.txt")).to eq("expected.txt")
+      end
+
+      it "ignores an 'illegal' %\w+% encoded instruction" do
+        expect(@action.send(:convert_encoded_instructions, "%some_name%.txt")).to eq("%some_name%.txt")
+      end
+
+      it "ignores incorrectly encoded instruction" do
+        expect(@action.send(:convert_encoded_instructions, "%some.name%.txt")).to eq("%some.name%.txt")
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/file_manipulation_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/file_manipulation_spec.rb
new file mode 100644
index 0000000..c4d571c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/file_manipulation_spec.rb
@@ -0,0 +1,382 @@
+require 'helper'
+
+class Application; end
+
+describe Thor::Actions do
+  def runner(options={})
+    @runner ||= MyCounter.new([1], options, { :destination_root => destination_root })
+  end
+
+  def action(*args, &block)
+    capture(:stdout) { runner.send(*args, &block) }
+  end
+
+  def exists_and_identical?(source, destination)
+   destination = File.join(destination_root, destination)
+   expect(File.exists?(destination)).to be_true
+
+   source = File.join(source_root, source)
+   expect(FileUtils).to be_identical(source, destination)
+  end
+
+  def file
+    File.join(destination_root, "foo")
+  end
+
+  before do
+    ::FileUtils.rm_rf(destination_root)
+  end
+
+  describe "#chmod" do
+    it "executes the command given" do
+      FileUtils.should_receive(:chmod_R).with(0755, file)
+      action :chmod, "foo", 0755
+    end
+
+    it "does not execute the command if pretending given" do
+      FileUtils.should_not_receive(:chmod_R)
+      runner(:pretend => true)
+      action :chmod, "foo", 0755
+    end
+
+    it "logs status" do
+      FileUtils.should_receive(:chmod_R).with(0755, file)
+      expect(action(:chmod, "foo", 0755)).to eq("       chmod  foo\n")
+    end
+
+    it "does not log status if required" do
+      FileUtils.should_receive(:chmod_R).with(0755, file)
+      expect(action(:chmod, "foo", 0755, :verbose => false)).to be_empty
+    end
+  end
+
+  describe "#copy_file" do
+    it "copies file from source to default destination" do
+      action :copy_file, "command.thor"
+      exists_and_identical?("command.thor", "command.thor")
+    end
+
+    it "copies file from source to the specified destination" do
+      action :copy_file, "command.thor", "foo.thor"
+      exists_and_identical?("command.thor", "foo.thor")
+    end
+
+    it "copies file from the source relative to the current path" do
+      runner.inside("doc") do
+        action :copy_file, "README"
+      end
+      exists_and_identical?("doc/README", "doc/README")
+    end
+
+    it "copies file from source to default destination and preserves file mode" do
+      action :copy_file, "preserve/script.sh", :mode => :preserve
+      original = File.join(source_root, "preserve/script.sh")
+      copy = File.join(destination_root, "preserve/script.sh")
+      expect(File.stat(original).mode).to eq(File.stat(copy).mode)
+    end
+
+    it "logs status" do
+      expect(action(:copy_file, "command.thor")).to eq("      create  command.thor\n")
+    end
+
+    it "accepts a block to change output" do
+      action :copy_file, "command.thor" do |content|
+        "OMG" + content
+      end
+      expect(File.read(File.join(destination_root, "command.thor"))).to match(/^OMG/)
+    end
+  end
+
+  describe "#link_file" do
+    it "links file from source to default destination" do
+      action :link_file, "command.thor"
+      exists_and_identical?("command.thor", "command.thor")
+    end
+
+    it "links file from source to the specified destination" do
+      action :link_file, "command.thor", "foo.thor"
+      exists_and_identical?("command.thor", "foo.thor")
+    end
+
+    it "links file from the source relative to the current path" do
+      runner.inside("doc") do
+        action :link_file, "README"
+      end
+      exists_and_identical?("doc/README", "doc/README")
+    end
+
+    it "logs status" do
+      expect(action(:link_file, "command.thor")).to eq("      create  command.thor\n")
+    end
+  end
+
+  describe "#get" do
+    it "copies file from source to the specified destination" do
+      action :get, "doc/README", "docs/README"
+      exists_and_identical?("doc/README", "docs/README")
+    end
+
+    it "uses just the source basename as destination if none is specified" do
+      action :get, "doc/README"
+      exists_and_identical?("doc/README", "README")
+    end
+
+    it "allows the destination to be set as a block result" do
+      action(:get, "doc/README"){ |c| "docs/README" }
+      exists_and_identical?("doc/README", "docs/README")
+    end
+
+    it "yields file content to a block" do
+      action :get, "doc/README" do |content|
+        expect(content).to eq("__start__\nREADME\n__end__\n")
+      end
+    end
+
+    it "logs status" do
+      expect(action(:get, "doc/README", "docs/README")).to eq("      create  docs/README\n")
+    end
+
+    it "accepts http remote sources" do
+      body = "__start__\nHTTPFILE\n__end__\n"
+      FakeWeb.register_uri(:get, 'http://example.com/file.txt', :body => body)
+      action :get, "http://example.com/file.txt" do |content|
+        expect(content).to eq(body)
+      end
+      FakeWeb.clean_registry
+    end
+
+    it "accepts https remote sources" do
+      body = "__start__\nHTTPSFILE\n__end__\n"
+      FakeWeb.register_uri(:get, 'https://example.com/file.txt', :body => body)
+      action :get, "https://example.com/file.txt" do |content|
+        expect(content).to eq(body)
+      end
+      FakeWeb.clean_registry
+    end
+  end
+
+  describe "#template" do
+    it "allows using block helpers in the template" do
+      action :template, "doc/block_helper.rb"
+
+      file = File.join(destination_root, "doc/block_helper.rb")
+      expect(File.read(file)).to eq("Hello world!")
+    end
+
+    it "evaluates the template given as source" do
+      runner.instance_variable_set("@klass", "Config")
+      action :template, "doc/config.rb"
+
+      file = File.join(destination_root, "doc/config.rb")
+      expect(File.read(file)).to eq("class Config; end\n")
+    end
+
+    it "copies the template to the specified destination" do
+      action :template, "doc/config.rb", "doc/configuration.rb"
+      file = File.join(destination_root, "doc/configuration.rb")
+      expect(File.exists?(file)).to be_true
+    end
+
+    it "converts enconded instructions" do
+      runner.should_receive(:file_name).and_return("rdoc")
+      action :template, "doc/%file_name%.rb.tt"
+      file = File.join(destination_root, "doc/rdoc.rb")
+      expect(File.exists?(file)).to be_true
+    end
+
+    it "logs status" do
+      expect(capture(:stdout) { runner.template("doc/config.rb") }).to eq("      create  doc/config.rb\n")
+    end
+
+    it "accepts a block to change output" do
+      action :template, "doc/config.rb" do |content|
+        "OMG" + content
+      end
+      expect(File.read(File.join(destination_root, "doc/config.rb"))).to match(/^OMG/)
+    end
+
+    it "guesses the destination name when given only a source" do
+      action :template, "doc/config.yaml.tt"
+
+      file = File.join(destination_root, "doc/config.yaml")
+      expect(File.exists?(file)).to be_true
+    end
+  end
+
+  describe "when changing existent files" do
+    before do
+      ::FileUtils.cp_r(source_root, destination_root)
+    end
+
+    def file
+      File.join(destination_root, "doc", "README")
+    end
+
+    describe "#remove_file" do
+      it "removes the file given" do
+        action :remove_file, "doc/README"
+        expect(File.exists?(file)).to be_false
+      end
+
+      it "removes directories too" do
+        action :remove_dir, "doc"
+        expect(File.exists?(File.join(destination_root, "doc"))).to be_false
+      end
+
+      it "does not remove if pretending" do
+        runner(:pretend => true)
+        action :remove_file, "doc/README"
+        expect(File.exists?(file)).to be_true
+      end
+
+      it "logs status" do
+        expect(action(:remove_file, "doc/README")).to eq("      remove  doc/README\n")
+      end
+
+      it "does not log status if required" do
+        expect(action(:remove_file, "doc/README", :verbose => false)).to be_empty
+      end
+    end
+
+    describe "#gsub_file" do
+      it "replaces the content in the file" do
+        action :gsub_file, "doc/README", "__start__", "START"
+        expect(File.binread(file)).to eq("START\nREADME\n__end__\n")
+      end
+
+      it "does not replace if pretending" do
+        runner(:pretend => true)
+        action :gsub_file, "doc/README", "__start__", "START"
+        expect(File.binread(file)).to eq("__start__\nREADME\n__end__\n")
+      end
+
+      it "accepts a block" do
+        action(:gsub_file, "doc/README", "__start__"){ |match| match.gsub('__', '').upcase  }
+        expect(File.binread(file)).to eq("START\nREADME\n__end__\n")
+      end
+
+      it "logs status" do
+        expect(action(:gsub_file, "doc/README", "__start__", "START")).to eq("        gsub  doc/README\n")
+      end
+
+      it "does not log status if required" do
+        expect(action(:gsub_file, file, "__", :verbose => false){ |match| match * 2 }).to be_empty
+      end
+    end
+
+    describe "#append_to_file" do
+      it "appends content to the file" do
+        action :append_to_file, "doc/README", "END\n"
+        expect(File.binread(file)).to eq("__start__\nREADME\n__end__\nEND\n")
+      end
+
+      it "accepts a block" do
+        action(:append_to_file, "doc/README"){ "END\n" }
+        expect(File.binread(file)).to eq("__start__\nREADME\n__end__\nEND\n")
+      end
+
+      it "logs status" do
+        expect(action(:append_to_file, "doc/README", "END")).to eq("      append  doc/README\n")
+      end
+    end
+
+    describe "#prepend_to_file" do
+      it "prepends content to the file" do
+        action :prepend_to_file, "doc/README", "START\n"
+        expect(File.binread(file)).to eq("START\n__start__\nREADME\n__end__\n")
+      end
+
+      it "accepts a block" do
+        action(:prepend_to_file, "doc/README"){ "START\n" }
+        expect(File.binread(file)).to eq("START\n__start__\nREADME\n__end__\n")
+      end
+
+      it "logs status" do
+        expect(action(:prepend_to_file, "doc/README", "START")).to eq("     prepend  doc/README\n")
+      end
+    end
+
+    describe "#inject_into_class" do
+      def file
+        File.join(destination_root, "application.rb")
+      end
+
+      it "appends content to a class" do
+        action :inject_into_class, "application.rb", Application, "  filter_parameters :password\n"
+        expect(File.binread(file)).to eq("class Application < Base\n  filter_parameters :password\nend\n")
+      end
+
+      it "accepts a block" do
+        action(:inject_into_class, "application.rb", Application){ "  filter_parameters :password\n" }
+        expect(File.binread(file)).to eq("class Application < Base\n  filter_parameters :password\nend\n")
+      end
+
+      it "logs status" do
+        expect(action(:inject_into_class, "application.rb", Application, "  filter_parameters :password\n")).to eq("      insert  application.rb\n")
+      end
+
+      it "does not append if class name does not match" do
+        action :inject_into_class, "application.rb", "App", "  filter_parameters :password\n"
+        expect(File.binread(file)).to eq("class Application < Base\nend\n")
+      end
+    end
+  end
+
+  describe "when adjusting comments" do
+    before do
+      ::FileUtils.cp_r(source_root, destination_root)
+    end
+
+    def file
+      File.join(destination_root, "doc", "COMMENTER")
+    end
+
+    unmodified_comments_file = /__start__\n # greenblue\n#\n# yellowblue\n#yellowred\n #greenred\norange\n    purple\n  ind#igo\n  # ind#igo\n__end__/
+
+    describe "#uncomment_lines" do
+      it "uncomments all matching lines in the file" do
+        action :uncomment_lines, "doc/COMMENTER", "green"
+        expect(File.binread(file)).to match(/__start__\n greenblue\n#\n# yellowblue\n#yellowred\n greenred\norange\n    purple\n  ind#igo\n  # ind#igo\n__end__/)
+
+        action :uncomment_lines, "doc/COMMENTER", "red"
+        expect(File.binread(file)).to match(/__start__\n greenblue\n#\n# yellowblue\nyellowred\n greenred\norange\n    purple\n  ind#igo\n  # ind#igo\n__end__/)
+      end
+
+      it "correctly uncomments lines with hashes in them" do
+        action :uncomment_lines, "doc/COMMENTER", "ind#igo"
+        expect(File.binread(file)).to match(/__start__\n # greenblue\n#\n# yellowblue\n#yellowred\n #greenred\norange\n    purple\n  ind#igo\n  ind#igo\n__end__/)
+      end
+
+      it "does not modify already uncommented lines in the file" do
+        action :uncomment_lines, "doc/COMMENTER", "orange"
+        action :uncomment_lines, "doc/COMMENTER", "purple"
+        expect(File.binread(file)).to match(unmodified_comments_file)
+      end
+
+      it "does not uncomment the wrong line when uncommenting lines preceded by blank commented line" do
+        action :uncomment_lines, "doc/COMMENTER", "yellow"
+        expect(File.binread(file)).to match(/__start__\n # greenblue\n#\nyellowblue\nyellowred\n #greenred\norange\n    purple\n  ind#igo\n  # ind#igo\n__end__/)
+      end
+    end
+
+    describe "#comment_lines" do
+      it "comments lines which are not commented" do
+        action :comment_lines, "doc/COMMENTER", "orange"
+        expect(File.binread(file)).to match(/__start__\n # greenblue\n#\n# yellowblue\n#yellowred\n #greenred\n# orange\n    purple\n  ind#igo\n  # ind#igo\n__end__/)
+
+        action :comment_lines, "doc/COMMENTER", "purple"
+        expect(File.binread(file)).to match(/__start__\n # greenblue\n#\n# yellowblue\n#yellowred\n #greenred\n# orange\n    # purple\n  ind#igo\n  # ind#igo\n__end__/)
+      end
+
+      it "correctly comments lines with hashes in them" do
+        action :comment_lines, "doc/COMMENTER", "ind#igo"
+        expect(File.binread(file)).to match(/__start__\n # greenblue\n#\n# yellowblue\n#yellowred\n #greenred\norange\n    purple\n  # ind#igo\n  # ind#igo\n__end__/)
+      end
+
+      it "does not modify already commented lines" do
+        action :comment_lines, "doc/COMMENTER", "green"
+        expect(File.binread(file)).to match(unmodified_comments_file)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/inject_into_file_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/inject_into_file_spec.rb
new file mode 100644
index 0000000..cf577de
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions/inject_into_file_spec.rb
@@ -0,0 +1,135 @@
+require 'helper'
+require 'thor/actions'
+
+describe Thor::Actions::InjectIntoFile do
+  before do
+    ::FileUtils.rm_rf(destination_root)
+    ::FileUtils.cp_r(source_root, destination_root)
+  end
+
+  def invoker(options={})
+    @invoker ||= MyCounter.new([1,2], options, { :destination_root => destination_root })
+  end
+
+  def revoker
+    @revoker ||= MyCounter.new([1,2], {}, { :destination_root => destination_root, :behavior => :revoke })
+  end
+
+  def invoke!(*args, &block)
+    capture(:stdout) { invoker.insert_into_file(*args, &block) }
+  end
+
+  def revoke!(*args, &block)
+    capture(:stdout) { revoker.insert_into_file(*args, &block) }
+  end
+
+  def file
+    File.join(destination_root, "doc/README")
+  end
+
+  describe "#invoke!" do
+    it "changes the file adding content after the flag" do
+      invoke! "doc/README", "\nmore content", :after => "__start__"
+      expect(File.read(file)).to eq("__start__\nmore content\nREADME\n__end__\n")
+    end
+
+    it "changes the file adding content before the flag" do
+      invoke! "doc/README", "more content\n", :before => "__end__"
+      expect(File.read(file)).to eq("__start__\nREADME\nmore content\n__end__\n")
+    end
+
+    it "accepts data as a block" do
+      invoke! "doc/README", :before => "__end__" do
+        "more content\n"
+      end
+
+      expect(File.read(file)).to eq("__start__\nREADME\nmore content\n__end__\n")
+    end
+
+    it "logs status" do
+      expect(invoke!("doc/README", "\nmore content", :after => "__start__")).to eq("      insert  doc/README\n")
+    end
+
+    it "does not change the file if pretending" do
+      invoker :pretend => true
+      invoke! "doc/README", "\nmore content", :after => "__start__"
+      expect(File.read(file)).to eq("__start__\nREADME\n__end__\n")
+    end
+
+    it "does not change the file if already include content" do
+      invoke! "doc/README", :before => "__end__" do
+        "more content\n"
+      end
+
+      expect(File.read(file)).to eq("__start__\nREADME\nmore content\n__end__\n")
+
+      invoke! "doc/README", :before => "__end__" do
+        "more content\n"
+      end
+
+      expect(File.read(file)).to eq("__start__\nREADME\nmore content\n__end__\n")
+    end
+
+    it "does change the file if already include content and :force == true" do
+      invoke! "doc/README", :before => "__end__" do
+        "more content\n"
+      end
+
+      expect(File.read(file)).to eq("__start__\nREADME\nmore content\n__end__\n")
+
+      invoke! "doc/README", :before => "__end__", :force => true do
+        "more content\n"
+      end
+
+      expect(File.read(file)).to eq("__start__\nREADME\nmore content\nmore content\n__end__\n")
+    end
+
+  end
+
+  describe "#revoke!" do
+    it "substracts the destination file after injection" do
+      invoke! "doc/README", "\nmore content", :after => "__start__"
+      revoke! "doc/README", "\nmore content", :after => "__start__"
+      expect(File.read(file)).to eq("__start__\nREADME\n__end__\n")
+    end
+
+    it "substracts the destination file before injection" do
+      invoke! "doc/README", "more content\n", :before => "__start__"
+      revoke! "doc/README", "more content\n", :before => "__start__"
+      expect(File.read(file)).to eq("__start__\nREADME\n__end__\n")
+    end
+
+    it "substracts even with double after injection" do
+      invoke! "doc/README", "\nmore content", :after => "__start__"
+      invoke! "doc/README", "\nanother stuff", :after => "__start__"
+      revoke! "doc/README", "\nmore content", :after => "__start__"
+      expect(File.read(file)).to eq("__start__\nanother stuff\nREADME\n__end__\n")
+    end
+
+    it "substracts even with double before injection" do
+      invoke! "doc/README", "more content\n", :before => "__start__"
+      invoke! "doc/README", "another stuff\n", :before => "__start__"
+      revoke! "doc/README", "more content\n", :before => "__start__"
+      expect(File.read(file)).to eq("another stuff\n__start__\nREADME\n__end__\n")
+    end
+
+    it "substracts when prepending" do
+      invoke! "doc/README", "more content\n", :after => /\A/
+      invoke! "doc/README", "another stuff\n", :after => /\A/
+      revoke! "doc/README", "more content\n", :after => /\A/
+      expect(File.read(file)).to eq("another stuff\n__start__\nREADME\n__end__\n")
+    end
+
+    it "substracts when appending" do
+      invoke! "doc/README", "more content\n", :before => /\z/
+      invoke! "doc/README", "another stuff\n", :before => /\z/
+      revoke! "doc/README", "more content\n", :before => /\z/
+      expect(File.read(file)).to eq("__start__\nREADME\n__end__\nanother stuff\n")
+    end
+
+    it "shows progress information to the user" do
+      invoke!("doc/README", "\nmore content", :after => "__start__")
+      expect(revoke!("doc/README", "\nmore content", :after => "__start__")).to eq("    subtract  doc/README\n")
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions_spec.rb
new file mode 100644
index 0000000..fc452c6
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/actions_spec.rb
@@ -0,0 +1,331 @@
+require 'helper'
+
+describe Thor::Actions do
+  def runner(options={})
+    @runner ||= MyCounter.new([1], options, { :destination_root => destination_root })
+  end
+
+  def action(*args, &block)
+    capture(:stdout) { runner.send(*args, &block) }
+  end
+
+  def file
+    File.join(destination_root, "foo")
+  end
+
+  describe "on include" do
+    it "adds runtime options to the base class" do
+      expect(MyCounter.class_options.keys).to include(:pretend)
+      expect(MyCounter.class_options.keys).to include(:force)
+      expect(MyCounter.class_options.keys).to include(:quiet)
+      expect(MyCounter.class_options.keys).to include(:skip)
+    end
+  end
+
+  describe "#initialize" do
+    it "has default behavior invoke" do
+      expect(runner.behavior).to eq(:invoke)
+    end
+
+    it "can have behavior revoke" do
+      expect(MyCounter.new([1], {}, :behavior => :revoke).behavior).to eq(:revoke)
+    end
+
+    it "when behavior is set to force, overwrite options" do
+      runner = MyCounter.new([1], { :force => false, :skip => true }, :behavior => :force)
+      expect(runner.behavior).to eq(:invoke)
+      expect(runner.options.force).to be_true
+      expect(runner.options.skip).not_to be_true
+    end
+
+    it "when behavior is set to skip, overwrite options" do
+      runner = MyCounter.new([1], ["--force"], :behavior => :skip)
+      expect(runner.behavior).to eq(:invoke)
+      expect(runner.options.force).not_to be_true
+      expect(runner.options.skip).to be_true
+    end
+  end
+
+  describe "accessors" do
+    describe "#destination_root=" do
+      it "gets the current directory and expands the path to set the root" do
+        base = MyCounter.new([1])
+        base.destination_root = "here"
+        expect(base.destination_root).to eq(File.expand_path(File.join(File.dirname(__FILE__), "..", "here")))
+      end
+
+      it "does not use the current directory if one is given" do
+        root = File.expand_path("/")
+        base = MyCounter.new([1])
+        base.destination_root = root
+        expect(base.destination_root).to eq(root)
+      end
+
+      it "uses the current directory if none is given" do
+        base = MyCounter.new([1])
+        expect(base.destination_root).to eq(File.expand_path(File.join(File.dirname(__FILE__), "..")))
+      end
+    end
+
+    describe "#relative_to_original_destination_root" do
+      it "returns the path relative to the absolute root" do
+        expect(runner.relative_to_original_destination_root(file)).to eq("foo")
+      end
+
+      it "does not remove dot if required" do
+        expect(runner.relative_to_original_destination_root(file, false)).to eq("./foo")
+      end
+
+      it "always use the absolute root" do
+        runner.inside("foo") do
+          expect(runner.relative_to_original_destination_root(file)).to eq("foo")
+        end
+      end
+
+      it "creates proper relative paths for absolute file location" do
+        expect(runner.relative_to_original_destination_root('/test/file')).to eq("/test/file")
+      end
+
+      it "does not fail with files constaining regexp characters" do
+        runner = MyCounter.new([1], {}, { :destination_root => File.join(destination_root, "fo[o-b]ar") })
+        expect(runner.relative_to_original_destination_root("bar")).to eq("bar")
+      end
+
+      describe "#source_paths_for_search" do
+        it "add source_root to source_paths_for_search" do
+          expect(MyCounter.source_paths_for_search).to include(File.expand_path("fixtures", File.dirname(__FILE__)))
+        end
+
+        it "keeps only current source root in source paths" do
+          expect(ClearCounter.source_paths_for_search).to include(File.expand_path("fixtures/bundle", File.dirname(__FILE__)))
+          expect(ClearCounter.source_paths_for_search).not_to include(File.expand_path("fixtures", File.dirname(__FILE__)))
+        end
+
+        it "customized source paths should be before source roots" do
+          expect(ClearCounter.source_paths_for_search[0]).to eq(File.expand_path("fixtures/doc", File.dirname(__FILE__)))
+          expect(ClearCounter.source_paths_for_search[1]).to eq(File.expand_path("fixtures/bundle", File.dirname(__FILE__)))
+        end
+
+        it "keeps inherited source paths at the end" do
+          expect(ClearCounter.source_paths_for_search.last).to eq(File.expand_path("fixtures/broken", File.dirname(__FILE__)))
+        end
+      end
+    end
+
+    describe "#find_in_source_paths" do
+      it "raises an error if source path is empty" do
+        expect {
+          A.new.find_in_source_paths("foo")
+        }.to raise_error(Thor::Error, /Currently you have no source paths/)
+      end
+
+      it "finds a template inside the source path" do
+        expect(runner.find_in_source_paths("doc")).to eq(File.expand_path("doc", source_root))
+        expect{ runner.find_in_source_paths("README") }.to raise_error
+
+        new_path = File.join(source_root, "doc")
+        runner.instance_variable_set(:@source_paths, nil)
+        runner.source_paths.unshift(new_path)
+        expect(runner.find_in_source_paths("README")).to eq(File.expand_path("README", new_path))
+      end
+    end
+  end
+
+  describe "#inside" do
+    it "executes the block inside the given folder" do
+      runner.inside("foo") do
+        expect(Dir.pwd).to eq(file)
+      end
+    end
+
+    it "changes the base root" do
+      runner.inside("foo") do
+        expect(runner.destination_root).to eq(file)
+      end
+    end
+
+    it "creates the directory if it does not exist" do
+      runner.inside("foo") do
+        expect(File.exists?(file)).to be_true
+      end
+    end
+
+    describe "when pretending" do
+      it "no directories should be created" do
+        runner.inside("bar", :pretend => true) {}
+        expect(File.exists?("bar")).to be_false
+      end
+    end
+
+    describe "when verbose" do
+      it "logs status" do
+        expect(capture(:stdout) {
+          runner.inside("foo", :verbose => true) {}
+        }).to match(/inside  foo/)
+      end
+
+      it "uses padding in next status" do
+        expect(capture(:stdout) {
+          runner.inside("foo", :verbose => true) do
+            runner.say_status :cool, :padding
+          end
+        }).to match(/cool    padding/)
+      end
+
+      it "removes padding after block" do
+        expect(capture(:stdout) {
+          runner.inside("foo", :verbose => true) {}
+          runner.say_status :no, :padding
+        }).to match(/no  padding/)
+      end
+    end
+  end
+
+  describe "#in_root" do
+    it "executes the block in the root folder" do
+      runner.inside("foo") do
+        runner.in_root { expect(Dir.pwd).to eq(destination_root) }
+      end
+    end
+
+    it "changes the base root" do
+      runner.inside("foo") do
+        runner.in_root { expect(runner.destination_root).to eq(destination_root) }
+      end
+    end
+
+    it "returns to the previous state" do
+      runner.inside("foo") do
+        runner.in_root { }
+        expect(runner.destination_root).to eq(file)
+      end
+    end
+  end
+
+  describe "#apply" do
+    before do
+      @template = <<-TEMPLATE
+        @foo = "FOO"
+        say_status :cool, :padding
+      TEMPLATE
+      @template.stub(:read).and_return(@template)
+
+      @file = '/'
+      runner.stub(:open).and_return(@template)
+    end
+
+    it "accepts a URL as the path" do
+      @file = "http://gist.github.com/103208.txt"
+      runner.should_receive(:open).with(@file, "Accept" => "application/x-thor-template").and_return(@template)
+      action(:apply, @file)
+    end
+
+    it "accepts a secure URL as the path" do
+      @file = "https://gist.github.com/103208.txt"
+      runner.should_receive(:open).with(@file, "Accept" => "application/x-thor-template").and_return(@template)
+      action(:apply, @file)
+    end
+
+    it "accepts a local file path with spaces" do
+      @file = File.expand_path("fixtures/path with spaces", File.dirname(__FILE__))
+      runner.should_receive(:open).with(@file).and_return(@template)
+      action(:apply, @file)
+    end
+
+    it "opens a file and executes its content in the instance binding" do
+      action :apply, @file
+      expect(runner.instance_variable_get("@foo")).to eq("FOO")
+    end
+
+    it "applies padding to the content inside the file" do
+      expect(action(:apply, @file)).to match(/cool    padding/)
+    end
+
+    it "logs its status" do
+      expect(action(:apply, @file)).to match(/       apply  #{@file}\n/)
+    end
+
+    it "does not log status" do
+      content = action(:apply, @file, :verbose => false)
+      expect(content).to match(/cool  padding/)
+      expect(content).not_to match(/apply http/)
+    end
+  end
+
+  describe "#run" do
+    before do
+      runner.should_receive(:system).with("ls")
+    end
+
+    it "executes the command given" do
+      action :run, "ls"
+    end
+
+    it "logs status" do
+      expect(action(:run, "ls")).to eq("         run  ls from \".\"\n")
+    end
+
+    it "does not log status if required" do
+      expect(action(:run, "ls", :verbose => false)).to be_empty
+    end
+
+    it "accepts a color as status" do
+      runner.shell.should_receive(:say_status).with(:run, 'ls from "."', :yellow)
+      action :run, "ls", :verbose => :yellow
+    end
+  end
+
+  describe "#run_ruby_script" do
+    before do
+      Thor::Util.stub!(:ruby_command).and_return("/opt/jruby")
+      runner.should_receive(:system).with("/opt/jruby script.rb")
+    end
+
+    it "executes the ruby script" do
+      action :run_ruby_script, "script.rb"
+    end
+
+    it "logs status" do
+      expect(action(:run_ruby_script, "script.rb")).to eq("         run  jruby script.rb from \".\"\n")
+    end
+
+    it "does not log status if required" do
+      expect(action(:run_ruby_script, "script.rb", :verbose => false)).to be_empty
+    end
+  end
+
+  describe "#thor" do
+    it "executes the thor command" do
+      runner.should_receive(:system).with("thor list")
+      action :thor, :list, :verbose => true
+    end
+
+    it "converts extra arguments to command arguments" do
+      runner.should_receive(:system).with("thor list foo bar")
+      action :thor, :list, "foo", "bar"
+    end
+
+    it "converts options hash to switches" do
+      runner.should_receive(:system).with("thor list foo bar --foo")
+      action :thor, :list, "foo", "bar", :foo => true
+
+      runner.should_receive(:system).with("thor list --foo 1 2 3")
+      action :thor, :list, :foo => [1,2,3]
+    end
+
+    it "logs status" do
+      runner.should_receive(:system).with("thor list")
+      expect(action(:thor, :list)).to eq("         run  thor list from \".\"\n")
+    end
+
+    it "does not log status if required" do
+      runner.should_receive(:system).with("thor list --foo 1 2 3")
+      expect(action(:thor, :list, :foo => [1,2,3], :verbose => false)).to be_empty
+    end
+
+    it "captures the output when :capture is given" do
+      runner.should_receive(:`).with("thor foo bar")
+      action(:thor, "foo", "bar", :capture => true)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/base_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/base_spec.rb
new file mode 100644
index 0000000..12143fd
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/base_spec.rb
@@ -0,0 +1,291 @@
+require 'helper'
+require 'thor/base'
+
+class Amazing
+  desc "hello", "say hello"
+  def hello
+    puts "Hello"
+  end
+end
+
+describe Thor::Base do
+  describe "#initialize" do
+    it "sets arguments array" do
+      base = MyCounter.new [1, 2]
+      expect(base.first).to eq(1)
+      expect(base.second).to eq(2)
+    end
+
+    it "sets arguments default values" do
+      base = MyCounter.new [1]
+      expect(base.second).to eq(2)
+    end
+
+    it "sets options default values" do
+      base = MyCounter.new [1, 2]
+      expect(base.options[:third]).to eq(3)
+    end
+
+    it "allows options to be given as symbols or strings" do
+      base = MyCounter.new [1, 2], :third => 4
+      expect(base.options[:third]).to eq(4)
+
+      base = MyCounter.new [1, 2], "third" => 4
+      expect(base.options[:third]).to eq(4)
+    end
+
+    it "creates options with indifferent access" do
+      base = MyCounter.new [1, 2], :third => 3
+      expect(base.options['third']).to eq(3)
+    end
+
+    it "creates options with magic predicates" do
+      base = MyCounter.new [1, 2], :third => 3
+      expect(base.options.third).to eq(3)
+    end
+  end
+
+  describe "#no_commands" do
+    it "avoids methods being added as commands" do
+      expect(MyScript.commands.keys).to include("animal")
+      expect(MyScript.commands.keys).not_to include("this_is_not_a_command")
+    end
+  end
+
+  describe "#argument" do
+    it "sets a value as required and creates an accessor for it" do
+      expect(MyCounter.start(["1", "2", "--third", "3"])[0]).to eq(1)
+      expect(Scripts::MyScript.start(["zoo", "my_special_param", "--param=normal_param"])).to eq("my_special_param")
+    end
+
+    it "does not set a value in the options hash" do
+      expect(BrokenCounter.start(["1", "2", "--third", "3"])[0]).to be_nil
+    end
+  end
+
+  describe "#arguments" do
+    it "returns the arguments for the class" do
+      expect(MyCounter.arguments).to have(2).items
+    end
+  end
+
+  describe ":aliases" do
+    it "supports string aliases without a dash prefix" do
+      expect(MyCounter.start(["1", "2", "-z", "3"])[4]).to eq(3)
+    end
+
+    it "supports symbol aliases" do
+      expect(MyCounter.start(["1", "2", "-y", "3"])[5]).to eq(3)
+      expect(MyCounter.start(["1", "2", "-r", "3"])[5]).to eq(3)
+    end
+  end
+
+  describe "#class_option" do
+    it "sets options class wise" do
+      expect(MyCounter.start(["1", "2", "--third", "3"])[2]).to eq(3)
+    end
+
+    it "does not create an accessor for it" do
+      expect(BrokenCounter.start(["1", "2", "--third", "3"])[3]).to be_false
+    end
+  end
+
+  describe "#class_options" do
+    it "sets default options overwriting superclass definitions" do
+      options = Scripts::MyScript.class_options
+      expect(options[:force]).not_to be_required
+    end
+  end
+
+  describe "#remove_argument" do
+    it "removes previous defined arguments from class" do
+      expect(ClearCounter.arguments).to be_empty
+    end
+
+    it "undefine accessors if required" do
+      expect(ClearCounter.new).not_to respond_to(:first)
+      expect(ClearCounter.new).not_to respond_to(:second)
+    end
+  end
+
+  describe "#remove_class_option" do
+    it "removes previous defined class option" do
+      expect(ClearCounter.class_options[:third]).to be_nil
+    end
+  end
+
+  describe "#class_options_help" do
+    before do
+      @content = capture(:stdout) { MyCounter.help(Thor::Base.shell.new) }
+    end
+
+    it "shows options description" do
+      expect(@content).to match(/# The third argument/)
+    end
+
+    it "shows usage with banner content" do
+      expect(@content).to match(/\[\-\-third=THREE\]/)
+    end
+
+    it "shows default values below description" do
+      expect(@content).to match(/# Default: 3/)
+    end
+
+    it "shows options in different groups" do
+      expect(@content).to match(/Options\:/)
+      expect(@content).to match(/Runtime options\:/)
+      expect(@content).to match(/\-p, \[\-\-pretend\]/)
+    end
+
+    it "use padding in options that does not have aliases" do
+      expect(@content).to match(/^  -t, \[--third/)
+      expect(@content).to match(/^          \[--fourth/)
+    end
+
+    it "allows extra options to be given" do
+      hash = { "Foo" => B.class_options.values }
+
+      content = capture(:stdout) { MyCounter.send(:class_options_help, Thor::Base.shell.new, hash) }
+      expect(content).to match(/Foo options\:/)
+      expect(content).to match(/--last-name=LAST_NAME/)
+    end
+
+    it "displays choices for enums" do
+      content = capture(:stdout) { Enum.help(Thor::Base.shell.new) }
+      expect(content).to match(/Possible values\: apple, banana/)
+    end
+  end
+
+  describe "#namespace" do
+    it "returns the default class namespace" do
+      expect(Scripts::MyScript.namespace).to eq("scripts:my_script")
+    end
+
+    it "sets a namespace to the class" do
+      expect(Scripts::MyDefaults.namespace).to eq("default")
+    end
+  end
+
+  describe "#group" do
+    it "sets a group" do
+      expect(MyScript.group).to eq("script")
+    end
+
+    it "inherits the group from parent" do
+      expect(MyChildScript.group).to eq("script")
+    end
+
+    it "defaults to standard if no group is given" do
+      expect(Amazing.group).to eq("standard")
+    end
+  end
+
+  describe "#subclasses" do
+    it "tracks its subclasses in an Array" do
+      expect(Thor::Base.subclasses).to include(MyScript)
+      expect(Thor::Base.subclasses).to include(MyChildScript)
+      expect(Thor::Base.subclasses).to include(Scripts::MyScript)
+    end
+  end
+
+  describe "#subclass_files" do
+    it "returns tracked subclasses, grouped by the files they come from" do
+      thorfile = File.join(File.dirname(__FILE__), "fixtures", "script.thor")
+      expect(Thor::Base.subclass_files[File.expand_path(thorfile)]).to eq([
+        MyScript, MyScript::AnotherScript, MyChildScript, Barn,
+        PackageNameScript, Scripts::MyScript, Scripts::MyDefaults,
+        Scripts::ChildDefault, Scripts::Arities
+      ])
+    end
+
+    it "tracks a single subclass across multiple files" do
+      thorfile = File.join(File.dirname(__FILE__), "fixtures", "command.thor")
+      expect(Thor::Base.subclass_files[File.expand_path(thorfile)]).to include(Amazing)
+      expect(Thor::Base.subclass_files[File.expand_path(__FILE__)]).to include(Amazing)
+    end
+  end
+
+  describe "#commands" do
+    it "returns a list with all commands defined in this class" do
+      expect(MyChildScript.new).to respond_to("animal")
+      expect(MyChildScript.commands.keys).to include("animal")
+    end
+
+    it "raises an error if a command with reserved word is defined" do
+      expect {
+        klass = Class.new(Thor::Group)
+        klass.class_eval "def shell; end"
+      }.to raise_error(RuntimeError, /"shell" is a Thor reserved word and cannot be defined as command/)
+    end
+  end
+
+  describe "#all_commands" do
+    it "returns a list with all commands defined in this class plus superclasses" do
+      expect(MyChildScript.new).to respond_to("foo")
+      expect(MyChildScript.all_commands.keys).to include("foo")
+    end
+  end
+
+  describe "#remove_command" do
+    it "removes the command from its commands hash" do
+      expect(MyChildScript.commands.keys).not_to include("bar")
+      expect(MyChildScript.commands.keys).not_to include("boom")
+    end
+
+    it "undefines the method if desired" do
+      expect(MyChildScript.new).not_to respond_to("boom")
+    end
+  end
+
+  describe "#from_superclass" do
+    it "does not send a method to the superclass if the superclass does not respond to it" do
+      expect(MyCounter.get_from_super).to eq(13)
+    end
+  end
+
+  describe "#start" do
+    it "raises an error instead of rescueing if THOR_DEBUG=1 is given" do
+      begin
+        ENV["THOR_DEBUG"] = 1
+        expect {
+          MyScript.start ["what", "--debug"]
+        }.to raise_error(Thor::UndefinedcommandError, 'Could not find command "what" in "my_script" namespace.')
+      rescue
+        ENV["THOR_DEBUG"] = nil
+      end
+    end
+
+    it "does not steal args" do
+      args = ["foo", "bar", "--force", "true"]
+      MyScript.start(args)
+      expect(args).to eq(["foo", "bar", "--force", "true"])
+    end
+
+    it "checks unknown options" do
+      expect(capture(:stderr) {
+        MyScript.start(["foo", "bar", "--force", "true", "--unknown", "baz"])
+      }.strip).to eq("Unknown switches '--unknown'")
+    end
+
+    it "checks unknown options except specified" do
+      expect(capture(:stderr) {
+        expect(MyScript.start(["with_optional", "NAME", "--omg", "--invalid"])).to eq(["NAME", {}, ["--omg", "--invalid"]])
+      }.strip).to be_empty
+    end
+  end
+
+  describe "attr_*" do
+    it "does not add attr_reader as a command" do
+      expect(capture(:stderr){ MyScript.start(["another_attribute"]) }).to match(/Could not find/)
+    end
+
+    it "does not add attr_writer as a command" do
+      expect(capture(:stderr){ MyScript.start(["another_attribute=", "foo"]) }).to match(/Could not find/)
+    end
+
+    it "does not add attr_accessor as a command" do
+      expect(capture(:stderr){ MyScript.start(["some_attribute"]) }).to match(/Could not find/)
+      expect(capture(:stderr){ MyScript.start(["some_attribute=", "foo"]) }).to match(/Could not find/)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/command_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/command_spec.rb
new file mode 100644
index 0000000..2f8dac0
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/command_spec.rb
@@ -0,0 +1,80 @@
+require 'helper'
+
+describe Thor::Command do
+  def command(options={})
+    options.each do |key, value|
+      options[key] = Thor::Option.parse(key, value)
+    end
+
+    @command ||= Thor::Command.new(:can_has, "I can has cheezburger", "I can has cheezburger\nLots and lots of it", "can_has", options)
+  end
+
+  describe "#formatted_usage" do
+    it "includes namespace within usage" do
+      object = Struct.new(:namespace, :arguments).new("foo", [])
+      expect(command(:bar => :required).formatted_usage(object)).to eq("foo:can_has --bar=BAR")
+    end
+
+    it "includes subcommand name within subcommand usage" do
+      object = Struct.new(:namespace, :arguments).new("main:foo", [])
+      expect(command(:bar => :required).formatted_usage(object, false, true)).to eq("foo can_has --bar=BAR")
+    end
+
+    it "removes default from namespace" do
+      object = Struct.new(:namespace, :arguments).new("default:foo", [])
+      expect(command(:bar => :required).formatted_usage(object)).to eq(":foo:can_has --bar=BAR")
+    end
+
+    it "injects arguments into usage" do
+      options = {:required => true, :type => :string}
+      object = Struct.new(:namespace, :arguments).new("foo", [Thor::Argument.new(:bar, options)])
+      expect(command(:foo => :required).formatted_usage(object)).to eq("foo:can_has BAR --foo=FOO")
+    end
+  end
+
+  describe "#dynamic" do
+    it "creates a dynamic command with the given name" do
+      expect(Thor::DynamicCommand.new('command').name).to eq('command')
+      expect(Thor::DynamicCommand.new('command').description).to eq('A dynamically-generated command')
+      expect(Thor::DynamicCommand.new('command').usage).to eq('command')
+      expect(Thor::DynamicCommand.new('command').options).to eq({})
+    end
+
+    it "does not invoke an existing method" do
+      mock = mock()
+      mock.class.should_receive(:handle_no_command_error).with("to_s")
+      Thor::DynamicCommand.new('to_s').run(mock)
+    end
+  end
+
+  describe "#dup" do
+    it "dup options hash" do
+      command = Thor::Command.new("can_has", nil, nil, nil, :foo => true, :bar => :required)
+      command.dup.options.delete(:foo)
+      expect(command.options[:foo]).to be
+    end
+  end
+
+  describe "#run" do
+    it "runs a command by calling a method in the given instance" do
+      mock = mock()
+      mock.should_receive(:can_has).and_return {|*args| args }
+      expect(command.run(mock, [1, 2, 3])).to eq([1, 2, 3])
+    end
+
+    it "raises an error if the method to be invoked is private" do
+      klass = Class.new do
+        def self.handle_no_command_error(name)
+          name
+        end
+
+      private
+        def can_has
+          "fail"
+        end
+      end
+
+      expect(command.run(klass.new)).to eq("can_has")
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/core_ext/hash_with_indifferent_access_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/core_ext/hash_with_indifferent_access_spec.rb
new file mode 100644
index 0000000..5d66951
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/core_ext/hash_with_indifferent_access_spec.rb
@@ -0,0 +1,48 @@
+require 'helper'
+require 'thor/core_ext/hash_with_indifferent_access'
+
+describe Thor::CoreExt::HashWithIndifferentAccess do
+  before do
+    @hash = Thor::CoreExt::HashWithIndifferentAccess.new :foo => 'bar', 'baz' => 'bee', :force => true
+  end
+
+  it "has values accessible by either strings or symbols" do
+    expect(@hash['foo']).to eq('bar')
+    expect(@hash[:foo]).to eq('bar')
+
+    expect(@hash.values_at(:foo, :baz)).to eq(['bar', 'bee'])
+    expect(@hash.delete(:foo)).to eq('bar')
+  end
+
+  it "handles magic boolean predicates" do
+    expect(@hash.force?).to be_true
+    expect(@hash.foo?).to be_true
+    expect(@hash.nothing?).to be_false
+  end
+
+  it "handles magic comparisions" do
+    expect(@hash.foo?('bar')).to be_true
+    expect(@hash.foo?('bee')).to be_false
+  end
+
+  it "maps methods to keys" do
+    expect(@hash.foo).to eq(@hash['foo'])
+  end
+
+  it "merges keys independent if they are symbols or strings" do
+    @hash.merge!('force' => false, :baz => "boom")
+    expect(@hash[:force]).to eq(false)
+    expect(@hash[:baz]).to eq("boom")
+  end
+
+  it "creates a new hash by merging keys independent if they are symbols or strings" do
+    other = @hash.merge('force' => false, :baz => "boom")
+    expect(other[:force]).to eq(false)
+    expect(other[:baz]).to eq("boom")
+  end
+
+  it "converts to a traditional hash" do
+    expect(@hash.to_hash.class).to eq(Hash)
+    expect(@hash).to eq({ 'foo' => 'bar', 'baz' => 'bee', 'force' => true })
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/core_ext/ordered_hash_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/core_ext/ordered_hash_spec.rb
new file mode 100644
index 0000000..aba5226
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/core_ext/ordered_hash_spec.rb
@@ -0,0 +1,115 @@
+require 'helper'
+require 'thor/core_ext/ordered_hash'
+
+describe Thor::CoreExt::OrderedHash do
+  before do
+    @hash = Thor::CoreExt::OrderedHash.new
+  end
+
+  describe "without any items" do
+    it "returns nil for an undefined key" do
+      expect(@hash["foo"]).to be_nil
+    end
+
+    it "doesn't iterate through any items" do
+      @hash.each { fail }
+    end
+
+    it "has an empty key and values list" do
+      expect(@hash.keys).to be_empty
+      expect(@hash.values).to be_empty
+    end
+
+    it "must be empty" do
+      expect(@hash).to be_empty
+    end
+  end
+
+  describe "with several items" do
+    before do
+      @hash[:foo] = "Foo!"
+      @hash[:bar] = "Bar!"
+      @hash[:baz] = "Baz!"
+      @hash[:bop] = "Bop!"
+      @hash[:bat] = "Bat!"
+    end
+
+    it "returns nil for an undefined key" do
+      expect(@hash[:boom]).to be_nil
+    end
+
+    it "returns the value for each key" do
+      expect(@hash[:foo]).to eq("Foo!")
+      expect(@hash[:bar]).to eq("Bar!")
+      expect(@hash[:baz]).to eq("Baz!")
+      expect(@hash[:bop]).to eq("Bop!")
+      expect(@hash[:bat]).to eq("Bat!")
+    end
+
+    it "iterates through the keys and values in order of assignment" do
+      arr = []
+      @hash.each do |key, value|
+        arr << [key, value]
+      end
+      expect(arr).to eq([[:foo, "Foo!"], [:bar, "Bar!"], [:baz, "Baz!"],
+                     [:bop, "Bop!"], [:bat, "Bat!"]])
+    end
+
+    it "returns the keys in order of insertion" do
+      expect(@hash.keys).to eq([:foo, :bar, :baz, :bop, :bat])
+    end
+
+    it "returns the values in order of insertion" do
+      expect(@hash.values).to eq(["Foo!", "Bar!", "Baz!", "Bop!", "Bat!"])
+    end
+
+    it "does not move an overwritten node to the end of the ordering" do
+      @hash[:baz] = "Bip!"
+      expect(@hash.values).to eq(["Foo!", "Bar!", "Bip!", "Bop!", "Bat!"])
+
+      @hash[:foo] = "Bip!"
+      expect(@hash.values).to eq(["Bip!", "Bar!", "Bip!", "Bop!", "Bat!"])
+
+      @hash[:bat] = "Bip!"
+      expect(@hash.values).to eq(["Bip!", "Bar!", "Bip!", "Bop!", "Bip!"])
+    end
+
+    it "appends another ordered hash while preserving ordering" do
+      other_hash = Thor::CoreExt::OrderedHash.new
+      other_hash[1] = "one"
+      other_hash[2] = "two"
+      other_hash[3] = "three"
+      expect(@hash.merge(other_hash).values).to eq(["Foo!", "Bar!", "Baz!", "Bop!", "Bat!", "one", "two", "three"])
+    end
+
+    it "overwrites hash keys with matching appended keys" do
+      other_hash = Thor::CoreExt::OrderedHash.new
+      other_hash[:bar] = "bar"
+      expect(@hash.merge(other_hash)[:bar]).to eq("bar")
+      expect(@hash[:bar]).to eq("Bar!")
+    end
+
+    it "converts to an array" do
+      expect(@hash.to_a).to eq([[:foo, "Foo!"], [:bar, "Bar!"], [:baz, "Baz!"], [:bop, "Bop!"], [:bat, "Bat!"]])
+    end
+
+    it "must not be empty" do
+      expect(@hash).not_to be_empty
+    end
+
+    it "deletes values from hash" do
+      expect(@hash.delete(:baz)).to eq("Baz!")
+      expect(@hash.values).to eq(["Foo!", "Bar!", "Bop!", "Bat!"])
+
+      expect(@hash.delete(:foo)).to eq("Foo!")
+      expect(@hash.values).to eq(["Bar!", "Bop!", "Bat!"])
+
+      expect(@hash.delete(:bat)).to eq("Bat!")
+      expect(@hash.values).to eq(["Bar!", "Bop!"])
+    end
+
+    it "returns nil if the value to be deleted can't be found" do
+      expect(@hash.delete(:nothing)).to be_nil
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/exit_condition_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/exit_condition_spec.rb
new file mode 100644
index 0000000..a7571ce
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/exit_condition_spec.rb
@@ -0,0 +1,19 @@
+require 'helper'
+require 'thor/base'
+
+describe "Exit conditions" do
+  it "exits 0, not bubble up EPIPE, if EPIPE is raised" do
+    epiped = false
+
+    command = Class.new(Thor) do
+      desc "my_action", "testing EPIPE"
+      define_method :my_action do
+        epiped = true
+        raise Errno::EPIPE
+      end
+    end
+
+    expect{ command.start(["my_action"]) }.to raise_error(SystemExit)
+    expect(epiped).to eq(true)
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/application.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/application.rb
new file mode 100644
index 0000000..50d2fae
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/application.rb
@@ -0,0 +1,2 @@
+class Application < Base
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/app{1}/README b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/app{1}/README
new file mode 100644
index 0000000..16374df
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/app{1}/README
@@ -0,0 +1,3 @@
+__start__
+README
+__end__
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/bundle/execute.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/bundle/execute.rb
new file mode 100644
index 0000000..0530d87
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/bundle/execute.rb
@@ -0,0 +1,6 @@
+class Execute < Thor
+  desc "ls", "Execute ls"
+  def ls
+    system "ls"
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/bundle/main.thor b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/bundle/main.thor
new file mode 100644
index 0000000..38bdfbc
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/bundle/main.thor
@@ -0,0 +1 @@
+require File.join(File.dirname(__FILE__), 'execute')
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/command.thor b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/command.thor
new file mode 100644
index 0000000..26a0268
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/command.thor
@@ -0,0 +1,10 @@
+# module: random
+
+class Amazing < Thor
+  desc "describe NAME", "say that someone is amazing"
+  method_options :forcefully => :boolean
+  def describe(name, opts)
+    ret = "#{name} is amazing"
+    puts opts["forcefully"] ? ret.upcase : ret
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/%file_name%.rb.tt b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/%file_name%.rb.tt
new file mode 100644
index 0000000..4c4c6c0
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/%file_name%.rb.tt
@@ -0,0 +1 @@
+FOO = <%= "FOO" %>
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/COMMENTER b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/COMMENTER
new file mode 100644
index 0000000..384cb3a
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/COMMENTER
@@ -0,0 +1,11 @@
+__start__
+ # greenblue
+#
+# yellowblue
+#yellowred
+ #greenred
+orange
+    purple
+  ind#igo
+  # ind#igo
+__end__
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/README b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/README
new file mode 100644
index 0000000..16374df
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/README
@@ -0,0 +1,3 @@
+__start__
+README
+__end__
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/block_helper.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/block_helper.rb
new file mode 100644
index 0000000..df59211
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/block_helper.rb
@@ -0,0 +1,3 @@
+<% world do -%>
+Hello
+<% end -%>
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/config.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/config.rb
new file mode 100644
index 0000000..6211739
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/config.rb
@@ -0,0 +1 @@
+class <%= @klass %>; end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/config.yaml.tt b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/config.yaml.tt
new file mode 100644
index 0000000..e75615c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/config.yaml.tt
@@ -0,0 +1 @@
+--- Hi from yaml
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/excluding/%file_name%.rb.tt b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/excluding/%file_name%.rb.tt
new file mode 100644
index 0000000..6296c46
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/doc/excluding/%file_name%.rb.tt
@@ -0,0 +1 @@
+BAR = <%= "BAR" %>
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/enum.thor b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/enum.thor
new file mode 100644
index 0000000..b5a7ded
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/enum.thor
@@ -0,0 +1,10 @@
+class Enum < Thor::Group
+  include Thor::Actions
+
+  desc "snack"
+  class_option "fruit", :aliases => "-f", :type => :string, :enum => %w(apple banana)
+  def snack
+    puts options['fruit']
+  end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/group.thor b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/group.thor
new file mode 100644
index 0000000..bc7e102
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/group.thor
@@ -0,0 +1,128 @@
+class MyCounter < Thor::Group
+  include Thor::Actions
+  add_runtime_options!
+
+  def self.get_from_super
+    from_superclass(:get_from_super, 13)
+  end
+
+  source_root File.expand_path(File.dirname(__FILE__))
+  source_paths << File.expand_path("broken", File.dirname(__FILE__))
+
+  argument :first,       :type => :numeric
+  argument :second,      :type => :numeric, :default => 2
+
+  class_option :third,    :type => :numeric, :desc => "The third argument", :default => 3,
+                          :banner => "THREE", :aliases => "-t"
+  class_option :fourth,   :type => :numeric, :desc => "The fourth argument"
+  class_option :simple,   :type => :numeric, :aliases => 'z'
+  class_option :symbolic, :type => :numeric, :aliases => [:y, :r]
+
+  desc <<-FOO
+Description:
+  This generator runs three commands: one, two and three.
+FOO
+
+  def one
+    first
+  end
+
+  def two
+    second
+  end
+
+  def three
+    options[:third]
+  end
+
+  def four
+    options[:fourth]
+  end
+
+  def five
+    options[:simple]
+  end
+
+  def six
+    options[:symbolic]
+  end
+
+  def self.inherited(base)
+    super
+    base.source_paths.unshift(File.expand_path(File.join(File.dirname(__FILE__), "doc")))
+  end
+
+  no_commands do
+    def world(&block)
+      result = capture(&block)
+      concat(result.strip + " world!")
+    end
+  end
+end
+
+class ClearCounter < MyCounter
+  remove_argument :first, :second, :undefine => true
+  remove_class_option :third
+
+  def self.source_root
+    File.expand_path(File.join(File.dirname(__FILE__), "bundle"))
+  end
+end
+
+class BrokenCounter < MyCounter
+  namespace "app:broken:counter"
+  class_option :fail, :type => :boolean, :default => false
+
+  class << self
+    undef_method :source_root
+  end
+
+  def one
+    options[:first]
+  end
+
+  def four
+    respond_to?(:fail)
+  end
+
+  def five
+    options[:fail] ? this_method_does_not_exist : 5
+  end
+end
+
+class WhinyGenerator < Thor::Group
+  include Thor::Actions
+
+  def self.source_root
+    File.expand_path(File.dirname(__FILE__))
+  end
+
+  def wrong_arity(required)
+  end
+end
+
+class CommandConflict < Thor::Group
+  desc "A group with the same name as a default command"
+  def group
+    puts "group"
+  end
+end
+
+class ParentGroup < Thor::Group
+private
+  def foo
+    "foo"
+  end
+
+  def baz(name = 'baz')
+    name
+  end
+end
+
+class ChildGroup < ParentGroup
+  def bar
+    "bar"
+  end
+
+  public_command :foo, :baz
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/invoke.thor b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/invoke.thor
new file mode 100644
index 0000000..75bd51b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/invoke.thor
@@ -0,0 +1,112 @@
+class A < Thor
+  include Thor::Actions
+
+  desc "one", "invoke one"
+  def one
+    p 1
+    invoke :two
+    invoke :three
+  end
+
+  desc "two", "invoke two"
+  def two
+    p 2
+    invoke :three
+  end
+
+  desc "three", "invoke three"
+  def three
+    p 3
+  end
+
+  desc "four", "invoke four"
+  def four
+    p 4
+    invoke "defined:five"
+  end
+
+  desc "five N", "check if number is equal 5"
+  def five(number)
+    number == 5
+  end
+
+  desc "invoker", "invoke a b command"
+  def invoker(*args)
+    invoke :b, :one, ["Jose"]
+  end
+end
+
+class B < Thor
+  class_option :last_name, :type => :string
+
+  desc "one FIRST_NAME", "invoke one"
+  def one(first_name)
+    "#{options.last_name}, #{first_name}"
+  end
+
+  desc "two", "invoke two"
+  def two
+    options
+  end
+
+  desc "three", "invoke three"
+  def three
+    self
+  end
+end
+
+class C < Thor::Group
+  include Thor::Actions
+
+  def one
+    p 1
+  end
+
+  def two
+    p 2
+  end
+
+  def three
+    p 3
+  end
+end
+
+class Defined < Thor::Group
+  class_option :unused, :type => :boolean, :desc => "This option has no use"
+
+  def one
+    p 1
+    invoke "a:two"
+    invoke "a:three"
+    invoke "a:four"
+    invoke "defined:five"
+  end
+
+  def five
+    p 5
+  end
+
+  def print_status
+    say_status :finished, :counting
+  end
+end
+
+class E < Thor::Group
+  invoke Defined
+end
+
+class F < Thor::Group
+  invoke "b:one" do |instance, klass, command|
+    instance.invoke klass, command, [ "Jose" ], :last_name => "Valim"
+  end
+end
+
+class G < Thor::Group
+  class_option :invoked, :type => :string, :default => "defined"
+  invoke_from_option :invoked
+end
+
+class H < Thor::Group
+  class_option :defined, :type => :boolean, :default => true
+  invoke_from_option :defined
+end
diff --git a/public/images/.gitkeep b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/path with spaces
similarity index 100%
copy from public/images/.gitkeep
copy to .bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/path with spaces
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/preserve/script.sh b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/preserve/script.sh
new file mode 100755
index 0000000..c52d3c2
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/preserve/script.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exit 0
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/script.thor b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/script.thor
new file mode 100644
index 0000000..3875133
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/script.thor
@@ -0,0 +1,220 @@
+class MyScript < Thor
+  check_unknown_options! :except => :with_optional
+
+  attr_accessor :some_attribute
+  attr_writer :another_attribute
+  attr_reader :another_attribute
+
+  private
+  attr_reader :private_attribute
+
+  public
+  group :script
+  default_command :example_default_command
+
+  map "-T" => :animal, ["-f", "--foo"] => :foo
+
+  map "animal_prison" => "zoo"
+
+  desc "zoo", "zoo around"
+  def zoo
+    true
+  end
+
+  desc "animal TYPE", "horse around"
+
+  no_commands do
+    def this_is_not_a_command
+    end
+  end
+
+  def animal(type)
+    [type]
+  end
+
+  map "hid" => "hidden"
+
+  desc "hidden TYPE", "this is hidden", :hide => true
+  def hidden(type)
+    [type]
+  end
+
+  map "fu" => "zoo"
+
+  desc "foo BAR", <<END
+do some fooing
+  This is more info!
+  Everyone likes more info!
+END
+  method_option :force, :type => :boolean, :desc => "Force to do some fooing"
+  def foo(bar)
+    [bar, options]
+  end
+
+  desc "example_default_command", "example!"
+  method_options :with => :string
+  def example_default_command
+    options.empty? ? "default command" : options
+  end
+
+  desc "call_myself_with_wrong_arity", "get the right error"
+  def call_myself_with_wrong_arity
+    call_myself_with_wrong_arity(4)
+  end
+
+  desc "call_unexistent_method", "Call unexistent method inside a command"
+  def call_unexistent_method
+    boom!
+  end
+
+  desc "long_description", "a" * 80
+  long_desc <<-D
+    This is a really really really long description.
+    Here you go. So very long.
+
+    It even has two paragraphs.
+  D
+  def long_description
+  end
+
+  desc "name-with-dashes", "Ensure normalization of command names"
+  def name_with_dashes
+  end
+
+  method_options :all => :boolean
+  method_option :lazy, :lazy_default => "yes"
+  method_option :lazy_numeric, :type => :numeric, :lazy_default => 42
+  method_option :lazy_array,   :type => :array,   :lazy_default => %w[eat at joes]
+  method_option :lazy_hash,    :type => :hash,    :lazy_default => {'swedish' => 'meatballs'}
+  desc "with_optional NAME", "invoke with optional name"
+  def with_optional(name=nil, *args)
+    [ name, options, args ]
+  end
+
+  class AnotherScript < Thor
+    desc "baz", "do some bazing"
+    def baz
+    end
+  end
+
+  desc "send", "send as a command name"
+  def send
+    true
+  end
+
+  private
+
+    def method_missing(meth, *args)
+      if meth == :boom!
+        super
+      else
+        [meth, args]
+      end
+    end
+
+    desc "what", "what"
+    def what
+    end
+end
+
+class MyChildScript < MyScript
+  remove_command :bar
+
+  method_options :force => :boolean, :param => :numeric
+  def initialize(*args)
+    super
+  end
+
+  desc "zoo", "zoo around"
+  method_options :param => :required
+  def zoo
+    options
+  end
+
+  desc "animal TYPE", "horse around"
+  def animal(type)
+    [type, options]
+  end
+  method_option :other, :type => :string, :default => "method default", :for => :animal
+  desc "animal KIND", "fish around", :for => :animal
+
+  desc "boom", "explodes everything"
+  def boom
+  end
+
+  remove_command :boom, :undefine => true
+end
+
+class Barn < Thor
+  desc "open [ITEM]", "open the barn door"
+  def open(item = nil)
+    if item == "shotgun"
+      puts "That's going to leave a mark."
+    else
+      puts "Open sesame!"
+    end
+  end
+
+  desc "paint [COLOR]", "paint the barn"
+  method_option :coats, :type => :numeric, :default => 2, :desc => 'how many coats of paint'
+  def paint(color='red')
+    puts "#{options[:coats]} coats of #{color} paint"
+  end
+end
+
+class PackageNameScript < Thor
+  package_name "Baboon"
+end
+
+module Scripts
+  class MyScript < MyChildScript
+    argument :accessor, :type => :string
+    class_options :force => :boolean
+    method_option :new_option, :type => :string, :for => :example_default_command
+
+    def zoo
+      self.accessor
+    end
+  end
+
+  class MyDefaults < Thor
+    check_unknown_options!
+
+    namespace :default
+    desc "cow", "prints 'moo'"
+    def cow
+      puts "moo"
+    end
+
+    desc "command_conflict", "only gets called when prepended with a colon"
+    def command_conflict
+      puts "command"
+    end
+
+    desc "barn", "commands to manage the barn"
+    subcommand "barn", Barn
+  end
+
+  class ChildDefault < Thor
+    namespace "default:child"
+  end
+
+  class Arities < Thor
+    desc "zero_args", "takes zero args"
+    def zero_args
+    end
+
+    desc "one_arg ARG", "takes one arg"
+    def one_arg(arg)
+    end
+
+    desc "two_args ARG1 ARG2", "takes two args"
+    def two_args(arg1, arg2)
+    end
+
+    desc "optional_arg [ARG]", "takes an optional arg"
+    def optional_arg(arg='default')
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/subcommand.thor b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/subcommand.thor
new file mode 100644
index 0000000..35d0b57
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/fixtures/subcommand.thor
@@ -0,0 +1,17 @@
+module TestSubcommands
+
+  class Subcommand < Thor
+    desc "print_opt", "My method"
+    def print_opt
+      print options["opt"]
+    end
+  end
+
+  class Parent < Thor
+    class_option "opt"
+
+    desc "sub", "My subcommand"
+    subcommand "sub", Subcommand
+  end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/group_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/group_spec.rb
new file mode 100644
index 0000000..0fc88fe
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/group_spec.rb
@@ -0,0 +1,216 @@
+require 'helper'
+
+describe Thor::Group do
+  describe "command" do
+    it "allows to use private methods from parent class as commands" do
+      expect(ChildGroup.start).to eq(["bar", "foo", "baz"])
+      expect(ChildGroup.new.baz("bar")).to eq("bar")
+    end
+  end
+
+  describe "#start" do
+    it "invokes all the commands under the Thor group" do
+      expect(MyCounter.start(["1", "2", "--third", "3"])).to eq([ 1, 2, 3, nil, nil, nil ])
+    end
+
+    it "uses argument default value" do
+      expect(MyCounter.start(["1", "--third", "3"])).to eq([ 1, 2, 3, nil, nil, nil ])
+    end
+
+    it "invokes all the commands in the Thor group and its parents" do
+      expect(BrokenCounter.start(["1", "2", "--third", "3"])).to eq([ nil, 2, 3, false, 5, nil ])
+    end
+
+    it "raises an error if a required argument is added after a non-required" do
+      expect {
+        MyCounter.argument(:foo, :type => :string)
+      }.to raise_error(ArgumentError, 'You cannot have "foo" as required argument after the non-required argument "second".')
+    end
+
+    it "raises when an exception happens within the command call" do
+      expect{ BrokenCounter.start(["1", "2", "--fail"]) }.to raise_error
+    end
+
+    it "raises an error when a Thor group command expects arguments" do
+      expect{ WhinyGenerator.start }.to raise_error(ArgumentError, /thor wrong_arity takes 1 argument, but it should not/)
+    end
+
+    it "invokes help message if any of the shortcuts is given" do
+      MyCounter.should_receive(:help)
+      MyCounter.start(["-h"])
+    end
+  end
+
+  describe "#desc" do
+    it "sets the description for a given class" do
+      expect(MyCounter.desc).to eq("Description:\n  This generator runs three commands: one, two and three.\n")
+    end
+
+    it "can be inherited" do
+      expect(BrokenCounter.desc).to eq("Description:\n  This generator runs three commands: one, two and three.\n")
+    end
+
+    it "can be nil" do
+      expect(WhinyGenerator.desc).to be_nil
+    end
+  end
+
+  describe "#help" do
+    before do
+      @content = capture(:stdout) { MyCounter.help(Thor::Base.shell.new) }
+    end
+
+    it "provides usage information" do
+      expect(@content).to match(/my_counter N \[N\]/)
+    end
+
+    it "shows description" do
+      expect(@content).to match(/Description:/)
+      expect(@content).to match(/This generator runs three commands: one, two and three./)
+    end
+
+    it "shows options information" do
+      expect(@content).to match(/Options/)
+      expect(@content).to match(/\[\-\-third=THREE\]/)
+    end
+  end
+
+  describe "#invoke" do
+    before do
+      @content = capture(:stdout) { E.start }
+    end
+
+    it "allows to invoke a class from the class binding" do
+      expect(@content).to match(/1\n2\n3\n4\n5\n/)
+    end
+
+    it "shows invocation information to the user" do
+      expect(@content).to match(/invoke  Defined/)
+    end
+
+    it "uses padding on status generated by the invoked class" do
+      expect(@content).to match(/finished    counting/)
+    end
+
+    it "allows invocation to be configured with blocks" do
+      capture(:stdout) do
+        expect(F.start).to eq(["Valim, Jose"])
+      end
+    end
+
+    it "shows invoked options on help" do
+      content = capture(:stdout) { E.help(Thor::Base.shell.new) }
+      expect(content).to match(/Defined options:/)
+      expect(content).to match(/\[--unused\]/)
+      expect(content).to match(/# This option has no use/)
+    end
+  end
+
+  describe "#invoke_from_option" do
+    describe "with default type" do
+      before do
+        @content = capture(:stdout) { G.start }
+      end
+
+      it "allows to invoke a class from the class binding by a default option" do
+        expect(@content).to match(/1\n2\n3\n4\n5\n/)
+      end
+
+      it "does not invoke if the option is nil" do
+        expect(capture(:stdout) { G.start(["--skip-invoked"]) }).not_to match(/invoke/)
+      end
+
+      it "prints a message if invocation cannot be found" do
+        content = capture(:stdout) { G.start(["--invoked", "unknown"]) }
+        expect(content).to match(/error  unknown \[not found\]/)
+      end
+
+      it "allows to invoke a class from the class binding by the given option" do
+        content = capture(:stdout) { G.start(["--invoked", "e"]) }
+        expect(content).to match(/invoke  e/)
+      end
+
+      it "shows invocation information to the user" do
+        expect(@content).to match(/invoke  defined/)
+      end
+
+      it "uses padding on status generated by the invoked class" do
+        expect(@content).to match(/finished    counting/)
+      end
+
+      it "shows invoked options on help" do
+        content = capture(:stdout) { G.help(Thor::Base.shell.new) }
+        expect(content).to match(/defined options:/)
+        expect(content).to match(/\[--unused\]/)
+        expect(content).to match(/# This option has no use/)
+      end
+    end
+
+    describe "with boolean type" do
+      before do
+        @content = capture(:stdout) { H.start }
+      end
+
+      it "allows to invoke a class from the class binding by a default option" do
+        expect(@content).to match(/1\n2\n3\n4\n5\n/)
+      end
+
+      it "does not invoke if the option is false" do
+        expect(capture(:stdout) { H.start(["--no-defined"]) }).not_to match(/invoke/)
+      end
+
+      it "shows invocation information to the user" do
+        expect(@content).to match(/invoke  defined/)
+      end
+
+      it "uses padding on status generated by the invoked class" do
+        expect(@content).to match(/finished    counting/)
+      end
+
+      it "shows invoked options on help" do
+        content = capture(:stdout) { H.help(Thor::Base.shell.new) }
+        expect(content).to match(/defined options:/)
+        expect(content).to match(/\[--unused\]/)
+        expect(content).to match(/# This option has no use/)
+      end
+    end
+  end
+
+  describe "edge-cases" do
+    it "can handle boolean options followed by arguments" do
+      klass = Class.new(Thor::Group) do
+        desc "say hi to name"
+        argument :name, :type => :string
+        class_option :loud, :type => :boolean
+
+        def hi
+          name.upcase! if options[:loud]
+          "Hi #{name}"
+        end
+      end
+
+      expect(klass.start(["jose"])).to eq(["Hi jose"])
+      expect(klass.start(["jose", "--loud"])).to eq(["Hi JOSE"])
+      expect(klass.start(["--loud", "jose"])).to eq(["Hi JOSE"])
+    end
+
+    it "provides extra args as `args`" do
+      klass = Class.new(Thor::Group) do
+        desc "say hi to name"
+        argument :name, :type => :string
+        class_option :loud, :type => :boolean
+
+        def hi
+          name.upcase! if options[:loud]
+          out = "Hi #{name}"
+          out << ": " << args.join(", ") unless args.empty?
+          out
+        end
+      end
+
+      expect(klass.start(["jose"])).to eq(["Hi jose"])
+      expect(klass.start(["jose", "--loud"])).to eq(["Hi JOSE"])
+      expect(klass.start(["--loud", "jose"])).to eq(["Hi JOSE"])
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/helper.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/helper.rb
new file mode 100644
index 0000000..6372759
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/helper.rb
@@ -0,0 +1,67 @@
+$TESTING=true
+
+require 'simplecov'
+require 'coveralls'
+
+SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
+  SimpleCov::Formatter::HTMLFormatter,
+  Coveralls::SimpleCov::Formatter
+]
+SimpleCov.start
+
+$:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
+require 'thor'
+require 'thor/group'
+require 'stringio'
+
+require 'rdoc'
+require 'rspec'
+require 'diff/lcs' # You need diff/lcs installed to run specs (but not to run Thor).
+require 'fakeweb'  # You need fakeweb installed to run specs (but not to run Thor).
+
+# Set shell to basic
+$0 = "thor"
+$thor_runner = true
+ARGV.clear
+Thor::Base.shell = Thor::Shell::Basic
+
+# Load fixtures
+load File.join(File.dirname(__FILE__), "fixtures", "enum.thor")
+load File.join(File.dirname(__FILE__), "fixtures", "group.thor")
+load File.join(File.dirname(__FILE__), "fixtures", "invoke.thor")
+load File.join(File.dirname(__FILE__), "fixtures", "script.thor")
+load File.join(File.dirname(__FILE__), "fixtures", "subcommand.thor")
+load File.join(File.dirname(__FILE__), "fixtures", "command.thor")
+
+RSpec.configure do |config|
+  config.before do
+    ARGV.replace []
+  end
+
+  config.expect_with :rspec do |c|
+    c.syntax = :expect
+  end
+
+  def capture(stream)
+    begin
+      stream = stream.to_s
+      eval "$#{stream} = StringIO.new"
+      yield
+      result = eval("$#{stream}").string
+    ensure
+      eval("$#{stream} = #{stream.upcase}")
+    end
+
+    result
+  end
+
+  def source_root
+    File.join(File.dirname(__FILE__), 'fixtures')
+  end
+
+  def destination_root
+    File.join(File.dirname(__FILE__), 'sandbox')
+  end
+
+  alias :silence :capture
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/invocation_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/invocation_spec.rb
new file mode 100644
index 0000000..2c0db51
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/invocation_spec.rb
@@ -0,0 +1,100 @@
+require 'helper'
+require 'thor/base'
+
+describe Thor::Invocation do
+  describe "#invoke" do
+    it "invokes a command inside another command" do
+      expect(capture(:stdout) { A.new.invoke(:two) }).to eq("2\n3\n")
+    end
+
+    it "invokes a command just once" do
+      expect(capture(:stdout) { A.new.invoke(:one) }).to eq("1\n2\n3\n")
+    end
+
+    it "invokes a command just once even if they belongs to different classes" do
+      expect(capture(:stdout) { Defined.new.invoke(:one) }).to eq("1\n2\n3\n4\n5\n")
+    end
+
+    it "invokes a command with arguments" do
+      expect(A.new.invoke(:five, [5])).to be_true
+      expect(A.new.invoke(:five, [7])).to be_false
+    end
+
+    it "invokes the default command if none is given to a Thor class" do
+      content = capture(:stdout) { A.new.invoke("b") }
+      expect(content).to match(/Commands/)
+      expect(content).to match(/LAST_NAME/)
+    end
+
+    it "accepts a class as argument without a command to invoke" do
+      content = capture(:stdout) { A.new.invoke(B) }
+      expect(content).to match(/Commands/)
+      expect(content).to match(/LAST_NAME/)
+    end
+
+    it "accepts a class as argument with a command to invoke" do
+      base = A.new([], :last_name => "Valim")
+      expect(base.invoke(B, :one, ["Jose"])).to eq("Valim, Jose")
+    end
+
+    it "allows customized options to be given" do
+      base = A.new([], :last_name => "Wrong")
+      expect(base.invoke(B, :one, ["Jose"], :last_name => "Valim")).to eq("Valim, Jose")
+    end
+
+    it "reparses options in the new class" do
+      expect(A.start(["invoker", "--last-name", "Valim"])).to eq("Valim, Jose")
+    end
+
+    it "shares initialize options with invoked class" do
+      expect(A.new([], :foo => :bar).invoke("b:two")).to eq({ "foo" => :bar })
+    end
+
+    it "dump configuration values to be used in the invoked class" do
+      base = A.new
+      expect(base.invoke("b:three").shell).to eq(base.shell)
+    end
+
+    it "allow extra configuration values to be given" do
+      base, shell = A.new, Thor::Base.shell.new
+      expect(base.invoke("b:three", [], {}, :shell => shell).shell).to eq(shell)
+    end
+
+    it "invokes a Thor::Group and all of its commands" do
+      expect(capture(:stdout) { A.new.invoke(:c) }).to eq("1\n2\n3\n")
+    end
+
+    it "does not invoke a Thor::Group twice" do
+      base = A.new
+      silence(:stdout){ base.invoke(:c) }
+      expect(capture(:stdout) { base.invoke(:c) }).to be_empty
+    end
+
+    it "does not invoke any of Thor::Group commands twice" do
+      base = A.new
+      silence(:stdout){ base.invoke(:c) }
+      expect(capture(:stdout) { base.invoke("c:one") }).to be_empty
+    end
+
+    it "raises Thor::UndefinedcommandError if the command can't be found" do
+      expect {
+        A.new.invoke("foo:bar")
+      }.to raise_error(Thor::UndefinedCommandError)
+    end
+
+    it "raises Thor::UndefinedcommandError if the command can't be found even if all commands were already executed" do
+      base = C.new
+      silence(:stdout){ base.invoke_all }
+
+      expect {
+        base.invoke("foo:bar")
+      }.to raise_error(Thor::UndefinedCommandError)
+    end
+
+    it "raises an error if a non Thor class is given" do
+      expect {
+        A.new.invoke(Object)
+      }.to raise_error(RuntimeError, "Expected Thor class, got Object")
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/parser/argument_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/parser/argument_spec.rb
new file mode 100644
index 0000000..6c6b0e8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/parser/argument_spec.rb
@@ -0,0 +1,53 @@
+require 'helper'
+require 'thor/parser'
+
+describe Thor::Argument do
+
+  def argument(name, options={})
+    @argument ||= Thor::Argument.new(name, options)
+  end
+
+  describe "errors" do
+    it "raises an error if name is not supplied" do
+      expect {
+        argument(nil)
+      }.to raise_error(ArgumentError, "Argument name can't be nil.")
+    end
+
+    it "raises an error if type is unknown" do
+      expect {
+        argument(:command, :type => :unknown)
+      }.to raise_error(ArgumentError, "Type :unknown is not valid for arguments.")
+    end
+
+    it "raises an error if argument is required and have default values" do
+      expect {
+        argument(:command, :type => :string, :default => "bar", :required => true)
+      }.to raise_error(ArgumentError, "An argument cannot be required and have default value.")
+    end
+
+    it "raises an error if enum isn't an array" do
+      expect {
+        argument(:command, :type => :string, :enum => "bar")
+      }.to raise_error(ArgumentError, "An argument cannot have an enum other than an array.")
+    end
+  end
+
+  describe "#usage" do
+    it "returns usage for string types" do
+      expect(argument(:foo, :type => :string).usage).to eq("FOO")
+    end
+
+    it "returns usage for numeric types" do
+      expect(argument(:foo, :type => :numeric).usage).to eq("N")
+    end
+
+    it "returns usage for array types" do
+      expect(argument(:foo, :type => :array).usage).to eq("one two three")
+    end
+
+    it "returns usage for hash types" do
+      expect(argument(:foo, :type => :hash).usage).to eq("key:value")
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/parser/arguments_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/parser/arguments_spec.rb
new file mode 100644
index 0000000..19588d9
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/parser/arguments_spec.rb
@@ -0,0 +1,66 @@
+require 'helper'
+require 'thor/parser'
+
+describe Thor::Arguments do
+  def create(opts={})
+    arguments = opts.map do |type, default|
+      options = {:required => default.nil?, :type => type, :default => default}
+      Thor::Argument.new(type.to_s, options)
+    end
+
+    arguments.sort!{ |a,b| b.name <=> a.name }
+    @opt = Thor::Arguments.new(arguments)
+  end
+
+  def parse(*args)
+    @opt.parse(args)
+  end
+
+  describe "#parse" do
+    it "parses arguments in the given order" do
+      create :string => nil, :numeric => nil
+      expect(parse("name", "13")["string"]).to eq("name")
+      expect(parse("name", "13")["numeric"]).to eq(13)
+    end
+
+    it "accepts hashes" do
+      create :string => nil, :hash => nil
+      expect(parse("product", "title:string", "age:integer")["string"]).to eq("product")
+      expect(parse("product", "title:string", "age:integer")["hash"]).to eq({ "title" => "string", "age" => "integer"})
+      expect(parse("product", "url:http://www.amazon.com/gp/product/123")["hash"]).to eq({ "url" => "http://www.amazon.com/gp/product/123" })
+    end
+
+    it "accepts arrays" do
+      create :string => nil, :array => nil
+      expect(parse("product", "title", "age")["string"]).to eq("product")
+      expect(parse("product", "title", "age")["array"]).to eq(%w(title age))
+    end
+
+    describe "with no inputs" do
+      it "and no arguments returns an empty hash" do
+        create
+        expect(parse).to eq({})
+      end
+
+      it "and required arguments raises an error" do
+        create :string => nil, :numeric => nil
+        expect{ parse }.to raise_error(Thor::RequiredArgumentMissingError, "No value provided for required arguments 'string', 'numeric'")
+      end
+
+      it "and default arguments returns default values" do
+        create :string => "name", :numeric => 13
+        expect(parse).to eq({ "string" => "name", "numeric" => 13 })
+      end
+    end
+
+    it "returns the input if it's already parsed" do
+      create :string => nil, :hash => nil, :array => nil, :numeric => nil
+      expect(parse("", 0, {}, [])).to eq({ "string" => "", "numeric" => 0, "hash" => {}, "array" => [] })
+    end
+
+    it "returns the default value if none is provided" do
+      create :string => "foo", :numeric => 3.0
+      expect(parse("bar")).to eq({ "string" => "bar", "numeric" => 3.0 })
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/parser/option_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/parser/option_spec.rb
new file mode 100644
index 0000000..d573976
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/parser/option_spec.rb
@@ -0,0 +1,202 @@
+require 'helper'
+require 'thor/parser'
+
+describe Thor::Option do
+  def parse(key, value)
+    Thor::Option.parse(key, value)
+  end
+
+  def option(name, options={})
+    @option ||= Thor::Option.new(name, options)
+  end
+
+  describe "#parse" do
+
+    describe "with value as a symbol" do
+      describe "and symbol is a valid type" do
+        it "has type equals to the symbol" do
+          expect(parse(:foo, :string).type).to eq(:string)
+          expect(parse(:foo, :numeric).type).to eq(:numeric)
+        end
+
+        it "has not default value" do
+          expect(parse(:foo, :string).default).to be_nil
+          expect(parse(:foo, :numeric).default).to be_nil
+        end
+      end
+
+      describe "equals to :required" do
+        it "has type equals to :string" do
+          expect(parse(:foo, :required).type).to eq(:string)
+        end
+
+        it "has no default value" do
+          expect(parse(:foo, :required).default).to be_nil
+        end
+      end
+
+      describe "and symbol is not a reserved key" do
+        it "has type equals to :string" do
+          expect(parse(:foo, :bar).type).to eq(:string)
+        end
+
+        it "has no default value" do
+          expect(parse(:foo, :bar).default).to be_nil
+        end
+      end
+    end
+
+    describe "with value as hash" do
+      it "has default type :hash" do
+        expect(parse(:foo, :a => :b).type).to eq(:hash)
+      end
+
+      it "has default value equals to the hash" do
+        expect(parse(:foo, :a => :b).default).to eq({ :a => :b })
+      end
+    end
+
+    describe "with value as array" do
+      it "has default type :array" do
+        expect(parse(:foo, [:a, :b]).type).to eq(:array)
+      end
+
+      it "has default value equals to the array" do
+        expect(parse(:foo, [:a, :b]).default).to eq([:a, :b])
+      end
+    end
+
+    describe "with value as string" do
+      it "has default type :string" do
+        expect(parse(:foo, "bar").type).to eq(:string)
+      end
+
+      it "has default value equals to the string" do
+        expect(parse(:foo, "bar").default).to eq("bar")
+      end
+    end
+
+    describe "with value as numeric" do
+      it "has default type :numeric" do
+        expect(parse(:foo, 2.0).type).to eq(:numeric)
+      end
+
+      it "has default value equals to the numeric" do
+        expect(parse(:foo, 2.0).default).to eq(2.0)
+      end
+    end
+
+    describe "with value as boolean" do
+      it "has default type :boolean" do
+        expect(parse(:foo, true).type).to eq(:boolean)
+        expect(parse(:foo, false).type).to eq(:boolean)
+      end
+
+      it "has default value equals to the boolean" do
+        expect(parse(:foo, true).default).to eq(true)
+        expect(parse(:foo, false).default).to eq(false)
+      end
+    end
+
+    describe "with key as a symbol" do
+      it "sets the name equals to the key" do
+        expect(parse(:foo, true).name).to eq("foo")
+      end
+    end
+
+    describe "with key as an array" do
+      it "sets the first items in the array to the name" do
+        expect(parse([:foo, :bar, :baz], true).name).to eq("foo")
+      end
+
+      it "sets all other items as aliases" do
+        expect(parse([:foo, :bar, :baz], true).aliases).to eq([:bar, :baz])
+      end
+    end
+  end
+
+  it "returns the switch name" do
+    expect(option("foo").switch_name).to eq("--foo")
+    expect(option("--foo").switch_name).to eq("--foo")
+  end
+
+  it "returns the human name" do
+    expect(option("foo").human_name).to eq("foo")
+    expect(option("--foo").human_name).to eq("foo")
+  end
+
+  it "converts underscores to dashes" do
+    expect(option("foo_bar").switch_name).to eq("--foo-bar")
+  end
+
+  it "can be required and have default values" do
+    option = option("foo", :required => true, :type => :string, :default => "bar")
+    expect(option.default).to eq("bar")
+    expect(option).to be_required
+  end
+
+  it "cannot be required and have type boolean" do
+    expect {
+      option("foo", :required => true, :type => :boolean)
+    }.to raise_error(ArgumentError, "An option cannot be boolean and required.")
+  end
+
+  it "allows type predicates" do
+    expect(parse(:foo, :string)).to be_string
+    expect(parse(:foo, :boolean)).to be_boolean
+    expect(parse(:foo, :numeric)).to be_numeric
+  end
+
+  it "raises an error on method missing" do
+    expect {
+      parse(:foo, :string).unknown?
+    }.to raise_error(NoMethodError)
+  end
+
+  describe "#usage" do
+
+    it "returns usage for string types" do
+      expect(parse(:foo, :string).usage).to eq("[--foo=FOO]")
+    end
+
+    it "returns usage for numeric types" do
+      expect(parse(:foo, :numeric).usage).to eq("[--foo=N]")
+    end
+
+    it "returns usage for array types" do
+      expect(parse(:foo, :array).usage).to eq("[--foo=one two three]")
+    end
+
+    it "returns usage for hash types" do
+      expect(parse(:foo, :hash).usage).to eq("[--foo=key:value]")
+    end
+
+    it "returns usage for boolean types" do
+      expect(parse(:foo, :boolean).usage).to eq("[--foo]")
+    end
+
+    it "uses padding when no aliases is given" do
+      expect(parse(:foo, :boolean).usage(4)).to eq("    [--foo]")
+    end
+
+    it "uses banner when supplied" do
+      expect(option(:foo, :required => false, :type => :string, :banner => "BAR").usage).to eq("[--foo=BAR]")
+    end
+
+    it "checkes when banner is an empty string" do
+      expect(option(:foo, :required => false, :type => :string, :banner => "").usage).to eq("[--foo]")
+    end
+
+    describe "with required values" do
+      it "does not show the usage between brackets" do
+        expect(parse(:foo, :required).usage).to eq("--foo=FOO")
+      end
+    end
+
+    describe "with aliases" do
+      it "does not show the usage between brackets" do
+        expect(parse([:foo, "-f", "-b"], :required).usage).to eq("-f, -b, --foo=FOO")
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/parser/options_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/parser/options_spec.rb
new file mode 100644
index 0000000..1505b38
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/parser/options_spec.rb
@@ -0,0 +1,400 @@
+require 'helper'
+require 'thor/parser'
+
+describe Thor::Options do
+  def create(opts, defaults={}, stop_on_unknown=false)
+    opts.each do |key, value|
+      opts[key] = Thor::Option.parse(key, value) unless value.is_a?(Thor::Option)
+    end
+
+    @opt = Thor::Options.new(opts, defaults, stop_on_unknown)
+  end
+
+  def parse(*args)
+    @opt.parse(args.flatten)
+  end
+
+  def check_unknown!
+    @opt.check_unknown!
+  end
+
+  def remaining
+    @opt.remaining
+  end
+
+  describe "#to_switches" do
+    it "turns true values into a flag" do
+      expect(Thor::Options.to_switches(:color => true)).to eq("--color")
+    end
+
+    it "ignores nil" do
+      expect(Thor::Options.to_switches(:color => nil)).to eq("")
+    end
+
+    it "ignores false" do
+      expect(Thor::Options.to_switches(:color => false)).to eq("")
+    end
+
+    it "writes --name value for anything else" do
+      expect(Thor::Options.to_switches(:format => "specdoc")).to eq('--format "specdoc"')
+    end
+
+    it "joins several values" do
+      switches = Thor::Options.to_switches(:color => true, :foo => "bar").split(' ').sort
+      expect(switches).to eq(['"bar"', "--color", "--foo"])
+    end
+
+    it "accepts arrays" do
+      expect(Thor::Options.to_switches(:count => [1,2,3])).to eq("--count 1 2 3")
+    end
+
+    it "accepts hashes" do
+      expect(Thor::Options.to_switches(:count => {:a => :b})).to eq("--count a:b")
+    end
+
+    it "accepts underscored options" do
+      expect(Thor::Options.to_switches(:under_score_option => "foo bar")).to eq('--under_score_option "foo bar"')
+    end
+
+  end
+
+  describe "#parse" do
+    it "allows multiple aliases for a given switch" do
+      create ["--foo", "--bar", "--baz"] => :string
+      expect(parse("--foo", "12")["foo"]).to eq("12")
+      expect(parse("--bar", "12")["foo"]).to eq("12")
+      expect(parse("--baz", "12")["foo"]).to eq("12")
+    end
+
+    it "allows custom short names" do
+      create "-f" => :string
+      expect(parse("-f", "12")).to eq({"f" => "12"})
+    end
+
+    it "allows custom short-name aliases" do
+      create ["--bar", "-f"] => :string
+      expect(parse("-f", "12")).to eq({"bar" => "12"})
+    end
+
+    it "accepts conjoined short switches" do
+      create ["--foo", "-f"] => true, ["--bar", "-b"] => true, ["--app", "-a"] => true
+      opts = parse("-fba")
+      expect(opts["foo"]).to be_true
+      expect(opts["bar"]).to be_true
+      expect(opts["app"]).to be_true
+    end
+
+    it "accepts conjoined short switches with input" do
+      create ["--foo", "-f"] => true, ["--bar", "-b"] => true, ["--app", "-a"] => :required
+      opts = parse "-fba", "12"
+      expect(opts["foo"]).to be_true
+      expect(opts["bar"]).to be_true
+      expect(opts["app"]).to eq("12")
+    end
+
+    it "returns the default value if none is provided" do
+      create :foo => "baz", :bar => :required
+      expect(parse("--bar", "boom")["foo"]).to eq("baz")
+    end
+
+    it "returns the default value from defaults hash to required arguments" do
+      create Hash[:bar => :required], Hash[:bar => "baz"]
+      expect(parse["bar"]).to eq("baz")
+    end
+
+    it "gives higher priority to defaults given in the hash" do
+      create Hash[:bar => true], Hash[:bar => false]
+      expect(parse["bar"]).to eq(false)
+    end
+
+    it "raises an error for unknown switches" do
+      create :foo => "baz", :bar => :required
+      parse("--bar", "baz", "--baz", "unknown")
+      expect{ check_unknown! }.to raise_error(Thor::UnknownArgumentError, "Unknown switches '--baz'")
+    end
+
+    it "skips leading non-switches" do
+      create(:foo => "baz")
+
+      expect(parse("asdf", "--foo", "bar")).to eq({"foo" => "bar"})
+    end
+
+    it "correctly recognizes things that look kind of like options, but aren't, as not options" do
+      create(:foo => "baz")
+      expect(parse("--asdf---asdf", "baz", "--foo", "--asdf---dsf--asdf")).to eq({"foo" => "--asdf---dsf--asdf"})
+      check_unknown!
+    end
+
+    it "accepts underscores in commandline args hash for boolean" do
+      create :foo_bar => :boolean
+      expect(parse("--foo_bar")["foo_bar"]).to eq(true)
+      expect(parse("--no_foo_bar")["foo_bar"]).to eq(false)
+    end
+
+    it "accepts underscores in commandline args hash for strings" do
+      create :foo_bar => :string, :baz_foo => :string
+      expect(parse("--foo_bar", "baz")["foo_bar"]).to eq("baz")
+      expect(parse("--baz_foo", "foo bar")["baz_foo"]).to eq("foo bar")
+    end
+
+    it "interprets everything after -- as args instead of options" do
+      create(:foo => :string, :bar => :required)
+      expect(parse(%w[--bar abc moo -- --foo def -a])).to eq({"bar" => "abc"})
+      expect(remaining).to eq(%w[moo --foo def -a])
+    end
+
+    it "ignores -- when looking for single option values" do
+      create(:foo => :string, :bar => :required)
+      expect(parse(%w[--bar -- --foo def -a])).to eq({"bar" => "--foo"})
+      expect(remaining).to eq(%w[def -a])
+    end
+
+    it "ignores -- when looking for array option values" do
+      create(:foo => :array)
+      expect(parse(%w[--foo a b -- c d -e])).to eq({"foo" => %w[a b c d -e]})
+      expect(remaining).to eq([])
+    end
+
+    it "ignores -- when looking for hash option values" do
+      create(:foo => :hash)
+      expect(parse(%w[--foo a:b -- c:d -e])).to eq({"foo" => {'a' => 'b', 'c' => 'd'}})
+      expect(remaining).to eq(%w[-e])
+    end
+
+    it "ignores trailing --" do
+      create(:foo => :string)
+      expect(parse(%w[--foo --])).to eq({"foo" => nil})
+      expect(remaining).to eq([])
+    end
+
+    describe "with no input" do
+      it "and no switches returns an empty hash" do
+        create({})
+        expect(parse).to eq({})
+      end
+
+      it "and several switches returns an empty hash" do
+        create "--foo" => :boolean, "--bar" => :string
+        expect(parse).to eq({})
+      end
+
+      it "and a required switch raises an error" do
+        create "--foo" => :required
+        expect{ parse }.to raise_error(Thor::RequiredArgumentMissingError, "No value provided for required options '--foo'")
+      end
+    end
+
+    describe "with one required and one optional switch" do
+      before do
+        create "--foo" => :required, "--bar" => :boolean
+      end
+
+      it "raises an error if the required switch has no argument" do
+        expect{ parse("--foo") }.to raise_error(Thor::MalformattedArgumentError)
+      end
+
+      it "raises an error if the required switch isn't given" do
+        expect{ parse("--bar") }.to raise_error(Thor::RequiredArgumentMissingError)
+      end
+
+      it "raises an error if the required switch is set to nil" do
+        expect{ parse("--no-foo") }.to raise_error(Thor::RequiredArgumentMissingError)
+      end
+
+      it "does not raises an error if the required option has a default value" do
+        options = {:required => true, :type => :string, :default => "baz"}
+        create :foo => Thor::Option.new("foo", options), :bar => :boolean
+        expect{ parse("--bar") }.not_to raise_error
+      end
+    end
+
+    context "when stop_on_unknown is true" do
+      before do
+        create({:foo => :string, :verbose => :boolean}, {}, true)
+      end
+
+      it "stops parsing on first non-option" do
+        expect(parse(%w[foo --verbose])).to eq({})
+        expect(remaining).to eq(["foo", "--verbose"])
+      end
+
+      it "stops parsing on unknown option" do
+        expect(parse(%w[--bar --verbose])).to eq({})
+        expect(remaining).to eq(["--bar", "--verbose"])
+      end
+
+      it "retains -- after it has stopped parsing" do
+        expect(parse(%w[--bar -- whatever])).to eq({})
+        expect(remaining).to eq(["--bar", "--", "whatever"])
+      end
+
+      it "still accepts options that are given before non-options" do
+        expect(parse(%w[--verbose foo])).to eq({"verbose" => true})
+        expect(remaining).to eq(["foo"])
+      end
+
+      it "still accepts options that require a value" do
+        expect(parse(%w[--foo bar baz])).to eq({"foo" => "bar"})
+        expect(remaining).to eq(["baz"])
+      end
+
+      it "still interprets everything after -- as args instead of options" do
+        expect(parse(%w[-- --verbose])).to eq({})
+        expect(remaining).to eq(["--verbose"])
+      end
+    end
+
+    describe "with :string type" do
+      before do
+        create ["--foo", "-f"] => :required
+      end
+
+      it "accepts a switch <value> assignment" do
+        expect(parse("--foo", "12")["foo"]).to eq("12")
+      end
+
+      it "accepts a switch=<value> assignment" do
+        expect(parse("-f=12")["foo"]).to eq("12")
+        expect(parse("--foo=12")["foo"]).to eq("12")
+        expect(parse("--foo=bar=baz")["foo"]).to eq("bar=baz")
+      end
+
+      it "must accept underscores switch=value assignment" do
+        create :foo_bar => :required
+        expect(parse("--foo_bar=http://example.com/under_score/")["foo_bar"]).to eq("http://example.com/under_score/")
+      end
+
+      it "accepts a --no-switch format" do
+        create "--foo" => "bar"
+        expect(parse("--no-foo")["foo"]).to be_nil
+      end
+
+      it "does not consume an argument for --no-switch format" do
+        create "--cheese" => :string
+        expect(parse('burger', '--no-cheese', 'fries')["cheese"]).to be_nil
+      end
+
+      it "accepts a --switch format on non required types" do
+        create "--foo" => :string
+        expect(parse("--foo")["foo"]).to eq("foo")
+      end
+
+      it "accepts a --switch format on non required types with default values" do
+        create "--baz" => :string, "--foo" => "bar"
+        expect(parse("--baz", "bang", "--foo")["foo"]).to eq("bar")
+      end
+
+      it "overwrites earlier values with later values" do
+        expect(parse("--foo=bar", "--foo", "12")["foo"]).to eq("12")
+        expect(parse("--foo", "12", "--foo", "13")["foo"]).to eq("13")
+      end
+    end
+
+    describe "with :boolean type" do
+      before do
+        create "--foo" => false
+      end
+
+      it "accepts --opt assignment" do
+        expect(parse("--foo")["foo"]).to eq(true)
+        expect(parse("--foo", "--bar")["foo"]).to eq(true)
+      end
+
+      it "uses the default value if no switch is given" do
+        expect(parse("")["foo"]).to eq(false)
+      end
+
+      it "accepts --opt=value assignment" do
+        expect(parse("--foo=true")["foo"]).to eq(true)
+        expect(parse("--foo=false")["foo"]).to eq(false)
+      end
+
+      it "accepts --[no-]opt variant, setting false for value" do
+        expect(parse("--no-foo")["foo"]).to eq(false)
+      end
+
+      it "accepts --[skip-]opt variant, setting false for value" do
+        expect(parse("--skip-foo")["foo"]).to eq(false)
+      end
+
+      it "will prefer 'no-opt' variant over inverting 'opt' if explicitly set" do
+        create "--no-foo" => true
+        expect(parse("--no-foo")["no-foo"]).to eq(true)
+      end
+
+      it "will prefer 'skip-opt' variant over inverting 'opt' if explicitly set" do
+        create "--skip-foo" => true
+        expect(parse("--skip-foo")["skip-foo"]).to eq(true)
+      end
+
+      it "accepts inputs in the human name format" do
+        create :foo_bar => :boolean
+        expect(parse("--foo-bar")["foo_bar"]).to eq(true)
+        expect(parse("--no-foo-bar")["foo_bar"]).to eq(false)
+        expect(parse("--skip-foo-bar")["foo_bar"]).to eq(false)
+      end
+
+      it "doesn't eat the next part of the param" do
+        create :foo => :boolean
+        expect(parse("--foo", "bar")).to eq({"foo" => true})
+        expect(@opt.remaining).to eq(["bar"])
+      end
+    end
+
+    describe "with :hash type" do
+      before do
+        create "--attributes" => :hash
+      end
+
+      it "accepts a switch=<value> assignment" do
+        expect(parse("--attributes=name:string", "age:integer")["attributes"]).to eq({"name" => "string", "age" => "integer"})
+      end
+
+      it "accepts a switch <value> assignment" do
+        expect(parse("--attributes", "name:string", "age:integer")["attributes"]).to eq({"name" => "string", "age" => "integer"})
+      end
+
+      it "must not mix values with other switches" do
+        expect(parse("--attributes", "name:string", "age:integer", "--baz", "cool")["attributes"]).to eq({"name" => "string", "age" => "integer"})
+      end
+    end
+
+    describe "with :array type" do
+      before do
+        create "--attributes" => :array
+      end
+
+      it "accepts a switch=<value> assignment" do
+        expect(parse("--attributes=a", "b", "c")["attributes"]).to eq(["a", "b", "c"])
+      end
+
+      it "accepts a switch <value> assignment" do
+        expect(parse("--attributes", "a", "b", "c")["attributes"]).to eq(["a", "b", "c"])
+      end
+
+      it "must not mix values with other switches" do
+        expect(parse("--attributes", "a", "b", "c", "--baz", "cool")["attributes"]).to eq(["a", "b", "c"])
+      end
+    end
+
+    describe "with :numeric type" do
+      before do
+        create "n" => :numeric, "m" => 5
+      end
+
+      it "accepts a -nXY assignment" do
+        expect(parse("-n12")["n"]).to eq(12)
+      end
+
+      it "converts values to numeric types" do
+        expect(parse("-n", "3", "-m", ".5")).to eq({"n" => 3, "m" => 0.5})
+      end
+
+      it "raises error when value isn't numeric" do
+        expect{ parse("-n", "foo") }.to raise_error(Thor::MalformattedArgumentError,
+          "Expected numeric value for '-n'; got \"foo\"")
+      end
+    end
+
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/rake_compat_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/rake_compat_spec.rb
new file mode 100644
index 0000000..4009661
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/rake_compat_spec.rb
@@ -0,0 +1,72 @@
+require 'helper'
+require 'thor/rake_compat'
+require 'rake/tasklib'
+
+$main = self
+
+class RakeTask < Rake::TaskLib
+  def initialize
+    define
+  end
+
+  def define
+    $main.instance_eval do
+      desc "Say it's cool"
+      task :cool do
+        puts "COOL"
+      end
+
+      namespace :hiper_mega do
+        task :super do
+          puts "HIPER MEGA SUPER"
+        end
+      end
+    end
+  end
+end
+
+class ThorTask < Thor
+  include Thor::RakeCompat
+  RakeTask.new
+end
+
+describe Thor::RakeCompat do
+  it "sets the rakefile application" do
+    expect(["rake_compat_spec.rb", "Thorfile"]).to include(Rake.application.rakefile)
+  end
+
+  it "adds rake tasks to thor classes too" do
+    task = ThorTask.tasks["cool"]
+    expect(task).to be
+  end
+
+  it "uses rake tasks descriptions on thor" do
+    expect(ThorTask.tasks["cool"].description).to eq("Say it's cool")
+  end
+
+  it "gets usage from rake tasks name" do
+    expect(ThorTask.tasks["cool"].usage).to eq("cool")
+  end
+
+  it "uses non namespaced name as description if non is available" do
+    expect(ThorTask::HiperMega.tasks["super"].description).to eq("super")
+  end
+
+  it "converts namespaces to classes" do
+    expect(ThorTask.const_get(:HiperMega)).to eq(ThorTask::HiperMega)
+  end
+
+  it "does not add tasks from higher namespaces in lowers namespaces" do
+    expect(ThorTask.tasks["super"]).not_to be
+  end
+
+  it "invoking the thor task invokes the rake task" do
+    expect(capture(:stdout) {
+      ThorTask.start ["cool"]
+    }).to eq("COOL\n")
+
+    expect(capture(:stdout) {
+      ThorTask::HiperMega.start ["super"]
+    }).to eq("HIPER MEGA SUPER\n")
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/register_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/register_spec.rb
new file mode 100644
index 0000000..3810831
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/register_spec.rb
@@ -0,0 +1,197 @@
+require 'helper'
+
+class BoringVendorProvidedCLI < Thor
+  desc "boring", "do boring stuff"
+  def boring
+    puts "bored. <yawn>"
+  end
+end
+
+class ExcitingPluginCLI < Thor
+  desc "hooray", "say hooray!"
+  def hooray
+    puts "hooray!"
+  end
+
+  desc "fireworks", "exciting fireworks!"
+  def fireworks
+    puts "kaboom!"
+  end
+end
+
+class SuperSecretPlugin < Thor
+  default_command :squirrel
+
+  desc "squirrel", "All of secret squirrel's secrets"
+  def squirrel
+    puts "I love nuts"
+  end
+end
+
+class GroupPlugin < Thor::Group
+  desc "part one"
+  def part_one
+    puts "part one"
+  end
+
+  desc "part two"
+  def part_two
+    puts "part two"
+  end
+end
+
+class ClassOptionGroupPlugin < Thor::Group
+  class_option :who,
+    :type => :string,
+    :aliases => "-w",
+    :default => "zebra"
+end
+
+class CompatibleWith19Plugin < ClassOptionGroupPlugin
+  desc "animal"
+  def animal
+    p options[:who]
+  end
+end
+
+class PluginWithDefault < Thor
+  desc "say MSG", "print MSG"
+  def say(msg)
+    puts msg
+  end
+
+  default_command :say
+end
+
+class PluginWithDefaultMultipleArguments < Thor
+  desc "say MSG [MSG]", "print multiple messages"
+  def say(*args)
+    puts args
+  end
+
+  default_command :say
+end
+
+class PluginWithDefaultcommandAndDeclaredArgument < Thor
+  desc "say MSG [MSG]", "print multiple messages"
+  argument :msg
+  def say
+    puts msg
+  end
+
+  default_command :say
+end
+
+BoringVendorProvidedCLI.register(
+  ExcitingPluginCLI,
+  "exciting",
+  "do exciting things",
+  "Various non-boring actions")
+
+BoringVendorProvidedCLI.register(
+  SuperSecretPlugin,
+  "secret",
+  "secret stuff",
+  "Nothing to see here. Move along.",
+  :hide => true)
+
+BoringVendorProvidedCLI.register(
+  GroupPlugin,
+  'groupwork',
+  "Do a bunch of things in a row",
+  "purple monkey dishwasher")
+
+BoringVendorProvidedCLI.register(
+  CompatibleWith19Plugin,
+  'zoo',
+  "zoo [-w animal]",
+  "Shows a provided animal or just zebra")
+
+BoringVendorProvidedCLI.register(
+  PluginWithDefault,
+  'say',
+  'say message',
+  'subcommands ftw')
+
+BoringVendorProvidedCLI.register(
+  PluginWithDefaultMultipleArguments,
+  'say_multiple',
+  'say message',
+  'subcommands ftw')
+
+BoringVendorProvidedCLI.register(
+  PluginWithDefaultcommandAndDeclaredArgument,
+  'say_argument',
+  'say message',
+  'subcommands ftw')
+
+describe ".register-ing a Thor subclass" do
+  it "registers the plugin as a subcommand" do
+    fireworks_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[exciting fireworks]) }
+    expect(fireworks_output).to eq("kaboom!\n")
+  end
+
+  it "includes the plugin's usage in the help" do
+    help_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[help]) }
+    expect(help_output).to include('do exciting things')
+  end
+
+  it "invokes the default command correctly" do
+    output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[say hello]) }
+    expect(output).to include("hello")
+  end
+
+  it "invokes the default command correctly with multiple args" do
+    output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[say_multiple hello adam]) }
+    expect(output).to include("hello")
+    expect(output).to include("adam")
+  end
+
+  it "invokes the default command correctly with a declared argument" do
+    output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[say_argument hello]) }
+    expect(output).to include("hello")
+  end
+
+  context "when $thor_runner is false" do
+    it "includes the plugin's subcommand name in subcommand's help" do
+      begin
+        $thor_runner = false
+        help_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[exciting]) }
+        expect(help_output).to include('thor exciting_plugin_c_l_i fireworks')
+      ensure
+        $thor_runner = true
+      end
+    end
+  end
+
+  context "when hidden" do
+    it "omits the hidden plugin's usage from the help" do
+      help_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[help]) }
+      expect(help_output).not_to include('secret stuff')
+    end
+
+    it "registers the plugin as a subcommand" do
+      secret_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[secret squirrel]) }
+      expect(secret_output).to eq("I love nuts\n")
+    end
+  end
+end
+
+describe ".register-ing a Thor::Group subclass" do
+  it "registers the group as a single command" do
+    group_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[groupwork]) }
+    expect(group_output).to eq("part one\npart two\n")
+  end
+end
+
+describe "1.8 and 1.9 syntax compatibility" do
+  it "is compatible with both 1.8 and 1.9 syntax w/o command options" do
+    group_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[zoo]) }
+    expect(group_output).to match(/zebra/)
+  end
+
+  it "is compatible with both 1.8 and 1.9 syntax w/command options" do
+    group_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[zoo -w lion]) }
+    expect(group_output).to match(/lion/)
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/runner_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/runner_spec.rb
new file mode 100644
index 0000000..17fd29f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/runner_spec.rb
@@ -0,0 +1,241 @@
+require 'helper'
+require 'thor/runner'
+
+describe Thor::Runner do
+  def when_no_thorfiles_exist
+    old_dir = Dir.pwd
+    Dir.chdir '..'
+    delete = Thor::Base.subclasses.select {|e| e.namespace == 'default' }
+    delete.each {|e| Thor::Base.subclasses.delete e }
+    yield
+    Thor::Base.subclasses.concat delete
+    Dir.chdir old_dir
+  end
+
+  describe "#help" do
+    it "shows information about Thor::Runner itself" do
+      expect(capture(:stdout) { Thor::Runner.start(["help"]) }).to match(/List the available thor commands/)
+    end
+
+    it "shows information about a specific Thor::Runner command" do
+      content = capture(:stdout) { Thor::Runner.start(["help", "list"]) }
+      expect(content).to match(/List the available thor commands/)
+      expect(content).not_to match(/help \[COMMAND\]/)
+    end
+
+    it "shows information about a specific Thor class" do
+      content = capture(:stdout) { Thor::Runner.start(["help", "my_script"]) }
+      expect(content).to match(/zoo\s+# zoo around/m)
+    end
+
+    it "shows information about an specific command from an specific Thor class" do
+      content = capture(:stdout) { Thor::Runner.start(["help", "my_script:zoo"]) }
+      expect(content).to match(/zoo around/)
+      expect(content).not_to match(/help \[COMMAND\]/)
+    end
+
+    it "shows information about a specific Thor group class" do
+      content = capture(:stdout) { Thor::Runner.start(["help", "my_counter"]) }
+      expect(content).to match(/my_counter N/)
+    end
+
+    it "raises error if a class/command cannot be found" do
+      content = capture(:stderr){ Thor::Runner.start(["help", "unknown"]) }
+      expect(content.strip).to eq('Could not find command "unknown" in "default" namespace.')
+    end
+
+    it "raises error if a class/command cannot be found for a setup without thorfiles" do
+      when_no_thorfiles_exist do
+        Thor::Runner.should_receive :exit
+        content = capture(:stderr){ Thor::Runner.start(["help", "unknown"]) }
+        expect(content.strip).to eq('Could not find command "unknown".')
+      end
+    end
+  end
+
+  describe "#start" do
+    it "invokes a command from Thor::Runner" do
+      ARGV.replace ["list"]
+      expect(capture(:stdout) { Thor::Runner.start }).to match(/my_counter N/)
+    end
+
+    it "invokes a command from a specific Thor class" do
+      ARGV.replace ["my_script:zoo"]
+      expect(Thor::Runner.start).to be_true
+    end
+
+    it "invokes the default command from a specific Thor class if none is specified" do
+      ARGV.replace ["my_script"]
+      expect(Thor::Runner.start).to eq("default command")
+    end
+
+    it "forwads arguments to the invoked command" do
+      ARGV.replace ["my_script:animal", "horse"]
+      expect(Thor::Runner.start).to eq(["horse"])
+    end
+
+    it "invokes commands through shortcuts" do
+      ARGV.replace ["my_script", "-T", "horse"]
+      expect(Thor::Runner.start).to eq(["horse"])
+    end
+
+    it "invokes a Thor::Group" do
+      ARGV.replace ["my_counter", "1", "2", "--third", "3"]
+      expect(Thor::Runner.start).to eq([1, 2, 3, nil, nil, nil])
+    end
+
+    it "raises an error if class/command can't be found" do
+      ARGV.replace ["unknown"]
+      content = capture(:stderr){ Thor::Runner.start }
+      expect(content.strip).to eq('Could not find command "unknown" in "default" namespace.')
+    end
+
+    it "raises an error if class/command can't be found in a setup without thorfiles" do
+      when_no_thorfiles_exist do
+        ARGV.replace ["unknown"]
+        Thor::Runner.should_receive :exit
+        content = capture(:stderr){ Thor::Runner.start }
+        expect(content.strip).to eq('Could not find command "unknown".')
+      end
+    end
+
+    it "does not swallow NoMethodErrors that occur inside the called method" do
+      ARGV.replace ["my_script:call_unexistent_method"]
+      expect{ Thor::Runner.start }.to raise_error(NoMethodError)
+    end
+
+    it "does not swallow Thor::Group InvocationError" do
+      ARGV.replace ["whiny_generator"]
+      expect{ Thor::Runner.start }.to raise_error(ArgumentError, /thor wrong_arity takes 1 argument, but it should not/)
+    end
+
+    it "does not swallow Thor InvocationError" do
+      ARGV.replace ["my_script:animal"]
+      content = capture(:stderr) { Thor::Runner.start }
+      expect(content.strip).to eq(%Q'ERROR: thor animal was called with no arguments\nUsage: "thor my_script:animal TYPE".')
+    end
+  end
+
+  describe "commands" do
+    before do
+      @location = "#{File.dirname(__FILE__)}/fixtures/command.thor"
+      @original_yaml = {
+        "random" => {
+          :location  => @location,
+          :filename  => "4a33b894ffce85d7b412fc1b36f88fe0",
+          :namespaces => ["amazing"]
+        }
+      }
+
+      root_file = File.join(Thor::Util.thor_root, "thor.yml")
+
+      # Stub load and save to avoid thor.yaml from being overwritten
+      YAML.stub!(:load_file).and_return(@original_yaml)
+      File.stub!(:exists?).with(root_file).and_return(true)
+      File.stub!(:open).with(root_file, "w")
+    end
+
+    describe "list" do
+      it "gives a list of the available commands" do
+        ARGV.replace ["list"]
+        content = capture(:stdout) { Thor::Runner.start }
+        expect(content).to match(/amazing:describe NAME\s+# say that someone is amazing/m)
+      end
+
+      it "gives a list of the available Thor::Group classes" do
+        ARGV.replace ["list"]
+        expect(capture(:stdout) { Thor::Runner.start }).to match(/my_counter N/)
+      end
+
+      it "can filter a list of the available commands by --group" do
+        ARGV.replace ["list", "--group", "standard"]
+        expect(capture(:stdout) { Thor::Runner.start }).to match(/amazing:describe NAME/)
+        ARGV.replace []
+        expect(capture(:stdout) { Thor::Runner.start }).not_to match(/my_script:animal TYPE/)
+        ARGV.replace ["list", "--group", "script"]
+        expect(capture(:stdout) { Thor::Runner.start }).to match(/my_script:animal TYPE/)
+      end
+
+      it "can skip all filters to show all commands using --all" do
+        ARGV.replace ["list", "--all"]
+        content = capture(:stdout) { Thor::Runner.start }
+        expect(content).to match(/amazing:describe NAME/)
+        expect(content).to match(/my_script:animal TYPE/)
+      end
+
+      it "doesn't list superclass commands in the subclass" do
+        ARGV.replace ["list"]
+        expect(capture(:stdout) { Thor::Runner.start }).not_to match(/amazing:help/)
+      end
+
+      it "presents commands in the default namespace with an empty namespace" do
+        ARGV.replace ["list"]
+        expect(capture(:stdout) { Thor::Runner.start }).to match(/^thor :cow\s+# prints 'moo'/m)
+      end
+
+      it "runs commands with an empty namespace from the default namespace" do
+        ARGV.replace [":command_conflict"]
+        expect(capture(:stdout) { Thor::Runner.start }).to eq("command\n")
+      end
+
+      it "runs groups even when there is a command with the same name" do
+        ARGV.replace ["command_conflict"]
+        expect(capture(:stdout) { Thor::Runner.start }).to eq("group\n")
+      end
+
+      it "runs commands with no colon in the default namespace" do
+        ARGV.replace ["cow"]
+        expect(capture(:stdout) { Thor::Runner.start }).to eq("moo\n")
+      end
+    end
+
+    describe "uninstall" do
+      before do
+        path = File.join(Thor::Util.thor_root, @original_yaml["random"][:filename])
+        FileUtils.should_receive(:rm_rf).with(path)
+      end
+
+      it "uninstalls existing thor modules" do
+        silence(:stdout) { Thor::Runner.start(["uninstall", "random"]) }
+      end
+    end
+
+    describe "installed" do
+      before do
+        Dir.should_receive(:[]).and_return([])
+      end
+
+      it "displays the modules installed in a pretty way" do
+        stdout = capture(:stdout) { Thor::Runner.start(["installed"]) }
+        expect(stdout).to match(/random\s*amazing/)
+        expect(stdout).to match(/amazing:describe NAME\s+# say that someone is amazing/m)
+      end
+    end
+
+    describe "install/update" do
+      before do
+        FileUtils.stub!(:mkdir_p)
+        FileUtils.stub!(:touch)
+        $stdin.stub!(:gets).and_return("Y")
+
+        path = File.join(Thor::Util.thor_root, Digest::MD5.hexdigest(@location + "random"))
+        File.should_receive(:open).with(path, "w")
+      end
+
+      it "updates existing thor files" do
+        path = File.join(Thor::Util.thor_root, @original_yaml["random"][:filename])
+        if File.directory? path
+          FileUtils.should_receive(:rm_rf).with(path)
+        else
+          File.should_receive(:delete).with(path)
+        end
+        silence(:stdout) { Thor::Runner.start(["update", "random"]) }
+      end
+
+      it "installs thor files" do
+        ARGV.replace ["install", @location]
+        silence(:stdout) { Thor::Runner.start }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/shell/basic_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/shell/basic_spec.rb
new file mode 100644
index 0000000..c1a4173
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/shell/basic_spec.rb
@@ -0,0 +1,311 @@
+# coding: UTF-8
+require 'helper'
+
+describe Thor::Shell::Basic do
+  def shell
+    @shell ||= Thor::Shell::Basic.new
+  end
+
+  describe "#padding" do
+    it "cannot be set to below zero" do
+      shell.padding = 10
+      expect(shell.padding).to eq(10)
+
+      shell.padding = -1
+      expect(shell.padding).to eq(0)
+    end
+  end
+
+  describe "#ask" do
+    it "prints a message to the user and gets the response" do
+      $stdout.should_receive(:print).with("Should I overwrite it? ")
+      $stdin.should_receive(:gets).and_return('Sure')
+      expect(shell.ask("Should I overwrite it?")).to eq("Sure")
+    end
+
+    it "prints a message and returns nil if EOF is sent to stdin" do
+      $stdout.should_receive(:print).with(" ")
+      $stdin.should_receive(:gets).and_return(nil)
+      expect(shell.ask("")).to eq(nil)
+    end
+
+
+    it "prints a message to the user with the available options and determines the correctness of the answer" do
+      $stdout.should_receive(:print).with('What\'s your favorite Neopolitan flavor? ["strawberry", "chocolate", "vanilla"] ')
+      $stdin.should_receive(:gets).and_return('chocolate')
+      expect(shell.ask("What's your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])).to eq("chocolate")
+    end
+
+    it "prints a message to the user with the available options and reasks the question after an incorrect repsonse" do
+      $stdout.should_receive(:print).with('What\'s your favorite Neopolitan flavor? ["strawberry", "chocolate", "vanilla"] ').twice
+      $stdout.should_receive(:puts).with('Your response must be one of: ["strawberry", "chocolate", "vanilla"]. Please try again.')
+      $stdin.should_receive(:gets).and_return('moose tracks', 'chocolate')
+      expect(shell.ask("What's your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])).to eq("chocolate")
+    end
+  end
+
+  describe "#yes?" do
+    it "asks the user and returns true if the user replies yes" do
+      $stdout.should_receive(:print).with("Should I overwrite it? ")
+        $stdin.should_receive(:gets).and_return('y')
+      expect(shell.yes?("Should I overwrite it?")).to be_true
+
+      $stdout.should_receive(:print).with("Should I overwrite it? ")
+        $stdin.should_receive(:gets).and_return('n')
+      expect(shell.yes?("Should I overwrite it?")).not_to be_true
+    end
+  end
+
+  describe "#no?" do
+    it "asks the user and returns true if the user replies no" do
+      $stdout.should_receive(:print).with("Should I overwrite it? ")
+        $stdin.should_receive(:gets).and_return('n')
+      expect(shell.no?("Should I overwrite it?")).to be_true
+
+      $stdout.should_receive(:print).with("Should I overwrite it? ")
+        $stdin.should_receive(:gets).and_return('Yes')
+      expect(shell.no?("Should I overwrite it?")).to be_false
+    end
+  end
+
+  describe "#say" do
+    it "prints a message to the user" do
+      $stdout.should_receive(:puts).with("Running...")
+      shell.say("Running...")
+    end
+
+    it "prints a message to the user without new line if it ends with a whitespace" do
+      $stdout.should_receive(:print).with("Running... ")
+      shell.say("Running... ")
+    end
+
+    it "does not use a new line with whitespace+newline embedded" do
+      $stdout.should_receive(:puts).with("It's \nRunning...")
+      shell.say("It's \nRunning...")
+    end
+
+    it "prints a message to the user without new line" do
+      $stdout.should_receive(:print).with("Running...")
+      shell.say("Running...", nil, false)
+    end
+  end
+
+  describe "#say_status" do
+    it "prints a message to the user with status" do
+      $stdout.should_receive(:puts).with("      create  ~/.thor/command.thor")
+      shell.say_status(:create, "~/.thor/command.thor")
+    end
+
+    it "always use new line" do
+      $stdout.should_receive(:puts).with("      create  ")
+      shell.say_status(:create, "")
+    end
+
+    it "does not print a message if base is muted" do
+      shell.should_receive(:mute?).and_return(true)
+      $stdout.should_not_receive(:puts)
+
+      shell.mute do
+        shell.say_status(:created, "~/.thor/command.thor")
+      end
+    end
+
+    it "does not print a message if base is set to quiet" do
+      base = MyCounter.new [1,2]
+      base.should_receive(:options).and_return(:quiet => true)
+
+      $stdout.should_not_receive(:puts)
+      shell.base = base
+      shell.say_status(:created, "~/.thor/command.thor")
+    end
+
+    it "does not print a message if log status is set to false" do
+      $stdout.should_not_receive(:puts)
+      shell.say_status(:created, "~/.thor/command.thor", false)
+    end
+
+    it "uses padding to set messages left margin" do
+      shell.padding = 2
+      $stdout.should_receive(:puts).with("      create      ~/.thor/command.thor")
+      shell.say_status(:create, "~/.thor/command.thor")
+    end
+  end
+
+  describe "#print_in_columns" do
+    before do
+      @array = [1234567890]
+      @array += ('a'..'e').to_a
+    end
+
+    it "prints in columns" do
+      content = capture(:stdout) { shell.print_in_columns(@array) }
+      expect(content.rstrip).to eq("1234567890  a           b           c           d           e")
+    end
+  end
+
+  describe "#print_table" do
+    before do
+      @table = []
+      @table << ["abc", "#123", "first three"]
+      @table << ["", "#0", "empty"]
+      @table << ["xyz", "#786", "last three"]
+    end
+
+    it "prints a table" do
+      content = capture(:stdout) { shell.print_table(@table) }
+      expect(content).to eq(<<-TABLE)
+abc  #123  first three
+     #0    empty
+xyz  #786  last three
+TABLE
+    end
+
+    it "prints a table with indentation" do
+      content = capture(:stdout) { shell.print_table(@table, :indent => 2) }
+      expect(content).to eq(<<-TABLE)
+  abc  #123  first three
+       #0    empty
+  xyz  #786  last three
+TABLE
+    end
+
+    it "uses maximum terminal width" do
+      @table << ["def", "#456", "Lançam foo bar"]
+      @table << ["ghi", "#789", "بالله  عليكم"]
+      shell.should_receive(:terminal_width).and_return(20)
+      content = capture(:stdout) { shell.print_table(@table, :indent => 2, :truncate => true) }
+      expect(content).to eq(<<-TABLE)
+  abc  #123  firs...
+       #0    empty
+  xyz  #786  last...
+  def  #456  Lanç...
+  ghi  #789  بالل...
+TABLE
+    end
+
+    it "honors the colwidth option" do
+      content = capture(:stdout) { shell.print_table(@table, :colwidth => 10)}
+      expect(content).to eq(<<-TABLE)
+abc         #123  first three
+            #0    empty
+xyz         #786  last three
+TABLE
+    end
+
+    it "prints tables with implicit columns" do
+      2.times { @table.first.pop }
+      content = capture(:stdout) { shell.print_table(@table) }
+      expect(content).to eq(<<-TABLE)
+abc  
+     #0    empty
+xyz  #786  last three
+TABLE
+    end
+
+    it "prints a table with small numbers and right-aligns them" do
+      table = [
+        ["Name", "Number", "Color"],
+        ["Erik", 1, "green"]
+      ]
+      content = capture(:stdout) { shell.print_table(table) }
+      expect(content).to eq(<<-TABLE)
+Name  Number  Color
+Erik       1  green
+TABLE
+    end
+
+    it "doesn't output extra spaces for right-aligned columns in the last column" do
+      table = [
+        ["Name", "Number"],
+        ["Erik", 1]
+      ]
+      content = capture(:stdout) { shell.print_table(table) }
+      expect(content).to eq(<<-TABLE)
+Name  Number
+Erik       1
+TABLE
+    end
+
+    it "prints a table with big numbers" do
+      table = [
+        ["Name", "Number", "Color"],
+        ["Erik", 1234567890123, "green"]
+      ]
+      content = capture(:stdout) { shell.print_table(table) }
+      expect(content).to eq(<<-TABLE)
+Name  Number         Color
+Erik  1234567890123  green
+TABLE
+    end
+  end
+
+  describe "#file_collision" do
+    it "shows a menu with options" do
+      $stdout.should_receive(:print).with('Overwrite foo? (enter "h" for help) [Ynaqh] ')
+      $stdin.should_receive(:gets).and_return('n')
+      shell.file_collision('foo')
+    end
+
+    it "returns true if the user choose default option" do
+      $stdout.stub!(:print)
+      $stdin.should_receive(:gets).and_return('')
+      expect(shell.file_collision('foo')).to be_true
+    end
+
+    it "returns false if the user choose no" do
+      $stdout.stub!(:print)
+      $stdin.should_receive(:gets).and_return('n')
+      expect(shell.file_collision('foo')).to be_false
+    end
+
+    it "returns true if the user choose yes" do
+      $stdout.stub!(:print)
+      $stdin.should_receive(:gets).and_return('y')
+      expect(shell.file_collision('foo')).to be_true
+    end
+
+    it "shows help usage if the user choose help" do
+      $stdout.stub!(:print)
+      $stdin.should_receive(:gets).and_return('h')
+      $stdin.should_receive(:gets).and_return('n')
+      help = capture(:stdout) { shell.file_collision('foo') }
+      expect(help).to match(/h \- help, show this help/)
+    end
+
+    it "quits if the user choose quit" do
+      $stdout.stub!(:print)
+      $stdout.should_receive(:puts).with('Aborting...')
+      $stdin.should_receive(:gets).and_return('q')
+
+      expect {
+        shell.file_collision('foo')
+      }.to raise_error(SystemExit)
+    end
+
+    it "always returns true if the user choose always" do
+      $stdout.should_receive(:print).with('Overwrite foo? (enter "h" for help) [Ynaqh] ')
+      $stdin.should_receive(:gets).and_return('a')
+
+      expect(shell.file_collision('foo')).to be_true
+
+      $stdout.should_not_receive(:print)
+      expect(shell.file_collision('foo')).to be_true
+    end
+
+    describe "when a block is given" do
+      it "displays diff options to the user" do
+        $stdout.should_receive(:print).with('Overwrite foo? (enter "h" for help) [Ynaqdh] ')
+        $stdin.should_receive(:gets).and_return('s')
+        shell.file_collision('foo'){ }
+      end
+
+      it "invokes the diff command" do
+        $stdout.stub!(:print)
+        $stdin.should_receive(:gets).and_return('d')
+        $stdin.should_receive(:gets).and_return('n')
+        shell.should_receive(:system).with(/diff -u/)
+        capture(:stdout) { shell.file_collision('foo'){ } }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/shell/color_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/shell/color_spec.rb
new file mode 100644
index 0000000..7822fab
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/shell/color_spec.rb
@@ -0,0 +1,95 @@
+require 'helper'
+
+describe Thor::Shell::Color do
+  def shell
+    @shell ||= Thor::Shell::Color.new
+  end
+
+  before do
+    StringIO.any_instance.stub(:tty?).and_return(true)
+  end
+
+  describe "#say" do
+    it "set the color if specified and tty?" do
+      out = capture(:stdout) do
+        shell.say "Wow! Now we have colors!", :green
+      end
+
+      expect(out.chomp).to eq("\e[32mWow! Now we have colors!\e[0m")
+    end
+
+    it "does not set the color if output is not a tty" do
+      out = capture(:stdout) do
+        $stdout.should_receive(:tty?).and_return(false)
+        shell.say "Wow! Now we have colors!", :green
+      end
+
+      expect(out.chomp).to eq("Wow! Now we have colors!")
+    end
+
+    it "does not use a new line even with colors" do
+      out = capture(:stdout) do
+        shell.say "Wow! Now we have colors! ", :green
+      end
+
+      expect(out.chomp).to eq("\e[32mWow! Now we have colors! \e[0m")
+    end
+
+    it "handles an Array of colors" do
+      out = capture(:stdout) do
+        shell.say "Wow! Now we have colors *and* background colors", [:green, :on_red, :bold]
+      end
+
+      expect(out.chomp).to eq("\e[32m\e[41m\e[1mWow! Now we have colors *and* background colors\e[0m")
+    end
+  end
+
+  describe "#say_status" do
+    it "uses color to say status" do
+      out = capture(:stdout) do
+        shell.say_status :conflict, "README", :red
+      end
+
+      expect(out.chomp).to eq("\e[1m\e[31m    conflict\e[0m  README")
+    end
+  end
+
+  describe "#set_color" do
+    it "colors a string with a foreground color" do
+      red = shell.set_color "hi!", :red
+      expect(red).to eq("\e[31mhi!\e[0m")
+    end
+
+    it "colors a string with a background color" do
+      on_red = shell.set_color "hi!", :white, :on_red
+      expect(on_red).to eq("\e[37m\e[41mhi!\e[0m")
+    end
+
+    it "colors a string with a bold color" do
+      bold = shell.set_color "hi!", :white, true
+      expect(bold).to eq("\e[1m\e[37mhi!\e[0m")
+
+      bold = shell.set_color "hi!", :white, :bold
+      expect(bold).to eq("\e[37m\e[1mhi!\e[0m")
+
+      bold = shell.set_color "hi!", :white, :on_red, :bold
+      expect(bold).to eq("\e[37m\e[41m\e[1mhi!\e[0m")
+    end
+  end
+
+  describe "#file_collision" do
+    describe "when a block is given" do
+      it "invokes the diff command" do
+        $stdout.stub!(:print)
+        $stdout.stub!(:tty?).and_return(true)
+        $stdin.should_receive(:gets).and_return('d')
+        $stdin.should_receive(:gets).and_return('n')
+
+        output = capture(:stdout) { shell.file_collision('spec/fixtures/doc/README'){ "README\nEND\n" } }
+        expect(output).to match(/\e\[31m\- __start__\e\[0m/)
+        expect(output).to match(/^  README/)
+        expect(output).to match(/\e\[32m\+ END\e\[0m/)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/shell/html_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/shell/html_spec.rb
new file mode 100644
index 0000000..b32f72c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/shell/html_spec.rb
@@ -0,0 +1,32 @@
+require 'helper'
+
+describe Thor::Shell::HTML do
+  def shell
+    @shell ||= Thor::Shell::HTML.new
+  end
+
+  describe "#say" do
+    it "set the color if specified" do
+      out = capture(:stdout) { shell.say "Wow! Now we have colors!", :green }
+      expect(out.chomp).to eq('<span style="color: green;">Wow! Now we have colors!</span>')
+    end
+
+    it "sets bold if specified" do
+      out = capture(:stdout) { shell.say "Wow! Now we have colors *and* bold!", [:green, :bold] }
+      expect(out.chomp).to eq('<span style="color: green; font-weight: bold;">Wow! Now we have colors *and* bold!</span>')
+    end
+
+    it "does not use a new line even with colors" do
+      out = capture(:stdout) { shell.say "Wow! Now we have colors! ", :green }
+      expect(out.chomp).to eq('<span style="color: green;">Wow! Now we have colors! </span>')
+    end
+  end
+
+  describe "#say_status" do
+    it "uses color to say status" do
+      $stdout.should_receive(:puts).with('<span style="color: red; font-weight: bold;">    conflict</span>  README')
+      shell.say_status :conflict, "README", :red
+    end
+  end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/shell_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/shell_spec.rb
new file mode 100644
index 0000000..7ee9c47
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/shell_spec.rb
@@ -0,0 +1,47 @@
+require 'helper'
+
+describe Thor::Shell do
+  def shell
+    @shell ||= Thor::Base.shell.new
+  end
+
+  describe "#initialize" do
+    it "sets shell value" do
+      base = MyCounter.new [1, 2], { }, :shell => shell
+      expect(base.shell).to eq(shell)
+    end
+
+    it "sets the base value on the shell if an accessor is available" do
+      base = MyCounter.new [1, 2], { }, :shell => shell
+      expect(shell.base).to eq(base)
+    end
+  end
+
+  describe "#shell" do
+    it "returns the shell in use" do
+      expect(MyCounter.new([1,2]).shell).to be_kind_of(Thor::Base.shell)
+    end
+
+    it "uses $THOR_SHELL" do
+      class Thor::Shell::TestShell < Thor::Shell::Basic; end
+
+      expect(Thor::Base.shell).to eq(shell.class)
+      ENV['THOR_SHELL'] = 'TestShell'
+      Thor::Base.shell = nil
+      expect(Thor::Base.shell).to eq(Thor::Shell::TestShell)
+      ENV['THOR_SHELL'] = ''
+      Thor::Base.shell = shell.class
+      expect(Thor::Base.shell).to eq(shell.class)
+    end
+  end
+
+  describe "with_padding" do
+    it "uses padding for inside block outputs" do
+      base = MyCounter.new([1,2])
+      base.with_padding do
+        expect(capture(:stdout) { base.say_status :padding, "cool" }.strip).to eq("padding    cool")
+      end
+    end
+  end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/subcommand_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/subcommand_spec.rb
new file mode 100644
index 0000000..721fedb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/subcommand_spec.rb
@@ -0,0 +1,30 @@
+require 'helper'
+
+describe Thor do
+
+  describe "#subcommand" do
+
+    it "maps a given subcommand to another Thor subclass" do
+      barn_help = capture(:stdout) { Scripts::MyDefaults.start(%w[barn]) }
+      expect(barn_help).to include("barn help [COMMAND]  # Describe subcommands or one specific subcommand")
+    end
+
+    it "passes commands to subcommand classes" do
+      expect(capture(:stdout) { Scripts::MyDefaults.start(%w[barn open]) }.strip).to eq("Open sesame!")
+    end
+
+    it "passes arguments to subcommand classes" do
+      expect(capture(:stdout) { Scripts::MyDefaults.start(%w[barn open shotgun]) }.strip).to eq("That's going to leave a mark.")
+    end
+
+    it "ignores unknown options (the subcommand class will handle them)" do
+      expect(capture(:stdout) { Scripts::MyDefaults.start(%w[barn paint blue --coats 4])}.strip).to eq("4 coats of blue paint")
+    end
+
+    it "passes parsed options to subcommands" do
+      output = capture(:stdout) { TestSubcommands::Parent.start(%w[sub print_opt --opt output]) }
+      expect(output).to eq("output")
+    end
+  end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/thor_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/thor_spec.rb
new file mode 100644
index 0000000..1bc484e
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/thor_spec.rb
@@ -0,0 +1,491 @@
+require 'helper'
+
+describe Thor do
+  describe "#method_option" do
+    it "sets options to the next method to be invoked" do
+      args = ["foo", "bar", "--force"]
+      arg, options = MyScript.start(args)
+      expect(options).to eq({ "force" => true })
+    end
+
+    describe ":lazy_default" do
+      it "is absent when option is not specified" do
+        arg, options = MyScript.start(["with_optional"])
+        expect(options).to eq({})
+      end
+
+      it "sets a default that can be overridden for strings" do
+        arg, options = MyScript.start(["with_optional", "--lazy"])
+        expect(options).to eq({ "lazy" => "yes" })
+
+        arg, options = MyScript.start(["with_optional", "--lazy", "yesyes!"])
+        expect(options).to eq({ "lazy" => "yesyes!" })
+      end
+
+      it "sets a default that can be overridden for numerics" do
+        arg, options = MyScript.start(["with_optional", "--lazy-numeric"])
+        expect(options).to eq({ "lazy_numeric" => 42 })
+
+        arg, options = MyScript.start(["with_optional", "--lazy-numeric", 20000])
+        expect(options).to eq({ "lazy_numeric" => 20000 })
+      end
+
+      it "sets a default that can be overridden for arrays" do
+        arg, options = MyScript.start(["with_optional", "--lazy-array"])
+        expect(options).to eq({ "lazy_array" => %w[eat at joes] })
+
+        arg, options = MyScript.start(["with_optional", "--lazy-array", "hello", "there"])
+        expect(options).to eq({ "lazy_array" => %w[hello there] })
+      end
+
+      it "sets a default that can be overridden for hashes" do
+        arg, options = MyScript.start(["with_optional", "--lazy-hash"])
+        expect(options).to eq({ "lazy_hash" => {'swedish' => 'meatballs'} })
+
+        arg, options = MyScript.start(["with_optional", "--lazy-hash", "polish:sausage"])
+        expect(options).to eq({ "lazy_hash" => {'polish' => 'sausage'} })
+      end
+    end
+
+    describe "when :for is supplied" do
+      it "updates an already defined command" do
+        args, options = MyChildScript.start(["animal", "horse", "--other=fish"])
+        expect(options[:other]).to eq("fish")
+      end
+
+      describe "and the target is on the parent class" do
+        it "updates an already defined command" do
+          args = ["example_default_command", "my_param", "--new-option=verified"]
+          options = Scripts::MyScript.start(args)
+          expect(options[:new_option]).to eq("verified")
+        end
+
+        it "adds a command to the command list if the updated command is on the parent class" do
+          expect(Scripts::MyScript.commands["example_default_command"]).to be
+        end
+
+        it "clones the parent command" do
+          expect(Scripts::MyScript.commands["example_default_command"]).not_to eq(MyChildScript.commands["example_default_command"])
+        end
+      end
+    end
+  end
+
+  describe "#default_command" do
+    it "sets a default command" do
+      expect(MyScript.default_command).to eq("example_default_command")
+    end
+
+    it "invokes the default command if no command is specified" do
+      expect(MyScript.start([])).to eq("default command")
+    end
+
+    it "invokes the default command if no command is specified even if switches are given" do
+      expect(MyScript.start(["--with", "option"])).to eq({"with"=>"option"})
+    end
+
+    it "inherits the default command from parent" do
+      expect(MyChildScript.default_command).to eq("example_default_command")
+    end
+  end
+
+  describe "#stop_on_unknown_option!" do
+    my_script = Class.new(Thor) do
+      class_option "verbose",   :type => :boolean
+      class_option "mode",      :type => :string
+
+      stop_on_unknown_option! :exec
+
+      desc "exec", "Run a command"
+      def exec(*args)
+        return options, args
+      end
+
+      desc "boring", "An ordinary command"
+      def boring(*args)
+        return options, args
+      end
+    end
+
+    it "passes remaining args to command when it encounters a non-option" do
+      expect(my_script.start(%w[exec command --verbose])).to eq [{}, ["command", "--verbose"]]
+    end
+
+    it "passes remaining args to command when it encounters an unknown option" do
+      expect(my_script.start(%w[exec --foo command --bar])).to eq [{}, ["--foo", "command", "--bar"]]
+    end
+
+    it "still accepts options that are given before non-options" do
+      expect(my_script.start(%w[exec --verbose command --foo])).to eq [{"verbose" => true}, ["command", "--foo"]]
+    end
+
+    it "still accepts options that require a value" do
+      expect(my_script.start(%w[exec --mode rashly command])).to eq [{"mode" => "rashly"}, ["command"]]
+    end
+
+    it "still passes everything after -- to command" do
+      expect(my_script.start(%w[exec -- --verbose])).to eq [{}, ["--verbose"]]
+    end
+
+    it "does not affect ordinary commands"  do
+      expect(my_script.start(%w[boring command --verbose])).to eq [{"verbose" => true}, ["command"]]
+    end
+
+    context "when provided with multiple command names" do
+      klass = Class.new(Thor) do
+        stop_on_unknown_option! :foo, :bar
+      end
+      it "affects all specified commands" do
+        expect(klass.stop_on_unknown_option?(mock :name => "foo")).to be_true
+        expect(klass.stop_on_unknown_option?(mock :name => "bar")).to be_true
+        expect(klass.stop_on_unknown_option?(mock :name => "baz")).to be_false
+      end
+    end
+
+    context "when invoked several times" do
+      klass = Class.new(Thor) do
+        stop_on_unknown_option! :foo
+        stop_on_unknown_option! :bar
+      end
+      it "affects all specified commands" do
+        expect(klass.stop_on_unknown_option?(mock :name => "foo")).to be_true
+        expect(klass.stop_on_unknown_option?(mock :name => "bar")).to be_true
+        expect(klass.stop_on_unknown_option?(mock :name => "baz")).to be_false
+      end
+    end
+  end
+
+  describe "#map" do
+    it "calls the alias of a method if one is provided" do
+      expect(MyScript.start(["-T", "fish"])).to eq(["fish"])
+    end
+
+    it "calls the alias of a method if several are provided via .map" do
+      expect(MyScript.start(["-f", "fish"])).to eq(["fish", {}])
+      expect(MyScript.start(["--foo", "fish"])).to eq(["fish", {}])
+    end
+
+    it "inherits all mappings from parent" do
+      expect(MyChildScript.default_command).to eq("example_default_command")
+    end
+  end
+
+  describe "#package_name" do
+    it "provides a proper description for a command when the package_name is assigned" do
+      content = capture(:stdout) { PackageNameScript.start(["help"]) }
+      expect(content).to match(/Baboon commands:/m)
+    end
+
+    # TODO: remove this, might be redundant, just wanted to prove full coverage
+    it "provides a proper description for a command when the package_name is NOT assigned" do
+      content = capture(:stdout) { MyScript.start(["help"]) }
+      expect(content).to match(/Commands:/m)
+    end
+  end
+
+  describe "#desc" do
+    it "provides description for a command" do
+      content = capture(:stdout) { MyScript.start(["help"]) }
+      expect(content).to match(/thor my_script:zoo\s+# zoo around/m)
+    end
+
+    it "provides no namespace if $thor_runner is false" do
+      begin
+        $thor_runner = false
+        content = capture(:stdout) { MyScript.start(["help"]) }
+        expect(content).to match(/thor zoo\s+# zoo around/m)
+      ensure
+        $thor_runner = true
+      end
+    end
+
+    describe "when :for is supplied" do
+      it "overwrites a previous defined command" do
+        expect(capture(:stdout) { MyChildScript.start(["help"]) }).to match(/animal KIND \s+# fish around/m)
+      end
+    end
+
+    describe "when :hide is supplied" do
+      it "does not show the command in help" do
+        expect(capture(:stdout) { MyScript.start(["help"]) }).not_to match(/this is hidden/m)
+      end
+
+      it "but the command is still invokcable not show the command in help" do
+        expect(MyScript.start(["hidden", "yesyes"])).to eq(["yesyes"])
+      end
+    end
+  end
+
+  describe "#method_options" do
+    it "sets default options if called before an initializer" do
+      options = MyChildScript.class_options
+      expect(options[:force].type).to eq(:boolean)
+      expect(options[:param].type).to eq(:numeric)
+    end
+
+    it "overwrites default options if called on the method scope" do
+      args = ["zoo", "--force", "--param", "feathers"]
+      options = MyChildScript.start(args)
+      expect(options).to eq({ "force" => true, "param" => "feathers" })
+    end
+
+    it "allows default options to be merged with method options" do
+      args = ["animal", "bird", "--force", "--param", "1.0", "--other", "tweets"]
+      arg, options = MyChildScript.start(args)
+      expect(arg).to eq('bird')
+      expect(options).to eq({ "force"=>true, "param"=>1.0, "other"=>"tweets" })
+    end
+  end
+
+  describe "#start" do
+    it "calls a no-param method when no params are passed" do
+      expect(MyScript.start(["zoo"])).to eq(true)
+    end
+
+    it "calls a single-param method when a single param is passed" do
+      expect(MyScript.start(["animal", "fish"])).to eq(["fish"])
+    end
+
+    it "does not set options in attributes" do
+      expect(MyScript.start(["with_optional", "--all"])).to eq([nil, { "all" => true }, []])
+    end
+
+    it "raises an error if the wrong number of params are provided" do
+      arity_asserter = lambda do |args, msg|
+        stderr = capture(:stderr) { Scripts::Arities.start(args) }
+        expect(stderr.strip).to eq(msg)
+      end
+      arity_asserter.call ["zero_args",    "one"         ], %Q'ERROR: thor zero_args was called with arguments ["one"]\nUsage: "thor scripts:arities:zero_args".'
+      arity_asserter.call ["one_arg"                     ], %Q'ERROR: thor one_arg was called with no arguments\nUsage: "thor scripts:arities:one_arg ARG".'
+      arity_asserter.call ["one_arg",      "one", "two"  ], %Q'ERROR: thor one_arg was called with arguments ["one", "two"]\nUsage: "thor scripts:arities:one_arg ARG".'
+      arity_asserter.call ["one_arg",      "one", "two"  ], %Q'ERROR: thor one_arg was called with arguments ["one", "two"]\nUsage: "thor scripts:arities:one_arg ARG".'
+      arity_asserter.call ["two_args",     "one"         ], %Q'ERROR: thor two_args was called with arguments ["one"]\nUsage: "thor scripts:arities:two_args ARG1 ARG2".'
+      arity_asserter.call ["optional_arg", "one", "two"  ], %Q'ERROR: thor optional_arg was called with arguments ["one", "two"]\nUsage: "thor scripts:arities:optional_arg [ARG]".'
+    end
+
+    it "raises an error if the invoked command does not exist" do
+      expect(capture(:stderr) { Amazing.start(["animal"]) }.strip).to eq('Could not find command "animal" in "amazing" namespace.')
+    end
+
+    it "calls method_missing if an unknown method is passed in" do
+      expect(MyScript.start(["unk", "hello"])).to eq([:unk, ["hello"]])
+    end
+
+    it "does not call a private method no matter what" do
+      expect(capture(:stderr) { MyScript.start(["what"]) }.strip).to eq('Could not find command "what" in "my_script" namespace.')
+    end
+
+    it "uses command default options" do
+      options = MyChildScript.start(["animal", "fish"]).last
+      expect(options).to eq({ "other" => "method default" })
+    end
+
+    it "raises when an exception happens within the command call" do
+      expect{ MyScript.start(["call_myself_with_wrong_arity"]) }.to raise_error(ArgumentError)
+    end
+
+    context "when the user enters an unambiguous substring of a command" do
+      it "invokes a command" do
+        expect(MyScript.start(["z"])).to eq(MyScript.start(["zoo"]))
+      end
+
+      it "invokes a command, even when there's an alias it resolves to the same command" do
+        expect(MyScript.start(["hi", "arg"])).to eq(MyScript.start(["hidden", "arg"]))
+      end
+
+      it "invokes an alias" do
+        expect(MyScript.start(["animal_pri"])).to eq(MyScript.start(["zoo"]))
+      end
+    end
+
+    context "when the user enters an ambiguous substring of a command" do
+      it "raises an exception that explains the ambiguity" do
+        expect{ MyScript.start(["call"]) }.to raise_error(ArgumentError, 'Ambiguous command call matches [call_myself_with_wrong_arity, call_unexistent_method]')
+      end
+
+      it "raises an exception when there is an alias" do
+        expect{ MyScript.start(["f"]) }.to raise_error(ArgumentError, 'Ambiguous command f matches [foo, fu]')
+      end
+    end
+
+  end
+
+  describe "#help" do
+    def shell
+      @shell ||= Thor::Base.shell.new
+    end
+
+    describe "on general" do
+      before do
+        @content = capture(:stdout) { MyScript.help(shell) }
+      end
+
+      it "provides useful help info for the help method itself" do
+        expect(@content).to match(/help \[COMMAND\]\s+# Describe available commands/)
+      end
+
+      it "provides useful help info for a method with params" do
+        expect(@content).to match(/animal TYPE\s+# horse around/)
+      end
+
+      it "uses the maximum terminal size to show commands" do
+        @shell.should_receive(:terminal_width).and_return(80)
+        content = capture(:stdout) { MyScript.help(shell) }
+        expect(content).to match(/aaa\.\.\.$/)
+      end
+
+      it "provides description for commands from classes in the same namespace" do
+        expect(@content).to match(/baz\s+# do some bazing/)
+      end
+
+      it "shows superclass commands" do
+        content = capture(:stdout) { MyChildScript.help(shell) }
+        expect(content).to match(/foo BAR \s+# do some fooing/)
+      end
+
+      it "shows class options information" do
+        content = capture(:stdout) { MyChildScript.help(shell) }
+        expect(content).to match(/Options\:/)
+        expect(content).to match(/\[\-\-param=N\]/)
+      end
+
+      it "injects class arguments into default usage" do
+        content = capture(:stdout) { Scripts::MyScript.help(shell) }
+        expect(content).to match(/zoo ACCESSOR \-\-param\=PARAM/)
+      end
+    end
+
+    describe "for a specific command" do
+      it "provides full help info when talking about a specific command" do
+        expect(capture(:stdout) { MyScript.command_help(shell, "foo") }).to eq(<<-END)
+Usage:
+  thor my_script:foo BAR
+
+Options:
+  [--force]  # Force to do some fooing
+
+do some fooing
+  This is more info!
+  Everyone likes more info!
+END
+      end
+
+      it "raises an error if the command can't be found" do
+        expect {
+          MyScript.command_help(shell, "unknown")
+        }.to raise_error(Thor::UndefinedCommandError, 'Could not find command "unknown" in "my_script" namespace.')
+      end
+
+      it "normalizes names before claiming they don't exist" do
+        expect(capture(:stdout) { MyScript.command_help(shell, "name-with-dashes") }).to match(/thor my_script:name-with-dashes/)
+      end
+
+      it "uses the long description if it exists" do
+        expect(capture(:stdout) { MyScript.command_help(shell, "long_description") }).to eq(<<-HELP)
+Usage:
+  thor my_script:long_description
+
+Description:
+  This is a really really really long description. Here you go. So very long.
+
+  It even has two paragraphs.
+HELP
+      end
+
+      it "doesn't assign the long description to the next command without one" do
+        expect(capture(:stdout) {
+          MyScript.command_help(shell, "name_with_dashes")
+        }).not_to match(/so very long/i)
+      end
+    end
+
+    describe "instance method" do
+      it "calls the class method" do
+        expect(capture(:stdout) { MyScript.start(["help"]) }).to match(/Commands:/)
+      end
+
+      it "calls the class method" do
+        expect(capture(:stdout) { MyScript.start(["help", "foo"]) }).to match(/Usage:/)
+      end
+    end
+  end
+
+  describe "when creating commands" do
+    it "prints a warning if a public method is created without description or usage" do
+      expect(capture(:stdout) {
+        klass = Class.new(Thor)
+        klass.class_eval "def hello_from_thor; end"
+      }).to match(/\[WARNING\] Attempted to create command "hello_from_thor" without usage or description/)
+    end
+
+    it "does not print if overwriting a previous command" do
+      expect(capture(:stdout) {
+        klass = Class.new(Thor)
+        klass.class_eval "def help; end"
+      }).to be_empty
+    end
+  end
+
+  describe "edge-cases" do
+    it "can handle boolean options followed by arguments" do
+      klass = Class.new(Thor) do
+        method_option :loud, :type => :boolean
+        desc "hi NAME", "say hi to name"
+        def hi(name)
+          name.upcase! if options[:loud]
+          "Hi #{name}"
+        end
+      end
+
+      expect(klass.start(["hi", "jose"])).to eq("Hi jose")
+      expect(klass.start(["hi", "jose", "--loud"])).to eq("Hi JOSE")
+      expect(klass.start(["hi", "--loud", "jose"])).to eq("Hi JOSE")
+    end
+
+    it "passes through unknown options" do
+      klass = Class.new(Thor) do
+        desc "unknown", "passing unknown options"
+        def unknown(*args)
+          args
+        end
+      end
+
+      expect(klass.start(["unknown", "foo", "--bar", "baz", "bat", "--bam"])).to eq(["foo", "--bar", "baz", "bat", "--bam"])
+      expect(klass.start(["unknown", "--bar", "baz"])).to eq(["--bar", "baz"])
+    end
+
+    it "does not pass through unknown options with strict args" do
+      klass = Class.new(Thor) do
+        strict_args_position!
+
+        desc "unknown", "passing unknown options"
+        def unknown(*args)
+          args
+        end
+      end
+
+      expect(klass.start(["unknown", "--bar", "baz"])).to eq([])
+      expect(klass.start(["unknown", "foo", "--bar", "baz"])).to eq(["foo"])
+    end
+
+    it "strict args works in the inheritance chain" do
+      parent = Class.new(Thor) do
+        strict_args_position!
+      end
+
+      klass = Class.new(parent) do
+        desc "unknown", "passing unknown options"
+        def unknown(*args)
+          args
+        end
+      end
+
+      expect(klass.start(["unknown", "--bar", "baz"])).to eq([])
+      expect(klass.start(["unknown", "foo", "--bar", "baz"])).to eq(["foo"])
+    end
+
+    it "send as a command name" do
+      expect(MyScript.start(["send"])).to eq(true)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/util_spec.rb b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/util_spec.rb
new file mode 100644
index 0000000..f451b53
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/spec/util_spec.rb
@@ -0,0 +1,196 @@
+require 'helper'
+
+module Thor::Util
+  def self.clear_user_home!
+    @@user_home = nil
+  end
+end
+
+describe Thor::Util do
+  describe "#find_by_namespace" do
+    it "returns 'default' if no namespace is given" do
+      expect(Thor::Util.find_by_namespace('')).to eq(Scripts::MyDefaults)
+    end
+
+    it "adds 'default' if namespace starts with :" do
+      expect(Thor::Util.find_by_namespace(':child')).to eq(Scripts::ChildDefault)
+    end
+
+    it "returns nil if the namespace can't be found" do
+      expect(Thor::Util.find_by_namespace('thor:core_ext:ordered_hash')).to be_nil
+    end
+
+    it "returns a class if it matches the namespace" do
+      expect(Thor::Util.find_by_namespace('app:broken:counter')).to eq(BrokenCounter)
+    end
+
+    it "matches classes default namespace" do
+      expect(Thor::Util.find_by_namespace('scripts:my_script')).to eq(Scripts::MyScript)
+    end
+  end
+
+  describe "#namespace_from_thor_class" do
+    it "replaces constant nesting with command namespacing" do
+      expect(Thor::Util.namespace_from_thor_class("Foo::Bar::Baz")).to eq("foo:bar:baz")
+    end
+
+    it "snake-cases component strings" do
+      expect(Thor::Util.namespace_from_thor_class("FooBar::BarBaz::BazBoom")).to eq("foo_bar:bar_baz:baz_boom")
+    end
+
+    it "accepts class and module objects" do
+      expect(Thor::Util.namespace_from_thor_class(Thor::CoreExt::OrderedHash)).to eq("thor:core_ext:ordered_hash")
+      expect(Thor::Util.namespace_from_thor_class(Thor::Util)).to eq("thor:util")
+    end
+
+    it "removes Thor::Sandbox namespace" do
+      expect(Thor::Util.namespace_from_thor_class("Thor::Sandbox::Package")).to eq("package")
+    end
+  end
+
+  describe "#namespaces_in_content" do
+    it "returns an array of names of constants defined in the string" do
+      list = Thor::Util.namespaces_in_content("class Foo; class Bar < Thor; end; end; class Baz; class Bat; end; end")
+      expect(list).to include("foo:bar")
+      expect(list).not_to include("bar:bat")
+    end
+
+    it "doesn't put the newly-defined constants in the enclosing namespace" do
+      Thor::Util.namespaces_in_content("class Blat; end")
+      expect(defined?(Blat)).not_to be
+      expect(defined?(Thor::Sandbox::Blat)).to be
+    end
+  end
+
+  describe "#snake_case" do
+    it "preserves no-cap strings" do
+      expect(Thor::Util.snake_case("foo")).to eq("foo")
+      expect(Thor::Util.snake_case("foo_bar")).to eq("foo_bar")
+    end
+
+    it "downcases all-caps strings" do
+      expect(Thor::Util.snake_case("FOO")).to eq("foo")
+      expect(Thor::Util.snake_case("FOO_BAR")).to eq("foo_bar")
+    end
+
+    it "downcases initial-cap strings" do
+      expect(Thor::Util.snake_case("Foo")).to eq("foo")
+    end
+
+    it "replaces camel-casing with underscores" do
+      expect(Thor::Util.snake_case("FooBarBaz")).to eq("foo_bar_baz")
+      expect(Thor::Util.snake_case("Foo_BarBaz")).to eq("foo_bar_baz")
+    end
+
+    it "places underscores between multiple capitals" do
+      expect(Thor::Util.snake_case("ABClass")).to eq("a_b_class")
+    end
+  end
+
+  describe "#find_class_and_command_by_namespace" do
+    it "returns a Thor::Group class if full namespace matches" do
+      expect(Thor::Util.find_class_and_command_by_namespace("my_counter")).to eq([MyCounter, nil])
+    end
+
+    it "returns a Thor class if full namespace matches" do
+      expect(Thor::Util.find_class_and_command_by_namespace("thor")).to eq([Thor, nil])
+    end
+
+    it "returns a Thor class and the command name" do
+      expect(Thor::Util.find_class_and_command_by_namespace("thor:help")).to eq([Thor, "help"])
+    end
+
+    it "falls back in the namespace:command look up even if a full namespace does not match" do
+      Thor.const_set(:Help, Module.new)
+      expect(Thor::Util.find_class_and_command_by_namespace("thor:help")).to eq([Thor, "help"])
+      Thor.send :remove_const, :Help
+    end
+
+    it "falls back on the default namespace class if nothing else matches" do
+      expect(Thor::Util.find_class_and_command_by_namespace("test")).to eq([Scripts::MyDefaults, "test"])
+    end
+  end
+
+  describe "#thor_classes_in" do
+    it "returns thor classes inside the given class" do
+      expect(Thor::Util.thor_classes_in(MyScript)).to eq([MyScript::AnotherScript])
+      expect(Thor::Util.thor_classes_in(MyScript::AnotherScript)).to be_empty
+    end
+  end
+
+  describe "#user_home" do
+    before do
+      ENV.stub!(:[])
+      Thor::Util.clear_user_home!
+    end
+
+    it "returns the user path if none variable is set on the environment" do
+      expect(Thor::Util.user_home).to eq(File.expand_path("~"))
+    end
+
+    it "returns the *unix system path if file cannot be expanded and separator does not exist" do
+      File.should_receive(:expand_path).with("~").and_raise(RuntimeError)
+      previous_value = File::ALT_SEPARATOR
+      capture(:stderr){ File.const_set(:ALT_SEPARATOR, false) }
+      expect(Thor::Util.user_home).to eq("/")
+      capture(:stderr){ File.const_set(:ALT_SEPARATOR, previous_value) }
+    end
+
+    it "returns the windows system path if file cannot be expanded and a separator exists" do
+      File.should_receive(:expand_path).with("~").and_raise(RuntimeError)
+      previous_value = File::ALT_SEPARATOR
+      capture(:stderr){ File.const_set(:ALT_SEPARATOR, true) }
+      expect(Thor::Util.user_home).to eq("C:/")
+      capture(:stderr){ File.const_set(:ALT_SEPARATOR, previous_value) }
+    end
+
+    it "returns HOME/.thor if set" do
+      ENV.stub!(:[]).with("HOME").and_return("/home/user/")
+      expect(Thor::Util.user_home).to eq("/home/user/")
+    end
+
+    it "returns path with HOMEDRIVE and HOMEPATH if set" do
+      ENV.stub!(:[]).with("HOMEDRIVE").and_return("D:/")
+      ENV.stub!(:[]).with("HOMEPATH").and_return("Documents and Settings/James")
+      expect(Thor::Util.user_home).to eq("D:/Documents and Settings/James")
+    end
+
+    it "returns APPDATA/.thor if set" do
+      ENV.stub!(:[]).with("APPDATA").and_return("/home/user/")
+      expect(Thor::Util.user_home).to eq("/home/user/")
+    end
+  end
+
+  describe "#thor_root_glob" do
+    before do
+      ENV.stub!(:[])
+      Thor::Util.clear_user_home!
+    end
+
+    it "escapes globs in path" do
+      ENV.stub!(:[]).with("HOME").and_return("/home/user{1}/")
+      Dir.should_receive(:[]).with("/home/user\\{1\\}/.thor/*").and_return([])
+      expect(Thor::Util.thor_root_glob).to eq([])
+    end
+  end
+
+  describe "#globs_for" do
+    it "escapes globs in path" do
+      expect(Thor::Util.globs_for("/home/apps{1}")).to eq([
+        "/home/apps\\{1\\}/Thorfile",
+        "/home/apps\\{1\\}/*.thor",
+        "/home/apps\\{1\\}/tasks/*.thor",
+        "/home/apps\\{1\\}/lib/tasks/*.thor"
+      ])
+    end
+  end
+
+  describe "#escape_globs" do
+    it "escapes ? * { } [ ] glob characters" do
+      expect(Thor::Util.escape_globs("apps?")).to eq("apps\\?")
+      expect(Thor::Util.escape_globs("apps*")).to eq("apps\\*")
+      expect(Thor::Util.escape_globs("apps {1}")).to eq("apps \\{1\\}")
+      expect(Thor::Util.escape_globs("apps [1]")).to eq("apps \\[1\\]")
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/thor-0.18.1/thor.gemspec b/.bundle/ruby/1.9.1/gems/thor-0.18.1/thor.gemspec
new file mode 100644
index 0000000..3124644
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/thor-0.18.1/thor.gemspec
@@ -0,0 +1,24 @@
+# coding: utf-8
+lib = File.expand_path('../lib/', __FILE__)
+$:.unshift lib unless $:.include?(lib)
+require 'thor/version'
+
+Gem::Specification.new do |spec|
+  spec.add_development_dependency 'bundler', '~> 1.0'
+  spec.authors = ['Yehuda Katz', 'José Valim']
+  spec.description = %q{A scripting framework that replaces rake, sake and rubigen}
+  spec.email = 'ruby-thor at googlegroups.com'
+  spec.executables = %w(thor)
+  spec.files = %w(.document CHANGELOG.md LICENSE.md README.md Thorfile thor.gemspec)
+  spec.files += Dir.glob("bin/**/*")
+  spec.files += Dir.glob("lib/**/*.rb")
+  spec.files += Dir.glob("spec/**/*")
+  spec.homepage = 'http://whatisthor.com/'
+  spec.licenses = ['MIT']
+  spec.name = 'thor'
+  spec.require_paths = ['lib']
+  spec.required_rubygems_version = '>= 1.3.6'
+  spec.summary = spec.description
+  spec.test_files = Dir.glob("spec/**/*")
+  spec.version = Thor::VERSION
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/CHANGELOG.md b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/CHANGELOG.md
new file mode 100644
index 0000000..23f3fdb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/CHANGELOG.md
@@ -0,0 +1,44 @@
+## master
+
+## 1.4.1 (2013-05-08)
+
+* Support Arrays in pre/postambles (#193, jbwiv)
+
+## 1.4.0 (2013-05-01)
+
+* Better encoding support
+
+## 1.3.7 (2013-04-09)
+
+* Erubis: Check for the correct constant (#183, mattwildig)
+* Don't fail when BasicObject is defined in 1.8 (#182, technobrat, judofyr)
+
+## 1.3.6 (2013-03-17)
+
+* Accept Hash that implements #path as options (#180, lawso017)
+* Changed extension for CsvTemplate from '.csv' to '.rcsv' (#177, alexgb)
+
+## 1.3.5 (2013-03-06)
+
+* Fixed extension for PlainTemplate (judofyr)
+* Improved local variables regexp (#174, razorinc)
+* Added CHANGELOG.md
+
+## 1.3.4 (2013-02-28)
+
+* Support RDoc 4.0 (#168, judofyr)
+* Add mention of Org-Mode support (#165, aslakknutsen)
+* Add AsciiDoctorTemplate (#163, #164, aslakknutsen)
+* Add PlainTextTemplate (nathanaeljones)
+* Restrict locals to valid variable names (#158, thinkerbot)
+* ERB: Improve trim mode support (#156, ssimeonov)
+* Add CSVTemplate (#153, alexgb)
+* Remove special case for 1.9.1 (#147, guilleiguaran)
+* Add allows\_script? method to Template (#143, bhollis)
+* Default to using Redcarpet2 (#139, DAddYE)
+* Allow File/Tempfile as filenames (#134, jamesotron)
+* Add EtanniTemplate (#131, manveru)
+* Support RDoc 3.10 (#112, timfel)
+* Always compile templates; remove old source evaluator (rtomayko)
+* Less: Options are now being passed to the parser (#106, cowboyd)
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/COPYING b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/COPYING
new file mode 100644
index 0000000..2f99dc1
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/COPYING
@@ -0,0 +1,18 @@
+Copyright (c) 2010 Ryan Tomayko <http://tomayko.com/about>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/Gemfile b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/Gemfile
new file mode 100644
index 0000000..dd73064
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/Gemfile
@@ -0,0 +1,32 @@
+source "http://rubygems.org"
+
+gem 'rake'
+gem 'asciidoctor', '>= 0.1.0'
+gem 'builder'
+gem 'coffee-script'
+gem 'contest'
+gem 'creole'
+gem 'erubis'
+gem 'haml', '>= 2.2.11', '< 4'
+gem 'kramdown'
+gem 'less'
+gem 'liquid'
+gem 'markaby'
+gem 'maruku'
+gem 'nokogiri'
+gem 'radius'
+gem 'sass'
+gem 'wikicloth'
+gem 'rdoc', (ENV['RDOC_VERSION'] || '> 0')
+
+platform :ruby do
+  gem 'yajl-ruby'
+  gem 'redcarpet'
+  gem 'rdiscount' if RUBY_VERSION != '1.9.2'
+  gem 'RedCloth'
+end
+
+platform :mri do
+  gem 'therubyracer'
+  gem 'bluecloth'
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/HACKING b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/HACKING
new file mode 100644
index 0000000..46e35f6
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/HACKING
@@ -0,0 +1,16 @@
+Clone:
+
+    git clone git://github.com/rtomayko/tilt.git
+    cd tilt
+
+Install needed packages under ./vendor and run tests (requires bundler):
+
+    rake
+
+Run tests under your current gem environment. Do not install anything:
+
+    rake test
+
+Only install needed packages under ./vendor:
+
+    rake setup
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/README.md b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/README.md
new file mode 100644
index 0000000..19a89ac
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/README.md
@@ -0,0 +1,232 @@
+Tilt [![Build Status](https://secure.travis-ci.org/rtomayko/tilt.png)](http://travis-ci.org/rtomayko/tilt) [![Dependency Status](https://gemnasium.com/rtomayko/tilt.png)](https://gemnasium.com/rtomayko/tilt)
+====
+
+Tilt is a thin interface over a bunch of different Ruby template engines in
+an attempt to make their usage as generic possible. This is useful for web
+frameworks, static site generators, and other systems that support multiple
+template engines but don't want to code for each of them individually.
+
+The following features are supported for all template engines (assuming the
+feature is relevant to the engine):
+
+ * Custom template evaluation scopes / bindings
+ * Ability to pass locals to template evaluation
+ * Support for passing a block to template evaluation for "yield"
+ * Backtraces with correct filenames and line numbers
+ * Template file caching and reloading
+ * Fast, method-based template source compilation
+
+The primary goal is to get all of the things listed above right for all
+template engines included in the distribution.
+
+Support for these template engines is included with the package:
+
+    ENGINE                     FILE EXTENSIONS         REQUIRED LIBRARIES
+    -------------------------- ----------------------- ----------------------------
+    Asciidoctor                .ad, .adoc, .asciidoc   asciidoctor (>= 0.1.0)
+    ERB                        .erb, .rhtml            none (included ruby stdlib)
+    Interpolated String        .str                    none (included ruby core)
+    Erubis                     .erb, .rhtml, .erubis   erubis
+    Haml                       .haml                   haml
+    Sass                       .sass                   haml (< 3.1) or sass (>= 3.1)
+    Scss                       .scss                   haml (< 3.1) or sass (>= 3.1)
+    Less CSS                   .less                   less
+    Builder                    .builder                builder
+    Liquid                     .liquid                 liquid
+    RDiscount                  .markdown, .mkd, .md    rdiscount
+    Redcarpet                  .markdown, .mkd, .md    redcarpet
+    BlueCloth                  .markdown, .mkd, .md    bluecloth
+    Kramdown                   .markdown, .mkd, .md    kramdown
+    Maruku                     .markdown, .mkd, .md    maruku
+    RedCloth                   .textile                redcloth
+    RDoc                       .rdoc                   rdoc
+    Radius                     .radius                 radius
+    Markaby                    .mab                    markaby
+    Nokogiri                   .nokogiri               nokogiri
+    CoffeeScript               .coffee                 coffee-script (+ javascript)
+    Creole (Wiki markup)       .wiki, .creole          creole
+    WikiCloth (Wiki markup)    .wiki, .mediawiki, .mw  wikicloth
+    Yajl                       .yajl                   yajl-ruby
+    CSV                        .rcsv                   none (Ruby >= 1.9), fastercsv (Ruby < 1.9)
+
+These template engines ship with their own Tilt integration:
+
+    ENGINE                     FILE EXTENSIONS   REQUIRED LIBRARIES
+    -------------------------- ----------------- ----------------------------
+    Slim                       .slim             slim (>= 0.7)
+    Embedded JavaScript                          sprockets
+    Embedded CoffeeScript                        sprockets
+    JST                                          sprockets
+    Org-mode                   .org              org-ruby (>= 0.6.2)
+
+See [TEMPLATES.md][t] for detailed information on template engine
+options and supported features.
+
+[t]: http://github.com/rtomayko/tilt/blob/master/TEMPLATES.md
+   "Tilt Template Engine Documentation"
+
+Basic Usage
+-----------
+
+Instant gratification:
+
+    require 'erb'
+    require 'tilt'
+    template = Tilt.new('templates/foo.erb')
+    => #<Tilt::ERBTemplate @file="templates/foo.rb" ...>
+    output = template.render
+    => "Hello world!"
+
+It's recommended that calling programs explicitly require template engine
+libraries (like 'erb' above) at load time. Tilt attempts to lazy require the
+template engine library the first time a template is created but this is
+prone to error in threaded environments.
+
+The `Tilt` module contains generic implementation classes for all supported
+template engines. Each template class adheres to the same interface for
+creation and rendering. In the instant gratification example, we let Tilt
+determine the template implementation class based on the filename, but
+`Tilt::Template` implementations can also be used directly:
+
+    template = Tilt::HamlTemplate.new('templates/foo.haml')
+    output = template.render
+
+The `render` method takes an optional evaluation scope and locals hash
+arguments. Here, the template is evaluated within the context of the
+`Person` object with locals `x` and `y`:
+
+    template = Tilt::ERBTemplate.new('templates/foo.erb')
+    joe = Person.find('joe')
+    output = template.render(joe, :x => 35, :y => 42)
+
+If no scope is provided, the template is evaluated within the context of an
+object created with `Object.new`.
+
+A single `Template` instance's `render` method may be called multiple times
+with different scope and locals arguments. Continuing the previous example,
+we render the same compiled template but this time in jane's scope:
+
+    jane = Person.find('jane')
+    output = template.render(jane, :x => 22, :y => nil)
+
+Blocks can be passed to `render` for templates that support running
+arbitrary ruby code (usually with some form of `yield`). For instance,
+assuming the following in `foo.erb`:
+
+    Hey <%= yield %>!
+
+The block passed to `render` is called on `yield`:
+
+    template = Tilt::ERBTemplate.new('foo.erb')
+    template.render { 'Joe' }
+    # => "Hey Joe!"
+
+Template Mappings
+-----------------
+
+The `Tilt` module includes methods for associating template implementation
+classes with filename patterns and for locating/instantiating template
+classes based on those associations.
+
+The `Tilt::register` method associates a filename pattern with a specific
+template implementation. To use ERB for files ending in a `.bar` extension:
+
+     >> Tilt.register Tilt::ERBTemplate, 'bar'
+     >> Tilt.new('views/foo.bar')
+     => #<Tilt::ERBTemplate @file="views/foo.bar" ...>
+
+Retrieving the template class for a file or file extension:
+
+     >> Tilt['foo.bar']
+     => Tilt::ERBTemplate
+     >> Tilt['haml']
+     => Tilt::HamlTemplate
+
+It's also possible to register template file mappings that are more specific
+than a file extension. To use Erubis for `bar.erb` but ERB for all other `.erb`
+files:
+
+     >> Tilt.register Tilt::ErubisTemplate, 'bar.erb'
+     >> Tilt.new('views/foo.erb')
+     => Tilt::ERBTemplate
+     >> Tilt.new('views/bar.erb')
+     => Tilt::ErubisTemplate
+
+The template class is determined by searching for a series of decreasingly
+specific name patterns. When creating a new template with
+`Tilt.new('views/foo.html.erb')`, we check for the following template
+mappings:
+
+  1. `views/foo.html.erb`
+  2. `foo.html.erb`
+  3. `html.erb`
+  4. `erb`
+
+### Fallback mode
+
+If there are more than one template class registered for a file extension, Tilt
+will automatically try to load the version that works on your machine:
+
+  1. If any of the template engines has been loaded already: Use that one.
+  2. If not, it will try to initialize each of the classes with an empty template.
+  3. Tilt will use the first that doesn't raise an exception.
+  4. If however *all* of them failed, Tilt will raise the exception of the first
+     template engine, since that was the most preferred one.
+
+Template classes that were registered *last* would be tried first. Because the
+Markdown extensions are registered like this:
+
+    Tilt.register Tilt::BlueClothTemplate, 'md'
+    Tilt.register Tilt::RDiscountTemplate, 'md'
+
+Tilt will first try RDiscount and then BlueCloth. You could say that RDiscount
+has a *higher priority* than BlueCloth.
+
+The fallback mode works nicely when you just need to render an ERB or Markdown
+template, but if you depend on a specific implementation, you should use #prefer:
+
+    # Prefer BlueCloth for all its registered extensions (markdown, mkd, md)
+    Tilt.prefer Tilt::BlueClothTemplate
+
+    # Prefer Erubis for .erb only:
+    Tilt.prefer Tilt::ErubisTemplate, 'erb'
+
+When a file extension has a preferred template class, Tilt will *always* use
+that class, even if it raises an exception.
+
+Encodings
+---------
+
+Tilt needs to know the encoding of the template in order to work properly:
+
+Tilt will use `Encoding.default_external` as the encoding when reading external
+files. If you're mostly working with one encoding (e.g. UTF-8) we *highly*
+recommend setting this option. When providing a custom reader block (`Tilt.new
+{ custom_string }`) you'll have ensure the string is properly encoded yourself.
+
+Most of the template engines in Tilt also allows you to override the encoding
+using the `:default_encoding`-option:
+
+```ruby
+tmpl = Tilt.new('hello.erb', :default_encoding => 'Big5')
+```
+
+Ultimately it's up to the template engine how to handle the encoding: It might
+respect `:default_encoding`, it might always assume it's UTF-8 (like
+CoffeScript), or it can do its own encoding detection.
+
+Template Compilation
+--------------------
+
+Tilt compiles generated Ruby source code produced by template engines and reuses
+it on subsequent template invocations. Benchmarks show this yields a 5x-10x
+performance increase over evaluating the Ruby source on each invocation.
+
+Template compilation is currently supported for these template engines:
+StringTemplate, ERB, Erubis, Haml, Nokogiri, Builder and Yajl.
+
+LICENSE
+-------
+
+Tilt is Copyright (c) 2010 [Ryan Tomayko](http://tomayko.com/about) and
+distributed under the MIT license. See the `COPYING` file for more info.
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/Rakefile b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/Rakefile
new file mode 100644
index 0000000..4228b1b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/Rakefile
@@ -0,0 +1,104 @@
+require 'rbconfig'
+require 'rake/testtask'
+task :default => [:setup, :test]
+
+# set GEM_HOME to use local ./vendor dir for tests
+vendor_dir = './vendor'
+ruby_version = RbConfig::CONFIG['ruby_version']
+ruby_engine = (defined?(RUBY_ENGINE) && RUBY_ENGINE) || 'ruby'
+gem_home = ENV['GEM_HOME'] = "#{vendor_dir}/#{ruby_engine}/#{ruby_version}"
+
+# Write the current version.
+task :version do
+  puts "#{ruby_engine} #{RUBY_VERSION} (#{gem_home})"
+end
+
+desc "Install gems to #{ENV['GEM_HOME']}"
+task :setup do
+  verbose false do
+    sh "
+      bundle check >/dev/null || {
+        echo 'Updating #{gem_home}' &&
+        bundle install --path='#{vendor_dir}'; }
+    "
+  end
+end
+
+# SPECS =====================================================================
+
+desc 'Generate test coverage report'
+task :rcov do
+  sh "rcov -Ilib:test test/*_test.rb"
+end
+
+desc 'Run tests (default)'
+Rake::TestTask.new(:test) do |t|
+  t.test_files = FileList['test/*_test.rb']
+  t.ruby_opts = ['-Itest']
+  t.ruby_opts << '-rubygems' if defined? Gem
+end
+task :test => :version
+
+# PACKAGING =================================================================
+
+begin
+  require 'rubygems'
+rescue LoadError
+end
+
+if defined?(Gem)
+  SPEC = eval(File.read('tilt.gemspec'))
+
+  def package(ext='')
+    "pkg/tilt-#{SPEC.version}" + ext
+  end
+
+  desc 'Build packages'
+  task :package => %w[.gem .tar.gz].map {|e| package(e)}
+
+  desc 'Build and install as local gem'
+  task :install => package('.gem') do
+    sh "gem install #{package('.gem')}"
+  end
+
+  directory 'pkg/'
+
+  file package('.gem') => %w[pkg/ tilt.gemspec] + SPEC.files do |f|
+    sh "gem build tilt.gemspec"
+    mv File.basename(f.name), f.name
+  end
+
+  file package('.tar.gz') => %w[pkg/] + SPEC.files do |f|
+    sh "git archive --format=tar HEAD | gzip > #{f.name}"
+  end
+
+  desc 'Upload gem and tar.gz distributables to rubyforge'
+  task :release => [package('.gem'), package('.tar.gz')] do |t|
+    sh <<-SH
+      rubyforge add_release sinatra tilt #{SPEC.version} #{package('.gem')} &&
+      rubyforge add_file    sinatra tilt #{SPEC.version} #{package('.tar.gz')}
+    SH
+  end
+end
+
+# GEMSPEC ===================================================================
+
+file 'tilt.gemspec' => FileList['{lib,test}/**','Rakefile'] do |f|
+  # read version from tilt.rb
+  version = File.read('lib/tilt.rb')[/VERSION = '(.*)'/] && $1
+  # read spec file and split out manifest section
+  spec = File.
+    read(f.name).
+    sub(/s\.version\s*=\s*'.*'/, "s.version = '#{version}'")
+  parts = spec.split("  # = MANIFEST =\n")
+  # determine file list from git ls-files
+  files = `git ls-files`.
+    split("\n").sort.reject{ |file| file =~ /^\./ }.
+    map{ |file| "    #{file}" }.join("\n")
+  # piece file back together and write...
+  parts[1] = "  s.files = %w[\n#{files}\n  ]\n"
+  spec = parts.join("  # = MANIFEST =\n")
+  spec.sub!(/s.date = '.*'/, "s.date = '#{Time.now.strftime("%Y-%m-%d")}'")
+  File.open(f.name, 'w') { |io| io.write(spec) }
+  puts "updated #{f.name}"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/TEMPLATES.md b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/TEMPLATES.md
new file mode 100644
index 0000000..ac5b583
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/TEMPLATES.md
@@ -0,0 +1,516 @@
+Tilt Templates
+==============
+
+(See <https://github.com/rtomayko/tilt/blob/master/TEMPLATES.md> for a rendered,
+HTML-version of this file).
+
+While all Tilt templates use the same basic interface for template loading and
+evaluation, each varies in its capabilities and available options. Detailed
+documentation on each supported template engine is provided below.
+
+There are also some file extensions that have several implementations
+(currently ERB and Markdown). These template classes have certain features
+which are guaranteed to work across all the implementations. If you wish to be
+compatible with all of these template classes, you should only depend on the
+cross-implementation features.
+
+ * [ERB](#erb) - Generic ERB implementation (backed by erb.rb or Erubis)
+ * [erb.rb](#erbrb) - `Tilt::ERBTemplate`
+ * [Erubis](#erubis) - `Tilt::ErubisTemplate`
+ * [Haml](#haml) - `Tilt::HamlTemplate`
+ * [Liquid](#liquid) - `Tilt::LiquidTemplate`
+ * Nokogiri - `Tilt::NokogiriTemplate`
+ * Builder - `Tilt::BuilderTemplate`
+ * Markaby - `Tilt::MarkabyTemplate`
+ * [Radius](#radius) - `Tilt::RadiusTemplate`
+
+Tilt also includes support for CSS processors like [LessCSS][lesscss] and
+[Sass][sass], [CoffeeScript][coffee-script] and some simple text formats.
+
+ * Less - `Tilt::LessTemplate`
+ * Sass - `Tilt::SassTemplate`
+ * Scss - `Tilt::ScssTemplate`
+ * CoffeeScript - `Tilt::CoffeeScriptTemplate`
+ * [Textile](#redcloth) - `Tilt::RedClothTemplate`
+ * Creole - `Tilt::CreoleTemplate`
+ * [RDoc](#rdoc) - `Tilt::RDocTemplate`
+
+Tilt has extensive support for Markdown, backed by one of four different
+implementations (depending on which are available on your system):
+
+ * [Markdown](#markdown) - Generic Markdown implementation
+ * [RDiscount](#rdiscount) - `Tilt::RDiscountTemplate`
+ * Redcarpet - `Tilt::RedcarpetTemplate`
+ * BlueCloth - `Tilt::BlueClothTemplate`
+ * Kramdown - `Tilt::KramdownTemplate`
+ * Maruku - `Tilt::MarukuTemplate`
+
+<a name='erb'></a>
+ERB (`erb`, `rhtml`)
+--------------------
+
+ERB is a simple but powerful template languge for Ruby. In Tilt it's backed by
+[Erubis](#erubis) (if installed on your system) or by [erb.rb](#erbrb) (which
+is included in Ruby's standard library). This documentation applies to both
+implementations.
+
+### Example
+
+    Hello <%= world %>!
+
+### Usage
+
+ERB templates support custom evaluation scopes and locals:
+
+    >> require 'erb'
+    >> template = Tilt.new('hello.html.erb')
+    >> template.render(self, :world => 'World!')
+    => "Hello World!"
+
+Or, use `Tilt['erb']` directly to process strings:
+
+    template = Tilt['erb'].new { "Hello <%= world %>!" }
+    template.render(self, :world => 'World!')
+
+### Options
+
+#### `:trim => trim`
+
+Omits newlines and spaces around certain lines (usually those that starts with
+`<%` and ends with `%>`). There isn't a specification for how trimming in ERB
+should work, so if you need more control over the whitespace, you should use
+[erb.rb](#erbrb) or [Erubis](#erubis) directly.
+
+
+#### `:outvar => '_erbout'`
+
+The name of the variable used to accumulate template output. This can be
+any valid Ruby expression but must be assignable. By default a local
+variable named `_erbout` is used.
+
+<a name='erbrb'></a>
+erb.rb (`erb`, `rhtml`)
+-----------------------
+
+[ERB](#erb) implementation available in Ruby's standard library.
+
+All the documentation of [ERB](#erb) applies in addition to the following:
+
+### Usage
+
+The `Tilt::ERBTemplate` class is registered for all files ending in `.erb` or
+`.rhtml` by default, but with a *lower* priority than ErubisTemplate. If you
+specifically want to use ERB, it's recommended to use `#prefer`:
+
+    Tilt.prefer Tilt::ERBTemplate
+
+__NOTE:__ It's suggested that your program `require 'erb'` at load time when
+using this template engine within a threaded environment.
+
+### Options
+
+#### `:trim => true`
+
+The ERB trim mode flags. This is a string consisting of any combination of the
+following characters:
+
+  * `'>'`  omits newlines for lines ending in `>`
+  * `'<>'` omits newlines for lines starting with `<%` and ending in `%>`
+  * `'%'`  enables processing of lines beginning with `%`
+  * `true` is an alias of `<>`
+
+#### `:safe => nil`
+
+The `$SAFE` level; when set, ERB code will be run in a
+separate thread with `$SAFE` set to the provided level.
+
+#### `:outvar => '_erbout'`
+
+The name of the variable used to accumulate template output. This can be
+any valid Ruby expression but must be assignable. By default a local
+variable named `_erbout` is used.
+
+### See also
+
+  * [ERB documentation](http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html)
+
+
+<a name='erubis'></a>
+Erubis (`erb`, `rhtml`, `erubis`)
+---------------------------------
+
+[Erubis][erubis] is a fast, secure, and very extensible implementation of [ERB](#erb).
+
+All the documentation of [ERB](#erb) applies in addition to the following:
+
+### Usage
+
+The `Tilt::ErubisTemplate` class is registered for all files ending in `.erb` or
+`.rhtml` by default, but with a *higher* priority than `ERBTemplate`. If you
+specifically want to use Erubis, it's recommended to use `#prefer`:
+
+    Tilt.prefer Tilt::ErubisTemplate
+
+__NOTE:__ It's suggested that your program `require 'erubis'` at load time when
+using this template engine within a threaded environment.
+
+### Options
+
+#### `:engine_class => Erubis::Eruby`
+
+Allows you to specify a custom engine class to use instead of the
+default which is `Erubis::Eruby`.
+
+#### `:escape_html => false`
+
+When `true`, `Erubis::EscapedEruby` will be used as the engine class
+instead of the default. All content within `<%= %>` blocks will be
+automatically html escaped.
+
+#### `:outvar => '_erbout'`
+
+The name of the variable used to accumulate template output. This can be
+any valid Ruby expression but must be assignable. By default a local
+variable named `_erbout` is used.
+
+#### `:pattern => '<% %>'`
+
+Set pattern for embedded Ruby code.
+
+#### `:trim => true`
+
+Delete spaces around `<% %>`. (But, spaces around `<%= %>` are preserved.)
+
+### See also
+
+  * [Erubis Home][erubis]
+  * [Erubis User's Guide](http://www.kuwata-lab.com/erubis/users-guide.html)
+
+
+<a name='haml'></a>
+Haml (`haml`)
+-------------
+
+[Haml][haml] is a markup language that’s used to cleanly and simply describe
+the HTML of any web document without the use of inline code. Haml functions as
+a replacement for inline page templating systems such as PHP, ASP, and ERB, the
+templating language used in most Ruby on Rails applications. However, Haml
+avoids the need for explicitly coding HTML into the template, because it itself
+is a description of the HTML, with some code to generate dynamic content.
+([more](http://haml.info/about.html))
+
+
+### Example
+
+    %html
+      %head
+        %title= @title
+      %body
+        %h1
+          Hello
+          = world + '!'
+
+### Usage
+
+The `Tilt::HamlTemplate` class is registered for all files ending in `.haml`
+by default. Haml templates support custom evaluation scopes and locals:
+
+    >> require 'haml'
+    >> template = Tilt.new('hello.haml')
+    => #<Tilt::HamlTemplate @file='hello.haml'>
+    >> @title = "Hello Haml!"
+    >> template.render(self, :world => 'Haml!')
+    => "
+    <html>
+      <head>
+        <title>Hello Haml!</title>
+      </head>
+      <body>
+        <h1>Hello Haml!</h1>
+      </body>
+    </html>"
+
+Or, use the `Tilt::HamlTemplate` class directly to process strings:
+
+    >> require 'haml'
+    >> template = Tilt::HamlTemplate.new { "%h1= 'Hello Haml!'" }
+    => #<Tilt::HamlTemplate @file=nil ...>
+    >> template.render
+    => "<h1>Hello Haml!</h1>"
+
+__NOTE:__ It's suggested that your program `require 'haml'` at load time when
+using this template engine within a threaded environment.
+
+### Options
+
+Please see the [Haml Reference](http://haml.info/docs/yardoc/file.HAML_REFERENCE.html#options) for all available options.
+
+### See also
+
+  * [#haml.docs](http://haml.info/docs.html)
+  * [Haml Tutorial](http://haml.info/tutorial.html)
+  * [Haml Reference](http://haml.info/docs/yardoc/file.HAML_REFERENCE.html)
+
+
+<a name='liquid'></a>
+Liquid (`liquid`)
+-----------------
+
+[Liquid][liquid] is for rendering safe templates which cannot affect the
+security of the server they are rendered on.
+
+### Example
+
+    <html>
+      <head>
+        <title>{{ title }}</title>
+      </head>
+      <body>
+        <h1>Hello {{ world }}!</h1>
+      </body>
+    </html>
+
+### Usage
+
+`Tilt::LiquidTemplate` is registered for all files ending in `.liquid` by
+default. Liquid templates support locals and objects that respond to
+`#to_h` as scopes:
+
+    >> require 'liquid'
+    >> require 'tilt'
+    >> template = Tilt.new('hello.liquid')
+    => #<Tilt::LiquidTemplate @file='hello.liquid'>
+    >> scope = { :title => "Hello Liquid Templates" }
+    >> template.render(nil, :world => "Liquid")
+    => "
+    <html>
+      <head>
+        <title>Hello Liquid Templates</title>
+      </head>
+      <body>
+        <h1>Hello Liquid!</h1>
+      </body>
+    </html>"
+
+Or, use `Tilt::LiquidTemplate` directly to process strings:
+
+    >> require 'liquid'
+    >> template = Tilt::LiquidTemplate.new { "<h1>Hello Liquid!</h1>" }
+    => #<Tilt::LiquidTemplate @file=nil ...>
+    >> template.render
+    => "<h1>Hello Liquid!</h1>"
+
+__NOTE:__ It's suggested that your program `require 'liquid'` at load
+time when using this template engine within a threaded environment.
+
+### See also
+
+  * [Liquid for Programmers](https://wiki.github.com/Shopify/liquid/liquid-for-programmers)
+  * [Liquid Docs](http://liquid.rubyforge.org/)
+  * GitHub: [Shopify/liquid](https://github.com/Shopify/liquid/)
+
+
+<a name='radius'></a>
+Radius (`radius`)
+-----------------
+
+[Radius][radius] is the template language used by [Radiant CMS][radiant]. It is
+a tag language designed to be valid XML/HTML.
+
+### Example
+
+    <html>
+    <body>
+      <h1><r:title /></h1>
+      <ul class="<r:type />">
+      <r:repeat times="3">
+        <li><r:hello />!</li>
+      </r:repeat>
+      </ul>
+      <r:yield />
+    </body>
+    </html>
+
+### Usage
+
+To render a template such as the one above.
+
+    scope = OpenStruct.new
+    scope.title = "Radius Example"
+    scope.hello = "Hello, World!"
+
+    require 'radius'
+    template = Tilt::RadiusTemplate.new('example.radius', :tag_prefix=>'r')
+    template.render(scope, :type=>'hlist'){ "Jackpot!" }
+
+The result will be:
+
+    <html>
+    <body>
+      <h1>Radius Example</h1>
+      <ul class="hlist">
+        <li>Hello, World!</li>
+        <li>Hello, World!</li>
+        <li>Hello, World!</li>
+      </ul>
+      Jackpot!
+    </body>
+    </html>
+
+### See also
+
+  * [Radius][radius]
+  * [Radiant CMS][radiant]
+
+
+<a name='textile'></a>
+Textile (`textile`)
+-------------------
+
+Textile is a lightweight markup language originally developed by Dean Allen and
+billed as a "humane Web text generator". Textile converts its marked-up text
+input to valid, well-formed XHTML and also inserts character entity references
+for apostrophes, opening and closing single and double quotation marks,
+ellipses and em dashes.
+
+Textile formatted texts are converted to HTML with the [RedCloth][redcloth]
+engine, which is a Ruby extension written in C.
+
+### Example
+
+    h1. Hello Textile Templates
+
+    Hello World. This is a paragraph.
+
+### Usage
+
+__NOTE:__ It's suggested that your program `require 'redcloth'` at load time
+when using this template engine in a threaded environment.
+
+### See Also
+
+  * [RedCloth][redcloth]
+
+
+<a name='rdoc'></a>
+RDoc (`rdoc`)
+-------------
+
+[RDoc][rdoc] is the simple text markup system that comes with Ruby's standard
+library.
+
+### Example
+
+    = Hello RDoc Templates
+
+    Hello World. This is a paragraph.
+
+### Usage
+
+__NOTE:__ It's suggested that your program `require 'rdoc'`,
+`require 'rdoc/markup'`, and `require 'rdoc/markup/to_html'` at load time
+when using this template engine in a threaded environment.
+
+### See also
+
+ * [RDoc][rdoc]
+
+
+<a name='markdown'></a>
+Markdown (`markdown`, `md`, `mkd`)
+----------------------------------
+
+[Markdown][markdown] is a lightweight markup language, created by John Gruber
+and Aaron Swartz. For any markup that is not covered by Markdown’s syntax, HTML
+is used.  Marking up plain text with Markdown markup is easy and Markdown
+formatted texts are readable.
+
+Markdown formatted texts are converted to HTML with one of these libraries:
+
+  * [RDiscount](#rdiscount) - `Tilt::RDiscountTemplate`
+  * Redcarpet - `Tilt::RedcarpetTemplate`
+  * BlueCloth - `Tilt::BlueClothTemplate`
+  * Kramdown - `Tilt::KramdownTemplate`
+  * Maruku - `Tilt::MarukuTemplate`
+
+Tilt will use fallback mode (as documented in the README) for determining which
+library to use. RDiscount has highest priority - Maruku has lowest.
+
+### Example
+
+    Hello Markdown Templates
+    ========================
+
+    Hello World. This is a paragraph.
+
+### Usage
+
+To wrap a Markdown formatted document with a layout:
+
+    layout = Tilt['erb'].new do
+      "<!doctype html><title></title><%= yield %>"
+    end
+    data = Tilt['md'].new { "# hello tilt" }
+    layout.render { data.render }
+    # => "<!doctype html><title></title><h1>hello tilt</h1>\n"
+
+### Options
+
+Every implementation of Markdown *should* support these options, but there are
+some known problems with the Kramdown and Maruku engines.
+
+#### `:smartypants => true|false`
+
+Set `true` to enable [Smarty Pants][smartypants]
+style punctuation replacement.
+
+#### `:escape_html => true|false`
+
+Set `true` disallow raw HTML in Markdown contents. HTML is converted to
+literal text by escaping `<` characters.
+
+### See also
+
+ * [Markdown Syntax Documentation](http://daringfireball.net/projects/markdown/syntax/)
+
+<a name='rdiscount'></a>
+RDiscount (`markdown`, `md`, `mkd`)
+-----------------------------------
+
+[Discount][discount] is an implementation of the Markdown markup language in C.
+[RDiscount][rdiscount] is a Ruby wrapper around Discount.
+
+All the documentation of [Markdown](#markdown) applies in addition to the following:
+
+### Usage
+
+The `Tilt::RDiscountTemplate` class is registered for all files ending in
+`.markdown`, `.md` or `.mkd` by default with the highest priority. If you
+specifically want to use RDiscount, it's recommended to use `#prefer`:
+
+    Tilt.prefer Tilt::RDiscountTemplate
+
+__NOTE:__ It's suggested that your program `require 'erubis'` at load time when
+using this template engine within a threaded environment.
+
+### See also
+
+  * [Discount][discount]
+  * [RDiscount][rdiscount]
+  * GitHub: [rtomayko/rdiscount][rdiscount]
+
+
+[lesscss]: http://lesscss.org/ "Less CSS"
+[sass]: http://sass-lang.com/ "Sass"
+[coffee-script]: http://jashkenas.github.com/coffee-script/ "Coffee Script"
+[erubis]: http://www.kuwata-lab.com/erubis/ "Erubis"
+[haml]: http://haml.info/ "Haml"
+[liquid]: http://www.liquidmarkup.org/ "Liquid"
+[radius]: http://radius.rubyforge.org/ "Radius"
+[radiant]: http://radiantcms.org/ "Radiant CMS"
+[redcloth]: http://redcloth.org/ "RedCloth"
+[rdoc]: http://rdoc.rubyforge.org/ "RDoc"
+[discount]: http://www.pell.portland.or.us/~orc/Code/discount/ "Discount"
+[rdiscount]: http://github.com/rtomayko/rdiscount/ "RDiscount"
+[smartypants]: http://daringfireball.net/projects/smartypants/ "Smarty Pants"
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/bin/tilt b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/bin/tilt
new file mode 100755
index 0000000..91ca399
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/bin/tilt
@@ -0,0 +1,112 @@
+#!/usr/bin/env ruby
+require 'ostruct'
+require 'optparse'
+require 'tilt'
+
+usage = <<USAGE
+Usage: tilt <options> <file>
+Process template <file> and write output to stdout. With no <file> or
+when <file> is '-', read template from stdin and use the --type option
+to determine the template's type.
+
+Options
+  -l, --list           List template engines + file patterns and exit
+  -t, --type=<pattern> Use this template engine; required if no <file>
+  -y, --layout=<file>  Use <file> as a layout template
+
+  -D<name>=<value>     Define variable <name> as <value>
+  --vars=<ruby>        Evaluate <ruby> to Hash and use for variables
+
+  -h, --help           Show this help message
+
+Convert markdown to HTML:
+  $ tilt foo.markdown > foo.html
+
+Process ERB template:
+  $ echo "Answer: <%= 2 + 2 %>" | tilt -t erb
+  Answer: 4
+
+Define variables:
+  $ echo "Answer: <%= 2 + n %>" | tilt -t erb --vars="{:n=>40}"
+  Answer: 42
+  $ echo "Answer: <%= 2 + n.to_i %>" | tilt -t erb -Dn=40
+  Answer: 42
+USAGE
+
+script_name = File.basename($0)
+pattern = nil
+layout = nil
+locals = {}
+
+ARGV.options do |o|
+  o.program_name = script_name
+
+  # list all available template engines
+  o.on("-l", "--list") do
+    groups = {}
+    Tilt.mappings.each do |pattern,engines|
+      engines.each do |engine|
+        key = engine.name.split('::').last.sub(/Template$/, '')
+        (groups[key] ||= []) << pattern
+      end
+    end
+    groups.sort { |(k1,v1),(k2,v2)| k1 <=> k2 }.each do |engine,files|
+      printf "%-15s %s\n", engine, files.sort.join(', ')
+    end
+    exit
+  end
+
+  # the template type / pattern
+  o.on("-t", "--type=PATTERN", String) do |val|
+    abort "unknown template type: #{val}" if Tilt[val].nil?
+    pattern = val
+  end
+
+  # pass template output into the specified layout template
+  o.on("-y", "--layout=FILE", String)  do |file|
+    paths = [file, "~/.tilt/#{file}", "/etc/tilt/#{file}"]
+    layout = paths.
+      map  { |p| File.expand_path(p) }.
+      find { |p| File.exist?(p) }
+    abort "no such layout: #{file}" if layout.nil?
+  end
+
+  # define a local variable
+  o.on("-D", "--define=PAIR", String) do |pair|
+    key, value = pair.split(/[=:]/, 2)
+    locals[key.to_sym] = value
+  end
+
+  # define local variables using a Ruby hash
+  o.on("--vars=RUBY") do |ruby|
+    hash = eval(ruby)
+    abort "vars must be a Hash, not #{hash.inspect}" if !hash.is_a?(Hash)
+    hash.each { |key, value| locals[key.to_sym] = value }
+  end
+
+  o.on_tail("-h", "--help") { puts usage; exit }
+
+  o.parse!
+end
+
+file = ARGV.first || '-'
+pattern = file if pattern.nil?
+abort "template type not given. see: #{$0} --help" if ['-', ''].include?(pattern)
+
+engine = Tilt[pattern]
+abort "template engine not found for: #{pattern}" if engine.nil?
+
+template =
+  engine.new(file) {
+    if file == '-'
+      $stdin.read
+    else
+      File.read(file)
+    end
+  }
+output = template.render(self, locals)
+
+# process layout
+output = Tilt.new(layout).render(self, locals) { output } if layout
+
+$stdout.write(output)
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt.rb
new file mode 100644
index 0000000..52756db
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt.rb
@@ -0,0 +1,204 @@
+module Tilt
+  VERSION = '1.4.1'
+
+  @preferred_mappings = Hash.new
+  @template_mappings = Hash.new { |h, k| h[k] = [] }
+
+  # Hash of template path pattern => template implementation class mappings.
+  def self.mappings
+    @template_mappings
+  end
+
+  def self.normalize(ext)
+    ext.to_s.downcase.sub(/^\./, '')
+  end
+
+  # Register a template implementation by file extension.
+  def self.register(template_class, *extensions)
+    if template_class.respond_to?(:to_str)
+      # Support register(ext, template_class) too
+      extensions, template_class = [template_class], extensions[0]
+    end
+
+    extensions.each do |ext|
+      ext = normalize(ext)
+      mappings[ext].unshift(template_class).uniq!
+    end
+  end
+
+  # Makes a template class preferred for the given file extensions. If you
+  # don't provide any extensions, it will be preferred for all its already
+  # registered extensions:
+  #
+  #   # Prefer RDiscount for its registered file extensions:
+  #   Tilt.prefer(Tilt::RDiscountTemplate)
+  #
+  #   # Prefer RDiscount only for the .md extensions:
+  #   Tilt.prefer(Tilt::RDiscountTemplate, '.md')
+  def self.prefer(template_class, *extensions)
+    if extensions.empty?
+      mappings.each do |ext, klasses|
+        @preferred_mappings[ext] = template_class if klasses.include? template_class
+      end
+    else
+      extensions.each do |ext|
+        ext = normalize(ext)
+        register(template_class, ext)
+        @preferred_mappings[ext] = template_class
+      end
+    end
+  end
+
+  # Returns true when a template exists on an exact match of the provided file extension
+  def self.registered?(ext)
+    mappings.key?(ext.downcase) && !mappings[ext.downcase].empty?
+  end
+
+  # Create a new template for the given file using the file's extension
+  # to determine the the template mapping.
+  def self.new(file, line=nil, options={}, &block)
+    if template_class = self[file]
+      template_class.new(file, line, options, &block)
+    else
+      fail "No template engine registered for #{File.basename(file)}"
+    end
+  end
+
+  # Lookup a template class for the given filename or file
+  # extension. Return nil when no implementation is found.
+  def self.[](file)
+    pattern = file.to_s.downcase
+    until pattern.empty? || registered?(pattern)
+      pattern = File.basename(pattern)
+      pattern.sub!(/^[^.]*\.?/, '')
+    end
+
+    # Try to find a preferred engine.
+    preferred_klass = @preferred_mappings[pattern]
+    return preferred_klass if preferred_klass
+
+    # Fall back to the general list of mappings.
+    klasses = @template_mappings[pattern]
+
+    # Try to find an engine which is already loaded.
+    template = klasses.detect do |klass|
+      if klass.respond_to?(:engine_initialized?)
+        klass.engine_initialized?
+      end
+    end
+
+    return template if template
+
+    # Try each of the classes until one succeeds. If all of them fails,
+    # we'll raise the error of the first class.
+    first_failure = nil
+
+    klasses.each do |klass|
+      begin
+        klass.new { '' }
+      rescue Exception => ex
+        first_failure ||= ex
+        next
+      else
+        return klass
+      end
+    end
+
+    raise first_failure if first_failure
+  end
+
+  # Deprecated module.
+  module CompileSite
+  end
+
+  # Extremely simple template cache implementation. Calling applications
+  # create a Tilt::Cache instance and use #fetch with any set of hashable
+  # arguments (such as those to Tilt.new):
+  #   cache = Tilt::Cache.new
+  #   cache.fetch(path, line, options) { Tilt.new(path, line, options) }
+  #
+  # Subsequent invocations return the already loaded template object.
+  class Cache
+    def initialize
+      @cache = {}
+    end
+
+    def fetch(*key)
+      @cache[key] ||= yield
+    end
+
+    def clear
+      @cache = {}
+    end
+  end
+
+
+  # Template Implementations ================================================
+
+  require 'tilt/string'
+  register StringTemplate, 'str'
+
+  require 'tilt/erb'
+  register ERBTemplate,    'erb', 'rhtml'
+  register ErubisTemplate, 'erb', 'rhtml', 'erubis'
+
+  require 'tilt/etanni'
+  register EtanniTemplate, 'etn', 'etanni'
+
+  require 'tilt/haml'
+  register HamlTemplate,   'haml'
+
+  require 'tilt/css'
+  register SassTemplate, 'sass'
+  register ScssTemplate, 'scss'
+  register LessTemplate, 'less'
+
+  require 'tilt/csv'
+  register CSVTemplate, 'rcsv'
+
+  require 'tilt/coffee'
+  register CoffeeScriptTemplate, 'coffee'
+
+  require 'tilt/nokogiri'
+  register NokogiriTemplate, 'nokogiri'
+
+  require 'tilt/builder'
+  register BuilderTemplate,  'builder'
+
+  require 'tilt/markaby'
+  register MarkabyTemplate,  'mab'
+
+  require 'tilt/liquid'
+  register LiquidTemplate, 'liquid'
+
+  require 'tilt/radius'
+  register RadiusTemplate, 'radius'
+
+  require 'tilt/markdown'
+  register MarukuTemplate,    'markdown', 'mkd', 'md'
+  register KramdownTemplate,  'markdown', 'mkd', 'md'
+  register BlueClothTemplate, 'markdown', 'mkd', 'md'
+  register RDiscountTemplate, 'markdown', 'mkd', 'md'
+  register RedcarpetTemplate::Redcarpet1, 'markdown', 'mkd', 'md'
+  register RedcarpetTemplate::Redcarpet2, 'markdown', 'mkd', 'md'
+  register RedcarpetTemplate, 'markdown', 'mkd', 'md'
+
+  require 'tilt/textile'
+  register RedClothTemplate, 'textile'
+
+  require 'tilt/rdoc'
+  register RDocTemplate, 'rdoc'
+
+  require 'tilt/wiki'
+  register CreoleTemplate,    'wiki', 'creole'
+  register WikiClothTemplate, 'wiki', 'mediawiki', 'mw'
+
+  require 'tilt/yajl'
+  register YajlTemplate, 'yajl'
+
+  require 'tilt/asciidoc'
+  register AsciidoctorTemplate, 'ad', 'adoc', 'asciidoc'
+
+  require 'tilt/plain'
+  register PlainTemplate, 'html'
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/asciidoc.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/asciidoc.rb
new file mode 100644
index 0000000..6e3029c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/asciidoc.rb
@@ -0,0 +1,34 @@
+require 'tilt/template'
+
+# AsciiDoc see: http://asciidoc.org/
+module Tilt
+  # Asciidoctor implementation for AsciiDoc see:
+  # http://asciidoctor.github.com/
+  #
+  # Asciidoctor is an open source, pure-Ruby processor for
+  # converting AsciiDoc documents or strings into HTML 5,
+  # DocBook 4.5 and other formats.
+  class AsciidoctorTemplate < Template
+    self.default_mime_type = 'text/html'
+
+    def self.engine_initialized?
+      defined? ::Asciidoctor::Document
+    end
+
+    def initialize_engine
+      require_template_library 'asciidoctor'
+    end
+
+    def prepare
+      options[:header_footer] = false if options[:header_footer].nil?
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= Asciidoctor.render(data, options, &block)
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/builder.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/builder.rb
new file mode 100644
index 0000000..f928952
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/builder.rb
@@ -0,0 +1,40 @@
+require 'tilt/template'
+
+module Tilt
+   # Builder template implementation. See:
+  # http://builder.rubyforge.org/
+  class BuilderTemplate < Template
+    self.default_mime_type = 'text/xml'
+
+    def self.engine_initialized?
+      defined? ::Builder
+    end
+
+    def initialize_engine
+      require_template_library 'builder'
+    end
+
+    def prepare; end
+
+    def evaluate(scope, locals, &block)
+      return super(scope, locals, &block) if data.respond_to?(:to_str)
+      xml = ::Builder::XmlMarkup.new(:indent => 2)
+      data.call(xml)
+      xml.target!
+    end
+
+    def precompiled_preamble(locals)
+      return super if locals.include? :xml
+      "xml = ::Builder::XmlMarkup.new(:indent => 2)\n#{super}"
+    end
+
+    def precompiled_postamble(locals)
+      "xml.target!"
+    end
+
+    def precompiled_template(locals)
+      data.to_str
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/coffee.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/coffee.rb
new file mode 100644
index 0000000..fafaac8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/coffee.rb
@@ -0,0 +1,54 @@
+require 'tilt/template'
+
+module Tilt
+  # CoffeeScript template implementation. See:
+  # http://coffeescript.org/
+  #
+  # CoffeeScript templates do not support object scopes, locals, or yield.
+  class CoffeeScriptTemplate < Template
+    self.default_mime_type = 'application/javascript'
+
+    @@default_bare = false
+
+    def self.default_bare
+      @@default_bare
+    end
+
+    def self.default_bare=(value)
+      @@default_bare = value
+    end
+
+    # DEPRECATED
+    def self.default_no_wrap
+      @@default_bare
+    end
+
+    # DEPRECATED
+    def self.default_no_wrap=(value)
+      @@default_bare = value
+    end
+
+    def self.engine_initialized?
+      defined? ::CoffeeScript
+    end
+
+    def initialize_engine
+      require_template_library 'coffee_script'
+    end
+
+    def prepare
+      if !options.key?(:bare) and !options.key?(:no_wrap)
+        options[:bare] = self.class.default_bare
+      end
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= CoffeeScript.compile(data, options)
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/css.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/css.rb
new file mode 100644
index 0000000..b237de9
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/css.rb
@@ -0,0 +1,80 @@
+require 'tilt/template'
+
+module Tilt
+  # Sass template implementation. See:
+  # http://haml.hamptoncatlin.com/
+  #
+  # Sass templates do not support object scopes, locals, or yield.
+  class SassTemplate < Template
+    self.default_mime_type = 'text/css'
+
+    def self.engine_initialized?
+      defined? ::Sass::Engine
+    end
+
+    def initialize_engine
+      require_template_library 'sass'
+    end
+
+    def prepare
+      @engine = ::Sass::Engine.new(data, sass_options)
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.render
+    end
+
+    def allows_script?
+      false
+    end
+
+  private
+    def sass_options
+      options.merge(:filename => eval_file, :line => line, :syntax => :sass)
+    end
+  end
+
+  # Sass's new .scss type template implementation.
+  class ScssTemplate < SassTemplate
+    self.default_mime_type = 'text/css'
+
+  private
+    def sass_options
+      options.merge(:filename => eval_file, :line => line, :syntax => :scss)
+    end
+  end
+
+   # Lessscss template implementation. See:
+  # http://lesscss.org/
+  #
+  # Less templates do not support object scopes, locals, or yield.
+  class LessTemplate < Template
+    self.default_mime_type = 'text/css'
+
+    def self.engine_initialized?
+      defined? ::Less
+    end
+
+    def initialize_engine
+      require_template_library 'less'
+    end
+
+    def prepare
+      if ::Less.const_defined? :Engine
+        @engine = ::Less::Engine.new(data)
+      else
+        parser  = ::Less::Parser.new(options.merge :filename => eval_file, :line => line)
+        @engine = parser.parse(data)
+      end
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_css(options)
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/csv.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/csv.rb
new file mode 100644
index 0000000..31214fa
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/csv.rb
@@ -0,0 +1,71 @@
+require 'tilt/template'
+
+module Tilt
+
+  # CSV Template implementation. See:
+  # http://ruby-doc.org/stdlib/libdoc/csv/rdoc/CSV.html
+  #
+  # == Example
+  #
+  #    # Example of csv template
+  #    tpl = <<-EOS
+  #      # header
+  #      csv << ['NAME', 'ID']
+  #
+  #      # data rows
+  #      @people.each do |person|
+  #        csv << [person[:name], person[:id]]
+  #      end
+  #    EOS
+  #
+  #    @people = [
+  #      {:name => "Joshua Peek", :id => 1},
+  #      {:name => "Ryan Tomayko", :id => 2},
+  #      {:name => "Simone Carletti", :id => 3}
+  #    ]
+  #
+  #    template = Tilt::CSVTemplate.new { tpl }
+  #    template.render(self)
+  #
+  class CSVTemplate < Template
+    self.default_mime_type = 'text/csv'
+
+    def self.engine_initialized?
+      engine
+    end
+
+    def self.engine
+      if RUBY_VERSION >= '1.9.0' && defined? ::CSV
+        ::CSV
+      elsif defined? ::FasterCSV
+        ::FasterCSV 
+      end
+    end
+
+    def initialize_engine
+      if RUBY_VERSION >= '1.9.0'
+        require_template_library 'csv'
+      else
+        require_template_library 'fastercsv'
+      end
+    end
+
+    def prepare
+      @code =<<-RUBY
+        #{self.class.engine}.generate do |csv|
+          #{data}
+        end
+      RUBY
+    end
+
+    def precompiled_template(locals)
+      @code
+    end
+
+    def precompiled(locals)
+      source, offset = super
+      [source, offset + 1]
+    end
+
+  end
+end
\ No newline at end of file
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/erb.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/erb.rb
new file mode 100644
index 0000000..513ac70
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/erb.rb
@@ -0,0 +1,110 @@
+require 'tilt/template'
+
+module Tilt
+  # ERB template implementation. See:
+  # http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html
+  class ERBTemplate < Template
+    @@default_output_variable = '_erbout'
+
+    def self.default_output_variable
+      @@default_output_variable
+    end
+
+    def self.default_output_variable=(name)
+      @@default_output_variable = name
+    end
+
+    def self.engine_initialized?
+      defined? ::ERB
+    end
+
+    def initialize_engine
+      require_template_library 'erb'
+    end
+
+    def prepare
+      @outvar = options[:outvar] || self.class.default_output_variable
+      options[:trim] = '<>' if !(options[:trim] == false) && (options[:trim].nil? || options[:trim] == true)
+      @engine = ::ERB.new(data, options[:safe], options[:trim], @outvar)
+    end
+
+    def precompiled_template(locals)
+      source = @engine.src
+      source
+    end
+
+    def precompiled_preamble(locals)
+      <<-RUBY
+        begin
+          __original_outvar = #{@outvar} if defined?(#{@outvar})
+          #{super}
+      RUBY
+    end
+
+    def precompiled_postamble(locals)
+      <<-RUBY
+          #{super}
+        ensure
+          #{@outvar} = __original_outvar
+        end
+      RUBY
+    end
+
+    # ERB generates a line to specify the character coding of the generated
+    # source in 1.9. Account for this in the line offset.
+    if RUBY_VERSION >= '1.9.0'
+      def precompiled(locals)
+        source, offset = super
+        [source, offset + 1]
+      end
+    end
+  end
+
+  # Erubis template implementation. See:
+  # http://www.kuwata-lab.com/erubis/
+  #
+  # ErubisTemplate supports the following additional options, which are not
+  # passed down to the Erubis engine:
+  #
+  #   :engine_class   allows you to specify a custom engine class to use
+  #                   instead of the default (which is ::Erubis::Eruby).
+  #
+  #   :escape_html    when true, ::Erubis::EscapedEruby will be used as
+  #                   the engine class instead of the default. All content
+  #                   within <%= %> blocks will be automatically html escaped.
+  class ErubisTemplate < ERBTemplate
+    def self.engine_initialized?
+      defined? ::Erubis::Eruby
+    end
+
+    def initialize_engine
+      require_template_library 'erubis'
+    end
+
+    def prepare
+      @outvar = options.delete(:outvar) || self.class.default_output_variable
+      @options.merge!(:preamble => false, :postamble => false, :bufvar => @outvar)
+      engine_class = options.delete(:engine_class)
+      engine_class = ::Erubis::EscapedEruby if options.delete(:escape_html)
+      @engine = (engine_class || ::Erubis::Eruby).new(data, options)
+    end
+
+    def precompiled_preamble(locals)
+      [super, "#{@outvar} = _buf = ''"].join("\n")
+    end
+
+    def precompiled_postamble(locals)
+      [@outvar, super].join("\n")
+    end
+
+    # Erubis doesn't have ERB's line-off-by-one under 1.9 problem.
+    # Override and adjust back.
+    if RUBY_VERSION >= '1.9.0'
+      def precompiled(locals)
+        source, offset = super
+        [source, offset - 1]
+      end
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/etanni.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/etanni.rb
new file mode 100644
index 0000000..e598ced
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/etanni.rb
@@ -0,0 +1,27 @@
+require 'tilt/template'
+
+module Tilt
+  class EtanniTemplate < Template
+    def prepare
+      separator = data.hash.abs
+      chomp = "<<#{separator}.chomp!"
+      start = "\n_out_ << #{chomp}\n"
+      stop = "\n#{separator}\n"
+      replacement = "#{stop}\\1#{start}"
+
+      temp = data.strip
+      temp.gsub!(/<\?r\s+(.*?)\s+\?>/m, replacement)
+
+      @code = "_out_ = [<<#{separator}.chomp!]\n#{temp}#{stop}_out_.join"
+    end
+
+    def precompiled_template(locals)
+      @code
+    end
+
+    def precompiled(locals)
+      source, offset = super
+      [source, offset + 1]
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/haml.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/haml.rb
new file mode 100644
index 0000000..6312206
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/haml.rb
@@ -0,0 +1,64 @@
+require 'tilt/template'
+
+module Tilt
+  # Haml template implementation. See:
+  # http://haml.hamptoncatlin.com/
+  class HamlTemplate < Template
+    self.default_mime_type = 'text/html'
+
+    def self.engine_initialized?
+      defined? ::Haml::Engine
+    end
+
+    def initialize_engine
+      require_template_library 'haml'
+    end
+
+    def prepare
+      options = @options.merge(:filename => eval_file, :line => line)
+      @engine = ::Haml::Engine.new(data, options)
+    end
+
+    def evaluate(scope, locals, &block)
+      if @engine.respond_to?(:precompiled_method_return_value, true)
+        super
+      else
+        @engine.render(scope, locals, &block)
+      end
+    end
+
+    # Precompiled Haml source. Taken from the precompiled_with_ambles
+    # method in Haml::Precompiler:
+    # http://github.com/nex3/haml/blob/master/lib/haml/precompiler.rb#L111-126
+    def precompiled_template(locals)
+      @engine.precompiled
+    end
+
+    def precompiled_preamble(locals)
+      local_assigns = super
+      @engine.instance_eval do
+        <<-RUBY
+          begin
+            extend Haml::Helpers
+            _hamlout = @haml_buffer = Haml::Buffer.new(@haml_buffer, #{options_for_buffer.inspect})
+            _erbout = _hamlout.buffer
+            __in_erb_template = true
+            _haml_locals = locals
+            #{local_assigns}
+        RUBY
+      end
+    end
+
+    def precompiled_postamble(locals)
+      @engine.instance_eval do
+        <<-RUBY
+            #{precompiled_method_return_value}
+          ensure
+            @haml_buffer = @haml_buffer.upper
+          end
+        RUBY
+      end
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/liquid.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/liquid.rb
new file mode 100644
index 0000000..3364911
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/liquid.rb
@@ -0,0 +1,45 @@
+require 'tilt/template'
+
+module Tilt
+  # Liquid template implementation. See:
+  # http://liquid.rubyforge.org/
+  #
+  # Liquid is designed to be a *safe* template system and threfore
+  # does not provide direct access to execuatable scopes. In order to
+  # support a +scope+, the +scope+ must be able to represent itself
+  # as a hash by responding to #to_h. If the +scope+ does not respond
+  # to #to_h it will be ignored.
+  #
+  # LiquidTemplate does not support yield blocks.
+  #
+  # It's suggested that your program require 'liquid' at load
+  # time when using this template engine.
+  class LiquidTemplate < Template
+    def self.engine_initialized?
+      defined? ::Liquid::Template
+    end
+
+    def initialize_engine
+      require_template_library 'liquid'
+    end
+
+    def prepare
+      @engine = ::Liquid::Template.parse(data)
+    end
+
+    def evaluate(scope, locals, &block)
+      locals = locals.inject({}){ |h,(k,v)| h[k.to_s] = v ; h }
+      if scope.respond_to?(:to_h)
+        scope  = scope.to_h.inject({}){ |h,(k,v)| h[k.to_s] = v ; h }
+        locals = scope.merge(locals)
+      end
+      locals['yield'] = block.nil? ? '' : yield
+      locals['content'] = locals['yield']
+      @engine.render(locals)
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/markaby.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/markaby.rb
new file mode 100644
index 0000000..3271e14
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/markaby.rb
@@ -0,0 +1,52 @@
+require 'tilt/template'
+
+module Tilt
+  # Markaby
+  # http://github.com/markaby/markaby
+  class MarkabyTemplate < Template
+    def self.builder_class
+      @builder_class ||= Class.new(Markaby::Builder) do
+        def __capture_markaby_tilt__(&block)
+          __run_markaby_tilt__ do
+            text capture(&block)
+          end
+        end
+      end
+    end
+
+    def self.engine_initialized?
+      defined? ::Markaby
+    end
+
+    def initialize_engine
+      require_template_library 'markaby'
+    end
+
+    def prepare
+    end
+
+    def evaluate(scope, locals, &block)
+      builder = self.class.builder_class.new({}, scope)
+      builder.locals = locals
+
+      if data.kind_of? Proc
+        (class << builder; self end).send(:define_method, :__run_markaby_tilt__, &data)
+      else
+        builder.instance_eval <<-CODE, __FILE__, __LINE__
+          def __run_markaby_tilt__
+            #{data}
+          end
+        CODE
+      end
+
+      if block
+        builder.__capture_markaby_tilt__(&block)
+      else
+        builder.__run_markaby_tilt__
+      end
+
+      builder.to_s
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/markdown.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/markdown.rb
new file mode 100644
index 0000000..0d089f1
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/markdown.rb
@@ -0,0 +1,214 @@
+require 'tilt/template'
+
+module Tilt
+  # Discount Markdown implementation. See:
+  # http://github.com/rtomayko/rdiscount
+  #
+  # RDiscount is a simple text filter. It does not support +scope+ or
+  # +locals+. The +:smart+ and +:filter_html+ options may be set true
+  # to enable those flags on the underlying RDiscount object.
+  class RDiscountTemplate < Template
+    self.default_mime_type = 'text/html'
+
+    ALIAS = {
+      :escape_html => :filter_html,
+      :smartypants => :smart
+    }
+
+    FLAGS = [:smart, :filter_html, :smartypants, :escape_html]
+
+    def flags
+      FLAGS.select { |flag| options[flag] }.map { |flag| ALIAS[flag] || flag }
+    end
+
+    def self.engine_initialized?
+      defined? ::RDiscount
+    end
+
+    def initialize_engine
+      require_template_library 'rdiscount'
+    end
+
+    def prepare
+      @engine = RDiscount.new(data, *flags)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+
+  # Upskirt Markdown implementation. See:
+  # https://github.com/tanoku/redcarpet
+  #
+  # Supports both Redcarpet 1.x and 2.x
+  class RedcarpetTemplate < Template
+    def self.engine_initialized?
+      defined? ::Redcarpet
+    end
+
+    def initialize_engine
+      require_template_library 'redcarpet'
+    end
+
+    def prepare
+      klass = [Redcarpet2, Redcarpet1].detect { |e| e.engine_initialized? }
+      @engine = klass.new(file, line, options) { data }
+    end
+
+    def evaluate(scope, locals, &block)
+      @engine.evaluate(scope, locals, &block)
+    end
+
+    def allows_script?
+      false
+    end
+
+    # Compatibility mode for Redcarpet 1.x
+    class Redcarpet1 < RDiscountTemplate
+      self.default_mime_type = 'text/html'
+
+      def self.engine_initialized?
+        defined? ::RedcarpetCompat
+      end
+
+      def prepare
+        @engine = RedcarpetCompat.new(data, *flags)
+        @output = nil
+      end
+    end
+
+    # Future proof mode for Redcarpet 2.x (not yet released)
+    class Redcarpet2 < Template
+      self.default_mime_type = 'text/html'
+
+      def self.engine_initialized?
+        defined? ::Redcarpet::Render and defined? ::Redcarpet::Markdown
+      end
+
+      def generate_renderer
+        renderer = options.delete(:renderer) || ::Redcarpet::Render::HTML
+        return renderer unless options.delete(:smartypants)
+        return renderer if renderer.is_a?(Class) && renderer <= ::Redcarpet::Render::SmartyPants
+
+        if renderer == ::Redcarpet::Render::XHTML
+          ::Redcarpet::Render::SmartyHTML.new(:xhtml => true)
+        elsif renderer == ::Redcarpet::Render::HTML
+          ::Redcarpet::Render::SmartyHTML
+        elsif renderer.is_a? Class
+          Class.new(renderer) { include ::Redcarpet::Render::SmartyPants }
+        else
+          renderer.extend ::Redcarpet::Render::SmartyPants
+        end
+      end
+
+      def prepare
+        # try to support the same aliases
+        RDiscountTemplate::ALIAS.each do |opt, aka|
+          next if options.key? opt or not options.key? aka
+          options[opt] = options.delete(aka)
+        end
+
+        # only raise an exception if someone is trying to enable :escape_html
+        options.delete(:escape_html) unless options[:escape_html]
+
+        @engine = ::Redcarpet::Markdown.new(generate_renderer, options)
+        @output = nil
+      end
+
+      def evaluate(scope, locals, &block)
+        @output ||= @engine.render(data)
+      end
+
+      def allows_script?
+        false
+      end
+    end
+  end
+
+  # BlueCloth Markdown implementation. See:
+  # http://deveiate.org/projects/BlueCloth/
+  class BlueClothTemplate < Template
+    self.default_mime_type = 'text/html'
+
+    def self.engine_initialized?
+      defined? ::BlueCloth
+    end
+
+    def initialize_engine
+      require_template_library 'bluecloth'
+    end
+
+    def prepare
+      @engine = BlueCloth.new(data, options)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+
+  # Maruku markdown implementation. See:
+  # http://maruku.rubyforge.org/
+  class MarukuTemplate < Template
+    def self.engine_initialized?
+      defined? ::Maruku
+    end
+
+    def initialize_engine
+      require_template_library 'maruku'
+    end
+
+    def prepare
+      @engine = Maruku.new(data, options)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+
+  # Kramdown Markdown implementation. See:
+  # http://kramdown.rubyforge.org/
+  class KramdownTemplate < Template
+    DUMB_QUOTES = [39, 39, 34, 34]
+
+    def self.engine_initialized?
+      defined? ::Kramdown
+    end
+
+    def initialize_engine
+      require_template_library 'kramdown'
+    end
+
+    def prepare
+      options[:smart_quotes] = DUMB_QUOTES unless options[:smartypants]
+      @engine = Kramdown::Document.new(data, options)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/nokogiri.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/nokogiri.rb
new file mode 100644
index 0000000..556c284
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/nokogiri.rb
@@ -0,0 +1,43 @@
+require 'tilt/template'
+
+module Tilt
+  # Nokogiri template implementation. See:
+  # http://nokogiri.org/
+  class NokogiriTemplate < Template
+    DOCUMENT_HEADER = /^<\?xml version=\"1\.0\"\?>\n?/
+    self.default_mime_type = 'text/xml'
+
+    def self.engine_initialized?
+      defined? ::Nokogiri
+    end
+
+    def initialize_engine
+      require_template_library 'nokogiri'
+    end
+
+    def prepare; end
+
+    def evaluate(scope, locals)
+      if data.respond_to?(:to_str)
+        wrapper = proc { yield.sub(DOCUMENT_HEADER, "") } if block_given?
+        super(scope, locals, &wrapper)
+      else
+        ::Nokogiri::XML::Builder.new.tap(&data).to_xml
+      end
+    end
+
+    def precompiled_preamble(locals)
+      return super if locals.include? :xml
+      "xml = ::Nokogiri::XML::Builder.new { |xml| }\n#{super}"
+    end
+
+    def precompiled_postamble(locals)
+      "xml.to_xml"
+    end
+
+    def precompiled_template(locals)
+      data.to_str
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/plain.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/plain.rb
new file mode 100644
index 0000000..4c08052
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/plain.rb
@@ -0,0 +1,20 @@
+require 'tilt/template'
+
+
+module Tilt
+  # Raw text (no template functionality).
+  class PlainTemplate < Template
+    self.default_mime_type = 'text/html'
+
+    def self.engine_initialized?
+      true
+    end
+
+    def prepare
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= data
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/radius.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/radius.rb
new file mode 100644
index 0000000..64ec908
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/radius.rb
@@ -0,0 +1,55 @@
+require 'tilt/template'
+
+module Tilt
+  # Radius Template
+  # http://github.com/jlong/radius/
+  class RadiusTemplate < Template
+    def self.engine_initialized?
+      defined? ::Radius
+    end
+
+    def self.context_class
+      @context_class ||= Class.new(Radius::Context) do
+        attr_accessor :tilt_scope
+
+        def tag_missing(name, attributes)
+          tilt_scope.__send__(name)
+        end
+
+        def dup
+          i = super
+          i.tilt_scope = tilt_scope
+          i
+        end
+      end
+    end
+
+    def initialize_engine
+      require_template_library 'radius'
+    end
+
+    def prepare
+    end
+
+    def evaluate(scope, locals, &block)
+      context = self.class.context_class.new
+      context.tilt_scope = scope
+      context.define_tag("yield") do
+        block.call
+      end
+      locals.each do |tag, value|
+        context.define_tag(tag) do
+          value
+        end
+      end
+
+      options = {:tag_prefix => 'r'}.merge(@options)
+      parser = Radius::Parser.new(context, options)
+      parser.parse(data)
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/rdoc.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/rdoc.rb
new file mode 100644
index 0000000..91f0dce
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/rdoc.rb
@@ -0,0 +1,47 @@
+require 'tilt/template'
+
+module Tilt
+  # RDoc template. See:
+  # http://rdoc.rubyforge.org/
+  #
+  # It's suggested that your program `require 'rdoc/markup'` and
+  # `require 'rdoc/markup/to_html'` at load time when using this template
+  # engine in a threaded environment.
+  class RDocTemplate < Template
+    self.default_mime_type = 'text/html'
+
+    def self.engine_initialized?
+      defined? ::RDoc::Markup::ToHtml
+    end
+
+    def initialize_engine
+      require_template_library 'rdoc'
+      require_template_library 'rdoc/markup'
+      require_template_library 'rdoc/markup/to_html'
+    end
+
+    def markup
+      begin
+        # RDoc 4.0
+        require 'rdoc/options'
+        RDoc::Markup::ToHtml.new(RDoc::Options.new, nil)
+      rescue ArgumentError
+        # RDoc < 4.0
+        RDoc::Markup::ToHtml.new
+      end
+    end
+
+    def prepare
+      @engine = markup.convert(data)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_s
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/string.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/string.rb
new file mode 100644
index 0000000..5bc6958
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/string.rb
@@ -0,0 +1,21 @@
+require 'tilt/template'
+
+module Tilt
+  # The template source is evaluated as a Ruby string. The #{} interpolation
+  # syntax can be used to generated dynamic output.
+  class StringTemplate < Template
+    def prepare
+      hash = "TILT#{data.hash.abs}"
+      @code = "<<#{hash}.chomp\n#{data}\n#{hash}"
+    end
+
+    def precompiled_template(locals)
+      @code
+    end
+
+    def precompiled(locals)
+      source, offset = super
+      [source, offset + 1]
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/template.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/template.rb
new file mode 100644
index 0000000..9b52237
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/template.rb
@@ -0,0 +1,292 @@
+module Tilt
+  TOPOBJECT = Object.superclass || Object
+
+  # Base class for template implementations. Subclasses must implement
+  # the #prepare method and one of the #evaluate or #precompiled_template
+  # methods.
+  class Template
+    # Template source; loaded from a file or given directly.
+    attr_reader :data
+
+    # The name of the file where the template data was loaded from.
+    attr_reader :file
+
+    # The line number in #file where template data was loaded from.
+    attr_reader :line
+
+    # A Hash of template engine specific options. This is passed directly
+    # to the underlying engine and is not used by the generic template
+    # interface.
+    attr_reader :options
+
+    # Used to determine if this class's initialize_engine method has
+    # been called yet.
+    @engine_initialized = false
+    class << self
+      attr_accessor :engine_initialized
+      alias engine_initialized? engine_initialized
+
+      attr_accessor :default_mime_type
+    end
+
+    # Create a new template with the file, line, and options specified. By
+    # default, template data is read from the file. When a block is given,
+    # it should read template data and return as a String. When file is nil,
+    # a block is required.
+    #
+    # All arguments are optional.
+    def initialize(file=nil, line=1, options={}, &block)
+      @file, @line, @options = nil, 1, {}
+
+      [options, line, file].compact.each do |arg|
+        case
+        when arg.respond_to?(:to_str)  ; @file = arg.to_str
+        when arg.respond_to?(:to_int)  ; @line = arg.to_int
+        when arg.respond_to?(:to_hash) ; @options = arg.to_hash.dup
+        when arg.respond_to?(:path)    ; @file = arg.path
+        else raise TypeError
+        end
+      end
+
+      raise ArgumentError, "file or block required" if (@file || block).nil?
+
+      # call the initialize_engine method if this is the very first time
+      # an instance of this class has been created.
+      if !self.class.engine_initialized?
+        initialize_engine
+        self.class.engine_initialized = true
+      end
+
+      # used to hold compiled template methods
+      @compiled_method = {}
+
+      # used on 1.9 to set the encoding if it is not set elsewhere (like a magic comment)
+      # currently only used if template compiles to ruby
+      @default_encoding = @options.delete :default_encoding
+
+      # load template data and prepare (uses binread to avoid encoding issues)
+      @reader = block || lambda { |t| read_template_file }
+      @data = @reader.call(self)
+
+      if @data.respond_to?(:force_encoding)
+        @data.force_encoding(default_encoding) if default_encoding
+
+        if !@data.valid_encoding?
+          raise Encoding::InvalidByteSequenceError, "#{eval_file} is not valid #{@data.encoding}"
+        end
+      end
+
+      prepare
+    end
+
+    # The encoding of the source data. Defaults to the
+    # default_encoding-option if present. You may override this method
+    # in your template class if you have a better hint of the data's
+    # encoding.
+    def default_encoding
+      @default_encoding
+    end
+
+    def read_template_file
+      data = File.open(file, 'rb') { |io| io.read }
+      if data.respond_to?(:force_encoding)
+        # Set it to the default external (without verifying)
+        data.force_encoding(Encoding.default_external) if Encoding.default_external
+      end
+      data
+    end
+
+    # Render the template in the given scope with the locals specified. If a
+    # block is given, it is typically available within the template via
+    # +yield+.
+    def render(scope=Object.new, locals={}, &block)
+      evaluate scope, locals || {}, &block
+    end
+
+    # The basename of the template file.
+    def basename(suffix='')
+      File.basename(file, suffix) if file
+    end
+
+    # The template file's basename with all extensions chomped off.
+    def name
+      basename.split('.', 2).first if basename
+    end
+
+    # The filename used in backtraces to describe the template.
+    def eval_file
+      file || '(__TEMPLATE__)'
+    end
+
+    # Whether or not this template engine allows executing Ruby script
+    # within the template. If this is false, +scope+ and +locals+ will
+    # generally not be used, nor will the provided block be avaiable 
+    # via +yield+.
+    # This should be overridden by template subclasses.
+    def allows_script?
+      true
+    end
+
+  protected
+    # Called once and only once for each template subclass the first time
+    # the template class is initialized. This should be used to require the
+    # underlying template library and perform any initial setup.
+    def initialize_engine
+    end
+
+    # Like Kernel#require but issues a warning urging a manual require when
+    # running under a threaded environment.
+    def require_template_library(name)
+      if Thread.list.size > 1
+        warn "WARN: tilt autoloading '#{name}' in a non thread-safe way; " +
+             "explicit require '#{name}' suggested."
+      end
+      require name
+    end
+
+    # Do whatever preparation is necessary to setup the underlying template
+    # engine. Called immediately after template data is loaded. Instance
+    # variables set in this method are available when #evaluate is called.
+    #
+    # Subclasses must provide an implementation of this method.
+    def prepare
+      if respond_to?(:compile!)
+        # backward compat with tilt < 0.6; just in case
+        warn 'Tilt::Template#compile! is deprecated; implement #prepare instead.'
+        compile!
+      else
+        raise NotImplementedError
+      end
+    end
+
+    # Execute the compiled template and return the result string. Template
+    # evaluation is guaranteed to be performed in the scope object with the
+    # locals specified and with support for yielding to the block.
+    #
+    # This method is only used by source generating templates. Subclasses that
+    # override render() may not support all features.
+    def evaluate(scope, locals, &block)
+      method = compiled_method(locals.keys)
+      method.bind(scope).call(locals, &block)
+    end
+
+    # Generates all template source by combining the preamble, template, and
+    # postamble and returns a two-tuple of the form: [source, offset], where
+    # source is the string containing (Ruby) source code for the template and
+    # offset is the integer line offset where line reporting should begin.
+    #
+    # Template subclasses may override this method when they need complete
+    # control over source generation or want to adjust the default line
+    # offset. In most cases, overriding the #precompiled_template method is
+    # easier and more appropriate.
+    def precompiled(locals)
+      preamble = precompiled_preamble(locals)
+      template = precompiled_template(locals)
+      postamble = precompiled_postamble(locals)
+      source = ''
+
+      # Ensure that our generated source code has the same encoding as the
+      # the source code generated by the template engine.
+      if source.respond_to?(:force_encoding)
+        template_encoding = extract_encoding(template)
+
+        source.force_encoding(template_encoding)
+        template.force_encoding(template_encoding)
+      end
+
+      # https://github.com/rtomayko/tilt/issues/193
+      warn "precompiled_preamble should return String (not Array)" if preamble.is_a?(Array)
+      warn "precompiled_postamble should return String (not Array)" if postamble.is_a?(Array)
+      source << [preamble, template, postamble].join("\n")
+
+      [source, preamble.count("\n")+1]
+    end
+
+    # A string containing the (Ruby) source code for the template. The
+    # default Template#evaluate implementation requires either this
+    # method or the #precompiled method be overridden. When defined,
+    # the base Template guarantees correct file/line handling, locals
+    # support, custom scopes, proper encoding, and support for template
+    # compilation.
+    def precompiled_template(locals)
+      raise NotImplementedError
+    end
+
+    # Generates preamble code for initializing template state, and performing
+    # locals assignment. The default implementation performs locals
+    # assignment only. Lines included in the preamble are subtracted from the
+    # source line offset, so adding code to the preamble does not effect line
+    # reporting in Kernel::caller and backtraces.
+    def precompiled_preamble(locals)
+      locals.map do |k,v|
+        if k.to_s =~ /\A[a-z_][a-zA-Z_0-9]*\z/
+          "#{k} = locals[#{k.inspect}]"
+        else
+          raise "invalid locals key: #{k.inspect} (keys must be variable names)"
+        end
+      end.join("\n")
+    end
+
+    # Generates postamble code for the precompiled template source. The
+    # string returned from this method is appended to the precompiled
+    # template source.
+    def precompiled_postamble(locals)
+      ''
+    end
+
+    # The compiled method for the locals keys provided.
+    def compiled_method(locals_keys)
+      @compiled_method[locals_keys] ||=
+        compile_template_method(locals_keys)
+    end
+
+  private
+    def compile_template_method(locals)
+      source, offset = precompiled(locals)
+      method_name = "__tilt_#{Thread.current.object_id.abs}"
+      method_source = ""
+
+      if method_source.respond_to?(:force_encoding)
+        method_source.force_encoding(source.encoding) 
+      end
+
+      method_source << <<-RUBY
+        TOPOBJECT.class_eval do
+          def #{method_name}(locals)
+            Thread.current[:tilt_vars] = [self, locals]
+            class << self
+              this, locals = Thread.current[:tilt_vars]
+              this.instance_eval do
+      RUBY
+      offset += method_source.count("\n")
+      method_source << source
+      method_source << "\nend;end;end;end"
+      Object.class_eval method_source, eval_file, line - offset
+      unbind_compiled_method(method_name)
+    end
+
+    def unbind_compiled_method(method_name)
+      method = TOPOBJECT.instance_method(method_name)
+      TOPOBJECT.class_eval { remove_method(method_name) }
+      method
+    end
+
+    def extract_encoding(script)
+      extract_magic_comment(script) || script.encoding
+    end
+
+    def extract_magic_comment(script)
+      binary script do
+        script[/\A[ \t]*\#.*coding\s*[=:]\s*([[:alnum:]\-_]+).*$/n, 1]
+      end
+    end
+
+    def binary(string)
+      original_encoding = string.encoding
+      string.force_encoding(Encoding::BINARY)
+      yield
+    ensure
+      string.force_encoding(original_encoding)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/textile.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/textile.rb
new file mode 100644
index 0000000..9135598
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/textile.rb
@@ -0,0 +1,30 @@
+require 'tilt/template'
+
+module Tilt
+  # RedCloth implementation. See:
+  # http://redcloth.org/
+  class RedClothTemplate < Template
+    def self.engine_initialized?
+      defined? ::RedCloth
+    end
+
+    def initialize_engine
+      require_template_library 'redcloth'
+    end
+
+    def prepare
+      @engine = RedCloth.new(data)
+      options.each {|k, v| @engine.send("#{k}=", v) if @engine.respond_to? "#{k}="}
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/wiki.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/wiki.rb
new file mode 100644
index 0000000..1349eb2
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/wiki.rb
@@ -0,0 +1,58 @@
+require 'tilt/template'
+
+module Tilt
+  # Creole implementation. See:
+  # http://www.wikicreole.org/
+  class CreoleTemplate < Template
+    def self.engine_initialized?
+      defined? ::Creole
+    end
+
+    def initialize_engine
+      require_template_library 'creole'
+    end
+
+    def prepare
+      opts = {}
+      [:allowed_schemes, :extensions, :no_escape].each do |k|
+        opts[k] = options[k] if options[k]
+      end
+      @engine = Creole::Parser.new(data, opts)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+
+  # WikiCloth implementation. See:
+  # http://redcloth.org/
+  class WikiClothTemplate < Template
+    def self.engine_initialized?
+      defined? ::WikiCloth::Parser
+    end
+
+    def initialize_engine
+      require_template_library 'wikicloth'
+    end
+
+    def prepare
+      @parser = options.delete(:parser) || WikiCloth::Parser
+      @engine = @parser.new options.merge(:data => data)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/yajl.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/yajl.rb
new file mode 100644
index 0000000..0b9b702
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/yajl.rb
@@ -0,0 +1,94 @@
+require 'tilt/template'
+
+module Tilt
+
+  # Yajl Template implementation
+  #
+  # Yajl is a fast JSON parsing and encoding library for Ruby
+  # See https://github.com/brianmario/yajl-ruby
+  #
+  # The template source is evaluated as a Ruby string,
+  # and the result is converted #to_json.
+  #
+  # == Example
+  #
+  #    # This is a template example.
+  #    # The template can contain any Ruby statement.
+  #    tpl <<-EOS
+  #      @counter = 0
+  #
+  #      # The json variable represents the buffer
+  #      # and holds the data to be serialized into json.
+  #      # It defaults to an empty hash, but you can override it at any time.
+  #      json = {
+  #        :"user#{@counter += 1}" => { :name => "Joshua Peek", :id => @counter },
+  #        :"user#{@counter += 1}" => { :name => "Ryan Tomayko", :id => @counter },
+  #        :"user#{@counter += 1}" => { :name => "Simone Carletti", :id => @counter },
+  #      }
+  #
+  #      # Since the json variable is a Hash,
+  #      # you can use conditional statements or any other Ruby statement
+  #      # to populate it.
+  #      json[:"user#{@counter += 1}"] = { :name => "Unknown" } if 1 == 2
+  #
+  #      # The last line doesn't affect the returned value.
+  #      nil
+  #    EOS
+  #
+  #    template = Tilt::YajlTemplate.new { tpl }
+  #    template.render(self)
+  #
+  class YajlTemplate < Template
+
+    self.default_mime_type = 'application/json'
+
+    def self.engine_initialized?
+      defined? ::Yajl
+    end
+
+    def initialize_engine
+      require_template_library 'yajl'
+    end
+
+    def prepare
+    end
+
+    def evaluate(scope, locals, &block)
+      decorate super(scope, locals, &block)
+    end
+
+    def precompiled_preamble(locals)
+      return super if locals.include? :json
+      "json = {}\n#{super}"
+    end
+
+    def precompiled_postamble(locals)
+      "Yajl::Encoder.new.encode(json)"
+    end
+
+    def precompiled_template(locals)
+      data.to_str
+    end
+
+
+    # Decorates the +json+ input according to given +options+.
+    #
+    # json    - The json String to decorate.
+    # options - The option Hash to customize the behavior.
+    #
+    # Returns the decorated String.
+    def decorate(json)
+      callback, variable = options[:callback], options[:variable]
+      if callback && variable
+        "var #{variable} = #{json}; #{callback}(#{variable});"
+      elsif variable
+        "var #{variable} = #{json};"
+      elsif callback
+        "#{callback}(#{json});"
+      else
+        json
+      end
+    end
+  end
+
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/contest.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/contest.rb
new file mode 100644
index 0000000..075f941
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/contest.rb
@@ -0,0 +1,68 @@
+require "test/unit"
+
+# Test::Unit loads a default test if the suite is empty, whose purpose is to
+# fail. Since having empty contexts is a common practice, we decided to
+# overwrite TestSuite#empty? in order to allow them. Having a failure when no
+# tests have been defined seems counter-intuitive.
+class Test::Unit::TestSuite
+  def empty?
+    false
+  end
+end
+
+# Contest adds +teardown+, +test+ and +context+ as class methods, and the
+# instance methods +setup+ and +teardown+ now iterate on the corresponding
+# blocks. Note that all setup and teardown blocks must be defined with the
+# block syntax. Adding setup or teardown instance methods defeats the purpose
+# of this library.
+class Test::Unit::TestCase
+  def self.setup(&block)
+    define_method :setup do
+      super(&block)
+      instance_eval(&block)
+    end
+  end
+
+  def self.teardown(&block)
+    define_method :teardown do
+      instance_eval(&block)
+      super(&block)
+    end
+  end
+
+  def self.context(name, &block)
+    subclass = Class.new(self)
+    remove_tests(subclass)
+    subclass.class_eval(&block) if block_given?
+    const_set(context_name(name), subclass)
+  end
+
+  def self.test(name, &block)
+    define_method(test_name(name), &block)
+  end
+
+  class << self
+    alias_method :should, :test
+    alias_method :describe, :context
+  end
+
+private
+
+  def self.context_name(name)
+    "Test#{sanitize_name(name).gsub(/(^| )(\w)/) { $2.upcase }}".to_sym
+  end
+
+  def self.test_name(name)
+    "test_#{sanitize_name(name).gsub(/\s+/,'_')}".to_sym
+  end
+
+  def self.sanitize_name(name)
+    name.gsub(/\W+/, ' ').strip
+  end
+
+  def self.remove_tests(subclass)
+    subclass.public_instance_methods.grep(/^test_/).each do |meth|
+      subclass.send(:undef_method, meth.to_sym)
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/locals.mab b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/locals.mab
new file mode 100644
index 0000000..36e29e6
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/locals.mab
@@ -0,0 +1 @@
+li foo
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/markaby.mab b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/markaby.mab
new file mode 100644
index 0000000..45f3fe4
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/markaby.mab
@@ -0,0 +1 @@
+text "hello from markaby!"
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/markaby_other_static.mab b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/markaby_other_static.mab
new file mode 100644
index 0000000..75c03fd
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/markaby_other_static.mab
@@ -0,0 +1 @@
+text "_why?"
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/render_twice.mab b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/render_twice.mab
new file mode 100644
index 0000000..f350322
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/render_twice.mab
@@ -0,0 +1 @@
+text "foo"
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/scope.mab b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/scope.mab
new file mode 100644
index 0000000..36e29e6
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/scope.mab
@@ -0,0 +1 @@
+li foo
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/yielding.mab b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/yielding.mab
new file mode 100644
index 0000000..6e95a1b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/markaby/yielding.mab
@@ -0,0 +1,2 @@
+text("Hey ")
+yield
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_asciidoctor_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_asciidoctor_test.rb
new file mode 100644
index 0000000..27fccdc
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_asciidoctor_test.rb
@@ -0,0 +1,44 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'asciidoctor'
+
+  class AsciidoctorTemplateTest < Test::Unit::TestCase
+    HTML5_OUTPUT = "<div class=\"sect1\"><h2 id=\"_hello_world\">Hello World!</h2><div class=\"sectionbody\"></div></div>"
+    DOCBOOK_OUTPUT = "<section id=\"_hello_world\"><title>Hello World!</title></section>"
+
+    def strip_space(str)
+      str.gsub(/>\s+</, '><').strip
+    end
+
+    test "registered for '.ad' files" do
+      assert Tilt.mappings['ad'].include?(Tilt::AsciidoctorTemplate)
+    end
+
+    test "registered for '.adoc' files" do
+      assert Tilt.mappings['adoc'].include?(Tilt::AsciidoctorTemplate)
+    end
+
+    test "registered for '.asciidoc' files" do
+      assert Tilt.mappings['asciidoc'].include?(Tilt::AsciidoctorTemplate)
+    end
+
+    test "preparing and evaluating html5 templates on #render" do
+      template = Tilt::AsciidoctorTemplate.new(:attributes => {"backend" => 'html5'}) { |t| "== Hello World!" } 
+      assert_equal HTML5_OUTPUT, strip_space(template.render)
+    end
+
+    test "preparing and evaluating docbook templates on #render" do
+      template = Tilt::AsciidoctorTemplate.new(:attributes => {"backend" => 'docbook'}) { |t| "== Hello World!" } 
+      assert_equal DOCBOOK_OUTPUT, strip_space(template.render)
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::AsciidoctorTemplate.new(:attributes => {"backend" => 'html5'}) { |t| "== Hello World!" } 
+      3.times { assert_equal HTML5_OUTPUT, strip_space(template.render) }
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::AsciidoctorTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_blueclothtemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_blueclothtemplate_test.rb
new file mode 100644
index 0000000..1952ef9
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_blueclothtemplate_test.rb
@@ -0,0 +1,45 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'bluecloth'
+
+  class BlueClothTemplateTest < Test::Unit::TestCase
+    test "registered for '.md' files" do
+      assert Tilt.mappings['md'].include?(Tilt::BlueClothTemplate)
+    end
+
+    test "registered for '.mkd' files" do
+      assert Tilt.mappings['mkd'].include?(Tilt::BlueClothTemplate)
+    end
+
+    test "registered for '.markdown' files" do
+      assert Tilt.mappings['markdown'].include?(Tilt::BlueClothTemplate)
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::BlueClothTemplate.new { |t| "# Hello World!" }
+      assert_equal "<h1>Hello World!</h1>", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::BlueClothTemplate.new { |t| "# Hello World!" }
+      3.times { assert_equal "<h1>Hello World!</h1>", template.render }
+    end
+
+    test "smartypants when :smart is set" do
+      template = Tilt::BlueClothTemplate.new(:smartypants => true) { |t|
+        "OKAY -- 'Smarty Pants'" }
+      assert_equal "<p>OKAY — ‘Smarty Pants’</p>",
+        template.render
+    end
+
+    test "stripping HTML when :filter_html is set" do
+      template = Tilt::BlueClothTemplate.new(:escape_html => true) { |t|
+        "HELLO <blink>WORLD</blink>" }
+      assert_equal "<p>HELLO <blink>WORLD</blink></p>", template.render
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::BlueClothTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_buildertemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_buildertemplate_test.rb
new file mode 100644
index 0000000..44d8deb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_buildertemplate_test.rb
@@ -0,0 +1,59 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'builder'
+  class BuilderTemplateTest < Test::Unit::TestCase
+    test "registered for '.builder' files" do
+      assert_equal Tilt::BuilderTemplate, Tilt['test.builder']
+      assert_equal Tilt::BuilderTemplate, Tilt['test.xml.builder']
+    end
+
+    test "preparing and evaluating the template on #render" do
+      template = Tilt::BuilderTemplate.new { |t| "xml.em 'Hello World!'" }
+      assert_equal "<em>Hello World!</em>\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::BuilderTemplate.new { |t| "xml.em 'Hello World!'" }
+      3.times { assert_equal "<em>Hello World!</em>\n", template.render }
+    end
+
+    test "passing locals" do
+      template = Tilt::BuilderTemplate.new { "xml.em('Hey ' + name + '!')" }
+      assert_equal "<em>Hey Joe!</em>\n", template.render(Object.new, :name => 'Joe')
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::BuilderTemplate.new { "xml.em('Hey ' + @name + '!')" }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal "<em>Hey Joe!</em>\n", template.render(scope)
+    end
+
+    test "passing a block for yield" do
+      template = Tilt::BuilderTemplate.new { "xml.em('Hey ' + yield + '!')" }
+      3.times { assert_equal "<em>Hey Joe!</em>\n", template.render { 'Joe' }}
+    end
+
+    test "block style templates" do
+      template =
+        Tilt::BuilderTemplate.new do |t|
+          lambda { |xml| xml.em('Hey Joe!') }
+        end
+      assert_equal "<em>Hey Joe!</em>\n", template.render
+    end
+
+    test "allows nesting raw XML" do
+      subtemplate = Tilt::BuilderTemplate.new { "xml.em 'Hello World!'" }
+      template = Tilt::BuilderTemplate.new { "xml.strong { xml << yield }" }
+      3.times do
+        options = { :xml => Builder::XmlMarkup.new }
+        assert_equal "<strong>\n<em>Hello World!</em>\n</strong>\n",
+          template.render(options) { subtemplate.render(options) }
+      end
+    end
+  end
+rescue LoadError
+  warn "Tilt::BuilderTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_cache_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_cache_test.rb
new file mode 100644
index 0000000..8c8e050
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_cache_test.rb
@@ -0,0 +1,32 @@
+require 'contest'
+require 'tilt'
+
+class TiltCacheTest < Test::Unit::TestCase
+  setup { @cache = Tilt::Cache.new }
+
+  test "caching with single simple argument to #fetch" do
+    template = nil
+    result = @cache.fetch('hello') { template = Tilt::StringTemplate.new {''} }
+    assert_same template, result
+    result = @cache.fetch('hello') { fail 'should be cached' }
+    assert_same template, result
+  end
+
+  test "caching with multiple complex arguments to #fetch" do
+    template = nil
+    result = @cache.fetch('hello', {:foo => 'bar', :baz => 'bizzle'}) { template = Tilt::StringTemplate.new {''} }
+    assert_same template, result
+    result = @cache.fetch('hello', {:foo => 'bar', :baz => 'bizzle'}) { fail 'should be cached' }
+    assert_same template, result
+  end
+
+  test "clearing the cache with #clear" do
+    template, other = nil
+    result = @cache.fetch('hello') { template = Tilt::StringTemplate.new {''} }
+    assert_same template, result
+
+    @cache.clear
+    result = @cache.fetch('hello') { other = Tilt::StringTemplate.new {''} }
+    assert_same other, result
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_coffeescripttemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_coffeescripttemplate_test.rb
new file mode 100644
index 0000000..377b6f7
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_coffeescripttemplate_test.rb
@@ -0,0 +1,114 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'coffee_script'
+
+  class CoffeeScriptTemplateTest < Test::Unit::TestCase
+
+    unless method_defined?(:assert_not_match)
+      # assert_not_match is missing on 1.8.7, which uses assert_no_match
+      def assert_not_match(a, b)
+        unless a.kind_of?(Regexp)
+          a = Regexp.new(Regexp.escape(a))
+        end
+        assert_no_match(a,b)
+      end
+    end
+
+    test "is registered for '.coffee' files" do
+      assert_equal Tilt::CoffeeScriptTemplate, Tilt['test.coffee']
+    end
+
+    test "bare is disabled by default" do
+      assert_equal false, Tilt::CoffeeScriptTemplate.default_bare
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::CoffeeScriptTemplate.new { |t| "puts 'Hello, World!'\n" }
+      assert_match "puts('Hello, World!');", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::CoffeeScriptTemplate.new { |t| "puts 'Hello, World!'\n" }
+      3.times { assert_match "puts('Hello, World!');", template.render }
+    end
+
+    test "disabling coffee-script wrapper" do
+      str = 'name = "Josh"; puts "Hello #{name}"'
+
+      template = Tilt::CoffeeScriptTemplate.new { str }
+      assert_match "(function() {", template.render
+      assert_match "puts(\"Hello \" + name);\n", template.render
+
+      template = Tilt::CoffeeScriptTemplate.new(:bare => true) { str }
+      assert_not_match "(function() {", template.render
+      assert_equal "var name;\n\nname = \"Josh\";\n\nputs(\"Hello \" + name);\n", template.render
+
+      template2 = Tilt::CoffeeScriptTemplate.new(:no_wrap => true) { str}
+      assert_not_match "(function() {", template.render
+      assert_equal "var name;\n\nname = \"Josh\";\n\nputs(\"Hello \" + name);\n", template.render
+    end
+
+    context "wrapper globally enabled" do
+      setup do
+        @bare = Tilt::CoffeeScriptTemplate.default_bare
+        Tilt::CoffeeScriptTemplate.default_bare = false
+      end
+
+      teardown do
+        Tilt::CoffeeScriptTemplate.default_bare = @bare
+      end
+
+      test "no options" do
+        template = Tilt::CoffeeScriptTemplate.new { |t| 'name = "Josh"; puts "Hello, #{name}"' }
+        assert_match "puts(\"Hello, \" + name);", template.render
+        assert_match "(function() {", template.render
+      end
+
+      test "overridden by :bare" do
+        template = Tilt::CoffeeScriptTemplate.new(:bare => true) { |t| 'name = "Josh"; puts "Hello, #{name}"' }
+        assert_match "puts(\"Hello, \" + name);", template.render
+        assert_not_match "(function() {", template.render
+      end
+
+      test "overridden by :no_wrap" do
+        template = Tilt::CoffeeScriptTemplate.new(:no_wrap => true) { |t| 'name = "Josh"; puts "Hello, #{name}"' }
+        assert_match "puts(\"Hello, \" + name);", template.render
+        assert_not_match "(function() {", template.render
+      end
+    end
+
+    context "wrapper globally disabled" do
+      setup do
+        @bare = Tilt::CoffeeScriptTemplate.default_bare
+        Tilt::CoffeeScriptTemplate.default_bare = true
+      end
+
+      teardown do
+        Tilt::CoffeeScriptTemplate.default_bare = @bare
+      end
+
+      test "no options" do
+        template = Tilt::CoffeeScriptTemplate.new { |t| 'name = "Josh"; puts "Hello, #{name}"' }
+        assert_match "puts(\"Hello, \" + name);", template.render
+        assert_not_match "(function() {", template.render
+      end
+
+      test "overridden by :bare" do
+        template = Tilt::CoffeeScriptTemplate.new(:bare => false) { |t| 'name = "Josh"; puts "Hello, #{name}"' }
+        assert_match "puts(\"Hello, \" + name);", template.render
+        assert_match "(function() {", template.render
+      end
+
+      test "overridden by :no_wrap" do
+        template = Tilt::CoffeeScriptTemplate.new(:no_wrap => false) { |t| 'name = "Josh"; puts "Hello, #{name}"' }
+        assert_match "puts(\"Hello, \" + name);", template.render
+        assert_match "(function() {", template.render
+      end
+    end
+  end
+
+rescue LoadError => boom
+  warn "Tilt::CoffeeScriptTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_compilesite_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_compilesite_test.rb
new file mode 100644
index 0000000..2944c84
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_compilesite_test.rb
@@ -0,0 +1,51 @@
+require 'contest'
+require 'tilt'
+require 'thread'
+
+class CompileSiteTest < Test::Unit::TestCase
+  def setup
+    GC.start
+  end
+
+  class CompilingTemplate < Tilt::Template
+    def prepare
+    end
+
+    def precompiled_template(locals)
+      @data.inspect
+    end
+  end
+
+  class Scope
+  end
+
+  test "compiling template source to a method" do
+    template = CompilingTemplate.new { |t| "Hello World!" }
+    template.render(Scope.new)
+    method = template.send(:compiled_method, [])
+    assert_kind_of UnboundMethod, method
+  end
+
+  # This test attempts to surface issues with compiling templates from
+  # multiple threads.
+  test "using compiled templates from multiple threads" do
+    template = CompilingTemplate.new { 'template' }
+    main_thread = Thread.current
+    10.times do |i|
+      threads =
+        (1..50).map do |j|
+          Thread.new {
+            begin
+              locals = { "local#{i}" => 'value' }
+              res = template.render(self, locals)
+              thread_id = Thread.current.object_id
+              res = template.render(self, "local#{thread_id.abs.to_s}" => 'value')
+            rescue => boom
+              main_thread.raise(boom)
+            end
+          }
+        end
+      threads.each { |t| t.join }
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_creoletemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_creoletemplate_test.rb
new file mode 100644
index 0000000..b4e8098
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_creoletemplate_test.rb
@@ -0,0 +1,28 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'creole'
+
+  class CreoleTemplateTest < Test::Unit::TestCase
+    test "is registered for '.creole' files" do
+      assert_equal Tilt::CreoleTemplate, Tilt['test.creole']
+    end
+
+    test "registered for '.wiki' files" do
+      assert Tilt.mappings['wiki'].include?(Tilt::CreoleTemplate)
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::CreoleTemplate.new { |t| "= Hello World!" }
+      assert_equal "<h1>Hello World!</h1>", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::CreoleTemplate.new { |t| "= Hello World!" }
+      3.times { assert_equal "<h1>Hello World!</h1>", template.render }
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::CreoleTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_csv_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_csv_test.rb
new file mode 100644
index 0000000..c11ce03
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_csv_test.rb
@@ -0,0 +1,69 @@
+require 'contest'
+require 'tilt'
+
+begin
+  if RUBY_VERSION >= '1.9.0'
+    require 'csv'
+  else
+    require 'fastercsv'
+  end
+
+  class CSVTemplateTest < Test::Unit::TestCase
+
+    test "registered for '.rcsv' files" do
+      assert Tilt.mappings['rcsv'].include?(Tilt::CSVTemplate)
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::CSVTemplate.new { "csv << ['hello', 'world']" }
+      assert_equal "hello,world\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::CSVTemplate.new { "csv << [1,2,3]" }
+      3.times { assert_equal "1,2,3\n", template.render }
+    end
+
+    test "can pass locals" do
+      template = Tilt::CSVTemplate.new { 'csv << [1, name]' }
+      assert_equal "1,Joe\n", template.render(Object.new, :name => 'Joe')
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::CSVTemplate.new { 'csv << [1, @name]' }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal "1,Joe\n", template.render(scope)
+    end
+
+    test "backtrace file and line reporting" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      template = Tilt::CSVTemplate.new('test.csv') { data }
+      begin
+        template.render
+        fail 'should have raised an exception'
+      rescue => boom
+        assert_kind_of NameError, boom
+        line = boom.backtrace.grep(/^test\.csv:/).first
+        assert line, "Backtrace didn't contain test.csv"
+        file, line, meth = line.split(":")
+        assert_equal '4', line
+      end
+    end
+
+  end
+
+rescue LoadError => boom
+  warn "Tilt::CSVTemplate (disabled) please install 'fastercsv' if using ruby 1.8.x"
+end
+
+
+__END__
+# header
+csv << ['Type', 'Age']
+
+raise NameError
+
+# rows
+csv << ['Frog', 2]
+csv << ['Cat', 5]
\ No newline at end of file
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_erbtemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_erbtemplate_test.rb
new file mode 100644
index 0000000..5faffcb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_erbtemplate_test.rb
@@ -0,0 +1,239 @@
+# coding: utf-8
+require 'contest'
+require 'tilt'
+require 'erb'
+require 'tempfile'
+
+class ERBTemplateTest < Test::Unit::TestCase
+  test "registered for '.erb' files" do
+    assert Tilt.mappings['erb'].include?(Tilt::ERBTemplate)
+  end
+
+  test "registered for '.rhtml' files" do
+    assert Tilt.mappings['rhtml'].include?(Tilt::ERBTemplate)
+  end
+
+  test "loading and evaluating templates on #render" do
+    template = Tilt::ERBTemplate.new { |t| "Hello World!" }
+    assert_equal "Hello World!", template.render
+  end
+
+  test "can be rendered more than once" do
+    template = Tilt::ERBTemplate.new { |t| "Hello World!" }
+    3.times { assert_equal "Hello World!", template.render }
+  end
+
+  test "passing locals" do
+    template = Tilt::ERBTemplate.new { 'Hey <%= name %>!' }
+    assert_equal "Hey Joe!", template.render(Object.new, :name => 'Joe')
+  end
+
+  test "evaluating in an object scope" do
+    template = Tilt::ERBTemplate.new { 'Hey <%= @name %>!' }
+    scope = Object.new
+    scope.instance_variable_set :@name, 'Joe'
+    assert_equal "Hey Joe!", template.render(scope)
+  end
+
+  class MockOutputVariableScope
+    attr_accessor :exposed_buffer
+  end
+
+  test "exposing the buffer to the template by default" do
+    begin
+      Tilt::ERBTemplate.default_output_variable = '@_out_buf'
+      template = Tilt::ERBTemplate.new { '<% self.exposed_buffer = @_out_buf %>hey' }
+      scope = MockOutputVariableScope.new
+      template.render(scope)
+      assert_not_nil scope.exposed_buffer
+      assert_equal scope.exposed_buffer, 'hey'
+    ensure
+      Tilt::ERBTemplate.default_output_variable = '_erbout'
+    end
+  end
+
+  test "passing a block for yield" do
+    template = Tilt::ERBTemplate.new { 'Hey <%= yield %>!' }
+    assert_equal "Hey Joe!", template.render { 'Joe' }
+  end
+
+  test "backtrace file and line reporting without locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::ERBTemplate.new('test.erb', 11) { data }
+    begin
+      template.render
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of NameError, boom
+      line = boom.backtrace.grep(/^test\.erb:/).first
+      assert line, "Backtrace didn't contain test.erb"
+      file, line, meth = line.split(":")
+      assert_equal '13', line
+    end
+  end
+
+  test "backtrace file and line reporting with locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::ERBTemplate.new('test.erb', 1) { data }
+    begin
+      template.render(nil, :name => 'Joe', :foo => 'bar')
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of RuntimeError, boom
+      line = boom.backtrace.first
+      file, line, meth = line.split(":")
+      assert_equal 'test.erb', file
+      assert_equal '6', line
+    end
+  end
+
+  test "explicit disabling of trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb', 1, :trim => false) { "\n<%= 1 + 1 %>\n" }
+    assert_equal "\n2\n", template.render
+  end
+
+  test "default stripping trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb', 1) { "\n<%= 1 + 1 %>\n" }
+    assert_equal "\n2", template.render
+  end
+
+  test "stripping trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb', 1, :trim => '-') { "\n<%= 1 + 1 -%>\n" }
+    assert_equal "\n2", template.render
+  end
+
+  test "shorthand whole line syntax trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb', :trim => '%') { "\n% if true\nhello\n%end\n" }
+    assert_equal "\nhello\n", template.render
+  end
+
+  test "using an instance variable as the outvar" do
+    template = Tilt::ERBTemplate.new(nil, :outvar => '@buf') { "<%= 1 + 1 %>" }
+    scope = Object.new
+    scope.instance_variable_set(:@buf, 'original value')
+    assert_equal '2', template.render(scope)
+    assert_equal 'original value', scope.instance_variable_get(:@buf)
+  end
+end
+
+class CompiledERBTemplateTest < Test::Unit::TestCase
+  def teardown
+    GC.start
+  end
+
+  class Scope
+  end
+
+  test "compiling template source to a method" do
+    template = Tilt::ERBTemplate.new { |t| "Hello World!" }
+    template.render(Scope.new)
+    method = template.send(:compiled_method, [])
+    assert_kind_of UnboundMethod, method
+  end
+
+  test "loading and evaluating templates on #render" do
+    template = Tilt::ERBTemplate.new { |t| "Hello World!" }
+    assert_equal "Hello World!", template.render(Scope.new)
+    assert_equal "Hello World!", template.render(Scope.new)
+  end
+
+  test "passing locals" do
+    template = Tilt::ERBTemplate.new { 'Hey <%= name %>!' }
+    assert_equal "Hey Joe!", template.render(Scope.new, :name => 'Joe')
+  end
+
+  test "evaluating in an object scope" do
+    template = Tilt::ERBTemplate.new { 'Hey <%= @name %>!' }
+    scope = Scope.new
+    scope.instance_variable_set :@name, 'Joe'
+    assert_equal "Hey Joe!", template.render(scope)
+    scope.instance_variable_set :@name, 'Jane'
+    assert_equal "Hey Jane!", template.render(scope)
+  end
+
+  test "passing a block for yield" do
+    template = Tilt::ERBTemplate.new { 'Hey <%= yield %>!' }
+    assert_equal "Hey Joe!", template.render(Scope.new) { 'Joe' }
+    assert_equal "Hey Jane!", template.render(Scope.new) { 'Jane' }
+  end
+
+  test "backtrace file and line reporting without locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::ERBTemplate.new('test.erb', 11) { data }
+    begin
+      template.render(Scope.new)
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of NameError, boom
+      line = boom.backtrace.grep(/^test\.erb:/).first
+      assert line, "Backtrace didn't contain test.erb"
+      file, line, meth = line.split(":")
+      assert_equal '13', line
+    end
+  end
+
+  test "backtrace file and line reporting with locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::ERBTemplate.new('test.erb') { data }
+    begin
+      template.render(Scope.new, :name => 'Joe', :foo => 'bar')
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of RuntimeError, boom
+      line = boom.backtrace.first
+      file, line, meth = line.split(":")
+      assert_equal 'test.erb', file
+      assert_equal '6', line
+    end
+  end
+
+  test "default stripping trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb') { "\n<%= 1 + 1 %>\n" }
+    assert_equal "\n2", template.render(Scope.new)
+  end
+
+  test "stripping trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb', :trim => '-') { "\n<%= 1 + 1 -%>\n" }
+    assert_equal "\n2", template.render(Scope.new)
+  end
+
+  test "shorthand whole line syntax trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb', :trim => '%') { "\n% if true\nhello\n%end\n" }
+    assert_equal "\nhello\n", template.render(Scope.new)
+  end
+
+  test "encoding with magic comment" do
+    f = Tempfile.open("template")
+    f.puts('<%# coding: UTF-8 %>')
+    f.puts('ふが <%= @hoge %>')
+    f.close()
+    @hoge = "ほげ"
+    erb = Tilt::ERBTemplate.new(f.path)
+    3.times { erb.render(self) }
+    f.delete
+  end
+
+  test "encoding with :default_encoding" do
+    f = Tempfile.open("template")
+    f.puts('ふが <%= @hoge %>')
+    f.close()
+    @hoge = "ほげ"
+    erb = Tilt::ERBTemplate.new(f.path, :default_encoding => 'UTF-8')
+    3.times { erb.render(self) }
+    f.delete
+  end
+end
+
+__END__
+<html>
+<body>
+  <h1>Hey <%= name %>!</h1>
+
+
+  <p><% fail %></p>
+</body>
+</html>
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_erubistemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_erubistemplate_test.rb
new file mode 100644
index 0000000..f908c0f
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_erubistemplate_test.rb
@@ -0,0 +1,151 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'erubis'
+  class ErubisTemplateTest < Test::Unit::TestCase
+    test "registered for '.erubis' files" do
+      assert_equal Tilt::ErubisTemplate, Tilt['test.erubis']
+      assert_equal Tilt::ErubisTemplate, Tilt['test.html.erubis']
+    end
+
+    test "registered above ERB" do
+      %w[erb rhtml].each do |ext|
+        mappings = Tilt.mappings[ext]
+        erubis_idx = mappings.index(Tilt::ErubisTemplate)
+        erb_idx = mappings.index(Tilt::ERBTemplate)
+        assert erubis_idx < erb_idx,
+          "#{erubis_idx} should be lower than #{erb_idx}"
+      end
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::ErubisTemplate.new { |t| "Hello World!" }
+      assert_equal "Hello World!", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::ErubisTemplate.new { |t| "Hello World!" }
+      3.times { assert_equal "Hello World!", template.render }
+    end
+
+    test "passing locals" do
+      template = Tilt::ErubisTemplate.new { 'Hey <%= name %>!' }
+      assert_equal "Hey Joe!", template.render(Object.new, :name => 'Joe')
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::ErubisTemplate.new { 'Hey <%= @name %>!' }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal "Hey Joe!", template.render(scope)
+    end
+
+    class MockOutputVariableScope
+      attr_accessor :exposed_buffer
+    end
+
+    test "exposing the buffer to the template by default" do
+      begin
+        Tilt::ErubisTemplate.default_output_variable = '@_out_buf'
+        template = Tilt::ErubisTemplate.new { '<% self.exposed_buffer = @_out_buf %>hey' }
+        scope = MockOutputVariableScope.new
+        template.render(scope)
+        assert_not_nil scope.exposed_buffer
+        assert_equal scope.exposed_buffer, 'hey'
+      ensure
+        Tilt::ErubisTemplate.default_output_variable = '_erbout'
+      end
+    end
+
+    test "passing a block for yield" do
+      template = Tilt::ErubisTemplate.new { 'Hey <%= yield %>!' }
+      assert_equal "Hey Joe!", template.render { 'Joe' }
+    end
+
+    test "backtrace file and line reporting without locals" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      fail unless data[0] == ?<
+      template = Tilt::ErubisTemplate.new('test.erubis', 11) { data }
+      begin
+        template.render
+        fail 'should have raised an exception'
+      rescue => boom
+        assert_kind_of NameError, boom
+        line = boom.backtrace.grep(/^test\.erubis:/).first
+        assert line, "Backtrace didn't contain test.erubis"
+        file, line, meth = line.split(":")
+        assert_equal '13', line
+      end
+    end
+
+    test "backtrace file and line reporting with locals" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      fail unless data[0] == ?<
+      template = Tilt::ErubisTemplate.new('test.erubis', 1) { data }
+      begin
+        template.render(nil, :name => 'Joe', :foo => 'bar')
+        fail 'should have raised an exception'
+      rescue => boom
+        assert_kind_of RuntimeError, boom
+        line = boom.backtrace.first
+        file, line, meth = line.split(":")
+        assert_equal 'test.erubis', file
+        assert_equal '6', line
+      end
+    end
+
+    test "erubis template options" do
+      template = Tilt::ErubisTemplate.new(nil, :pattern => '\{% %\}') { 'Hey {%= @name %}!' }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal "Hey Joe!", template.render(scope)
+    end
+
+    test "using an instance variable as the outvar" do
+      template = Tilt::ErubisTemplate.new(nil, :outvar => '@buf') { "<%= 1 + 1 %>" }
+      scope = Object.new
+      scope.instance_variable_set(:@buf, 'original value')
+      assert_equal '2', template.render(scope)
+      assert_equal 'original value', scope.instance_variable_get(:@buf)
+    end
+
+    test "using Erubis::EscapedEruby subclass via :engine_class option" do
+      template = Tilt::ErubisTemplate.new(nil, :engine_class => ::Erubis::EscapedEruby) { |t| %(<%= "<p>Hello World!</p>" %>) }
+      assert_equal "<p>Hello World!</p>", template.render
+    end
+
+    test "using :escape_html => true option" do
+      template = Tilt::ErubisTemplate.new(nil, :escape_html => true) { |t| %(<%= "<p>Hello World!</p>" %>) }
+      assert_equal "<p>Hello World!</p>", template.render
+    end
+
+    test "using :escape_html => false option" do
+      template = Tilt::ErubisTemplate.new(nil, :escape_html => false) { |t| %(<%= "<p>Hello World!</p>" %>) }
+      assert_equal "<p>Hello World!</p>", template.render
+    end
+
+    test "erubis default does not escape html" do
+      template = Tilt::ErubisTemplate.new { |t| %(<%= "<p>Hello World!</p>" %>) }
+      assert_equal "<p>Hello World!</p>", template.render
+    end
+
+    test "does not modify options argument" do
+      options_hash = {:escape_html => true}
+      template = Tilt::ErubisTemplate.new(nil, options_hash) { |t| "Hello World!" }
+      assert_equal({:escape_html => true}, options_hash)
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::ErubisTemplate (disabled)"
+end
+
+__END__
+<html>
+<body>
+  <h1>Hey <%= name %>!</h1>
+
+
+  <p><% fail %></p>
+</body>
+</html>
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_etannitemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_etannitemplate_test.rb
new file mode 100644
index 0000000..32c81e8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_etannitemplate_test.rb
@@ -0,0 +1,173 @@
+require 'contest'
+require 'tilt'
+
+class EtanniTemplateTest < Test::Unit::TestCase
+  test "registered for '.etn' files" do
+    assert_equal Tilt::EtanniTemplate, Tilt['test.etn']
+  end
+
+  test "registered for '.etanni' files" do
+    assert_equal Tilt::EtanniTemplate, Tilt['test.etanni']
+  end
+
+  test "loading and evaluating templates on #render" do
+    template = Tilt::EtanniTemplate.new { |t| "Hello World!" }
+    assert_equal "Hello World!", template.render
+  end
+
+  test "can be rendered more than once" do
+    template = Tilt::EtanniTemplate.new { |t| "Hello World!" }
+    3.times { assert_equal "Hello World!", template.render }
+  end
+
+  test "passing locals" do
+    template = Tilt::EtanniTemplate.new { 'Hey #{name}!' }
+    assert_equal "Hey Joe!", template.render(Object.new, :name => 'Joe')
+  end
+
+  test "evaluating in an object scope" do
+    template = Tilt::EtanniTemplate.new { 'Hey #{@name}!' }
+    scope = Object.new
+    scope.instance_variable_set :@name, 'Joe'
+    assert_equal "Hey Joe!", template.render(scope)
+  end
+
+  test "passing a block for yield" do
+    template = Tilt::EtanniTemplate.new { 'Hey #{yield}!' }
+    assert_equal "Hey Joe!", template.render { 'Joe' }
+    assert_equal "Hey Moe!", template.render { 'Moe' }
+  end
+
+  test "multiline templates" do
+    template = Tilt::EtanniTemplate.new { "Hello\nWorld!\n" }
+    assert_equal "Hello\nWorld!", template.render
+  end
+
+  test "backtrace file and line reporting without locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::EtanniTemplate.new('test.etn', 11) { data }
+    begin
+      template.render
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of NameError, boom
+      line = boom.backtrace.grep(/^test\.etn:/).first
+      assert line, "Backtrace didn't contain test.etn"
+      file, line, meth = line.split(":")
+      assert_equal '13', line
+    end
+  end
+
+  test "backtrace file and line reporting with locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::EtanniTemplate.new('test.etn', 1) { data }
+    begin
+      template.render(nil, :name => 'Joe', :foo => 'bar')
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of RuntimeError, boom
+      line = boom.backtrace.first
+      file, line, meth = line.split(":")
+      assert_equal 'test.etn', file
+      assert_equal '6', line
+    end
+  end
+end
+
+
+class CompiledEtanniTemplateTest < Test::Unit::TestCase
+  def teardown
+    GC.start
+  end
+
+  class Scope
+  end
+
+  test "compiling template source to a method" do
+    template = Tilt::EtanniTemplate.new { |t| "Hello World!" }
+    template.render(Scope.new)
+    method = template.send(:compiled_method, [])
+    assert_kind_of UnboundMethod, method
+  end
+
+  test "loading and evaluating templates on #render" do
+    template = Tilt::EtanniTemplate.new { |t| "Hello World!" }
+    assert_equal "Hello World!", template.render(Scope.new)
+  end
+
+  test "passing locals" do
+    template = Tilt::EtanniTemplate.new { 'Hey #{name}!' }
+    assert_equal "Hey Joe!", template.render(Scope.new, :name => 'Joe')
+    assert_equal "Hey Moe!", template.render(Scope.new, :name => 'Moe')
+  end
+
+  test "evaluating in an object scope" do
+    template = Tilt::EtanniTemplate.new { 'Hey #{@name}!' }
+    scope = Scope.new
+    scope.instance_variable_set :@name, 'Joe'
+    assert_equal "Hey Joe!", template.render(scope)
+    scope.instance_variable_set :@name, 'Moe'
+    assert_equal "Hey Moe!", template.render(scope)
+  end
+
+  test "passing a block for yield" do
+    template = Tilt::EtanniTemplate.new { 'Hey #{yield}!' }
+    assert_equal "Hey Joe!", template.render(Scope.new) { 'Joe' }
+    assert_equal "Hey Moe!", template.render(Scope.new) { 'Moe' }
+  end
+
+  test "multiline templates" do
+    template = Tilt::EtanniTemplate.new { "Hello\nWorld!\n" }
+    assert_equal "Hello\nWorld!", template.render(Scope.new)
+  end
+
+  test "template with '}'" do
+    template = Tilt::EtanniTemplate.new { "Hello }" }
+    assert_equal "Hello }", template.render
+  end
+
+  test "backtrace file and line reporting without locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::EtanniTemplate.new('test.etn', 11) { data }
+    begin
+      template.render(Scope.new)
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of NameError, boom
+      line = boom.backtrace.first
+      line = boom.backtrace.grep(/^test\.etn:/).first
+      assert line, "Backtrace didn't contain test.etn"
+      file, line, meth = line.split(":")
+      assert_equal '13', line
+    end
+  end
+
+  test "backtrace file and line reporting with locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::EtanniTemplate.new('test.etn') { data }
+    begin
+      template.render(Scope.new, :name => 'Joe', :foo => 'bar')
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of RuntimeError, boom
+      line = boom.backtrace.first
+      file, line, meth = line.split(":")
+      assert_equal 'test.etn', file
+      assert_equal '6', line
+    end
+  end
+end
+
+__END__
+<html>
+<body>
+  <h1>Hey #{name}!</h1>
+
+
+  <p>#{fail}</p>
+</body>
+</html>
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_fallback_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_fallback_test.rb
new file mode 100644
index 0000000..067fae1
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_fallback_test.rb
@@ -0,0 +1,122 @@
+require 'contest'
+require 'tilt'
+
+class TiltFallbackTest < Test::Unit::TestCase
+  class FailTemplate  < Tilt::Template
+    def self.engine_initialized?; false end
+    def prepare;                        end
+
+    def initialize_engine
+      raise LoadError, "can't load #{self.class}"
+    end
+  end
+
+  class WinTemplate < Tilt::Template
+    def self.engine_initialized?; true end
+    def prepare;                       end
+  end
+
+  FailTemplate2 = Class.new(FailTemplate)
+  WinTemplate2  = Class.new(WinTemplate)
+
+  def set_ivar(obj, name, value)
+    obj.instance_variable_set("@#{name}", value)
+  end
+
+  def clear_ivar(obj, name)
+    ivar = "@#{name}"
+    value = obj.instance_variable_get(ivar)
+  ensure
+    obj.instance_variable_set(ivar, value.dup.clear)
+  end
+
+  setup do
+    # Make sure every test have no mappings.
+    @p = clear_ivar(Tilt, :preferred_mappings)
+    @t = clear_ivar(Tilt, :template_mappings)
+  end
+
+  teardown do
+    set_ivar(Tilt, :preferred_mappings, @p)
+    set_ivar(Tilt, :template_mappings, @t)
+  end
+
+  test "returns nil on unregistered extensions" do
+    template = Tilt["md"]
+    assert_equal nil, template
+  end
+
+  test "returns the last registered template" do
+    Tilt.register("md", WinTemplate)
+    Tilt.register("md", WinTemplate2)
+
+    template = Tilt["md"]
+    assert_equal WinTemplate2, template
+  end
+
+  test "returns the last registered working template" do
+    Tilt.register("md", WinTemplate)
+    Tilt.register("md", FailTemplate)
+
+    template = Tilt["md"]
+    assert_equal WinTemplate, template
+  end
+
+  test "if every template fails, raise the exception from the first template" do
+    Tilt.register("md", FailTemplate)
+    Tilt.register("md", FailTemplate2)
+
+    exc = assert_raise(LoadError) { Tilt["md"] }
+    assert_match /FailTemplate2/, exc.message
+  end
+
+  test ".prefer should also register the template" do
+    Tilt.prefer(WinTemplate, "md")
+    assert Tilt.registered?("md")
+  end
+
+  test ".prefer always win" do
+    Tilt.register("md", FailTemplate)
+    Tilt.register("md", WinTemplate)
+    Tilt.prefer(FailTemplate, "md")
+
+    template = Tilt["md"]
+    assert_equal FailTemplate, template
+  end
+
+  test ".prefer accepts multiple extensions" do
+    extensions = %w[md mkd markdown]
+    Tilt.prefer(FailTemplate, *extensions)
+
+    extensions.each do |ext|
+      template = Tilt[ext]
+      assert_equal FailTemplate, template
+    end
+  end
+
+  test ".prefer with no extension should use already registered extensions" do
+    extensions = %w[md mkd markdown]
+
+    extensions.each do |ext|
+      Tilt.register(ext, FailTemplate)
+      Tilt.register(ext, WinTemplate)
+    end
+
+    Tilt.prefer(FailTemplate)
+
+    extensions.each do |ext|
+      template = Tilt[ext]
+      assert_equal FailTemplate, template
+    end
+  end
+
+  test ".prefer should only override extensions the preferred library is registered for"  do
+    Tilt.register("md", WinTemplate)
+    Tilt.register("mkd", FailTemplate)
+    Tilt.register("mkd", WinTemplate)
+    Tilt.prefer(FailTemplate)
+    assert_equal FailTemplate, Tilt["mkd"]
+    assert_equal WinTemplate, Tilt["md"]
+  end
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_hamltemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_hamltemplate_test.rb
new file mode 100644
index 0000000..8466675
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_hamltemplate_test.rb
@@ -0,0 +1,144 @@
+require 'contest'
+require 'tilt'
+
+begin
+  class ::MockError < NameError
+  end
+
+  require 'haml'
+
+  class HamlTemplateTest < Test::Unit::TestCase
+    test "registered for '.haml' files" do
+      assert_equal Tilt::HamlTemplate, Tilt['test.haml']
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::HamlTemplate.new { |t| "%p Hello World!" }
+      assert_equal "<p>Hello World!</p>\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::HamlTemplate.new { |t| "%p Hello World!" }
+      3.times { assert_equal "<p>Hello World!</p>\n", template.render }
+    end
+
+    test "passing locals" do
+      template = Tilt::HamlTemplate.new { "%p= 'Hey ' + name + '!'" }
+      assert_equal "<p>Hey Joe!</p>\n", template.render(Object.new, :name => 'Joe')
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::HamlTemplate.new { "%p= 'Hey ' + @name + '!'" }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal "<p>Hey Joe!</p>\n", template.render(scope)
+    end
+
+    test "passing a block for yield" do
+      template = Tilt::HamlTemplate.new { "%p= 'Hey ' + yield + '!'" }
+      assert_equal "<p>Hey Joe!</p>\n", template.render { 'Joe' }
+    end
+
+    test "backtrace file and line reporting without locals" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      fail unless data[0] == ?%
+      template = Tilt::HamlTemplate.new('test.haml', 10) { data }
+      begin
+        template.render
+        fail 'should have raised an exception'
+      rescue => boom
+        assert_kind_of NameError, boom
+        line = boom.backtrace.grep(/^test\.haml:/).first
+        assert line, "Backtrace didn't contain test.haml"
+        file, line, meth = line.split(":")
+        assert_equal '12', line
+      end
+    end
+
+    test "backtrace file and line reporting with locals" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      fail unless data[0] == ?%
+      template = Tilt::HamlTemplate.new('test.haml') { data }
+      begin
+        res = template.render(Object.new, :name => 'Joe', :foo => 'bar')
+      rescue => boom
+        assert_kind_of MockError, boom
+        line = boom.backtrace.first
+        file, line, meth = line.split(":")
+        assert_equal 'test.haml', file
+        assert_equal '5', line
+      end
+    end
+  end
+
+  class CompiledHamlTemplateTest < Test::Unit::TestCase
+    class Scope
+    end
+
+    test "compiling template source to a method" do
+      template = Tilt::HamlTemplate.new { |t| "Hello World!" }
+      template.render(Scope.new)
+      method = template.send(:compiled_method, [])
+      assert_kind_of UnboundMethod, method
+    end
+
+    test "passing locals" do
+      template = Tilt::HamlTemplate.new { "%p= 'Hey ' + name + '!'" }
+      assert_equal "<p>Hey Joe!</p>\n", template.render(Scope.new, :name => 'Joe')
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::HamlTemplate.new { "%p= 'Hey ' + @name + '!'" }
+      scope = Scope.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal "<p>Hey Joe!</p>\n", template.render(scope)
+    end
+
+    test "passing a block for yield" do
+      template = Tilt::HamlTemplate.new { "%p= 'Hey ' + yield + '!'" }
+      assert_equal "<p>Hey Joe!</p>\n", template.render(Scope.new) { 'Joe' }
+    end
+
+    test "backtrace file and line reporting without locals" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      fail unless data[0] == ?%
+      template = Tilt::HamlTemplate.new('test.haml', 10) { data }
+      begin
+        template.render(Scope.new)
+        fail 'should have raised an exception'
+      rescue => boom
+        assert_kind_of NameError, boom
+        line = boom.backtrace.grep(/^test\.haml:/).first
+        assert line, "Backtrace didn't contain test.haml"
+        file, line, meth = line.split(":")
+        assert_equal '12', line
+      end
+    end
+
+    test "backtrace file and line reporting with locals" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      fail unless data[0] == ?%
+      template = Tilt::HamlTemplate.new('test.haml') { data }
+      begin
+        res = template.render(Scope.new, :name => 'Joe', :foo => 'bar')
+      rescue => boom
+        assert_kind_of MockError, boom
+        line = boom.backtrace.first
+        file, line, meth = line.split(":")
+        assert_equal 'test.haml', file
+        assert_equal '5', line
+      end
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::HamlTemplate (disabled)"
+end
+
+__END__
+%html
+  %body
+    %h1= "Hey #{name}"
+
+    = raise MockError
+
+    %p we never get here
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_kramdown_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_kramdown_test.rb
new file mode 100644
index 0000000..c031709
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_kramdown_test.rb
@@ -0,0 +1,42 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'kramdown'
+
+  class MarukuTemplateTest < Test::Unit::TestCase
+    test "registered for '.md' files" do
+      assert Tilt.mappings['md'].include?(Tilt::KramdownTemplate)
+    end
+
+    test "registered for '.mkd' files" do
+      assert Tilt.mappings['mkd'].include?(Tilt::KramdownTemplate)
+    end
+
+    test "registered for '.markdown' files" do
+      assert Tilt.mappings['markdown'].include?(Tilt::KramdownTemplate)
+    end
+
+    test "registered above MarukuTemplate" do
+      %w[md mkd markdown].each do |ext|
+        mappings = Tilt.mappings[ext]
+        kram_idx = mappings.index(Tilt::KramdownTemplate)
+        maru_idx = mappings.index(Tilt::MarukuTemplate)
+        assert kram_idx < maru_idx,
+          "#{kram_idx} should be lower than #{maru_idx}"
+      end
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::KramdownTemplate.new { |t| "# Hello World!" }
+      assert_equal "<h1 id='hello_world'>Hello World!</h1>", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::KramdownTemplate.new { |t| "# Hello World!" }
+      3.times { assert_equal "<h1 id='hello_world'>Hello World!</h1>", template.render }
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::KramdownTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_lesstemplate_test.less b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_lesstemplate_test.less
new file mode 100644
index 0000000..3e1dafa
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_lesstemplate_test.less
@@ -0,0 +1 @@
+ at text-color: #ffc0cb;
\ No newline at end of file
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_lesstemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_lesstemplate_test.rb
new file mode 100644
index 0000000..9b9a3e8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_lesstemplate_test.rb
@@ -0,0 +1,42 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'pathname'
+  require 'less'
+
+  class LessTemplateTest < Test::Unit::TestCase
+    def assert_similar(a, b)
+      assert_equal a.gsub(/\s+/m, ' '), b.gsub(/\s+/m, ' ')
+    end
+
+    test "is registered for '.less' files" do
+      assert_equal Tilt::LessTemplate, Tilt['test.less']
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::LessTemplate.new { |t| ".bg { background-color: #0000ff; } \n#main\n { .bg; }\n" }
+      assert_similar ".bg {\n  background-color: #0000ff;\n}\n#main {\n  background-color: #0000ff;\n}\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::LessTemplate.new { |t| ".bg { background-color: #0000ff; } \n#main\n { .bg; }\n" }
+      3.times { assert_similar ".bg {\n  background-color: #0000ff;\n}\n#main {\n  background-color: #0000ff;\n}\n", template.render }
+    end
+
+    test "can be passed a load path" do
+      template = Tilt::LessTemplate.new({
+        :paths => [Pathname(__FILE__).dirname]
+      }) {
+        <<-EOLESS
+        @import 'tilt_lesstemplate_test.less';
+        .bg {background-color: @text-color;}
+        EOLESS
+      }
+      assert_similar ".bg {\n  background-color: #ffc0cb;\n}\n", template.render
+    end
+  end
+
+rescue LoadError => boom
+  warn "Tilt::LessTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_liquidtemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_liquidtemplate_test.rb
new file mode 100644
index 0000000..13db928
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_liquidtemplate_test.rb
@@ -0,0 +1,78 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'liquid'
+
+  class LiquidTemplateTest < Test::Unit::TestCase
+    test "registered for '.liquid' files" do
+      assert_equal Tilt::LiquidTemplate, Tilt['test.liquid']
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::LiquidTemplate.new { |t| "Hello World!" }
+      assert_equal "Hello World!", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::LiquidTemplate.new { |t| "Hello World!" }
+      3.times { assert_equal "Hello World!", template.render }
+    end
+
+    test "passing locals" do
+      template = Tilt::LiquidTemplate.new { "Hey {{ name }}!" }
+      assert_equal "Hey Joe!", template.render(nil, :name => 'Joe')
+    end
+
+    # Object's passed as "scope" to LiquidTemplate may respond to
+    # #to_h with a Hash. The Hash's contents are merged underneath
+    # Tilt locals.
+    class ExampleLiquidScope
+      def to_h
+        { :beer => 'wet', :whisky => 'wetter' }
+      end
+    end
+
+    test "combining scope and locals when scope responds to #to_h" do
+      template =
+        Tilt::LiquidTemplate.new {
+          'Beer is {{ beer }} but Whisky is {{ whisky }}.'
+        }
+      scope = ExampleLiquidScope.new
+      assert_equal "Beer is wet but Whisky is wetter.", template.render(scope)
+    end
+
+    test "precedence when locals and scope define same variables" do
+      template =
+        Tilt::LiquidTemplate.new {
+          'Beer is {{ beer }} but Whisky is {{ whisky }}.'
+        }
+      scope = ExampleLiquidScope.new
+      assert_equal "Beer is great but Whisky is greater.",
+        template.render(scope, :beer => 'great', :whisky => 'greater')
+    end
+
+    # Object's passed as "scope" to LiquidTemplate that do not
+    # respond to #to_h are silently ignored.
+    class ExampleIgnoredLiquidScope
+    end
+
+    test "handling scopes that do not respond to #to_h" do
+      template = Tilt::LiquidTemplate.new { 'Whisky' }
+      scope = ExampleIgnoredLiquidScope.new
+      assert_equal "Whisky", template.render(scope)
+    end
+
+    test "passing a block for yield" do
+      template =
+        Tilt::LiquidTemplate.new {
+          'Beer is {{ yield }} but Whisky is {{ content }}ter.'
+        }
+      assert_equal "Beer is wet but Whisky is wetter.",
+        template.render({}) { 'wet' }
+    end
+  end
+
+rescue LoadError => boom
+  warn "Tilt::LiquidTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_markaby_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_markaby_test.rb
new file mode 100644
index 0000000..392abac
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_markaby_test.rb
@@ -0,0 +1,88 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'markaby'
+
+  class MarkabyTiltTest <  Test::Unit::TestCase
+    def setup
+      @block = lambda do |t|
+        File.read(File.dirname(__FILE__) + "/#{t.file}")
+      end
+    end
+
+    test "should be able to render a markaby template with static html" do
+      tilt = Tilt::MarkabyTemplate.new("markaby/markaby.mab", &@block)
+      assert_equal "hello from markaby!", tilt.render
+    end
+
+    test "should use the contents of the template" do
+      tilt = ::Tilt::MarkabyTemplate.new("markaby/markaby_other_static.mab", &@block)
+      assert_equal "_why?", tilt.render
+    end
+
+    test "should render from a string (given as data)" do
+      tilt = ::Tilt::MarkabyTemplate.new { "html do; end" }
+      assert_equal "<html></html>", tilt.render
+    end
+
+    test "can be rendered more than once" do
+      tilt = ::Tilt::MarkabyTemplate.new { "html do; end" }
+      3.times { assert_equal "<html></html>", tilt.render }
+    end
+
+    test "should evaluate a template file in the scope given" do
+      scope = Object.new
+      def scope.foo
+        "bar"
+      end
+
+      tilt = ::Tilt::MarkabyTemplate.new("markaby/scope.mab", &@block)
+      assert_equal "<li>bar</li>", tilt.render(scope)
+    end
+
+    test "should pass locals to the template" do
+      tilt = ::Tilt::MarkabyTemplate.new("markaby/locals.mab", &@block)
+      assert_equal "<li>bar</li>", tilt.render(Object.new, { :foo => "bar" })
+    end
+
+    test "should yield to the block given" do
+      tilt = ::Tilt::MarkabyTemplate.new("markaby/yielding.mab", &@block)
+      eval_scope = Markaby::Builder.new
+
+      output = tilt.render(Object.new, {}) do
+        text("Joe")
+      end
+
+      assert_equal "Hey Joe", output
+    end
+
+    test "should be able to render two templates in a row" do
+      tilt = ::Tilt::MarkabyTemplate.new("markaby/render_twice.mab", &@block)
+
+      assert_equal "foo", tilt.render
+      assert_equal "foo", tilt.render
+    end
+
+    test "should retrieve a Tilt::MarkabyTemplate when calling Tilt['hello.mab']" do
+      assert_equal Tilt::MarkabyTemplate, ::Tilt['./markaby/markaby.mab']
+    end
+
+    test "should return a new instance of the implementation class (when calling Tilt.new)" do
+      assert ::Tilt.new(File.dirname(__FILE__) + "/markaby/markaby.mab").kind_of?(Tilt::MarkabyTemplate)
+    end
+
+    test "should be able to evaluate block style templates" do
+      tilt = Tilt::MarkabyTemplate.new { |t| lambda { h1 "Hello World!" }}
+      assert_equal "<h1>Hello World!</h1>", tilt.render
+    end
+
+    test "should pass locals to block style templates" do
+      tilt = Tilt::MarkabyTemplate.new { |t| lambda { h1 "Hello #{name}!" }}
+      assert_equal "<h1>Hello _why!</h1>", tilt.render(nil, :name => "_why")
+    end
+  end
+
+rescue LoadError => boom
+  warn "Tilt::MarkabyTemplate (disabled)"
+end
\ No newline at end of file
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_markdown_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_markdown_test.rb
new file mode 100644
index 0000000..9e864a7
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_markdown_test.rb
@@ -0,0 +1,172 @@
+# coding: UTF-8
+require 'tilt'
+
+begin
+require 'nokogiri'
+
+module MarkdownTests
+  def self.included(mod)
+    class << mod
+      def template(t = nil)
+        t.nil? ? @template : @template = t
+      end
+    end
+  end
+
+  def render(text, options = {})
+    self.class.template.new(options) { text }.render
+  end
+
+  def normalize(html)
+    Nokogiri::HTML.fragment(html).to_s.strip
+  end
+
+  def nrender(text, options = {})
+    html = render(text, options)
+    html.encode!("UTF-8") if html.respond_to?(:encode)
+    normalize(html)
+  end
+
+  def test_escape_html
+    html = nrender "Hello <b>World</b>"
+    assert_equal "<p>Hello <b>World</b></p>", html
+  end
+
+  def test_escape_html_false
+    html = nrender "Hello <b>World</b>", :escape_html => false
+    assert_equal "<p>Hello <b>World</b></p>", html
+  end
+
+  def test_escape_html_true
+    if self.class.template == Tilt::RedcarpetTemplate
+      flunk "redcarpet doesn't support :escape_html yet"
+    end
+    html = nrender "Hello <b>World</b>", :escape_html => true
+    assert_equal "<p>Hello <b>World</b></p>", html
+  end
+
+  def test_smart_quotes
+    html = nrender 'Hello "World"'
+    assert_equal '<p>Hello "World"</p>', html
+  end
+
+  def test_smart_quotes_false
+    html = nrender 'Hello "World"', :smartypants => false
+    assert_equal '<p>Hello "World"</p>', html
+  end
+
+  def test_smart_quotes_true
+    html = nrender 'Hello "World"', :smartypants => true
+    assert_equal '<p>Hello “World”</p>', html
+  end
+
+  def test_smarty_pants
+    html = nrender "Hello ``World'' -- This is --- a test ..."
+    assert_equal "<p>Hello ``World'' -- This is --- a test ...</p>", html
+  end
+
+  def test_smarty_pants_false
+    html = nrender "Hello ``World'' -- This is --- a test ...", :smartypants => false
+    assert_equal "<p>Hello ``World'' -- This is --- a test ...</p>", html
+  end
+
+  def test_smarty_pants_true
+    html = nrender "Hello ``World'' -- This is --- a test ...", :smartypants => true
+    assert_equal "<p>Hello “World” — This is —– a test …</p>", html
+  end
+end
+
+begin
+  require 'rdiscount'
+
+  class MarkdownRDiscountTest < Test::Unit::TestCase
+    include MarkdownTests
+    template Tilt::RDiscountTemplate
+  end
+rescue LoadError => boom
+  # It should already be warned in the main tests
+end
+
+begin
+  require 'redcarpet'
+
+  class MarkdownRedcarpetTest < Test::Unit::TestCase
+    include MarkdownTests
+    template Tilt::RedcarpetTemplate
+    # Doesn't support escaping
+    undef test_escape_html_true
+
+    def test_smarty_pants_true
+      html = nrender "Hello ``World'' -- This is --- a test ...", :smartypants => true
+      assert_equal "<p>Hello “World'' – This is — a test …</p>", html
+    end
+
+    def test_fenced_code_blocks_with_lang
+      code = <<-COD.gsub(/^\s+/,"")
+      ```ruby
+      puts "hello world"
+      ```
+      COD
+
+      html = nrender code, :fenced_code_blocks => true
+      assert_equal %Q{<pre><code class="ruby">puts "hello world"\n</code></pre>}, html
+    end
+  end
+rescue LoadError => boom
+  # It should already be warned in the main tests
+end
+
+begin
+  require 'bluecloth'
+
+  class MarkdownBlueClothTest < Test::Unit::TestCase
+    include MarkdownTests
+    template Tilt::BlueClothTemplate
+  end
+rescue LoadError => boom
+  # It should already be warned in the main tests
+end
+
+begin
+  require 'kramdown'
+
+  class MarkdownKramdownTest < Test::Unit::TestCase
+    include MarkdownTests
+    template Tilt::KramdownTemplate
+    # Doesn't support escaping
+    undef test_escape_html_true
+    # Smarty Pants is *always* on, but doesn't support it fully
+    undef test_smarty_pants
+    undef test_smarty_pants_false
+    undef test_smarty_pants_true
+  end
+rescue LoadError => boom
+  # It should already be warned in the main tests
+end
+
+
+begin
+  require 'maruku'
+
+  class MarkdownMarukuTest < Test::Unit::TestCase
+    include MarkdownTests
+    template Tilt::MarukuTemplate
+    # Doesn't support escaping
+    undef test_escape_html_true
+    # Doesn't support Smarty Pants, and even fails on ``Foobar''
+    undef test_smarty_pants
+    undef test_smarty_pants_false
+    undef test_smarty_pants_true
+    # Smart Quotes is always on
+    undef test_smart_quotes
+    undef test_smart_quotes_false
+  end
+rescue LoadError => boom
+  # It should already be warned in the main tests
+end
+
+rescue LoadError
+  warn "Markdown tests need Nokogiri"
+end
+
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_marukutemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_marukutemplate_test.rb
new file mode 100644
index 0000000..1be67db
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_marukutemplate_test.rb
@@ -0,0 +1,48 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'maruku'
+
+  class MarukuTemplateTest < Test::Unit::TestCase
+    test "registered for '.md' files" do
+      assert Tilt.mappings['md'].include?(Tilt::MarukuTemplate)
+    end
+
+    test "registered for '.mkd' files" do
+      assert Tilt.mappings['mkd'].include?(Tilt::MarukuTemplate)
+    end
+
+    test "registered for '.markdown' files" do
+      assert Tilt.mappings['markdown'].include?(Tilt::MarukuTemplate)
+    end
+
+    test "registered below Kramdown" do
+      %w[md mkd markdown].each do |ext|
+        mappings = Tilt.mappings[ext]
+        kram_idx = mappings.index(Tilt::KramdownTemplate)
+        maru_idx = mappings.index(Tilt::MarukuTemplate)
+        assert maru_idx > kram_idx,
+          "#{maru_idx} should be higher than #{kram_idx}"
+      end
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::MarukuTemplate.new { |t| "# Hello World!" }
+      assert_equal "<h1 id='hello_world'>Hello World!</h1>", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::MarukuTemplate.new { |t| "# Hello World!" }
+      3.times { assert_equal "<h1 id='hello_world'>Hello World!</h1>", template.render }
+    end
+
+    test "removes HTML when :filter_html is set" do
+      template = Tilt::MarukuTemplate.new(:filter_html => true) { |t|
+        "HELLO <blink>WORLD</blink>" }
+      assert_equal "<p>HELLO </p>", template.render
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::MarukuTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_nokogiritemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_nokogiritemplate_test.rb
new file mode 100644
index 0000000..22225e8
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_nokogiritemplate_test.rb
@@ -0,0 +1,87 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'nokogiri'
+  class NokogiriTemplateTest < Test::Unit::TestCase
+    test "registered for '.nokogiri' files" do
+      assert_equal Tilt::NokogiriTemplate, Tilt['test.nokogiri']
+      assert_equal Tilt::NokogiriTemplate, Tilt['test.xml.nokogiri']
+    end
+
+    test "preparing and evaluating the template on #render" do
+      template = Tilt::NokogiriTemplate.new { |t| "xml.em 'Hello World!'" }
+      doc = Nokogiri.XML template.render
+      assert_equal 'Hello World!', doc.root.text
+      assert_equal 'em', doc.root.name
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::NokogiriTemplate.new { |t| "xml.em 'Hello World!'" }
+      3.times do
+        doc = Nokogiri.XML template.render
+        assert_equal 'Hello World!', doc.root.text
+        assert_equal 'em', doc.root.name
+      end
+    end
+
+    test "passing locals" do
+      template = Tilt::NokogiriTemplate.new { "xml.em('Hey ' + name + '!')" }
+      doc = Nokogiri.XML template.render(Object.new, :name => 'Joe')
+      assert_equal 'Hey Joe!', doc.root.text
+      assert_equal 'em', doc.root.name
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::NokogiriTemplate.new { "xml.em('Hey ' + @name + '!')" }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      doc = Nokogiri.XML template.render(scope)
+      assert_equal 'Hey Joe!', doc.root.text
+      assert_equal 'em', doc.root.name
+    end
+
+    test "passing a block for yield" do
+      template = Tilt::NokogiriTemplate.new { "xml.em('Hey ' + yield + '!')" }
+      3.times do
+        doc = Nokogiri.XML template.render { 'Joe' }
+        assert_equal 'Hey Joe!', doc.root.text
+        assert_equal 'em', doc.root.name
+      end
+    end
+
+    test "block style templates" do
+      template =
+        Tilt::NokogiriTemplate.new do |t|
+          lambda { |xml| xml.em('Hey Joe!') }
+        end
+      doc = Nokogiri.XML template.render
+      assert_equal 'Hey Joe!', doc.root.text
+      assert_equal 'em', doc.root.name
+    end
+
+    test "allows nesting raw XML, API-compatible to Builder" do
+      subtemplate = Tilt::NokogiriTemplate.new { "xml.em 'Hello World!'" }
+      template = Tilt::NokogiriTemplate.new { "xml.strong { xml << yield }" }
+      3.times do
+        options = { :xml => Nokogiri::XML::Builder.new }
+        doc = Nokogiri.XML(template.render(options) { subtemplate.render(options) })
+        assert_equal 'Hello World!', doc.root.text.strip
+        assert_equal 'strong', doc.root.name
+      end
+    end
+
+    test "doesn't modify self when template is a string" do
+      template = Tilt::NokogiriTemplate.new { "xml.root { xml.child @hello }" }
+      scope = Object.new
+      scope.instance_variable_set(:@hello, "Hello World!")
+
+      3.times do
+        doc = Nokogiri.XML(template.render(scope))
+        assert_equal "Hello World!", doc.text.strip
+      end
+    end
+  end
+rescue LoadError
+  warn "Tilt::NokogiriTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_radiustemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_radiustemplate_test.rb
new file mode 100644
index 0000000..1db5b4b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_radiustemplate_test.rb
@@ -0,0 +1,75 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'radius'
+
+  # Disable radius tests under Ruby versions >= 1.9.1 since it's still buggy.
+  # Remove when fixed upstream.
+  raise LoadError if RUBY_VERSION >= "1.9.1" and Radius.version < "0.7"
+
+  class RadiusTemplateTest < Test::Unit::TestCase
+    test "registered for '.radius' files" do
+      assert_equal Tilt::RadiusTemplate, Tilt['test.radius']
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::RadiusTemplate.new { |t| "Hello World!" }
+      assert_equal "Hello World!", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::RadiusTemplate.new { |t| "Hello World!" }
+      3.times { assert_equal "Hello World!", template.render }
+    end
+
+    test "passing locals" do
+      template = Tilt::RadiusTemplate.new { "Hey <r:name />!" }
+      assert_equal "Hey Joe!", template.render(nil, :name => 'Joe')
+    end
+
+    class ExampleRadiusScope
+      def beer; 'wet'; end
+      def whisky; 'wetter'; end
+    end
+
+    test "combining scope and locals when scope responds" do
+      template = Tilt::RadiusTemplate.new {
+        'Beer is <r:beer /> but Whisky is <r:whisky />.'
+      }
+      scope = ExampleRadiusScope.new
+      assert_equal "Beer is wet but Whisky is wetter.", template.render(scope)
+    end
+
+    test "precedence when locals and scope define same variables" do
+      template = Tilt::RadiusTemplate.new {
+        'Beer is <r:beer /> but Whisky is <r:whisky />.'
+      }
+      scope = ExampleRadiusScope.new
+      assert_equal "Beer is great but Whisky is greater.",
+        template.render(scope, :beer => 'great', :whisky => 'greater')
+    end
+
+    #test "handles local scope" do
+    #  beer   = 'wet'
+    #  whisky = 'wetter'
+    #
+    #  template = Tilt::RadiusTemplate.new {
+    #    'Beer is <r:beer /> but Whisky is <r:whisky />.'
+    #  }
+    #  assert_equal "Beer is wet but Whisky is wetter.", template.render(self)
+    #end
+
+    test "passing a block for yield" do
+      template = Tilt::RadiusTemplate.new {
+        'Beer is <r:yield /> but Whisky is <r:yield />ter.'
+      }
+      assert_equal "Beer is wet but Whisky is wetter.",
+        template.render({}) { 'wet' }
+    end
+  end
+
+rescue LoadError => boom
+  warn "Tilt::RadiusTemplate (disabled)"
+end
+
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_rdiscounttemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_rdiscounttemplate_test.rb
new file mode 100644
index 0000000..35ccbaf
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_rdiscounttemplate_test.rb
@@ -0,0 +1,55 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'rdiscount'
+
+  class RDiscountTemplateTest < Test::Unit::TestCase
+    test "registered for '.md' files" do
+      assert Tilt.mappings['md'].include?(Tilt::RDiscountTemplate)
+    end
+
+    test "registered for '.mkd' files" do
+      assert Tilt.mappings['mkd'].include?(Tilt::RDiscountTemplate)
+    end
+
+    test "registered for '.markdown' files" do
+      assert Tilt.mappings['markdown'].include?(Tilt::RDiscountTemplate)
+    end
+
+    test "registered above BlueCloth" do
+      %w[md mkd markdown].each do |ext|
+        mappings = Tilt.mappings[ext]
+        blue_idx = mappings.index(Tilt::BlueClothTemplate)
+        rdis_idx = mappings.index(Tilt::RDiscountTemplate)
+        assert rdis_idx < blue_idx,
+          "#{rdis_idx} should be lower than #{blue_idx}"
+      end
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::RDiscountTemplate.new { |t| "# Hello World!" }
+      assert_equal "<h1>Hello World!</h1>\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::RDiscountTemplate.new { |t| "# Hello World!" }
+      3.times { assert_equal "<h1>Hello World!</h1>\n", template.render }
+    end
+
+    test "smartypants when :smart is set" do
+      template = Tilt::RDiscountTemplate.new(:smart => true) { |t|
+        "OKAY -- 'Smarty Pants'" }
+      assert_equal "<p>OKAY — ‘Smarty Pants’</p>\n",
+        template.render
+    end
+
+    test "stripping HTML when :filter_html is set" do
+      template = Tilt::RDiscountTemplate.new(:filter_html => true) { |t|
+        "HELLO <blink>WORLD</blink>" }
+      assert_equal "<p>HELLO <blink>WORLD</blink></p>\n", template.render
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::RDiscountTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_rdoctemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_rdoctemplate_test.rb
new file mode 100644
index 0000000..5a729ea
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_rdoctemplate_test.rb
@@ -0,0 +1,31 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'rdoc'
+  require 'rdoc/markup'
+  require 'rdoc/markup/to_html'
+  class RDocTemplateTest < Test::Unit::TestCase
+    test "is registered for '.rdoc' files" do
+      assert_equal Tilt::RDocTemplate, Tilt['test.rdoc']
+    end
+
+    test "preparing and evaluating the template with #render" do
+      template = Tilt::RDocTemplate.new { |t| "= Hello World!" }
+      result = template.render.strip
+      assert_match /<h1/, result
+      assert_match />Hello World!</, result
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::RDocTemplate.new { |t| "= Hello World!" }
+      3.times do
+        result = template.render.strip
+        assert_match /<h1/, result
+        assert_match />Hello World!</, result
+      end
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::RDocTemplate (disabled) [#{boom}]"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_redcarpettemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_redcarpettemplate_test.rb
new file mode 100644
index 0000000..f675b47
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_redcarpettemplate_test.rb
@@ -0,0 +1,71 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'redcarpet'
+
+  class RedcarpetTemplateTest < Test::Unit::TestCase
+    test "registered for '.md' files" do
+      assert Tilt.mappings['md'].include?(Tilt::RedcarpetTemplate)
+    end
+
+    test "registered for '.mkd' files" do
+      assert Tilt.mappings['mkd'].include?(Tilt::RedcarpetTemplate)
+    end
+
+    test "registered for '.markdown' files" do
+      assert Tilt.mappings['markdown'].include?(Tilt::RedcarpetTemplate)
+    end
+
+    test "registered above BlueCloth" do
+      %w[md mkd markdown].each do |ext|
+        mappings = Tilt.mappings[ext]
+        blue_idx = mappings.index(Tilt::BlueClothTemplate)
+        redc_idx = mappings.index(Tilt::RedcarpetTemplate)
+        assert redc_idx < blue_idx,
+          "#{redc_idx} should be lower than #{blue_idx}"
+      end
+    end
+
+    test "registered above RDiscount" do
+      %w[md mkd markdown].each do |ext|
+        mappings = Tilt.mappings[ext]
+        rdis_idx = mappings.index(Tilt::RDiscountTemplate)
+        redc_idx = mappings.index(Tilt::RedcarpetTemplate)
+        assert redc_idx < rdis_idx,
+          "#{redc_idx} should be lower than #{rdis_idx}"
+      end
+    end
+
+    test "redcarpet2 is our default choice" do
+      template = Tilt::RedcarpetTemplate.new {}
+      assert_equal Tilt::RedcarpetTemplate::Redcarpet2, template.prepare.class
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::RedcarpetTemplate.new { |t| "# Hello World!" }
+      assert_equal "<h1>Hello World!</h1>\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::RedcarpetTemplate.new { |t| "# Hello World!" }
+      3.times { assert_equal "<h1>Hello World!</h1>\n", template.render }
+    end
+
+    test "smartypants when :smart is set" do
+      template = Tilt::RedcarpetTemplate.new(:smartypants => true) { |t|
+        "OKAY -- 'Smarty Pants'" }
+      assert_match /<p>OKAY – 'Smarty Pants'<\/p>/,
+        template.render
+    end
+
+    test "smartypants with a rendererer instance" do
+      template = Tilt::RedcarpetTemplate.new(:renderer => Redcarpet::Render::HTML.new(:hard_wrap => true), :smartypants => true) { |t|
+        "OKAY -- 'Smarty Pants'" }
+      assert_match /<p>OKAY – 'Smarty Pants'<\/p>/,
+        template.render
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::RedcarpetTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_redclothtemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_redclothtemplate_test.rb
new file mode 100644
index 0000000..2d94a4c
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_redclothtemplate_test.rb
@@ -0,0 +1,36 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'redcloth'
+
+  class RedClothTemplateTest < Test::Unit::TestCase
+    test "is registered for '.textile' files" do
+      assert_equal Tilt::RedClothTemplate, Tilt['test.textile']
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::RedClothTemplate.new { |t| "h1. Hello World!" }
+      assert_equal "<h1>Hello World!</h1>", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::RedClothTemplate.new { |t| "h1. Hello World!" }
+      3.times { assert_equal "<h1>Hello World!</h1>", template.render }
+    end
+
+    test "ignores unknown options" do
+      template = Tilt::RedClothTemplate.new(:foo => "bar") { |t| "h1. Hello World!" }
+      3.times { assert_equal "<h1>Hello World!</h1>", template.render }
+    end
+
+    test "passes in RedCloth options" do
+      template = Tilt::RedClothTemplate.new { |t| "Hard breaks are\ninserted by default." }
+      assert_equal "<p>Hard breaks are<br />\ninserted by default.</p>", template.render
+      template = Tilt::RedClothTemplate.new(:hard_breaks => false) { |t| "But they can be\nturned off." }
+      assert_equal "<p>But they can be\nturned off.</p>", template.render
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::RedClothTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_sasstemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_sasstemplate_test.rb
new file mode 100644
index 0000000..be822af
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_sasstemplate_test.rb
@@ -0,0 +1,41 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'sass'
+
+  class SassTemplateTest < Test::Unit::TestCase
+    test "is registered for '.sass' files" do
+      assert_equal Tilt::SassTemplate, Tilt['test.sass']
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::SassTemplate.new { |t| "#main\n  :background-color #0000f1" }
+      assert_equal "#main {\n  background-color: #0000f1; }\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::SassTemplate.new { |t| "#main\n  :background-color #0000f1" }
+      3.times { assert_equal "#main {\n  background-color: #0000f1; }\n", template.render }
+    end
+  end
+
+  class ScssTemplateTest < Test::Unit::TestCase
+    test "is registered for '.scss' files" do
+      assert_equal Tilt::ScssTemplate, Tilt['test.scss']
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::ScssTemplate.new { |t| "#main {\n  background-color: #0000f1;\n}" }
+      assert_equal "#main {\n  background-color: #0000f1; }\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::ScssTemplate.new { |t| "#main {\n  background-color: #0000f1;\n}" }
+      3.times { assert_equal "#main {\n  background-color: #0000f1; }\n", template.render }
+    end
+  end
+
+rescue LoadError => boom
+  warn "Tilt::SassTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_stringtemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_stringtemplate_test.rb
new file mode 100644
index 0000000..f0a8919
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_stringtemplate_test.rb
@@ -0,0 +1,170 @@
+require 'contest'
+require 'tilt'
+
+class StringTemplateTest < Test::Unit::TestCase
+  test "registered for '.str' files" do
+    assert_equal Tilt::StringTemplate, Tilt['test.str']
+  end
+
+  test "loading and evaluating templates on #render" do
+    template = Tilt::StringTemplate.new { |t| "Hello World!" }
+    assert_equal "Hello World!", template.render
+  end
+
+  test "can be rendered more than once" do
+    template = Tilt::StringTemplate.new { |t| "Hello World!" }
+    3.times { assert_equal "Hello World!", template.render }
+  end
+
+  test "passing locals" do
+    template = Tilt::StringTemplate.new { 'Hey #{name}!' }
+    assert_equal "Hey Joe!", template.render(Object.new, :name => 'Joe')
+  end
+
+  test "evaluating in an object scope" do
+    template = Tilt::StringTemplate.new { 'Hey #{@name}!' }
+    scope = Object.new
+    scope.instance_variable_set :@name, 'Joe'
+    assert_equal "Hey Joe!", template.render(scope)
+  end
+
+  test "passing a block for yield" do
+    template = Tilt::StringTemplate.new { 'Hey #{yield}!' }
+    assert_equal "Hey Joe!", template.render { 'Joe' }
+    assert_equal "Hey Moe!", template.render { 'Moe' }
+  end
+
+  test "multiline templates" do
+    template = Tilt::StringTemplate.new { "Hello\nWorld!\n" }
+    assert_equal "Hello\nWorld!\n", template.render
+  end
+
+  test "backtrace file and line reporting without locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::StringTemplate.new('test.str', 11) { data }
+    begin
+      template.render
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of NameError, boom
+      line = boom.backtrace.grep(/^test\.str:/).first
+      assert line, "Backtrace didn't contain test.str"
+      file, line, meth = line.split(":")
+      assert_equal '13', line
+    end
+  end
+
+  test "backtrace file and line reporting with locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::StringTemplate.new('test.str', 1) { data }
+    begin
+      template.render(nil, :name => 'Joe', :foo => 'bar')
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of RuntimeError, boom
+      line = boom.backtrace.first
+      file, line, meth = line.split(":")
+      assert_equal 'test.str', file
+      assert_equal '6', line
+    end
+  end
+end
+
+
+class CompiledStringTemplateTest < Test::Unit::TestCase
+  def teardown
+    GC.start
+  end
+
+  class Scope
+  end
+
+  test "compiling template source to a method" do
+    template = Tilt::StringTemplate.new { |t| "Hello World!" }
+    template.render(Scope.new)
+    method = template.send(:compiled_method, [])
+    assert_kind_of UnboundMethod, method
+  end
+
+  test "loading and evaluating templates on #render" do
+    template = Tilt::StringTemplate.new { |t| "Hello World!" }
+    assert_equal "Hello World!", template.render(Scope.new)
+  end
+
+  test "passing locals" do
+    template = Tilt::StringTemplate.new { 'Hey #{name}!' }
+    assert_equal "Hey Joe!", template.render(Scope.new, :name => 'Joe')
+    assert_equal "Hey Moe!", template.render(Scope.new, :name => 'Moe')
+  end
+
+  test "evaluating in an object scope" do
+    template = Tilt::StringTemplate.new { 'Hey #{@name}!' }
+    scope = Scope.new
+    scope.instance_variable_set :@name, 'Joe'
+    assert_equal "Hey Joe!", template.render(scope)
+    scope.instance_variable_set :@name, 'Moe'
+    assert_equal "Hey Moe!", template.render(scope)
+  end
+
+  test "passing a block for yield" do
+    template = Tilt::StringTemplate.new { 'Hey #{yield}!' }
+    assert_equal "Hey Joe!", template.render(Scope.new) { 'Joe' }
+    assert_equal "Hey Moe!", template.render(Scope.new) { 'Moe' }
+  end
+
+  test "multiline templates" do
+    template = Tilt::StringTemplate.new { "Hello\nWorld!\n" }
+    assert_equal "Hello\nWorld!\n", template.render(Scope.new)
+  end
+
+
+  test "template with '}'" do
+    template = Tilt::StringTemplate.new { "Hello }" }
+    assert_equal "Hello }", template.render
+  end
+
+  test "backtrace file and line reporting without locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::StringTemplate.new('test.str', 11) { data }
+    begin
+      template.render(Scope.new)
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of NameError, boom
+      line = boom.backtrace.first
+      line = boom.backtrace.grep(/^test\.str:/).first
+      assert line, "Backtrace didn't contain test.str"
+      file, line, meth = line.split(":")
+      assert_equal '13', line
+    end
+  end
+
+  test "backtrace file and line reporting with locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::StringTemplate.new('test.str') { data }
+    begin
+      template.render(Scope.new, :name => 'Joe', :foo => 'bar')
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of RuntimeError, boom
+      line = boom.backtrace.first
+      file, line, meth = line.split(":")
+      assert_equal 'test.str', file
+      assert_equal '6', line
+    end
+  end
+end
+
+__END__
+<html>
+<body>
+  <h1>Hey #{name}!</h1>
+
+
+  <p>#{fail}</p>
+</body>
+</html>
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_template_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_template_test.rb
new file mode 100644
index 0000000..111a141
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_template_test.rb
@@ -0,0 +1,323 @@
+# coding: utf-8
+require 'contest'
+require 'tilt'
+require 'tempfile'
+
+class TiltTemplateTest < Test::Unit::TestCase
+
+  class MockTemplate < Tilt::Template
+    def prepare
+    end
+  end
+
+  test "needs a file or block" do
+    assert_raise(ArgumentError) { Tilt::Template.new }
+  end
+
+  test "initializing with a file" do
+    inst = MockTemplate.new('foo.erb') {}
+    assert_equal 'foo.erb', inst.file
+  end
+
+  test "initializing with a file and line" do
+    inst = MockTemplate.new('foo.erb', 55) {}
+    assert_equal 'foo.erb', inst.file
+    assert_equal 55, inst.line
+  end
+
+  test "initializing with a tempfile" do
+    tempfile = Tempfile.new('tilt_template_test')
+    inst = MockTemplate.new(tempfile)
+    assert_equal File.basename(tempfile.path), inst.basename
+  end
+
+  class SillyHash < Hash
+    def path(arg)
+    end
+  end
+
+  test "initialize with hash that implements #path" do
+    options = SillyHash[:key => :value]
+    inst = MockTemplate.new(options) {}
+    assert_equal :value, inst.options[:key]
+  end
+
+  test "uses correct eval_file" do
+    inst = MockTemplate.new('foo.erb', 55) {}
+    assert_equal 'foo.erb', inst.eval_file
+  end
+
+  test "uses a default filename for #eval_file when no file provided" do
+    inst = MockTemplate.new { 'Hi' }
+    assert_not_nil inst.eval_file
+    assert !inst.eval_file.include?("\n")
+  end
+
+  test "calculating template's #basename" do
+    inst = MockTemplate.new('/tmp/templates/foo.html.erb') {}
+    assert_equal 'foo.html.erb', inst.basename
+  end
+
+  test "calculating the template's #name" do
+    inst = MockTemplate.new('/tmp/templates/foo.html.erb') {}
+    assert_equal 'foo', inst.name
+  end
+
+  test "initializing with a data loading block" do
+    MockTemplate.new { |template| "Hello World!" }
+  end
+
+  class InitializingMockTemplate < Tilt::Template
+    @@initialized_count = 0
+    def self.initialized_count
+      @@initialized_count
+    end
+
+    def initialize_engine
+      @@initialized_count += 1
+    end
+
+    def prepare
+    end
+  end
+
+  test "one-time template engine initialization" do
+    assert_nil InitializingMockTemplate.engine_initialized
+    assert_equal 0, InitializingMockTemplate.initialized_count
+
+    InitializingMockTemplate.new { "Hello World!" }
+    assert InitializingMockTemplate.engine_initialized
+    assert_equal 1, InitializingMockTemplate.initialized_count
+
+    InitializingMockTemplate.new { "Hello World!" }
+    assert_equal 1, InitializingMockTemplate.initialized_count
+  end
+
+  class PreparingMockTemplate < Tilt::Template
+    include Test::Unit::Assertions
+    def prepare
+      assert !data.nil?
+      @prepared = true
+    end
+    def prepared? ; @prepared ; end
+  end
+
+  test "raises NotImplementedError when #prepare not defined" do
+    assert_raise(NotImplementedError) { Tilt::Template.new { |template| "Hello World!" } }
+  end
+
+  test "raises NotImplementedError when #evaluate or #template_source not defined" do
+    inst = PreparingMockTemplate.new { |t| "Hello World!" }
+    assert_raise(NotImplementedError) { inst.render }
+    assert inst.prepared?
+  end
+
+  class SimpleMockTemplate < PreparingMockTemplate
+    include Test::Unit::Assertions
+    def evaluate(scope, locals, &block)
+      assert prepared?
+      assert !scope.nil?
+      assert !locals.nil?
+      "<em>#{@data}</em>"
+    end
+  end
+
+  test "prepares and evaluates the template on #render" do
+    inst = SimpleMockTemplate.new { |t| "Hello World!" }
+    assert_equal "<em>Hello World!</em>", inst.render
+    assert inst.prepared?
+  end
+
+  class SourceGeneratingMockTemplate < PreparingMockTemplate
+    def precompiled_template(locals)
+      "foo = [] ; foo << %Q{#{data}} ; foo.join"
+    end
+  end
+
+  test "template_source with locals" do
+    inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{name}!' }
+    assert_equal "Hey Joe!", inst.render(Object.new, :name => 'Joe')
+    assert inst.prepared?
+  end
+
+  test "template_source with locals of strings" do
+    inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{name}!' }
+    assert_equal "Hey Joe!", inst.render(Object.new, 'name' => 'Joe')
+    assert inst.prepared?
+  end
+
+  test "template_source with locals having non-variable keys raises error" do
+    inst = SourceGeneratingMockTemplate.new { |t| '1 + 2 = #{_answer}' }
+    err = assert_raise(RuntimeError) { inst.render(Object.new, 'ANSWER' => 3) }
+    assert_equal "invalid locals key: \"ANSWER\" (keys must be variable names)", err.message
+    assert_equal "1 + 2 = 3", inst.render(Object.new, '_answer' => 3)
+  end
+
+  class CustomGeneratingMockTemplate < PreparingMockTemplate
+    def precompiled_template(locals)
+      data
+    end
+
+    def precompiled_preamble(locals)
+      options.fetch(:preamble)
+    end
+
+    def precompiled_postamble(locals)
+      options.fetch(:postamble)
+    end
+  end
+
+  test "supports pre/postamble" do
+    inst = CustomGeneratingMockTemplate.new(
+      :preamble => 'buf = []',
+      :postamble => 'buf.join'
+    ) { 'buf << 1' }
+
+    assert_equal "1", inst.render
+  end
+
+  # Special-case for Haml
+  # https://github.com/rtomayko/tilt/issues/193
+  test "supports Array pre/postambles" do
+    inst = CustomGeneratingMockTemplate.new(
+      :preamble => ['buf = ', '[]'],
+      :postamble => ['buf.', 'join']
+    ) { 'buf << 1' }
+
+    # TODO: Use assert_output when we swicth to MiniTest
+    warns = <<-EOF
+precompiled_preamble should return String (not Array)
+precompiled_postamble should return String (not Array)
+EOF
+
+    begin
+      require 'stringio'
+      $stderr = StringIO.new
+      assert_equal "1", inst.render
+      assert_equal warns, $stderr.string
+    ensure
+      $stderr = STDERR
+    end
+  end
+
+  class Person
+    CONSTANT = "Bob"
+
+    attr_accessor :name
+    def initialize(name)
+      @name = name
+    end
+  end
+
+  test "template_source with an object scope" do
+    inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{@name}!' }
+    scope = Person.new('Joe')
+    assert_equal "Hey Joe!", inst.render(scope)
+  end
+
+  test "template_source with a block for yield" do
+    inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{yield}!' }
+    assert_equal "Hey Joe!", inst.render(Object.new){ 'Joe' }
+  end
+
+  test "template which accesses a constant" do
+    inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{CONSTANT}!' }
+    assert_equal "Hey Bob!", inst.render(Person.new("Joe"))
+  end
+
+  ##
+  # Encodings
+
+  class DynamicMockTemplate < MockTemplate
+    def precompiled_template(locals)
+      options[:code]
+    end
+  end
+
+  class UTF8Template < MockTemplate
+    def default_encoding
+      Encoding::UTF_8
+    end
+  end
+
+  if ''.respond_to?(:encoding)
+    original_encoding = Encoding.default_external
+
+    setup do
+      @file = Tempfile.open('template')
+      @file.puts "stuff"
+      @file.close
+      @template = @file.path
+    end
+
+    teardown do
+      Encoding.default_external = original_encoding
+      Encoding.default_internal = nil
+      @file.delete
+    end
+
+    test "reading from file assumes default external encoding" do
+      Encoding.default_external = 'Big5'
+      inst = MockTemplate.new(@template)
+      assert_equal 'Big5', inst.data.encoding.to_s
+    end
+
+    test "reading from file with a :default_encoding overrides default external" do
+      Encoding.default_external = 'Big5'
+      inst = MockTemplate.new(@template, :default_encoding => 'GBK')
+      assert_equal 'GBK', inst.data.encoding.to_s
+    end
+
+    test "reading from file with default_internal set does no transcoding" do
+      Encoding.default_internal = 'utf-8'
+      Encoding.default_external = 'Big5'
+      inst = MockTemplate.new(@template)
+      assert_equal 'Big5', inst.data.encoding.to_s
+    end
+
+    test "using provided template data verbatim when given as string" do
+      Encoding.default_internal = 'Big5'
+      inst = MockTemplate.new(@template) { "blah".force_encoding('GBK') }
+      assert_equal 'GBK', inst.data.encoding.to_s
+    end
+
+    test "uses the template from the generated source code" do
+      tmpl = "ふが"
+      code = tmpl.inspect.encode('Shift_JIS')
+      inst = DynamicMockTemplate.new(:code => code) { '' }
+      res = inst.render
+      assert_equal 'Shift_JIS', res.encoding.to_s
+      assert_equal tmpl, res.encode(tmpl.encoding)
+    end
+
+    test "uses the magic comment from the generated source code" do
+      tmpl = "ふが"
+      code = ("# coding: Shift_JIS\n" + tmpl.inspect).encode('Shift_JIS')
+      # Set it to an incorrect encoding
+      code.force_encoding('UTF-8')
+
+      inst = DynamicMockTemplate.new(:code => code) { '' }
+      res = inst.render
+      assert_equal 'Shift_JIS', res.encoding.to_s
+      assert_equal tmpl, res.encode(tmpl.encoding)
+    end
+
+    test "uses #default_encoding instead of default_external" do
+      Encoding.default_external = 'Big5'
+      inst = UTF8Template.new(@template)
+      assert_equal 'UTF-8', inst.data.encoding.to_s
+    end
+
+    test "uses #default_encoding instead of current encoding" do
+      tmpl = "".force_encoding('Big5')
+      inst = UTF8Template.new(@template) { tmpl }
+      assert_equal 'UTF-8', inst.data.encoding.to_s
+    end
+
+    test "raises error if the encoding is not valid" do
+      assert_raises(Encoding::InvalidByteSequenceError) do
+        UTF8Template.new(@template) { "\xe4" }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_test.rb
new file mode 100644
index 0000000..f12dacb
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_test.rb
@@ -0,0 +1,65 @@
+require 'contest'
+require 'tilt'
+
+class TiltTest < Test::Unit::TestCase
+  class MockTemplate
+    attr_reader :args, :block
+    def initialize(*args, &block)
+      @args = args
+      @block = block
+    end
+  end
+
+  test "registering template implementation classes by file extension" do
+    Tilt.register('mock', MockTemplate)
+  end
+
+  test "an extension is registered if explicit handle is found" do
+    Tilt.register('mock', MockTemplate)
+    assert Tilt.registered?('mock')
+  end
+
+  test "registering template classes by symbol file extension" do
+    Tilt.register(:mock, MockTemplate)
+  end
+
+  test "looking up template classes by exact file extension" do
+    Tilt.register('mock', MockTemplate)
+    impl = Tilt['mock']
+    assert_equal MockTemplate, impl
+  end
+
+  test "looking up template classes by implicit file extension" do
+    Tilt.register('mock', MockTemplate)
+    impl = Tilt['.mock']
+    assert_equal MockTemplate, impl
+  end
+
+  test "looking up template classes with multiple file extensions" do
+    Tilt.register('mock', MockTemplate)
+    impl = Tilt['index.html.mock']
+    assert_equal MockTemplate, impl
+  end
+
+  test "looking up template classes by file name" do
+    Tilt.register('mock', MockTemplate)
+    impl = Tilt['templates/test.mock']
+    assert_equal MockTemplate, impl
+  end
+
+  test "looking up non-existant template class" do
+    assert_nil Tilt['none']
+  end
+
+  test "accessing template class mappings at Tilt::mappings" do
+    assert Tilt.respond_to?(:mappings)
+    assert Tilt.mappings.respond_to?(:[])
+  end
+
+  test "creating new template instance with a filename" do
+    Tilt.register('mock', MockTemplate)
+    template = Tilt.new('foo.mock', 1, :key => 'val') { 'Hello World!' }
+    assert_equal ['foo.mock', 1, {:key => 'val'}], template.args
+    assert_equal 'Hello World!', template.block.call
+  end
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_wikiclothtemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_wikiclothtemplate_test.rb
new file mode 100644
index 0000000..fd52de9
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_wikiclothtemplate_test.rb
@@ -0,0 +1,32 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'wikicloth'
+
+  class WikiClothTemplateTest < Test::Unit::TestCase
+    test "is registered for '.mediawiki' files" do
+      assert_equal Tilt::WikiClothTemplate, Tilt['test.mediawiki']
+    end
+
+    test "is registered for '.mw' files" do
+      assert_equal Tilt::WikiClothTemplate, Tilt['test.mw']
+    end
+
+    test "is registered for '.wiki' files" do
+      assert_equal Tilt::WikiClothTemplate, Tilt['test.wiki']
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::WikiClothTemplate.new { |t| "= Hello World! =" }
+      assert_match /<h1>.*Hello World!.*<\/h1>/, template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::WikiClothTemplate.new { |t| "= Hello World! =" }
+      3.times { assert_match /<h1>.*Hello World!.*<\/h1>/, template.render }
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::WikiClothTemplate (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_yajltemplate_test.rb b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_yajltemplate_test.rb
new file mode 100644
index 0000000..48ef1d1
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/test/tilt_yajltemplate_test.rb
@@ -0,0 +1,101 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'yajl'
+
+  class YajlTemplateTest < Test::Unit::TestCase
+    test "is registered for '.yajl' files" do
+      assert_equal Tilt::YajlTemplate, Tilt['test.yajl']
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::YajlTemplate.new { "json = { :integer => 3, :string => 'hello' }" }
+      output = template.render
+      result = Yajl::Parser.parse(output)
+      expect = {"integer" => 3,"string" => "hello"}
+      assert_equal expect, result
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::YajlTemplate.new { "json = { :integer => 3, :string => 'hello' }" }
+      expect = {"integer" => 3,"string" => "hello"}
+      3.times do
+        output = template.render
+        result = Yajl::Parser.parse(output)
+        assert_equal expect, result
+      end
+    end
+
+    test "evaluating ruby code" do
+      template = Tilt::YajlTemplate.new { "json = { :integer => (3 * 2) }" }
+      assert_equal '{"integer":6}', template.render
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::YajlTemplate.new { "json = { :string => 'Hey ' + @name + '!' }" }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal '{"string":"Hey Joe!"}', template.render(scope)
+    end
+
+    test "passing locals" do
+      template = Tilt::YajlTemplate.new { "json = { :string => 'Hey ' + name + '!' }" }
+      assert_equal '{"string":"Hey Joe!"}', template.render(Object.new, :name => 'Joe')
+    end
+
+    test "passing a block for yield" do
+      template = Tilt::YajlTemplate.new { "json = { :string => 'Hey ' + yield + '!' }" }
+      assert_equal '{"string":"Hey Joe!"}', template.render { 'Joe' }
+      assert_equal '{"string":"Hey Moe!"}', template.render { 'Moe' }
+    end
+
+    test "template multiline" do
+      template = Tilt::YajlTemplate.new { %Q{
+        json = {
+          :string   => "hello"
+        }
+      } }
+      assert_equal '{"string":"hello"}', template.render
+    end
+
+    test "template can reuse existing json buffer" do
+      template = Tilt::YajlTemplate.new { "json.merge! :string => 'hello'" }
+      assert_equal '{"string":"hello"}', template.render
+    end
+
+    test "template can end with any statement" do
+      template = Tilt::YajlTemplate.new { %Q{
+        json = {
+          :string   => "hello"
+        }
+        four = 2 * 2
+        json[:integer] = four
+        nil
+      } }
+      result = template.render
+      assert( (result == '{"string":"hello","integer":4}') || (result == '{"integer":4,"string":"hello"}') )
+    end
+
+    test "option callback" do
+      options = { :callback => 'foo' }
+      template = Tilt::YajlTemplate.new(nil, options) { "json = { :string => 'hello' }" }
+      assert_equal 'foo({"string":"hello"});', template.render
+    end
+
+    test "option variable" do
+      options = { :variable => 'output' }
+      template = Tilt::YajlTemplate.new(nil, options) { "json = { :string => 'hello' }" }
+      assert_equal 'var output = {"string":"hello"};', template.render
+    end
+
+    test "option callback and variable" do
+      options = { :callback => 'foo', :variable => 'output' }
+      template = Tilt::YajlTemplate.new(nil, options) { "json = { :string => 'hello' }" }
+      assert_equal 'var output = {"string":"hello"}; foo(output);', template.render
+    end
+
+  end
+rescue LoadError
+  warn "Tilt::YajlTemplateTest (disabled)"
+end
diff --git a/.bundle/ruby/1.9.1/gems/tilt-1.4.1/tilt.gemspec b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/tilt.gemspec
new file mode 100644
index 0000000..00f49f4
--- /dev/null
+++ b/.bundle/ruby/1.9.1/gems/tilt-1.4.1/tilt.gemspec
@@ -0,0 +1,120 @@
+Gem::Specification.new do |s|
+  s.specification_version = 2 if s.respond_to? :specification_version=
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+
+  s.name = 'tilt'
+  s.version = '1.4.1'
+  s.date = '2013-05-08'
+
+  s.description = "Generic interface to multiple Ruby template engines"
+  s.summary     = s.description
+  s.license     = "MIT"
+
+  s.authors = ["Ryan Tomayko"]
+  s.email = "r at tomayko.com"
+
+  # = MANIFEST =
+  s.files = %w[
+    CHANGELOG.md
+    COPYING
+    Gemfile
+    HACKING
+    README.md
+    Rakefile
+    TEMPLATES.md
+    bin/tilt
+    lib/tilt.rb
+    lib/tilt/asciidoc.rb
+    lib/tilt/builder.rb
+    lib/tilt/coffee.rb
+    lib/tilt/css.rb
+    lib/tilt/csv.rb
+    lib/tilt/erb.rb
+    lib/tilt/etanni.rb
+    lib/tilt/haml.rb
+    lib/tilt/liquid.rb
+    lib/tilt/markaby.rb
+    lib/tilt/markdown.rb
+    lib/tilt/nokogiri.rb
+    lib/tilt/plain.rb
+    lib/tilt/radius.rb
+    lib/tilt/rdoc.rb
+    lib/tilt/string.rb
+    lib/tilt/template.rb
+    lib/tilt/textile.rb
+    lib/tilt/wiki.rb
+    lib/tilt/yajl.rb
+    test/contest.rb
+    test/markaby/locals.mab
+    test/markaby/markaby.mab
+    test/markaby/markaby_other_static.mab
+    test/markaby/render_twice.mab
+    test/markaby/scope.mab
+    test/markaby/yielding.mab
+    test/tilt_asciidoctor_test.rb
+    test/tilt_blueclothtemplate_test.rb
+    test/tilt_buildertemplate_test.rb
+    test/tilt_cache_test.rb
+    test/tilt_coffeescripttemplate_test.rb
+    test/tilt_compilesite_test.rb
+    test/tilt_creoletemplate_test.rb
+    test/tilt_csv_test.rb
+    test/tilt_erbtemplate_test.rb
+    test/tilt_erubistemplate_test.rb
+    test/tilt_etannitemplate_test.rb
+    test/tilt_fallback_test.rb
+    test/tilt_hamltemplate_test.rb
+    test/tilt_kramdown_test.rb
+    test/tilt_lesstemplate_test.less
+    test/tilt_lesstemplate_test.rb
+    test/tilt_liquidtemplate_test.rb
+    test/tilt_markaby_test.rb
+    test/tilt_markdown_test.rb
+    test/tilt_marukutemplate_test.rb
+    test/tilt_nokogiritemplate_test.rb
+    test/tilt_radiustemplate_test.rb
+    test/tilt_rdiscounttemplate_test.rb
+    test/tilt_rdoctemplate_test.rb
+    test/tilt_redcarpettemplate_test.rb
+    test/tilt_redclothtemplate_test.rb
+    test/tilt_sasstemplate_test.rb
+    test/tilt_stringtemplate_test.rb
+    test/tilt_template_test.rb
+    test/tilt_test.rb
+    test/tilt_wikiclothtemplate_test.rb
+    test/tilt_yajltemplate_test.rb
+    tilt.gemspec
+  ]
+  # = MANIFEST =
+
+  s.executables = ['tilt']
+  s.test_files = s.files.select {|path| path =~ /^test\/.*_test.rb/}
+  s.add_development_dependency 'asciidoctor', '>= 0.1.0'
+  s.add_development_dependency 'RedCloth'
+  s.add_development_dependency 'bluecloth'
+  s.add_development_dependency 'builder'
+  s.add_development_dependency 'coffee-script'
+  s.add_development_dependency 'contest'
+  s.add_development_dependency 'creole'
+  s.add_development_dependency 'erubis'
+  s.add_development_dependency 'haml', '>= 2.2.11'
+  s.add_development_dependency 'kramdown'
+  s.add_development_dependency 'less'
+  s.add_development_dependency 'liquid'
+  s.add_development_dependency 'markaby'
+  s.add_development_dependency 'maruku'
+  s.add_development_dependency 'nokogiri'
+  s.add_development_dependency 'radius'
+  s.add_development_dependency 'rdiscount'
+  s.add_development_dependency 'rdoc'
+  s.add_development_dependency 'redcarpet'
+  s.add_development_dependency 'sass'
+  s.add_development_dependency 'wikicloth'
+  s.add_development_dependency 'yajl-ruby'
+  s.add_development_dependency 'rdoc'
+
+  s.homepage = "http://github.com/rtomayko/tilt/"
+  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Tilt", "--main", "Tilt"]
+  s.require_paths = %w[lib]
+  s.rubygems_version = '1.1.1'
+end
diff --git a/.bundle/ruby/1.9.1/specifications/fastimage-1.5.0.gemspec b/.bundle/ruby/1.9.1/specifications/fastimage-1.5.0.gemspec
new file mode 100644
index 0000000..9c42b9b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/specifications/fastimage-1.5.0.gemspec
@@ -0,0 +1,29 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "fastimage"
+  s.version = "1.5.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Stephen Sykes"]
+  s.date = "2013-07-02"
+  s.description = "FastImage finds the size or type of an image given its uri by fetching as little as needed."
+  s.email = "sdsykes at gmail.com"
+  s.extra_rdoc_files = ["README.textile"]
+  s.files = ["README.textile"]
+  s.homepage = "http://github.com/sdsykes/fastimage"
+  s.licenses = ["MIT"]
+  s.rdoc_options = ["--charset=UTF-8"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "1.8.23"
+  s.summary = "FastImage - Image info fast"
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+    else
+    end
+  else
+  end
+end
diff --git a/.bundle/ruby/1.9.1/specifications/hike-1.2.3.gemspec b/.bundle/ruby/1.9.1/specifications/hike-1.2.3.gemspec
new file mode 100644
index 0000000..0c091a7
--- /dev/null
+++ b/.bundle/ruby/1.9.1/specifications/hike-1.2.3.gemspec
@@ -0,0 +1,29 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "hike"
+  s.version = "1.2.3"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Sam Stephenson"]
+  s.date = "2013-06-04"
+  s.description = "A Ruby library for finding files in a set of paths."
+  s.email = ["sstephenson at gmail.com"]
+  s.homepage = "http://github.com/sstephenson/hike"
+  s.licenses = ["MIT"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "1.8.23"
+  s.summary = "Find files in a set of paths"
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<rake>, [">= 0"])
+    else
+      s.add_dependency(%q<rake>, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<rake>, [">= 0"])
+  end
+end
diff --git a/.bundle/ruby/1.9.1/specifications/hikidoc-0.0.6.gemspec b/.bundle/ruby/1.9.1/specifications/hikidoc-0.0.6.gemspec
new file mode 100644
index 0000000..ac09da6
--- /dev/null
+++ b/.bundle/ruby/1.9.1/specifications/hikidoc-0.0.6.gemspec
@@ -0,0 +1,34 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "hikidoc"
+  s.version = "0.0.6"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Kazuhiko", "SHIBATA Hiroshi"]
+  s.date = "2013-02-26"
+  s.description = "'HikiDoc' is a text-to-HTML conversion tool for web writers."
+  s.email = ["kazuhiko at fdiary.net", "shibata.hiroshi at gmail.com"]
+  s.executables = ["hikidoc"]
+  s.files = ["bin/hikidoc"]
+  s.homepage = "https://github.com/hiki/hikidoc"
+  s.licenses = ["MIT"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "1.8.23"
+  s.summary = "'HikiDoc' is a text-to-HTML conversion tool for web writers. HikiDoc allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid HTML (or XHTML)."
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<bundler>, [">= 0"])
+      s.add_development_dependency(%q<rake>, [">= 0"])
+    else
+      s.add_dependency(%q<bundler>, [">= 0"])
+      s.add_dependency(%q<rake>, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<bundler>, [">= 0"])
+    s.add_dependency(%q<rake>, [">= 0"])
+  end
+end
diff --git a/.bundle/ruby/1.9.1/specifications/multi_json-1.7.7.gemspec b/.bundle/ruby/1.9.1/specifications/multi_json-1.7.7.gemspec
new file mode 100644
index 0000000..7408ce2
--- /dev/null
+++ b/.bundle/ruby/1.9.1/specifications/multi_json-1.7.7.gemspec
@@ -0,0 +1,30 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "multi_json"
+  s.version = "1.7.7"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 1.3.5") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Michael Bleigh", "Josh Kalderimis", "Erik Michaels-Ober", "Pavel Pravosud"]
+  s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIDLjCCAhagAwIBAgIBADANBgkqhkiG9w0BAQUFADA9MQ8wDQYDVQQDDAZzZmVy\naWsxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2NvbTAe\nFw0xMzAyMDMxMDAyMjdaFw0xNDAyMDMxMDAyMjdaMD0xDzANBgNVBAMMBnNmZXJp\nazEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29tMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl0x5dx8uKxi7TkrIuyBUTJVB\nv1o93nUB9j/y4M96gV2rYwAci1JPBseNd6Fybzjo3YGuHl7EQHuSHNaf1p2lxew/\ny60JXIJBBgPcDK/KCP4NUHofm0jfoYD+H5uNJfHCNq7/ZsTx [...]
+  s.date = "2013-06-14"
+  s.description = "A common interface to multiple JSON libraries, including Oj, Yajl, the JSON gem (with C-extensions), the pure-Ruby JSON gem, NSJSONSerialization, gson.rb, JrJackson, and OkJson."
+  s.email = ["michael at intridea.com", "josh.kalderimis at gmail.com", "sferik at gmail.com"]
+  s.homepage = "http://github.com/intridea/multi_json"
+  s.licenses = ["MIT"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "1.8.23"
+  s.summary = "A common interface to multiple JSON libraries."
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<bundler>, ["~> 1.0"])
+    else
+      s.add_dependency(%q<bundler>, ["~> 1.0"])
+    end
+  else
+    s.add_dependency(%q<bundler>, ["~> 1.0"])
+  end
+end
diff --git a/.bundle/ruby/1.9.1/specifications/rack-1.5.2.gemspec b/.bundle/ruby/1.9.1/specifications/rack-1.5.2.gemspec
new file mode 100644
index 0000000..1602b22
--- /dev/null
+++ b/.bundle/ruby/1.9.1/specifications/rack-1.5.2.gemspec
@@ -0,0 +1,36 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "rack"
+  s.version = "1.5.2"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Christian Neukirchen"]
+  s.date = "2013-02-08"
+  s.description = "Rack provides a minimal, modular and adaptable interface for developing\nweb applications in Ruby.  By wrapping HTTP requests and responses in\nthe simplest way possible, it unifies and distills the API for web\nservers, web frameworks, and software in between (the so-called\nmiddleware) into a single method call.\n\nAlso see http://rack.github.com/.\n"
+  s.email = "chneukirchen at gmail.com"
+  s.executables = ["rackup"]
+  s.extra_rdoc_files = ["README.rdoc", "KNOWN-ISSUES"]
+  s.files = ["bin/rackup", "README.rdoc", "KNOWN-ISSUES"]
+  s.homepage = "http://rack.github.com/"
+  s.licenses = ["MIT"]
+  s.require_paths = ["lib"]
+  s.rubyforge_project = "rack"
+  s.rubygems_version = "1.8.23"
+  s.summary = "a modular Ruby webserver interface"
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<bacon>, [">= 0"])
+      s.add_development_dependency(%q<rake>, [">= 0"])
+    else
+      s.add_dependency(%q<bacon>, [">= 0"])
+      s.add_dependency(%q<rake>, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<bacon>, [">= 0"])
+    s.add_dependency(%q<rake>, [">= 0"])
+  end
+end
diff --git a/.bundle/ruby/1.9.1/specifications/rdtool-0.6.38.gemspec b/.bundle/ruby/1.9.1/specifications/rdtool-0.6.38.gemspec
new file mode 100644
index 0000000..533163d
--- /dev/null
+++ b/.bundle/ruby/1.9.1/specifications/rdtool-0.6.38.gemspec
@@ -0,0 +1,34 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "rdtool"
+  s.version = "0.6.38"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Youhei SASAKI"]
+  s.date = "2012-11-27"
+  s.description = "RD is multipurpose documentation format created for documentating Ruby and output of Ruby world. You can embed RD into Ruby script. And RD have neat syntax which help you to read document in Ruby script. On the other hand, RD have a feature for class reference."
+  s.email = "uwabami at gfd-dennou.org"
+  s.executables = ["rd2", "rdswap.rb"]
+  s.files = ["bin/rd2", "bin/rdswap.rb"]
+  s.homepage = "http://github.com/uwabami/rdtool"
+  s.licenses = ["GPL-2+", "Ruby"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "1.8.23"
+  s.summary = "RDtool is formatter for RD."
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<racc>, ["~> 1.4.6"])
+      s.add_development_dependency(%q<rake>, [">= 0"])
+    else
+      s.add_dependency(%q<racc>, ["~> 1.4.6"])
+      s.add_dependency(%q<rake>, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<racc>, ["~> 1.4.6"])
+    s.add_dependency(%q<rake>, [">= 0"])
+  end
+end
diff --git a/.bundle/ruby/1.9.1/specifications/sprockets-2.10.0.gemspec b/.bundle/ruby/1.9.1/specifications/sprockets-2.10.0.gemspec
new file mode 100644
index 0000000..7bdff33
--- /dev/null
+++ b/.bundle/ruby/1.9.1/specifications/sprockets-2.10.0.gemspec
@@ -0,0 +1,77 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "sprockets"
+  s.version = "2.10.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Sam Stephenson", "Joshua Peek"]
+  s.date = "2013-05-24"
+  s.description = "Sprockets is a Rack-based asset packaging system that concatenates and serves JavaScript, CoffeeScript, CSS, LESS, Sass, and SCSS."
+  s.email = ["sstephenson at gmail.com", "josh at joshpeek.com"]
+  s.executables = ["sprockets"]
+  s.files = ["bin/sprockets"]
+  s.homepage = "http://getsprockets.org/"
+  s.licenses = ["MIT"]
+  s.require_paths = ["lib"]
+  s.rubyforge_project = "sprockets"
+  s.rubygems_version = "1.8.23"
+  s.summary = "Rack-based asset packaging system"
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<hike>, ["~> 1.2"])
+      s.add_runtime_dependency(%q<multi_json>, ["~> 1.0"])
+      s.add_runtime_dependency(%q<rack>, ["~> 1.0"])
+      s.add_runtime_dependency(%q<tilt>, ["!= 1.3.0", "~> 1.1"])
+      s.add_development_dependency(%q<closure-compiler>, [">= 0"])
+      s.add_development_dependency(%q<coffee-script>, ["~> 2.0"])
+      s.add_development_dependency(%q<coffee-script-source>, ["~> 1.2"])
+      s.add_development_dependency(%q<eco>, ["~> 1.0"])
+      s.add_development_dependency(%q<ejs>, ["~> 1.0"])
+      s.add_development_dependency(%q<execjs>, ["~> 1.0"])
+      s.add_development_dependency(%q<json>, [">= 0"])
+      s.add_development_dependency(%q<rack-test>, [">= 0"])
+      s.add_development_dependency(%q<rake>, [">= 0"])
+      s.add_development_dependency(%q<sass>, ["~> 3.1"])
+      s.add_development_dependency(%q<uglifier>, [">= 0"])
+      s.add_development_dependency(%q<yui-compressor>, [">= 0"])
+    else
+      s.add_dependency(%q<hike>, ["~> 1.2"])
+      s.add_dependency(%q<multi_json>, ["~> 1.0"])
+      s.add_dependency(%q<rack>, ["~> 1.0"])
+      s.add_dependency(%q<tilt>, ["!= 1.3.0", "~> 1.1"])
+      s.add_dependency(%q<closure-compiler>, [">= 0"])
+      s.add_dependency(%q<coffee-script>, ["~> 2.0"])
+      s.add_dependency(%q<coffee-script-source>, ["~> 1.2"])
+      s.add_dependency(%q<eco>, ["~> 1.0"])
+      s.add_dependency(%q<ejs>, ["~> 1.0"])
+      s.add_dependency(%q<execjs>, ["~> 1.0"])
+      s.add_dependency(%q<json>, [">= 0"])
+      s.add_dependency(%q<rack-test>, [">= 0"])
+      s.add_dependency(%q<rake>, [">= 0"])
+      s.add_dependency(%q<sass>, ["~> 3.1"])
+      s.add_dependency(%q<uglifier>, [">= 0"])
+      s.add_dependency(%q<yui-compressor>, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<hike>, ["~> 1.2"])
+    s.add_dependency(%q<multi_json>, ["~> 1.0"])
+    s.add_dependency(%q<rack>, ["~> 1.0"])
+    s.add_dependency(%q<tilt>, ["!= 1.3.0", "~> 1.1"])
+    s.add_dependency(%q<closure-compiler>, [">= 0"])
+    s.add_dependency(%q<coffee-script>, ["~> 2.0"])
+    s.add_dependency(%q<coffee-script-source>, ["~> 1.2"])
+    s.add_dependency(%q<eco>, ["~> 1.0"])
+    s.add_dependency(%q<ejs>, ["~> 1.0"])
+    s.add_dependency(%q<execjs>, ["~> 1.0"])
+    s.add_dependency(%q<json>, [">= 0"])
+    s.add_dependency(%q<rack-test>, [">= 0"])
+    s.add_dependency(%q<rake>, [">= 0"])
+    s.add_dependency(%q<sass>, ["~> 3.1"])
+    s.add_dependency(%q<uglifier>, [">= 0"])
+    s.add_dependency(%q<yui-compressor>, [">= 0"])
+  end
+end
diff --git a/.bundle/ruby/1.9.1/specifications/thor-0.18.1.gemspec b/.bundle/ruby/1.9.1/specifications/thor-0.18.1.gemspec
new file mode 100644
index 0000000..5da6249
--- /dev/null
+++ b/.bundle/ruby/1.9.1/specifications/thor-0.18.1.gemspec
@@ -0,0 +1,31 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "thor"
+  s.version = "0.18.1"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Yehuda Katz", "Jos\u{e9} Valim"]
+  s.date = "2013-03-30"
+  s.description = "A scripting framework that replaces rake, sake and rubigen"
+  s.email = "ruby-thor at googlegroups.com"
+  s.executables = ["thor"]
+  s.files = ["bin/thor"]
+  s.homepage = "http://whatisthor.com/"
+  s.licenses = ["MIT"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "1.8.23"
+  s.summary = "A scripting framework that replaces rake, sake and rubigen"
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<bundler>, ["~> 1.0"])
+    else
+      s.add_dependency(%q<bundler>, ["~> 1.0"])
+    end
+  else
+    s.add_dependency(%q<bundler>, ["~> 1.0"])
+  end
+end
diff --git a/.bundle/ruby/1.9.1/specifications/tilt-1.4.1.gemspec b/.bundle/ruby/1.9.1/specifications/tilt-1.4.1.gemspec
new file mode 100644
index 0000000..ef2dc3b
--- /dev/null
+++ b/.bundle/ruby/1.9.1/specifications/tilt-1.4.1.gemspec
@@ -0,0 +1,98 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "tilt"
+  s.version = "1.4.1"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Ryan Tomayko"]
+  s.date = "2013-05-08"
+  s.description = "Generic interface to multiple Ruby template engines"
+  s.email = "r at tomayko.com"
+  s.executables = ["tilt"]
+  s.files = ["bin/tilt"]
+  s.homepage = "http://github.com/rtomayko/tilt/"
+  s.licenses = ["MIT"]
+  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Tilt", "--main", "Tilt"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "1.8.23"
+  s.summary = "Generic interface to multiple Ruby template engines"
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 2
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<asciidoctor>, [">= 0.1.0"])
+      s.add_development_dependency(%q<RedCloth>, [">= 0"])
+      s.add_development_dependency(%q<bluecloth>, [">= 0"])
+      s.add_development_dependency(%q<builder>, [">= 0"])
+      s.add_development_dependency(%q<coffee-script>, [">= 0"])
+      s.add_development_dependency(%q<contest>, [">= 0"])
+      s.add_development_dependency(%q<creole>, [">= 0"])
+      s.add_development_dependency(%q<erubis>, [">= 0"])
+      s.add_development_dependency(%q<haml>, [">= 2.2.11"])
+      s.add_development_dependency(%q<kramdown>, [">= 0"])
+      s.add_development_dependency(%q<less>, [">= 0"])
+      s.add_development_dependency(%q<liquid>, [">= 0"])
+      s.add_development_dependency(%q<markaby>, [">= 0"])
+      s.add_development_dependency(%q<maruku>, [">= 0"])
+      s.add_development_dependency(%q<nokogiri>, [">= 0"])
+      s.add_development_dependency(%q<radius>, [">= 0"])
+      s.add_development_dependency(%q<rdiscount>, [">= 0"])
+      s.add_development_dependency(%q<rdoc>, [">= 0"])
+      s.add_development_dependency(%q<redcarpet>, [">= 0"])
+      s.add_development_dependency(%q<sass>, [">= 0"])
+      s.add_development_dependency(%q<wikicloth>, [">= 0"])
+      s.add_development_dependency(%q<yajl-ruby>, [">= 0"])
+      s.add_development_dependency(%q<rdoc>, [">= 0"])
+    else
+      s.add_dependency(%q<asciidoctor>, [">= 0.1.0"])
+      s.add_dependency(%q<RedCloth>, [">= 0"])
+      s.add_dependency(%q<bluecloth>, [">= 0"])
+      s.add_dependency(%q<builder>, [">= 0"])
+      s.add_dependency(%q<coffee-script>, [">= 0"])
+      s.add_dependency(%q<contest>, [">= 0"])
+      s.add_dependency(%q<creole>, [">= 0"])
+      s.add_dependency(%q<erubis>, [">= 0"])
+      s.add_dependency(%q<haml>, [">= 2.2.11"])
+      s.add_dependency(%q<kramdown>, [">= 0"])
+      s.add_dependency(%q<less>, [">= 0"])
+      s.add_dependency(%q<liquid>, [">= 0"])
+      s.add_dependency(%q<markaby>, [">= 0"])
+      s.add_dependency(%q<maruku>, [">= 0"])
+      s.add_dependency(%q<nokogiri>, [">= 0"])
+      s.add_dependency(%q<radius>, [">= 0"])
+      s.add_dependency(%q<rdiscount>, [">= 0"])
+      s.add_dependency(%q<rdoc>, [">= 0"])
+      s.add_dependency(%q<redcarpet>, [">= 0"])
+      s.add_dependency(%q<sass>, [">= 0"])
+      s.add_dependency(%q<wikicloth>, [">= 0"])
+      s.add_dependency(%q<yajl-ruby>, [">= 0"])
+      s.add_dependency(%q<rdoc>, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<asciidoctor>, [">= 0.1.0"])
+    s.add_dependency(%q<RedCloth>, [">= 0"])
+    s.add_dependency(%q<bluecloth>, [">= 0"])
+    s.add_dependency(%q<builder>, [">= 0"])
+    s.add_dependency(%q<coffee-script>, [">= 0"])
+    s.add_dependency(%q<contest>, [">= 0"])
+    s.add_dependency(%q<creole>, [">= 0"])
+    s.add_dependency(%q<erubis>, [">= 0"])
+    s.add_dependency(%q<haml>, [">= 2.2.11"])
+    s.add_dependency(%q<kramdown>, [">= 0"])
+    s.add_dependency(%q<less>, [">= 0"])
+    s.add_dependency(%q<liquid>, [">= 0"])
+    s.add_dependency(%q<markaby>, [">= 0"])
+    s.add_dependency(%q<maruku>, [">= 0"])
+    s.add_dependency(%q<nokogiri>, [">= 0"])
+    s.add_dependency(%q<radius>, [">= 0"])
+    s.add_dependency(%q<rdiscount>, [">= 0"])
+    s.add_dependency(%q<rdoc>, [">= 0"])
+    s.add_dependency(%q<redcarpet>, [">= 0"])
+    s.add_dependency(%q<sass>, [">= 0"])
+    s.add_dependency(%q<wikicloth>, [">= 0"])
+    s.add_dependency(%q<yajl-ruby>, [">= 0"])
+    s.add_dependency(%q<rdoc>, [">= 0"])
+  end
+end
diff --git a/.bundle/ruby/2.0.0/bin/hikidoc b/.bundle/ruby/2.0.0/bin/hikidoc
new file mode 100755
index 0000000..bca09c9
--- /dev/null
+++ b/.bundle/ruby/2.0.0/bin/hikidoc
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'hikidoc' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'hikidoc', version
+load Gem.bin_path('hikidoc', 'hikidoc', version)
diff --git a/.bundle/ruby/2.0.0/bin/rackup b/.bundle/ruby/2.0.0/bin/rackup
new file mode 100755
index 0000000..9e6b53a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/bin/rackup
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'rack' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'rack', version
+load Gem.bin_path('rack', 'rackup', version)
diff --git a/.bundle/ruby/2.0.0/bin/rd2 b/.bundle/ruby/2.0.0/bin/rd2
new file mode 100755
index 0000000..f9653b0
--- /dev/null
+++ b/.bundle/ruby/2.0.0/bin/rd2
@@ -0,0 +1,25 @@
+#!/bin/sh
+'exec' "ruby" '-x' "$0" "$@"
+#!/Users/machu/.rbenv/versions/2.0.0-p247/bin/ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'rdtool' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'rdtool', version
+load Gem.bin_path('rdtool', 'rd2', version)
diff --git a/.bundle/ruby/2.0.0/bin/rdswap.rb b/.bundle/ruby/2.0.0/bin/rdswap.rb
new file mode 100755
index 0000000..6d3a148
--- /dev/null
+++ b/.bundle/ruby/2.0.0/bin/rdswap.rb
@@ -0,0 +1,25 @@
+#!/bin/sh
+'exec' "ruby" '-x' "$0" "$@"
+#!/Users/machu/.rbenv/versions/2.0.0-p247/bin/ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'rdtool' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'rdtool', version
+load Gem.bin_path('rdtool', 'rdswap.rb', version)
diff --git a/.bundle/ruby/2.0.0/bin/sprockets b/.bundle/ruby/2.0.0/bin/sprockets
new file mode 100755
index 0000000..046b12e
--- /dev/null
+++ b/.bundle/ruby/2.0.0/bin/sprockets
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'sprockets' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'sprockets', version
+load Gem.bin_path('sprockets', 'sprockets', version)
diff --git a/.bundle/ruby/2.0.0/bin/thor b/.bundle/ruby/2.0.0/bin/thor
new file mode 100755
index 0000000..d3446b1
--- /dev/null
+++ b/.bundle/ruby/2.0.0/bin/thor
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'thor' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'thor', version
+load Gem.bin_path('thor', 'thor', version)
diff --git a/.bundle/ruby/2.0.0/bin/tilt b/.bundle/ruby/2.0.0/bin/tilt
new file mode 100755
index 0000000..c1db0bc
--- /dev/null
+++ b/.bundle/ruby/2.0.0/bin/tilt
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by RubyGems.
+#
+# The application 'tilt' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'rubygems'
+
+version = ">= 0"
+
+if ARGV.first
+  str = ARGV.first
+  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
+  if str =~ /\A_(.*)_\z/
+    version = $1
+    ARGV.shift
+  end
+end
+
+gem 'tilt', version
+load Gem.bin_path('tilt', 'tilt', version)
diff --git a/vendor/json_pure-1.7.7/TODO b/.bundle/ruby/2.0.0/build_info/fastimage-1.5.0.info
similarity index 100%
copy from vendor/json_pure-1.7.7/TODO
copy to .bundle/ruby/2.0.0/build_info/fastimage-1.5.0.info
diff --git a/vendor/json_pure-1.7.7/TODO b/.bundle/ruby/2.0.0/build_info/hike-1.2.3.info
similarity index 100%
copy from vendor/json_pure-1.7.7/TODO
copy to .bundle/ruby/2.0.0/build_info/hike-1.2.3.info
diff --git a/vendor/json_pure-1.7.7/TODO b/.bundle/ruby/2.0.0/build_info/hikidoc-0.0.6.info
similarity index 100%
copy from vendor/json_pure-1.7.7/TODO
copy to .bundle/ruby/2.0.0/build_info/hikidoc-0.0.6.info
diff --git a/vendor/json_pure-1.7.7/TODO b/.bundle/ruby/2.0.0/build_info/multi_json-1.7.7.info
similarity index 100%
copy from vendor/json_pure-1.7.7/TODO
copy to .bundle/ruby/2.0.0/build_info/multi_json-1.7.7.info
diff --git a/vendor/json_pure-1.7.7/TODO b/.bundle/ruby/2.0.0/build_info/rack-1.5.2.info
similarity index 100%
copy from vendor/json_pure-1.7.7/TODO
copy to .bundle/ruby/2.0.0/build_info/rack-1.5.2.info
diff --git a/vendor/json_pure-1.7.7/TODO b/.bundle/ruby/2.0.0/build_info/rdtool-0.6.38.info
similarity index 100%
copy from vendor/json_pure-1.7.7/TODO
copy to .bundle/ruby/2.0.0/build_info/rdtool-0.6.38.info
diff --git a/vendor/json_pure-1.7.7/TODO b/.bundle/ruby/2.0.0/build_info/sprockets-2.10.0.info
similarity index 100%
copy from vendor/json_pure-1.7.7/TODO
copy to .bundle/ruby/2.0.0/build_info/sprockets-2.10.0.info
diff --git a/vendor/json_pure-1.7.7/TODO b/.bundle/ruby/2.0.0/build_info/thor-0.18.1.info
similarity index 100%
copy from vendor/json_pure-1.7.7/TODO
copy to .bundle/ruby/2.0.0/build_info/thor-0.18.1.info
diff --git a/vendor/json_pure-1.7.7/TODO b/.bundle/ruby/2.0.0/build_info/tilt-1.4.1.info
similarity index 100%
rename from vendor/json_pure-1.7.7/TODO
rename to .bundle/ruby/2.0.0/build_info/tilt-1.4.1.info
diff --git a/.bundle/ruby/2.0.0/cache/fastimage-1.5.0.gem b/.bundle/ruby/2.0.0/cache/fastimage-1.5.0.gem
new file mode 100644
index 0000000..5dbf441
Binary files /dev/null and b/.bundle/ruby/2.0.0/cache/fastimage-1.5.0.gem differ
diff --git a/.bundle/ruby/2.0.0/cache/hike-1.2.3.gem b/.bundle/ruby/2.0.0/cache/hike-1.2.3.gem
new file mode 100644
index 0000000..3dd8fe7
Binary files /dev/null and b/.bundle/ruby/2.0.0/cache/hike-1.2.3.gem differ
diff --git a/.bundle/ruby/2.0.0/cache/hikidoc-0.0.6.gem b/.bundle/ruby/2.0.0/cache/hikidoc-0.0.6.gem
new file mode 100644
index 0000000..d9723c1
Binary files /dev/null and b/.bundle/ruby/2.0.0/cache/hikidoc-0.0.6.gem differ
diff --git a/.bundle/ruby/2.0.0/cache/multi_json-1.7.7.gem b/.bundle/ruby/2.0.0/cache/multi_json-1.7.7.gem
new file mode 100644
index 0000000..ca25c16
Binary files /dev/null and b/.bundle/ruby/2.0.0/cache/multi_json-1.7.7.gem differ
diff --git a/.bundle/ruby/2.0.0/cache/rack-1.5.2.gem b/.bundle/ruby/2.0.0/cache/rack-1.5.2.gem
new file mode 100644
index 0000000..e1f7bfd
Binary files /dev/null and b/.bundle/ruby/2.0.0/cache/rack-1.5.2.gem differ
diff --git a/.bundle/ruby/2.0.0/cache/rdtool-0.6.38.gem b/.bundle/ruby/2.0.0/cache/rdtool-0.6.38.gem
new file mode 100644
index 0000000..f2da176
Binary files /dev/null and b/.bundle/ruby/2.0.0/cache/rdtool-0.6.38.gem differ
diff --git a/.bundle/ruby/2.0.0/cache/sprockets-2.10.0.gem b/.bundle/ruby/2.0.0/cache/sprockets-2.10.0.gem
new file mode 100644
index 0000000..c15b00c
Binary files /dev/null and b/.bundle/ruby/2.0.0/cache/sprockets-2.10.0.gem differ
diff --git a/.bundle/ruby/2.0.0/cache/thor-0.18.1.gem b/.bundle/ruby/2.0.0/cache/thor-0.18.1.gem
new file mode 100644
index 0000000..9fd0308
Binary files /dev/null and b/.bundle/ruby/2.0.0/cache/thor-0.18.1.gem differ
diff --git a/.bundle/ruby/2.0.0/cache/tilt-1.4.1.gem b/.bundle/ruby/2.0.0/cache/tilt-1.4.1.gem
new file mode 100644
index 0000000..3ad79a9
Binary files /dev/null and b/.bundle/ruby/2.0.0/cache/tilt-1.4.1.gem differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/MIT-LICENSE b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/MIT-LICENSE
new file mode 100644
index 0000000..24a670f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/MIT-LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2008-2013 Stephen Sykes
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/README.textile b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/README.textile
new file mode 100644
index 0000000..3cc072f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/README.textile
@@ -0,0 +1,119 @@
+h1. FastImage
+
+h4. FastImage finds the size or type of an image given its uri by fetching as little as needed
+
+h2. The problem
+
+Your app needs to find the size or type of an image.  This could be for adding width and height attributes to an image tag, for adjusting layouts or overlays to fit an image or any other of dozens of reasons.
+
+But the image is not locally stored - it's on another asset server, or in the cloud - at Amazon S3 for example.
+
+You don't want to download the entire image to your app server - it could be many tens of kilobytes, or even megabytes just to get this information.  For most common image types (GIF, PNG, BMP), the size of the image is simply stored at the start of the file.  For JPEG files it's a little bit more complex, but even so you do not need to fetch much of the image to find the size.
+
+FastImage does this minimal fetch for image types GIF, JPEG, PNG, TIFF and BMP.  And it doesn't rely on installing external libraries such as RMagick (which relies on ImageMagick or GraphicsMagick) or ImageScience (which relies on FreeImage).
+
+You only need supply the uri, and FastImage will do the rest.
+
+h2. Features
+
+Fastimage can also read local (and other) files, and uses the open-uri library to do so.
+
+FastImage will automatically read from any object that responds to :read - for
+instance an IO object if that is passed instead of a URI.
+
+FastImage will follow up to 4 HTTP redirects to get the image.
+
+FastImage will obey the http_proxy setting in your environment to route requests via a proxy.
+
+You can add a timeout to the request which will limit the request time by passing :timeout => number_of_seconds.
+
+FastImage normally replies will nil if it encounters an error, but you can pass :raise_on_failure => true to get an exception.
+
+h2. Examples
+
+<pre lang="ruby"><code>
+require 'fastimage'
+
+FastImage.size("http://stephensykes.com/images/ss.com_x.gif")
+=> [266, 56]  # width, height
+FastImage.type("http://stephensykes.com/images/pngimage")
+=> :png
+FastImage.type("/some/local/file.gif")
+=> :gif
+FastImage.size("http://upload.wikimedia.org/wikipedia/commons/b/b4/Mardin_1350660_1350692_33_images.jpg", :raise_on_failure=>true, :timeout=>0.1)
+=> FastImage::ImageFetchFailure: FastImage::ImageFetchFailure
+FastImage.size("http://upload.wikimedia.org/wikipedia/commons/b/b4/Mardin_1350660_1350692_33_images.jpg", :raise_on_failure=>true, :timeout=>2.0)
+=> [9545, 6623]
+</code></pre>
+
+h2. Installation
+
+h4. Gem
+
+bc. gem install fastimage
+
+h4. Rails
+
+Install the gem as above, and add it to your Gemfile.
+
+Then you're off - just use @FastImage.size()@ and @FastImage.type()@ in your code as in the examples.
+
+h2. Documentation
+
+"http://sdsykes.github.io/fastimage/rdoc/FastImage.html":http://sdsykes.github.io/fastimage/rdoc/FastImage.html
+
+h2. Benchmark
+
+It's way faster than conventional methods (for example the image_size gem) for most types of file when fetching over the wire.
+
+<pre lang="ruby"><code>
+irb> uri = "http://upload.wikimedia.org/wikipedia/commons/b/b4/Mardin_1350660_1350692_33_images.jpg"
+irb> puts Benchmark.measure {open(uri, 'rb') {|fh| p ImageSize.new(fh).size}}
+[9545, 6623]
+  0.680000   0.250000   0.930000 (  7.571887)
+  
+irb> puts Benchmark.measure {p FastImage.size(uri)}
+[9545, 6623]
+  0.010000   0.000000   0.010000 (  0.090640)
+</code></pre>
+
+The file is fetched in about 7.5 seconds in this test (the number in brackets is the total time taken), but as FastImage doesn't need to fetch the whole thing, it completes in less than 0.1s.
+
+You'll see similar excellent results for the other file types, except for TIFF. Unfortunately TIFFs tend to have their
+metadata towards the end of the file, so it makes little difference to do a minimal fetch. The result shown below is
+mostly dependent on the exact internet conditions during the test, and little to do with the library used.
+
+<pre lang="ruby"><code>
+irb> uri = "http://upload.wikimedia.org/wikipedia/commons/1/11/Shinbutsureijoushuincho.tiff"
+irb> puts Benchmark.measure {open(uri, 'rb') {|fh| p ImageSize.new(fh).size}}
+[1120, 1559]
+  1.080000   0.370000   1.450000 ( 13.766962)
+  
+irb> puts Benchmark.measure {p FastImage.size(uri)}
+[1120, 1559]
+  3.490000   3.810000   7.300000 ( 11.754315)
+</code></pre>
+
+h2. Tests
+
+You'll need to @gem install fakeweb@ to be able to run the tests.
+
+bc.. $ ruby test.rb 
+Run options: 
+
+# Running tests:
+
+Finished tests in 1.033640s, 23.2189 tests/s, 82.2337 assertions/s.             
+24 tests, 85 assertions, 0 failures, 0 errors, 0 skips
+
+h2. References
+
+* "Pennysmalls - Find jpeg dimensions fast in pure Ruby, no image library needed":http://pennysmalls.wordpress.com/2008/08/19/find-jpeg-dimensions-fast-in-pure-ruby-no-ima/
+* "DZone - Determine Image Size":http://snippets.dzone.com/posts/show/805
+* "Antti Kupila - Getting JPG dimensions with AS3 without loading the entire file":http://www.anttikupila.com/flash/getting-jpg-dimensions-with-as3-without-loading-the-entire-file/
+* "imagesize gem documentation":http://imagesize.rubyforge.org/
+* "EXIF Reader":https://github.com/remvee/exifr
+
+h2. Licence
+
+MIT, see file "MIT-LICENSE":MIT-LICENSE
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/lib/fastimage.rb b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/lib/fastimage.rb
new file mode 100644
index 0000000..2c0838c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/lib/fastimage.rb
@@ -0,0 +1,478 @@
+# coding: ASCII-8BIT
+
+# FastImage finds the size or type of an image given its uri.
+# It is careful to only fetch and parse as much of the image as is needed to determine the result.
+# It does this by using a feature of Net::HTTP that yields strings from the resource being fetched
+# as soon as the packets arrive.
+#
+# No external libraries such as ImageMagick are used here, this is a very lightweight solution to 
+# finding image information.
+#
+# FastImage knows about GIF, JPEG, BMP, TIFF and PNG files.
+#
+# FastImage can also read files from the local filesystem by supplying the path instead of a uri.
+# In this case FastImage uses the open-uri library to read the file in chunks of 256 bytes until
+# it has enough. This is possibly a useful bandwidth-saving feature if the file is on a network
+# attached disk rather than truly local.
+#
+# New in v1.2.9, FastImage will automatically read from any object that responds to :read - for 
+# instance an IO object if that is passed instead of a URI.
+#
+# New in v1.2.10 FastImage will follow up to 4 HTTP redirects to get the image.
+#
+# === Examples
+#   require 'fastimage'
+#
+#   FastImage.size("http://stephensykes.com/images/ss.com_x.gif")
+#   => [266, 56]
+#   FastImage.type("http://stephensykes.com/images/pngimage")
+#   => :png
+#   FastImage.type("/some/local/file.gif")
+#   => :gif
+#   File.open("/some/local/file.gif", "r") {|io| FastImage.type(io)}
+#   => :gif
+#
+# === References
+# * http://snippets.dzone.com/posts/show/805
+# * http://www.anttikupila.com/flash/getting-jpg-dimensions-with-as3-without-loading-the-entire-file/
+# * http://pennysmalls.wordpress.com/2008/08/19/find-jpeg-dimensions-fast-in-pure-ruby-no-ima/
+# * http://imagesize.rubyforge.org/
+# * https://github.com/remvee/exifr
+#
+
+require 'net/https'
+require 'open-uri'
+require 'fastimage/fbr.rb'
+
+class FastImage
+  attr_reader :size, :type
+  
+  attr_reader :bytes_read
+
+  class FastImageException < StandardError # :nodoc:
+  end
+  class MoreCharsNeeded < FastImageException # :nodoc:
+  end
+  class UnknownImageType < FastImageException # :nodoc:
+  end
+  class ImageFetchFailure < FastImageException # :nodoc:
+  end
+  class SizeNotFound < FastImageException # :nodoc:
+  end
+  class CannotParseImage < FastImageException # :nodoc:
+  end
+
+  DefaultTimeout = 2
+  
+  LocalFileChunkSize = 256
+
+  # Returns an array containing the width and height of the image.
+  # It will return nil if the image could not be fetched, or if the image type was not recognised.
+  #
+  # By default there is a timeout of 2 seconds for opening and reading from a remote server.
+  # This can be changed by passing a :timeout => number_of_seconds in the options.
+  #
+  # If you wish FastImage to raise if it cannot size the image for any reason, then pass
+  # :raise_on_failure => true in the options.
+  #
+  # FastImage knows about GIF, JPEG, BMP, TIFF and PNG files.
+  #
+  # === Example
+  #
+  #   require 'fastimage'
+  #
+  #   FastImage.size("http://stephensykes.com/images/ss.com_x.gif")
+  #   => [266, 56]
+  #   FastImage.size("http://stephensykes.com/images/pngimage")
+  #   => [16, 16]
+  #   FastImage.size("http://farm4.static.flickr.com/3023/3047236863_9dce98b836.jpg")
+  #   => [500, 375]
+  #   FastImage.size("http://www-ece.rice.edu/~wakin/images/lena512.bmp")
+  #   => [512, 512]
+  #   FastImage.size("test/fixtures/test.jpg")
+  #   => [882, 470]
+  #   FastImage.size("http://pennysmalls.com/does_not_exist")
+  #   => nil
+  #   FastImage.size("http://pennysmalls.com/does_not_exist", :raise_on_failure=>true)
+  #   => raises FastImage::ImageFetchFailure
+  #   FastImage.size("http://stephensykes.com/favicon.ico", :raise_on_failure=>true)
+  #   => raises FastImage::UnknownImageType
+  #   FastImage.size("http://stephensykes.com/favicon.ico", :raise_on_failure=>true, :timeout=>0.01)
+  #   => raises FastImage::ImageFetchFailure
+  #   FastImage.size("http://stephensykes.com/images/faulty.jpg", :raise_on_failure=>true)
+  #   => raises FastImage::SizeNotFound
+  #
+  # === Supported options
+  # [:timeout]
+  #   Overrides the default timeout of 2 seconds.  Applies both to reading from and opening the http connection.
+  # [:raise_on_failure]
+  #   If set to true causes an exception to be raised if the image size cannot be found for any reason.
+  #
+  def self.size(uri, options={})
+    new(uri, options).size
+  end
+
+  # Returns an symbol indicating the image type fetched from a uri.
+  # It will return nil if the image could not be fetched, or if the image type was not recognised.
+  #
+  # By default there is a timeout of 2 seconds for opening and reading from a remote server.
+  # This can be changed by passing a :timeout => number_of_seconds in the options.
+  #
+  # If you wish FastImage to raise if it cannot find the type of the image for any reason, then pass
+  # :raise_on_failure => true in the options.
+  #
+  # === Example
+  #
+  #   require 'fastimage'
+  #
+  #   FastImage.type("http://stephensykes.com/images/ss.com_x.gif")
+  #   => :gif
+  #   FastImage.type("http://stephensykes.com/images/pngimage")
+  #   => :png
+  #   FastImage.type("http://farm4.static.flickr.com/3023/3047236863_9dce98b836.jpg")
+  #   => :jpeg
+  #   FastImage.type("http://www-ece.rice.edu/~wakin/images/lena512.bmp")
+  #   => :bmp
+  #   FastImage.type("test/fixtures/test.jpg")
+  #   => :jpeg
+  #   FastImage.type("http://pennysmalls.com/does_not_exist")
+  #   => nil
+  #   File.open("/some/local/file.gif", "r") {|io| FastImage.type(io)}
+  #   => :gif
+  #   FastImage.type("test/fixtures/test.tiff")
+  #   => :tiff
+  #
+  # === Supported options
+  # [:timeout]
+  #   Overrides the default timeout of 2 seconds.  Applies both to reading from and opening the http connection.
+  # [:raise_on_failure]
+  #   If set to true causes an exception to be raised if the image type cannot be found for any reason.
+  #
+  def self.type(uri, options={})
+    new(uri, options.merge(:type_only=>true)).type
+  end
+
+  def initialize(uri, options={})
+    @property = options[:type_only] ? :type : :size
+    @timeout = options[:timeout] || DefaultTimeout
+    @uri = uri
+
+    if uri.respond_to?(:read)
+      fetch_using_read(uri)
+    else
+      begin
+        @parsed_uri = URI.parse(uri)
+      rescue URI::InvalidURIError
+        fetch_using_open_uri
+      else
+        if @parsed_uri.scheme == "http" || @parsed_uri.scheme == "https"
+          fetch_using_http
+        else
+          fetch_using_open_uri
+        end
+      end
+    end
+    
+    uri.rewind if uri.respond_to?(:rewind)
+    
+    raise SizeNotFound if options[:raise_on_failure] && @property == :size && !@size
+  
+  rescue Timeout::Error, SocketError, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ECONNRESET, 
+    ImageFetchFailure, Net::HTTPBadResponse, EOFError, Errno::ENOENT
+    raise ImageFetchFailure if options[:raise_on_failure]
+  rescue NoMethodError  # 1.8.7p248 can raise this due to a net/http bug
+    raise ImageFetchFailure if options[:raise_on_failure]
+  rescue UnknownImageType
+    raise UnknownImageType if options[:raise_on_failure]
+  rescue CannotParseImage
+    if options[:raise_on_failure]
+      if @property == :size
+        raise SizeNotFound
+      else
+        raise ImageFetchFailure
+      end
+    end
+    
+  end
+
+  private
+
+  def fetch_using_http
+    @redirect_count = 0
+
+    fetch_using_http_from_parsed_uri
+  end
+  
+  def fetch_using_http_from_parsed_uri
+    setup_http
+    @http.request_get(@parsed_uri.request_uri, 'Accept-Encoding' => 'identity') do |res|
+      if res.is_a?(Net::HTTPRedirection) && @redirect_count < 4
+        @redirect_count += 1
+        begin
+          @parsed_uri = URI.parse(res['Location'])
+        rescue URI::InvalidURIError
+        else
+          fetch_using_http_from_parsed_uri
+          break
+        end
+      end
+
+      raise ImageFetchFailure unless res.is_a?(Net::HTTPSuccess)
+
+      @read_fiber = Fiber.new do
+        res.read_body do |str|
+          Fiber.yield str
+        end
+      end
+      
+      parse_packets
+      
+      break  # needed to actively quit out of the fetch
+    end
+  end
+
+  def proxy_uri
+    begin
+      proxy = ENV['http_proxy'] && ENV['http_proxy'] != "" ? URI.parse(ENV['http_proxy']) : nil
+    rescue URI::InvalidURIError
+      proxy = nil
+    end
+    proxy
+  end
+
+  def setup_http
+    proxy = proxy_uri
+
+    if proxy
+      @http = Net::HTTP::Proxy(proxy.host, proxy.port).new(@parsed_uri.host, @parsed_uri.port)
+    else
+      @http = Net::HTTP.new(@parsed_uri.host, @parsed_uri.port)
+    end
+    
+    @http.use_ssl = (@parsed_uri.scheme == "https")
+    @http.verify_mode = OpenSSL::SSL::VERIFY_NONE
+    @http.open_timeout = @timeout
+    @http.read_timeout = @timeout
+  end
+
+  def fetch_using_read(readable)
+    @read_fiber = Fiber.new do
+      while str = readable.read(LocalFileChunkSize)
+        Fiber.yield str
+      end
+    end
+    
+    parse_packets
+  end
+
+  def fetch_using_open_uri
+    open(@uri) do |s|
+      fetch_using_read(s)
+    end
+  end
+
+  def parse_packets
+    @str = ""
+    @str.force_encoding("ASCII-8BIT") if has_encoding?
+    @strpos = 0
+    @bytes_read = 0
+    @bytes_delivered = 0
+    
+    begin
+      result = send("parse_#{@property}")
+      if result 
+        instance_variable_set("@#{@property}", result)
+      else
+        raise CannotParseImage
+      end
+    rescue FiberError
+      raise CannotParseImage
+    end
+  end
+
+  def parse_size
+    @type = parse_type unless @type
+    @strpos = 0
+    @bytes_delivered = 0
+    send("parse_size_for_#{@type}")
+  end
+
+  def has_encoding?
+    if @has_encoding.nil?
+      @has_encoding = String.new.respond_to? :force_encoding
+    else
+      @has_encoding
+    end
+  end
+
+  def get_chars(n)
+    while @strpos + n - 1 >= @str.size
+      unused_str = @str[@strpos..-1]
+      new_string = @read_fiber.resume
+      raise CannotParseImage if !new_string
+
+      # we are dealing with bytes here, so force the encoding
+      if has_encoding?
+        new_string.force_encoding("ASCII-8BIT")
+      end
+
+      @bytes_read += new_string.size
+      
+      @str = unused_str + new_string
+      @strpos = 0
+    end
+    
+    result = @str[@strpos..(@strpos + n - 1)]
+    @strpos += n
+    @bytes_delivered += n
+    result
+  end
+
+  def get_byte
+    get_chars(1).unpack("C")[0]
+  end
+
+  def read_int(str)
+    size_bytes = str.unpack("CC")
+    (size_bytes[0] << 8) + size_bytes[1]
+  end
+
+  def parse_type
+    case get_chars(2)
+    when "BM"
+      :bmp
+    when "GI"
+      :gif
+    when 0xff.chr + 0xd8.chr
+      :jpeg
+    when 0x89.chr + "P"
+      :png
+    when "II"
+      :tiff
+    when "MM"
+      :tiff
+    else
+      raise UnknownImageType
+    end
+  end
+
+  def parse_size_for_gif
+    get_chars(11)[6..10].unpack('SS')
+  end
+
+  def parse_size_for_png
+    get_chars(25)[16..24].unpack('NN')
+  end
+
+  def parse_size_for_jpeg
+    loop do
+      @state = case @state
+      when nil
+        get_chars(2)
+        :started
+      when :started
+        get_byte == 0xFF ? :sof : :started
+      when :sof
+        case get_byte
+        when 0xe1 # APP1
+          skip_chars = read_int(get_chars(2)) - 2
+          skip_from = @bytes_delivered
+          if get_chars(4) == "Exif"
+            get_chars(2)
+            parse_exif
+          end
+          get_chars(skip_chars - (@bytes_delivered - skip_from))
+          :started
+        when 0xe0..0xef
+          :skipframe
+        when 0xC0..0xC3, 0xC5..0xC7, 0xC9..0xCB, 0xCD..0xCF
+          :readsize
+        when 0xFF
+          :sof
+        else
+          :skipframe
+        end
+      when :skipframe
+        skip_chars = read_int(get_chars(2)) - 2
+        get_chars(skip_chars)
+        :started
+      when :readsize
+        s = get_chars(7)
+        if @exif_orientation && @exif_orientation >= 5
+          return [read_int(s[3..4]), read_int(s[5..6])]
+        else
+          return [read_int(s[5..6]), read_int(s[3..4])]
+        end          
+      end
+    end
+  end
+
+  def parse_size_for_bmp
+    d = get_chars(29)[14..28]
+    d.unpack("C")[0] == 40 ? d[4..-1].unpack('LL') : d[4..8].unpack('SS')
+  end
+
+  def get_exif_byte_order
+    byte_order = get_chars(2)
+    case byte_order
+    when 'II'
+      @short, @long = 'v', 'V'
+    when 'MM'
+      @short, @long = 'n', 'N'
+    else
+      raise CannotParseImage
+    end
+  end
+
+  def parse_exif_ifd
+    tag_count = get_chars(2).unpack(@short)[0]
+    tag_count.downto(1) do
+      type = get_chars(2).unpack(@short)[0]
+      get_chars(6)
+      data = get_chars(2).unpack(@short)[0]
+      case type
+      when 0x0100 # image width
+        @exif_width = data
+      when 0x0101 # image height
+        @exif_height = data
+      when 0x0112 # orientation
+        @exif_orientation = data
+      end
+      if @type == :tiff && @exif_width && @exif_height && @exif_orientation
+        return # no need to parse more
+      end
+      get_chars(2)
+    end
+
+    next_offset = get_chars(4).unpack(@long)[0]
+    if next_offset > 0
+      get_chars(next_offset - (@bytes_delivered - @exif_start_byte))
+      parse_exif_ifd
+    end
+  end
+
+  def parse_exif
+    @exif_start_byte = @bytes_delivered
+    
+    get_exif_byte_order
+    
+    get_chars(2) # 42
+
+    offset = get_chars(4).unpack(@long)[0]
+    get_chars(offset - 8)
+
+    parse_exif_ifd
+  end
+
+  def parse_size_for_tiff
+    parse_exif
+
+    if @exif_orientation && @exif_orientation >= 5
+      return [@exif_height, @exif_width]
+    else
+      return [@exif_width, @exif_height]
+    end
+
+    raise CannotParseImage
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/lib/fastimage/fbr.rb b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/lib/fastimage/fbr.rb
new file mode 100644
index 0000000..cbb0efc
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/lib/fastimage/fbr.rb
@@ -0,0 +1,67 @@
+# Poor Man's Fiber (API compatible Thread based Fiber implementation for Ruby 1.8)
+# (c) 2008 Aman Gupta (tmm1)
+
+unless defined? Fiber
+  require 'thread'
+
+  class FiberError < StandardError; # :nodoc:
+  end
+
+  class Fiber # :nodoc:
+    def initialize
+      raise ArgumentError, 'new Fiber requires a block' unless block_given?
+
+      @yield = Queue.new
+      @resume = Queue.new
+
+      @thread = Thread.new{ @yield.push [yield(*@resume.pop)] }
+      @thread.abort_on_exception = true
+      @thread[:fiber] = self
+    end
+    attr_reader :thread
+
+    def resume *args
+      raise FiberError, 'dead fiber called' unless @thread.alive?
+      @resume.push(args)
+      result = @yield.pop
+      result.size > 1 ? result : result.first
+    end
+
+    def yield *args
+      @yield.push(args)
+      result = @resume.pop
+      result.size > 1 ? result : result.first
+    end
+
+    def self.yield *args
+      if fiber = Thread.current[:fiber]
+        fiber.yield(*args)
+      else
+        raise FiberError, 'not inside a fiber'
+      end
+    end
+
+    def self.current
+      if Thread.current == Thread.main
+        return Thread.main[:fiber] ||= RootFiber.new
+      end
+
+      Thread.current[:fiber] or raise FiberError, 'not inside a fiber'
+    end
+
+    def inspect
+      "#<#{self.class}:0x#{self.object_id.to_s(16)}>"
+    end
+  end
+
+  class RootFiber < Fiber # :nodoc:
+    def initialize
+      # XXX: what is a root fiber anyway?
+    end
+
+    def self.yield *args
+      raise FiberError, "can't yield from root fiber"
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/exif_orientation.jpg b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/exif_orientation.jpg
new file mode 100644
index 0000000..55bb114
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/exif_orientation.jpg differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/faulty.jpg b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/faulty.jpg
new file mode 100644
index 0000000..d7f6db0
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/faulty.jpg differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/folder with spaces/test.bmp b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/folder with spaces/test.bmp
new file mode 100644
index 0000000..0e1da1b
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/folder with spaces/test.bmp differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.bmp b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.bmp
new file mode 100644
index 0000000..0e1da1b
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.bmp differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.gif b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.gif
new file mode 100644
index 0000000..f775284
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.gif differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.ico b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.ico
new file mode 100644
index 0000000..e08bf55
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.ico differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.jpg b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.jpg
new file mode 100644
index 0000000..77b3171
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.jpg differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.png b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.png
new file mode 100644
index 0000000..202d468
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.png differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.tiff b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.tiff
new file mode 100644
index 0000000..bd70832
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test.tiff differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test2.jpg b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test2.jpg
new file mode 100644
index 0000000..467a0a2
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test2.jpg differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test2.tiff b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test2.tiff
new file mode 100644
index 0000000..730d10f
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test2.tiff differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test3.jpg b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test3.jpg
new file mode 100644
index 0000000..7325d67
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/fixtures/test3.jpg differ
diff --git a/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/test.rb b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/test.rb
new file mode 100644
index 0000000..fa9e53b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/fastimage-1.5.0/test/test.rb
@@ -0,0 +1,218 @@
+require 'rubygems'
+
+require 'test/unit'
+
+PathHere = File.dirname(__FILE__)
+$LOAD_PATH.unshift File.join(PathHere, "..", "lib")
+
+require 'fastimage'
+require 'fakeweb'
+
+FixturePath = File.join(PathHere, "fixtures")
+
+GoodFixtures = {
+  "test.bmp"=>[:bmp, [40, 27]],
+  "test.gif"=>[:gif, [17, 32]],
+  "test.jpg"=>[:jpeg, [882, 470]],
+  "test.png"=>[:png, [30, 20]],
+  "test2.jpg"=>[:jpeg, [250, 188]],
+  "test3.jpg"=>[:jpeg, [630, 367]],
+  "test.tiff"=>[:tiff, [85, 67]],
+  "test2.tiff"=>[:tiff, [333, 225]],
+  "exif_orientation.jpg"=>[:jpeg, [2448, 3264]]
+  }
+
+BadFixtures = [
+  "faulty.jpg",
+  "test.ico"
+]
+
+TestUrl = "http://example.nowhere/"
+
+# this image fetch allows me to really test that fastimage is truly fast
+# but it's not ideal relying on external resources and connectivity speed
+LargeImage = "http://upload.wikimedia.org/wikipedia/commons/b/b4/Mardin_1350660_1350692_33_images.jpg"
+LargeImageInfo = [:jpeg, [9545, 6623]]
+LargeImageFetchLimit = 2  # seconds
+
+GoodFixtures.each do |fn, info|
+  FakeWeb.register_uri(:get, "#{TestUrl}#{fn}", :body => File.join(FixturePath, fn))
+end
+BadFixtures.each do |fn|
+  FakeWeb.register_uri(:get, "#{TestUrl}#{fn}", :body => File.join(FixturePath, fn))
+end
+
+class FastImageTest < Test::Unit::TestCase
+  def test_should_report_type_correctly
+    GoodFixtures.each do |fn, info|
+      assert_equal info[0], FastImage.type(TestUrl + fn)
+      assert_equal info[0], FastImage.type(TestUrl + fn, :raise_on_failure=>true)
+    end
+  end
+
+  def test_should_report_size_correctly
+    GoodFixtures.each do |fn, info|
+      assert_equal info[1], FastImage.size(TestUrl + fn)
+      assert_equal info[1], FastImage.size(TestUrl + fn, :raise_on_failure=>true)
+    end    
+  end
+
+  def test_should_return_nil_on_fetch_failure
+    assert_nil FastImage.size(TestUrl + "does_not_exist")
+  end
+  
+  def test_should_return_nil_for_faulty_jpeg_where_size_cannot_be_found
+    assert_nil FastImage.size(TestUrl + "faulty.jpg")
+  end
+
+  def test_should_return_nil_when_image_type_not_known
+    assert_nil FastImage.size(TestUrl + "test.ico")
+  end
+  
+  def test_should_return_nil_if_timeout_occurs
+    assert_nil FastImage.size("http://example.com/does_not_exist", :timeout=>0.001)
+  end
+  
+  def test_should_raise_when_asked_to_when_size_cannot_be_found
+    assert_raises(FastImage::SizeNotFound) do
+      FastImage.size(TestUrl + "faulty.jpg", :raise_on_failure=>true)
+    end
+  end
+
+  def test_should_raise_when_asked_to_when_timeout_occurs
+    assert_raises(FastImage::ImageFetchFailure) do
+      FastImage.size("http://example.com/does_not_exist", :timeout=>0.001, :raise_on_failure=>true)
+    end
+  end
+
+  def test_should_raise_when_asked_to_when_file_does_not_exist
+    assert_raises(FastImage::ImageFetchFailure) do
+      FastImage.size("http://www.google.com/does_not_exist_at_all", :raise_on_failure=>true)
+    end
+  end
+
+  def test_should_raise_when_asked_when_image_type_not_known
+    assert_raises(FastImage::UnknownImageType) do
+      FastImage.size(TestUrl + "test.ico", :raise_on_failure=>true)
+    end
+  end
+  
+  def test_should_report_type_correctly_for_local_files
+    GoodFixtures.each do |fn, info|
+      assert_equal info[0], FastImage.type(File.join(FixturePath, fn))
+    end    
+  end
+  
+  def test_should_report_size_correctly_for_local_files
+    GoodFixtures.each do |fn, info|
+      assert_equal info[1], FastImage.size(File.join(FixturePath, fn))
+    end    
+  end
+
+  def test_should_report_type_correctly_for_ios
+    GoodFixtures.each do |fn, info|
+      File.open(File.join(FixturePath, fn), "r") do |io|
+        assert_equal info[0], FastImage.type(io)
+      end
+    end
+  end
+  
+  def test_should_report_size_correctly_for_ios
+    GoodFixtures.each do |fn, info|
+      File.open(File.join(FixturePath, fn), "r") do |io|
+        assert_equal info[1], FastImage.size(io)
+      end
+    end
+  end
+  
+  def test_should_report_size_correctly_on_io_object_twice
+    GoodFixtures.each do |fn, info|
+      File.open(File.join(FixturePath, fn), "r") do |io|
+        assert_equal info[1], FastImage.size(io)
+        assert_equal info[1], FastImage.size(io)
+      end
+    end
+  end
+
+  def test_should_report_size_correctly_for_local_files_with_path_that_has_spaces
+    Dir.chdir(PathHere) do
+      assert_equal GoodFixtures["test.bmp"][1], FastImage.size(File.join("fixtures", "folder with spaces", "test.bmp"))
+    end
+  end
+  
+  def test_should_return_nil_on_fetch_failure_for_local_path
+    assert_nil FastImage.size("does_not_exist")
+  end
+  
+  def test_should_return_nil_for_faulty_jpeg_where_size_cannot_be_found_for_local_file
+    assert_nil FastImage.size(File.join(FixturePath, "faulty.jpg"))
+  end
+
+  def test_should_return_nil_when_image_type_not_known_for_local_file
+    assert_nil FastImage.size(File.join(FixturePath, "test.ico"))
+  end
+  
+  def test_should_raise_when_asked_to_when_size_cannot_be_found_for_local_file
+    assert_raises(FastImage::SizeNotFound) do
+      FastImage.size(File.join(FixturePath, "faulty.jpg"), :raise_on_failure=>true)
+    end
+  end
+  
+  def test_should_handle_permanent_redirect
+    url = "http://example.com/foo.jpeg"
+    register_redirect(url, TestUrl + GoodFixtures.keys.first)
+    assert_equal GoodFixtures[GoodFixtures.keys.first][1], FastImage.size(url, :raise_on_failure=>true)
+  end
+
+  def test_should_handle_permanent_redirect_4_times
+    first_url = "http://example.com/foo.jpeg"
+    register_redirect(first_url, "http://example.com/foo2.jpeg")
+    register_redirect("http://example.com/foo2.jpeg", "http://example.com/foo3.jpeg")
+    register_redirect("http://example.com/foo3.jpeg", "http://example.com/foo4.jpeg")
+    register_redirect("http://example.com/foo4.jpeg", TestUrl + GoodFixtures.keys.first)
+    assert_equal GoodFixtures[GoodFixtures.keys.first][1], FastImage.size(first_url, :raise_on_failure=>true)
+  end
+
+  def test_should_raise_on_permanent_redirect_5_times
+    first_url = "http://example.com/foo.jpeg"
+    register_redirect(first_url, "http://example.com/foo2.jpeg")
+    register_redirect("http://example.com/foo2.jpeg", "http://example.com/foo3.jpeg")
+    register_redirect("http://example.com/foo3.jpeg", "http://example.com/foo4.jpeg")
+    register_redirect("http://example.com/foo4.jpeg", "http://example.com/foo5.jpeg")
+    register_redirect("http://example.com/foo5.jpeg", TestUrl + GoodFixtures.keys.first)
+    assert_raises(FastImage::ImageFetchFailure) do
+      FastImage.size(first_url, :raise_on_failure=>true)
+    end
+  end
+  
+  def register_redirect(from, to)
+    resp = Net::HTTPMovedPermanently.new(1.0, 302, "Moved")
+    resp['Location'] = to
+    FakeWeb.register_uri(:get, from, :response=>resp)
+  end
+  
+  def test_should_fetch_info_of_large_image_faster_than_downloading_the_whole_thing
+    time = Time.now
+    size = FastImage.size(LargeImage)
+    size_time = Time.now
+    assert size_time - time < LargeImageFetchLimit
+    assert_equal LargeImageInfo[1], size
+    time = Time.now
+    type = FastImage.type(LargeImage)
+    type_time = Time.now
+    assert type_time - time < LargeImageFetchLimit
+    assert_equal LargeImageInfo[0], type
+  end
+  
+  # This test doesn't actually test the proxy function, but at least
+  # it excercises the code. You could put anything in the http_proxy and it would still pass.
+  # Any ideas on how to actually test this?
+  def test_should_fetch_via_proxy
+    file = "test.gif"
+    actual_size = GoodFixtures[file][1]
+    ENV['http_proxy'] = "http://my.proxy.host:8080"
+    size = FastImage.size(TestUrl + file)
+    ENV['http_proxy'] = nil
+    assert_equal actual_size, size
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/hike-1.2.3/LICENSE b/.bundle/ruby/2.0.0/gems/hike-1.2.3/LICENSE
new file mode 100644
index 0000000..63c11cb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hike-1.2.3/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2011 Sam Stephenson
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/2.0.0/gems/hike-1.2.3/README.md b/.bundle/ruby/2.0.0/gems/hike-1.2.3/README.md
new file mode 100644
index 0000000..f2c2f24
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hike-1.2.3/README.md
@@ -0,0 +1,52 @@
+Hike
+====
+
+Hike is a Ruby library for finding files in a set of paths. Use it to
+implement search paths, load paths, and the like.
+
+# Examples
+
+Find Ruby files in this project:
+
+    trail = Hike::Trail.new "/Users/sam/Projects/hike"
+    trail.append_extension ".rb"
+    trail.append_paths "lib", "test"
+
+    trail.find "hike/trail"
+    # => "/Users/sam/Projects/hike/lib/hike/trail.rb"
+
+    trail.find "test_trail"
+    # => "/Users/sam/Projects/hike/test/test_trail.rb"
+
+Explore your Ruby load path:
+
+    trail = Hike::Trail.new "/"
+    trail.append_extensions ".rb", ".bundle"
+    trail.append_paths *$:
+
+    trail.find "net/http"
+    # => "/Users/sam/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/net/http.rb"
+
+    trail.find "strscan"
+    # => "/Users/sam/.rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/i686-darwin10.4.0/strscan.bundle"
+
+Explore your shell path:
+
+    trail = Hike::Trail.new "/"
+    trail.append_paths *ENV["PATH"].split(":")
+
+    trail.find "ls"
+    # => "/bin/ls"
+
+    trail.find "gem"
+    # => "/Users/sam/.rvm/rubies/ree-1.8.7-2010.02/bin/gem"
+
+# Installation
+
+    $ gem install hike
+
+# License
+
+Copyright (c) 2011 Sam Stephenson.
+
+Released under the MIT license. See `LICENSE` for details.
diff --git a/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike.rb b/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike.rb
new file mode 100644
index 0000000..48d46e8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike.rb
@@ -0,0 +1,9 @@
+module Hike
+  VERSION = "1.2.0"
+
+  autoload :Extensions,      "hike/extensions"
+  autoload :Index,           "hike/index"
+  autoload :NormalizedArray, "hike/normalized_array"
+  autoload :Paths,           "hike/paths"
+  autoload :Trail,           "hike/trail"
+end
diff --git a/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/extensions.rb b/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/extensions.rb
new file mode 100644
index 0000000..f32bfd8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/extensions.rb
@@ -0,0 +1,23 @@
+require 'hike/normalized_array'
+
+module Hike
+  # `Extensions` is an internal collection for tracking extension names.
+  class Extensions < NormalizedArray
+    # Extensions added to this array are normalized with a leading
+    # `.`.
+    #
+    #     extensions << "js"
+    #     extensions << ".css"
+    #
+    #     extensions
+    #     # => [".js", ".css"]
+    #
+    def normalize_element(extension)
+      if extension[/^\./]
+        extension
+      else
+        ".#{extension}"
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/index.rb b/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/index.rb
new file mode 100644
index 0000000..3838c6f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/index.rb
@@ -0,0 +1,206 @@
+require 'pathname'
+
+module Hike
+  # `Index` is an internal cached variant of `Trail`. It assumes the
+  # file system does not change between `find` calls. All `stat` and
+  # `entries` calls are cached for the lifetime of the `Index` object.
+  class Index
+    # `Index#paths` is an immutable `Paths` collection.
+    attr_reader :paths
+
+    # `Index#extensions` is an immutable `Extensions` collection.
+    attr_reader :extensions
+
+    # `Index#aliases` is an immutable `Hash` mapping an extension to
+    # an `Array` of aliases.
+    attr_reader :aliases
+
+    # `Index.new` is an internal method. Instead of constructing it
+    # directly, create a `Trail` and call `Trail#index`.
+    def initialize(root, paths, extensions, aliases)
+      @root = root
+
+      # Freeze is used here so an error is throw if a mutator method
+      # is called on the array. Mutating `@paths`, `@extensions`, or
+      # `@aliases` would have unpredictable results.
+      @paths      = paths.dup.freeze
+      @extensions = extensions.dup.freeze
+      @aliases    = aliases.inject({}) { |h, (k, a)|
+                      h[k] = a.dup.freeze; h
+                   }.freeze
+      @pathnames  = paths.map { |path| Pathname.new(path) }
+
+      @stats    = {}
+      @entries  = {}
+      @patterns = {}
+    end
+
+    # `Index#root` returns root path as a `String`. This attribute is immutable.
+    def root
+      @root.to_s
+    end
+
+    # `Index#index` returns `self` to be compatable with the `Trail` interface.
+    def index
+      self
+    end
+
+    # The real implementation of `find`. `Trail#find` generates a one
+    # time index and delegates here.
+    #
+    # See `Trail#find` for usage.
+    def find(*logical_paths, &block)
+      if block_given?
+        options = extract_options!(logical_paths)
+        base_path = Pathname.new(options[:base_path] || @root)
+
+        logical_paths.each do |logical_path|
+          logical_path = Pathname.new(logical_path.sub(/^\//, ''))
+
+          if relative?(logical_path)
+            find_in_base_path(logical_path, base_path, &block)
+          else
+            find_in_paths(logical_path, &block)
+          end
+        end
+
+        nil
+      else
+        find(*logical_paths) do |path|
+          return path
+        end
+      end
+    end
+
+    # A cached version of `Dir.entries` that filters out `.` files and
+    # `~` swap files. Returns an empty `Array` if the directory does
+    # not exist.
+    def entries(path)
+      @entries[path.to_s] ||= begin
+        pathname = Pathname.new(path)
+        if pathname.directory?
+          pathname.entries.reject { |entry| entry.to_s =~ /^\.|~$|^\#.*\#$/ }.sort
+        else
+          []
+        end
+      end
+    end
+
+    # A cached version of `File.stat`. Returns nil if the file does
+    # not exist.
+    def stat(path)
+      key = path.to_s
+      if @stats.key?(key)
+        @stats[key]
+      elsif File.exist?(path)
+        @stats[key] = File.stat(path)
+      else
+        @stats[key] = nil
+      end
+    end
+
+    protected
+      def extract_options!(arguments)
+        arguments.last.is_a?(Hash) ? arguments.pop.dup : {}
+      end
+
+      def relative?(logical_path)
+        logical_path.to_s =~ /^\.\.?\//
+      end
+
+      # Finds logical path across all `paths`
+      def find_in_paths(logical_path, &block)
+        dirname, basename = logical_path.split
+        @pathnames.each do |base_path|
+          match(base_path.join(dirname), basename, &block)
+        end
+      end
+
+      # Finds relative logical path, `../test/test_trail`. Requires a
+      # `base_path` for reference.
+      def find_in_base_path(logical_path, base_path, &block)
+        candidate = base_path.join(logical_path)
+        dirname, basename = candidate.split
+        match(dirname, basename, &block) if paths_contain?(dirname)
+      end
+
+      # Checks if the path is actually on the file system and performs
+      # any syscalls if necessary.
+      def match(dirname, basename)
+        # Potential `entries` syscall
+        matches = entries(dirname)
+
+        pattern = pattern_for(basename)
+        matches = matches.select { |m| m.to_s =~ pattern }
+
+        sort_matches(matches, basename).each do |path|
+          pathname = dirname.join(path)
+
+          # Potential `stat` syscall
+          stat = stat(pathname)
+
+          # Exclude directories
+          if stat && stat.file?
+            yield pathname.to_s
+          end
+        end
+      end
+
+      # Returns true if `dirname` is a subdirectory of any of the `paths`
+      def paths_contain?(dirname)
+        paths.any? { |path| dirname.to_s[0, path.length] == path }
+      end
+
+      # Cache results of `build_pattern_for`
+      def pattern_for(basename)
+        @patterns[basename] ||= build_pattern_for(basename)
+      end
+
+      # Returns a `Regexp` that matches the allowed extensions.
+      #
+      #     pattern_for("index.html") #=> /^index(.html|.htm)(.builder|.erb)*$/
+      def build_pattern_for(basename)
+        extname = basename.extname
+        aliases = find_aliases_for(extname)
+
+        if aliases.any?
+          basename = basename.basename(extname)
+          aliases  = [extname] + aliases
+          aliases_pattern = aliases.map { |e| Regexp.escape(e) }.join("|")
+          basename_re = Regexp.escape(basename.to_s) + "(?:#{aliases_pattern})"
+        else
+          basename_re = Regexp.escape(basename.to_s)
+        end
+
+        extension_pattern = extensions.map { |e| Regexp.escape(e) }.join("|")
+        /^#{basename_re}(?:#{extension_pattern})*$/
+      end
+
+      # Sorts candidate matches by their extension
+      # priority. Extensions in the front of the `extensions` carry
+      # more weight.
+      def sort_matches(matches, basename)
+        aliases = find_aliases_for(basename.extname)
+
+        matches.sort_by do |match|
+          extnames = match.sub(basename.to_s, '').to_s.scan(/\.[^.]+/)
+          extnames.inject(0) do |sum, ext|
+            if i = extensions.index(ext)
+              sum + i + 1
+            elsif i = aliases.index(ext)
+              sum + i + 11
+            else
+              sum
+            end
+          end
+        end
+      end
+
+      def find_aliases_for(extension)
+        @aliases.inject([]) do |aliases, (key, value)|
+          aliases.push(key) if value == extension
+          aliases
+        end
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/normalized_array.rb b/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/normalized_array.rb
new file mode 100644
index 0000000..3ba2d47
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/normalized_array.rb
@@ -0,0 +1,59 @@
+module Hike
+  # `NormalizedArray` is an internal abstract wrapper class that calls
+  # a callback `normalize_element` anytime an element is added to the
+  # Array.
+  #
+  # `Extensions` and `Paths` are subclasses of `NormalizedArray`.
+  class NormalizedArray < Array
+    def initialize
+      super()
+    end
+
+    def []=(*args)
+      value = args.pop
+
+      if value.respond_to?(:to_ary)
+        value = normalize_elements(value)
+      else
+        value = normalize_element(value)
+      end
+
+      super(*args.concat([value]))
+    end
+
+    def <<(element)
+      super normalize_element(element)
+    end
+
+    def collect!
+      super do |element|
+        result = yield element
+        normalize_element(result)
+      end
+    end
+
+    alias_method :map!, :collect!
+
+    def insert(index, *elements)
+      super index, *normalize_elements(elements)
+    end
+
+    def push(*elements)
+      super(*normalize_elements(elements))
+    end
+
+    def replace(elements)
+      super normalize_elements(elements)
+    end
+
+    def unshift(*elements)
+      super(*normalize_elements(elements))
+    end
+
+    def normalize_elements(elements)
+      elements.map do |element|
+        normalize_element(element)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/paths.rb b/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/paths.rb
new file mode 100644
index 0000000..0dad9ab
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/paths.rb
@@ -0,0 +1,27 @@
+require 'pathname'
+require 'hike/normalized_array'
+
+module Hike
+  # `Paths` is an internal collection for tracking path strings.
+  class Paths < NormalizedArray
+    def initialize(root = ".")
+      @root = Pathname.new(root)
+      super()
+    end
+
+    # Relative paths added to this array are expanded relative to `@root`.
+    #
+    #     paths = Paths.new("/usr/local")
+    #     paths << "tmp"
+    #     paths << "/tmp"
+    #
+    #     paths
+    #     # => ["/usr/local/tmp", "/tmp"]
+    #
+    def normalize_element(path)
+      path = Pathname.new(path)
+      path = @root.join(path) if path.relative?
+      path.expand_path.to_s
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/trail.rb b/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/trail.rb
new file mode 100644
index 0000000..6908491
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hike-1.2.3/lib/hike/trail.rb
@@ -0,0 +1,188 @@
+require 'pathname'
+require 'hike/extensions'
+require 'hike/index'
+require 'hike/paths'
+
+module Hike
+  # `Trail` is the public container class for holding paths and extensions.
+  class Trail
+    # `Trail#paths` is a mutable `Paths` collection.
+    #
+    #     trail = Hike::Trail.new
+    #     trail.paths.push "~/Projects/hike/lib", "~/Projects/hike/test"
+    #
+    # The order of the paths is significant. Paths in the beginning of
+    # the collection will be checked first. In the example above,
+    # `~/Projects/hike/lib/hike.rb` would shadow the existent of
+    # `~/Projects/hike/test/hike.rb`.
+    attr_reader :paths
+
+    # `Trail#extensions` is a mutable `Extensions` collection.
+    #
+    #     trail = Hike::Trail.new
+    #     trail.paths.push "~/Projects/hike/lib"
+    #     trail.extensions.push ".rb"
+    #
+    # Extensions allow you to find files by just their name omitting
+    # their extension. Is similar to Ruby's require mechanism that
+    # allows you to require files with specifiying `foo.rb`.
+    attr_reader :extensions
+
+    # `Index#aliases` is a mutable `Hash` mapping an extension to
+    # an `Array` of aliases.
+    #
+    #   trail = Hike::Trail.new
+    #   trail.paths.push "~/Projects/hike/site"
+    #   trail.aliases['.htm']   = 'html'
+    #   trail.aliases['.xhtml'] = 'html'
+    #   trail.aliases['.php']   = 'html'
+    #
+    # Aliases provide a fallback when the primary extension is not
+    # matched. In the example above, a lookup for "foo.html" will
+    # check for the existence of "foo.htm", "foo.xhtml", or "foo.php".
+    attr_reader :aliases
+
+    # A Trail accepts an optional root path that defaults to your
+    # current working directory. Any relative paths added to
+    # `Trail#paths` will expanded relative to the root.
+    def initialize(root = ".")
+      @root       = Pathname.new(root).expand_path
+      @paths      = Paths.new(@root)
+      @extensions = Extensions.new
+      @aliases    = Hash.new { |h, k| h[k] = Extensions.new }
+    end
+
+    # `Trail#root` returns root path as a `String`. This attribute is immutable.
+    def root
+      @root.to_s
+    end
+
+    # Prepend `path` to `Paths` collection
+    def prepend_paths(*paths)
+      self.paths.unshift(*paths)
+    end
+    alias_method :prepend_path, :prepend_paths
+
+    # Append `path` to `Paths` collection
+    def append_paths(*paths)
+      self.paths.push(*paths)
+    end
+    alias_method :append_path, :append_paths
+
+    # Remove `path` from `Paths` collection
+    def remove_path(path)
+      self.paths.delete(path)
+    end
+
+    # Prepend `extension` to `Extensions` collection
+    def prepend_extensions(*extensions)
+      self.extensions.unshift(*extensions)
+    end
+    alias_method :prepend_extension, :prepend_extensions
+
+    # Append `extension` to `Extensions` collection
+    def append_extensions(*extensions)
+      self.extensions.push(*extensions)
+    end
+    alias_method :append_extension, :append_extensions
+
+    # Remove `extension` from `Extensions` collection
+    def remove_extension(extension)
+      self.extensions.delete(extension)
+    end
+
+    # Alias `new_extension` to `old_extension`
+    def alias_extension(new_extension, old_extension)
+      aliases[normalize_extension(new_extension)] = normalize_extension(old_extension)
+    end
+
+    # Remove the alias for `extension`
+    def unalias_extension(extension)
+      aliases.delete(normalize_extension(extension))
+    end
+
+    # `Trail#find` returns a the expand path for a logical path in the
+    # path collection.
+    #
+    #     trail = Hike::Trail.new "~/Projects/hike"
+    #     trail.extensions.push ".rb"
+    #     trail.paths.push "lib", "test"
+    #
+    #     trail.find "hike/trail"
+    #     # => "~/Projects/hike/lib/hike/trail.rb"
+    #
+    #     trail.find "test_trail"
+    #     # => "~/Projects/hike/test/test_trail.rb"
+    #
+    # `find` accepts multiple fallback logical paths that returns the
+    # first match.
+    #
+    #     trail.find "hike", "hike/index"
+    #
+    # is equivalent to
+    #
+    #     trail.find("hike") || trail.find("hike/index")
+    #
+    # Though `find` always returns the first match, it is possible
+    # to iterate over all shadowed matches and fallbacks by supplying
+    # a block.
+    #
+    #     trail.find("hike", "hike/index") { |path| warn path }
+    #
+    # This allows you to filter your matches by any condition.
+    #
+    #     trail.find("application") do |path|
+    #       return path if mime_type_for(path) == "text/css"
+    #     end
+    #
+    def find(*args, &block)
+      index.find(*args, &block)
+    end
+
+    # `Trail#index` returns an `Index` object that has the same
+    # interface as `Trail`. An `Index` is a cached `Trail` object that
+    # does not update when the file system changes. If you are
+    # confident that you are not making changes the paths you are
+    # searching, `index` will avoid excess system calls.
+    #
+    #     index = trail.index
+    #     index.find "hike/trail"
+    #     index.find "test_trail"
+    #
+    def index
+      Index.new(root, paths, extensions, aliases)
+    end
+
+    # `Trail#entries` is equivalent to `Dir#entries`. It is not
+    # recommend to use this method for general purposes. It exists for
+    # parity with `Index#entries`.
+    def entries(path)
+      pathname = Pathname.new(path)
+      if pathname.directory?
+        pathname.entries.reject { |entry| entry.to_s =~ /^\.|~$|^\#.*\#$/ }.sort
+      else
+        []
+      end
+    end
+
+    # `Trail#stat` is equivalent to `File#stat`. It is not
+    # recommend to use this method for general purposes. It exists for
+    # parity with `Index#stat`.
+    def stat(path)
+      if File.exist?(path)
+        File.stat(path.to_s)
+      else
+        nil
+      end
+    end
+
+    private
+      def normalize_extension(extension)
+        if extension[/^\./]
+          extension
+        else
+          ".#{extension}"
+        end
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/.gitignore b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/.gitignore
new file mode 100644
index 0000000..d87d4be
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/.gitignore
@@ -0,0 +1,17 @@
+*.gem
+*.rbc
+.bundle
+.config
+.yardoc
+Gemfile.lock
+InstalledFiles
+_yardoc
+coverage
+doc/
+lib/bundler/man
+pkg
+rdoc
+spec/reports
+test/tmp
+test/version_tmp
+tmp
diff --git a/vendor/hikidoc-0.0.6/COPYING b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/COPYING
similarity index 100%
rename from vendor/hikidoc-0.0.6/COPYING
rename to .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/COPYING
diff --git a/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/Gemfile b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/Gemfile
new file mode 100644
index 0000000..1a18baa
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/Gemfile
@@ -0,0 +1,4 @@
+source 'https://rubygems.org'
+
+# Specify your gem's dependencies in hikidoc.gemspec
+gemspec
diff --git a/vendor/hikidoc-0.0.6/NEWS b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/NEWS
similarity index 100%
rename from vendor/hikidoc-0.0.6/NEWS
rename to .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/NEWS
diff --git a/vendor/hikidoc-0.0.6/NEWS.ja b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/NEWS.ja
similarity index 100%
rename from vendor/hikidoc-0.0.6/NEWS.ja
rename to .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/NEWS.ja
diff --git a/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/README b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/README
new file mode 100644
index 0000000..0b16a84
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/README
@@ -0,0 +1,87 @@
+! HikiDoc
+
+!! Introduction
+
+'HikiDoc' is a text-to-HTML conversion tool for web writers. HikiDoc
+allows you to write using an easy-to-read, easy-to-write plain text
+format, then convert it to structurally valid HTML (or XHTML).
+
+!! Requirements
+
+HikiDoc requires Ruby 1.8.2 or later.
+
+!! Download
+
+Get from the subversion repository http://hikidoc.rubyforge.org/svn/ .
+
+ (eg.)
+ svn co http://hikidoc.rubyforge.org/svn/trunk/ hikidoc
+
+!! Installation
+
+Run the 'setup.rb' script like so:
+
+ $ ruby setup.rb config
+ $ ruby setup.rb setup
+ # ruby setup.rb install
+
+!! Syntax
+
+See [[TextFormattingRules]].
+
+!! Mailing list
+
+To subscribe the HikiDoc ML, please send the following mail. English
+posts are also welcome.
+
+ To: hikidoc at ml.fdiary.net
+ Cc: kazuhiko at fdiary.net
+ Subject: subscribe        <- any subject
+ 
+ Hello.                    <- any body
+
+HikiDoc ML's archive is available at http://www.fdiary.net/ml/hikidoc/ .
+
+!! Related softwares
+
+The following softwares use the HikiDoc library or the HikiDoc format.
+
+:[[tDiary|http://www.tdiary.org/]]:a Weblog/Web-diary software
+:[[Hiki|http://hikiwiki.org/]]:a powerful and fast wiki clone
+:[[lily|http://lily.sourceforge.jp/]]:a simple CMS
+:[[Text::HikiDoc|http://search.cpan.org/perldoc?Text::HikiDoc]]:HikiDoc by Perl
+:[[PikiDoc|http://github.com/moro/piki_doc/]]:a library that you can add plugin functions on HikiDoc
+:[[mail2weblog|http://sourceforge.jp/projects/mail2weblog/wiki/FrontPage]]:a blog system via mobile phone email
+
+!! License
+
+HikiDoc's license is the 'Modified BSD License'.
+
+ Copyright (c) 2005, Kazuhiko <kazuhiko at fdiary.net>
+ 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 the HikiDoc 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
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/README.ja b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/README.ja
new file mode 100644
index 0000000..94fb2d6
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/README.ja
@@ -0,0 +1,84 @@
+! HikiDoc
+
+!! �Ϥ����
+
+'HikiDoc' �ϡ֥ƥ����Ȣ� HTML���Ѵ��ġ���Ǥ����񤭤䤹���ɤߤ䤹��ʸˡ��
+�ƥ����Ȥ�ޤȤ�� HTML (�� XHTML) ���Ѵ����ޤ���
+
+!! ɬ�פʤ��
+
+HikiDoc �μ¹Ԥˤ� Ruby 1.8.2 �ʹߤ�ɬ�פǤ���
+
+!! ���������
+
+Subversion ��ݥ��ȥ� http://hikidoc.rubyforge.org/svn/ �����������
+����������
+
+ (��)
+ svn co http://hikidoc.rubyforge.org/svn/trunk/ hikidoc
+
+!! ���󥹥ȡ���
+
+�ʲ��Τ褦�� 'setup.rb' ������ץȤ��Ѥ��ƥ��󥹥ȡ��뤷�ޤ���
+
+ $ ruby setup.rb config
+ $ ruby setup.rb setup
+ # ruby setup.rb install
+
+!! ʸˡ
+
+[[TextFormattingRules.ja]] ��������������
+
+!! �᡼��󥰥ꥹ��
+
+���ä��˾��������ϡ��ʲ��Τ褦�ʥ᡼����������Ƥ���������
+ To: hikidoc at ml.fdiary.net
+ Cc: kazuhiko at fdiary.net
+ 
+ ��ʸ�˼��ʾҲ�ʤ�
+
+���Υ᡼��� http://www.fdiary.net/ml/hikidoc/ �Ǹ������Ƥ��ޤ���
+
+!! ��Ϣ���륽�եȥ�����
+
+�ʲ��Υ��եȥ������� HikiDoc �饤�֥�ꡢ�ޤ��� HikiDoc �ե����ޥåȤ��Ѥ����Ƥ��ޤ���
+
+:[[tDiary|http://www.tdiary.org/]]:�������������եȥ�����
+:[[Hiki|http://hikiwiki.org/]]:¿��ǽ���Ĺ�®�� Wiki ������
+:[[lily|http://lily.sourceforge.jp/]]:����ץ�� CMS (Web �����ȹ��ۥ����ƥ�)
+:[[Text::HikiDoc|http://search.cpan.org/perldoc?Text::HikiDoc]]:Perl �ˤ�� HikiDoc �μ���
+:[[PikiDoc|http://github.com/moro/piki_doc/]]:HikiDoc�Ρ֥ץ饰����׵�ǽ���ɲäǤ���饤�֥��Ǥ�
+:[[mail2weblog|http://sourceforge.jp/projects/mail2weblog/wiki/FrontPage]]:�ⵡǽ�᡼����Ʒ���֥�
+
+!! �饤����
+
+Modified BSD �饤���󥹤Ǥ���
+
+ Copyright (c) 2005, Kazuhiko <kazuhiko at fdiary.net>
+ 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 the HikiDoc 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
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/Rakefile b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/Rakefile
new file mode 100644
index 0000000..2e5241a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/Rakefile
@@ -0,0 +1,8 @@
+require "bundler/gem_tasks"
+require 'rake/testtask'
+
+Rake::TestTask.new do |t|
+  t.libs << "test"
+  t.test_files = FileList['test/**/*_test.rb']
+  t.verbose = true
+end
diff --git a/vendor/hikidoc-0.0.6/TextFormattingRules b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/TextFormattingRules
similarity index 100%
rename from vendor/hikidoc-0.0.6/TextFormattingRules
rename to .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/TextFormattingRules
diff --git a/vendor/hikidoc-0.0.6/TextFormattingRules.ja b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/TextFormattingRules.ja
similarity index 100%
rename from vendor/hikidoc-0.0.6/TextFormattingRules.ja
rename to .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/TextFormattingRules.ja
diff --git a/vendor/hikidoc-0.0.6/bin/hikidoc b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/bin/hikidoc
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/hikidoc-0.0.6/bin/hikidoc
rename to .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/bin/hikidoc
diff --git a/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/hikidoc.gemspec b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/hikidoc.gemspec
new file mode 100644
index 0000000..28839bb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/hikidoc.gemspec
@@ -0,0 +1,23 @@
+# coding: utf-8
+lib = File.expand_path('../lib', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+require 'hikidoc'
+
+Gem::Specification.new do |spec|
+  spec.name          = "hikidoc"
+  spec.version       = HikiDoc::VERSION
+  spec.authors       = ['Kazuhiko', "SHIBATA Hiroshi"]
+  spec.email         = ['kazuhiko at fdiary.net', "shibata.hiroshi at gmail.com"]
+  spec.description   = %q{'HikiDoc' is a text-to-HTML conversion tool for web writers.}
+  spec.summary       = %q{'HikiDoc' is a text-to-HTML conversion tool for web writers. HikiDoc allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid HTML (or XHTML).}
+  spec.homepage      = "https://github.com/hiki/hikidoc"
+  spec.license       = "MIT"
+
+  spec.files         = `git ls-files`.split($/)
+  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
+  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
+  spec.require_paths = ["lib"]
+
+  spec.add_development_dependency "bundler"
+  spec.add_development_dependency "rake"
+end
diff --git a/vendor/hikidoc-0.0.6/lib/hikidoc.rb b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/lib/hikidoc.rb
similarity index 100%
rename from vendor/hikidoc-0.0.6/lib/hikidoc.rb
rename to .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/lib/hikidoc.rb
diff --git a/vendor/hikidoc-0.0.6/setup.rb b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/setup.rb
similarity index 100%
rename from vendor/hikidoc-0.0.6/setup.rb
rename to .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/setup.rb
diff --git a/vendor/hikidoc-0.0.6/test/test_hikidoc.rb b/.bundle/ruby/2.0.0/gems/hikidoc-0.0.6/test/hikidoc_test.rb
similarity index 100%
rename from vendor/hikidoc-0.0.6/test/test_hikidoc.rb
rename to .bundle/ruby/2.0.0/gems/hikidoc-0.0.6/test/hikidoc_test.rb
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/.document b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/.document
new file mode 100644
index 0000000..3b0c733
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/.document
@@ -0,0 +1,5 @@
+LICENSE.md
+README.md
+bin/*
+features/**/*.feature
+lib/**/*.rb
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/.rspec b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/.rspec
new file mode 100644
index 0000000..0ea59b0
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/.rspec
@@ -0,0 +1,3 @@
+--color
+--fail-fast
+--order random
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/.travis.yml b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/.travis.yml
new file mode 100644
index 0000000..72df94b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/.travis.yml
@@ -0,0 +1,11 @@
+bundler_args: --without development
+language: ruby
+rvm:
+  - rbx-18mode
+  - rbx-19mode
+  - jruby-18mode
+  - jruby-19mode
+  - 1.8.7
+  - 1.9.2
+  - 1.9.3
+  - 2.0.0
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/.yardopts b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/.yardopts
new file mode 100644
index 0000000..884b083
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/.yardopts
@@ -0,0 +1,6 @@
+--markup markdown
+-
+CHANGELOG.md
+CONTRIBUTING.md
+LICENSE.md
+README.md
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/CHANGELOG.md b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/CHANGELOG.md
new file mode 100644
index 0000000..744d918
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/CHANGELOG.md
@@ -0,0 +1,164 @@
+1.7.7
+-----
+* [Fix options caching issues](https://github.com/intridea/multi_json/commit/a3f14c3661688c5927638fa6088c7b46a67e875e)
+
+1.7.6
+-----
+* [Bring back MultiJson::VERSION constant](https://github.com/intridea/multi_json/commit/31b990c2725e6673bf8ce57540fe66b57a751a72)
+
+1.7.5
+-----
+* [Fix warning '*' interpreted as argument prefix](https://github.com/intridea/multi_json/commit/b698962c7f64430222a1f06430669706a47aff89)
+* [Remove stdlib warning](https://github.com/intridea/multi_json/commit/d06eec6b7996ac8b4ff0e2229efd835379b0c30f)
+
+1.7.4
+-----
+* [Cache options for better performance](https://github.com/intridea/multi_json/commit/8a26ee93140c4bed36194ed9fb887a1b6919257b)
+
+1.7.3
+-----
+* [Require json/ext to ensure extension version gets loaded for json_gem](https://github.com/intridea/multi_json/commit/942686f7e8597418c6f90ee69e1d45242fac07b1)
+* [Rename JrJackson](https://github.com/intridea/multi_json/commit/078de7ba8b6035343c3e96b4767549e9ec43369a)
+* [Prefer JrJackson to JSON gem if present](https://github.com/intridea/multi_json/commit/af8bd9799a66855f04b3aff1c488485950cec7bf)
+* [Print a warning if outdated gem versions are used](https://github.com/intridea/multi_json/commit/e7438e7ba2be0236cfa24c2bb9ad40ee821286d1)
+* [Loosen required_rubygems_version for compatibility with Ubuntu 10.04](https://github.com/intridea/multi_json/commit/59fad014e8fe41dbc6f09485ea0dc21fc42fd7a7)
+
+1.7.2
+-----
+* [Rename Jrjackson adapter to JrJackson](https://github.com/intridea/multi_json/commit/b36dc915fc0e6548cbad06b5db6f520e040c9c8b)
+* [Implement jrjackson -> jr_jackson alias for back-compatability](https://github.com/intridea/multi_json/commit/aa50ab8b7bb646b8b75d5d65dfeadae8248a4f10)
+* [Update vendored OkJson module](https://github.com/intridea/multi_json/commit/30a3f474e17dd86a697c3fab04f468d1a4fd69d7)
+
+1.7.1
+-----
+* [Fix capitalization of JrJackson class](https://github.com/intridea/multi_json/commit/5373a5e38c647f02427a0477cb8e0e0dafad1b8d)
+
+1.7.0
+-----
+* [Add load_options/dump_options to MultiJson](https://github.com/intridea/multi_json/commit/a153956be6b0df06ea1705ce3c1ff0b5b0e27ea5)
+* [MultiJson does not modify arguments](https://github.com/intridea/multi_json/commit/58525b01c4c2f6635ba2ac13d6fd987b79f3962f)
+* [Enable quirks_mode by default for json_gem/json_pure adapters](https://github.com/intridea/multi_json/commit/1fd4e6635c436515b7d7d5a0bee4548de8571520)
+* [Add JrJackson adapter](https://github.com/intridea/multi_json/commit/4dd86fa96300aaaf6d762578b9b31ea82adb056d)
+* [Raise ArgumentError on bad adapter input](https://github.com/intridea/multi_json/commit/911a3756bdff2cb5ac06497da3fa3e72199cb7ad)
+
+1.6.1
+-----
+* [Revert "Use JSON.generate instead of #to_json"](https://github.com/intridea/multi_json/issues/86)
+
+1.6.0
+-----
+* [Add gson.rb support](https://github.com/intridea/multi_json/pull/71)
+* [Add MultiJson.default_options](https://github.com/intridea/multi_json/pull/70)
+* [Add MultiJson.with_adapter](https://github.com/intridea/multi_json/pull/67)
+* [Stringify all possible keys for ok_json](https://github.com/intridea/multi_json/pull/66)
+* [Use JSON.generate instead of #to_json](https://github.com/intridea/multi_json/issues/73)
+* [Alias `MultiJson::DecodeError` to `MultiJson::LoadError`](https://github.com/intridea/multi_json/pull/79)
+
+1.5.1
+-----
+* [Do not allow Oj or JSON to create symbols by searching for classes](https://github.com/intridea/multi_json/commit/193e28cf4dc61b6e7b7b7d80f06f74c76df65c41)
+
+1.5.0
+-----
+* [Add `MultiJson.with_adapter` method](https://github.com/intridea/multi_json/commit/d14c5d28cae96557a0421298621b9499e1f28104)
+* [Stringify all possible keys for `ok_json`](https://github.com/intridea/multi_json/commit/73998074058e1e58c557ffa7b9541d486d6041fa)
+
+1.4.0
+-----
+* [Allow `load`/`dump` of JSON fragments](https://github.com/intridea/multi_json/commit/707aae7d48d39c85b38febbd2c210ba87f6e4a36)
+
+1.3.7
+-----
+* [Fix rescue clause for MagLev](https://github.com/intridea/multi_json/commit/39abdf50199828c50e85b2ce8f8ba31fcbbc9332)
+* [Remove unnecessary check for string version of options key](https://github.com/intridea/multi_json/commit/660101b70e962b3c007d0b90d45944fa47d13ec4)
+* [Explicitly set default adapter when adapter is set to `nil` or `false`](https://github.com/intridea/multi_json/commit/a9e587d5a63eafb4baee9fb211265e4dd96a26bc)
+* [Fix Oj `ParseError` mapping for Oj 1.4.0](https://github.com/intridea/multi_json/commit/7d9045338cc9029401c16f3c409d54ce97f275e2)
+
+1.3.6
+-----
+* [Allow adapter-specific options to be passed through to Oj](https://github.com/intridea/multi_json/commit/d0e5feeebcba0bc69400dd203a295f5c30971223)
+
+1.3.5
+-----
+* [Add pretty support to Oj adapter](https://github.com/intridea/multi_json/commit/0c8f75f03020c53bcf4c6be258faf433d24b2c2b)
+
+1.3.4
+-----
+* [Use `class << self` instead of `module_function` to create aliases](https://github.com/intridea/multi_json/commit/ba1451c4c48baa297e049889be241a424cb05980)
+
+1.3.3
+-----
+* [Remove deprecation warnings](https://github.com/intridea/multi_json/commit/36b524e71544eb0186826a891bcc03b2820a008f)
+
+1.3.2
+-----
+* [Add ability to use adapter per call](https://github.com/intridea/multi_json/commit/106bbec469d5d0a832bfa31fffcb8c0f0cdc9bd3)
+* [Add and deprecate `default_engine` method](https://github.com/intridea/multi_json/commit/fc3df0c7a3e2ab9ce0c2c7e7617a4da97dd13f6e)
+
+1.3.1
+-----
+* [Only warn once for each instance a deprecated method is called](https://github.com/intridea/multi_json/commit/e21d6eb7da74b3f283995c1d27d5880e75f0ae84)
+
+1.3.0
+-----
+* [Implement `load`/`dump`; deprecate `decode`/`encode`](https://github.com/intridea/multi_json/commit/e90fd6cb1b0293eb0c73c2f4eb0f7a1764370216)
+* [Rename engines to adapters](https://github.com/intridea/multi_json/commit/ae7fd144a7949a9c221dcaa446196ec23db908df)
+
+1.2.0
+-----
+* [Add support for Oj](https://github.com/intridea/multi_json/commit/acd06b233edabe6c44f226873db7b49dab560c60)
+
+1.1.0
+-----
+* [`NSJSONSerialization` support for MacRuby](https://github.com/intridea/multi_json/commit/f862e2fc966cac8867fe7da3997fc76e8a6cf5d4)
+
+1.0.4
+-----
+* [Set data context to `DecodeError` exception](https://github.com/intridea/multi_json/commit/19ddafd44029c6681f66fae2a0f6eabfd0f85176)
+* [Allow `ok_json` to fallback to `to_json`](https://github.com/intridea/multi_json/commit/c157240b1193b283d06d1bd4d4b5b06bcf3761f8)
+* [Add warning when using `ok_json`](https://github.com/intridea/multi_json/commit/dd4b68810c84f826fb98f9713bfb29ab96888d57)
+* [Options can be passed to an engine on encode](https://github.com/intridea/multi_json/commit/e0a7ff5d5ff621ffccc61617ed8aeec5816e81f7)
+
+1.0.3
+-----
+* [`Array` support for `stringify_keys`](https://github.com/intridea/multi_json/commit/644d1c5c7c7f6a27663b11668527b346094e38b9)
+* [`Array` support for `symbolize_keys`](https://github.com/intridea/multi_json/commit/c885377d47a2aa39cb0d971fea78db2d2fa479a7)
+
+1.0.2
+-----
+* [Allow encoding of rootless JSON when `ok_json` is used](https://github.com/intridea/multi_json/commit/d1cde7de97cb0f6152aef8daf14037521cdce8c6)
+
+1.0.1
+-----
+* [Correct an issue with `ok_json` not being returned as the default engine](https://github.com/intridea/multi_json/commit/d33c141619c54cccd770199694da8fd1bd8f449d)
+
+1.0.0
+-----
+* [Remove `ActiveSupport::JSON` support](https://github.com/intridea/multi_json/commit/c2f4140141d785a24b3f56e58811b0e561b37f6a)
+* [Fix `@engine` ivar warning](https://github.com/intridea/multi_json/commit/3b978a8995721a8dffedc3b75a7f49e5494ec553)
+* [Only `rescue` from parsing errors during decoding, not any `StandardError`](https://github.com/intridea/multi_json/commit/391d00b5e85294d42d41347605d8d46b4a7f66cc)
+* [Rename `okjson` engine and vendored lib to `ok_json`](https://github.com/intridea/multi_json/commit/5bd1afc977a8208ddb0443e1d57cb79665c019f1)
+* [Add `StringIO` support to `json` gem and `ok_json`](https://github.com/intridea/multi_json/commit/1706b11568db7f50af451fce5f4d679aeb3bbe8f)
+
+0.0.5
+-----
+* [Trap all JSON decoding errors; raise `MultiJson::DecodeError`](https://github.com/intridea/multi_json/commit/dea9a1aef6dd1212aa1e5a37ab1669f9b045b732)
+
+0.0.4
+-----
+* [Fix default_engine check for `json` gem](https://github.com/intridea/multi_json/commit/caced0c4e8c795922a109ebc00c3c4fa8635bed8)
+* [Make requirement mapper an `Array` to preserve order in Ruby versions < 1.9](https://github.com/intridea/multi_json/commit/526f5f29a42131574a088ad9bbb43d7f48439b2c)
+
+0.0.3
+-----
+* [Improve defaulting and documentation](https://github.com/sferik/twitter/commit/3a0e41b9e4b0909201045fa47704b78c9d949b73)
+
+0.0.2
+-----
+
+* [Rename to `multi_json`](https://github.com/sferik/twitter/commit/461ab89ce071c8c9fabfc183581e0ec523788b62)
+
+0.0.1
+-----
+
+* [Initial commit](https://github.com/sferik/twitter/commit/518c21ab299c500527491e6c049ab2229e22a805)
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/CONTRIBUTING.md b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/CONTRIBUTING.md
new file mode 100644
index 0000000..3e8bfd5
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/CONTRIBUTING.md
@@ -0,0 +1,46 @@
+## Contributing
+In the spirit of [free software][free-sw], **everyone** is encouraged to help
+improve this project.
+
+[free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
+
+Here are some ways *you* can contribute:
+
+* by using alpha, beta, and prerelease versions
+* by reporting bugs
+* by suggesting new features
+* by writing or editing documentation
+* by writing specifications
+* by writing code (**no patch is too small**: fix typos, add comments, clean up
+  inconsistent whitespace)
+* by refactoring code
+* by closing [issues][]
+* by reviewing patches
+
+[issues]: https://github.com/intridea/multi_json/issues
+
+## Submitting an Issue
+We use the [GitHub issue tracker][issues] to track bugs and features. Before
+submitting a bug report or feature request, check to make sure it hasn't
+already been submitted. When submitting a bug report, please include a [Gist][]
+that includes a stack trace and any details that may be necessary to reproduce
+the bug, including your gem version, Ruby version, and operating system.
+Ideally, a bug report should include a pull request with failing specs.
+
+[gist]: https://gist.github.com/
+
+## Submitting a Pull Request
+1. [Fork the repository.][fork]
+2. [Create a topic branch.][branch]
+3. Add specs for your unimplemented feature or bug fix.
+4. Run `bundle exec rake spec`. If your specs pass, return to step 3.
+5. Implement your feature or bug fix.
+6. Run `bundle exec rake spec`. If your specs fail, return to step 5.
+7. Run `open coverage/index.html`. If your changes are not completely covered
+   by your tests, return to step 3.
+8. Add, commit, and push your changes.
+9. [Submit a pull request.][pr]
+
+[fork]: http://help.github.com/fork-a-repo/
+[branch]: http://learn.github.com/p/branching.html
+[pr]: http://help.github.com/send-pull-requests/
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/Gemfile b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/Gemfile
new file mode 100644
index 0000000..af0eec5
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/Gemfile
@@ -0,0 +1,31 @@
+source 'https://rubygems.org'
+
+gem 'rake', '>= 0.9'
+gem 'yard', '>= 0.8'
+
+gem 'json',      '~> 1.4', :require => nil
+gem 'json_pure', '~> 1.4', :require => nil
+
+platforms :ruby, :mswin, :mingw do
+  gem 'oj', '~> 2.0', :require => nil
+  gem 'yajl-ruby', '~> 1.0', :require => nil
+end
+
+platforms :jruby do
+  gem 'gson', '>= 0.6', :require => nil
+  gem 'jrjackson', '~> 0.1.1', :require => nil
+end
+
+group :development do
+  gem 'kramdown', '>= 0.14'
+  gem 'pry'
+  gem 'pry-debugger', :platforms => :mri_19
+end
+
+group :test do
+  gem 'coveralls', :require => false
+  gem 'rspec', '>= 2.11'
+  gem 'simplecov', :require => false
+end
+
+gemspec
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/LICENSE.md b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/LICENSE.md
new file mode 100644
index 0000000..1768f37
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/LICENSE.md
@@ -0,0 +1,20 @@
+Copyright (c) 2010-2013 Michael Bleigh, Josh Kalderimis, Erik Michaels-Ober, Pavel Pravosud
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/README.md b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/README.md
new file mode 100644
index 0000000..57cca4b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/README.md
@@ -0,0 +1,109 @@
+# MultiJSON
+
+[![Gem Version](https://badge.fury.io/rb/multi_json.png)][gem]
+[![Build Status](https://secure.travis-ci.org/intridea/multi_json.png?branch=master)][travis]
+[![Dependency Status](https://gemnasium.com/intridea/multi_json.png?travis)][gemnasium]
+[![Code Climate](https://codeclimate.com/github/intridea/multi_json.png)][codeclimate]
+[![Coverage Status](https://coveralls.io/repos/intridea/multi_json/badge.png?branch=master)][coveralls]
+
+[gem]: https://rubygems.org/gems/multi_json
+[travis]: http://travis-ci.org/intridea/multi_json
+[gemnasium]: https://gemnasium.com/intridea/multi_json
+[codeclimate]: https://codeclimate.com/github/intridea/multi_json
+[coveralls]: https://coveralls.io/r/intridea/multi_json
+
+Lots of Ruby libraries parse JSON and everyone has their favorite JSON coder.
+Instead of choosing a single JSON coder and forcing users of your library to be
+stuck with it, you can use MultiJSON instead, which will simply choose the
+fastest available JSON coder. Here's how to use it:
+
+```ruby
+require 'multi_json'
+
+MultiJson.load('{"abc":"def"}') #=> {"abc" => "def"}
+MultiJson.load('{"abc":"def"}', :symbolize_keys => true) #=> {:abc => "def"}
+MultiJson.dump({:abc => 'def'}) # convert Ruby back to JSON
+MultiJson.dump({:abc => 'def'}, :pretty => true) # encoded in a pretty form (if supported by the coder)
+```
+
+When loading invalid JSON, multiJSON will throw a `MultiJson::LoadError`. `MultiJson::DecodeError` is an alias for backwards compatibility.
+
+```ruby
+MultiJson.load('invalid json') #=> MultiJson::LoadError
+```
+
+The `use` method, which sets the MultiJson adapter, takes either a symbol or a
+class (to allow for custom JSON parsers) that responds to both `.load` and `.dump`
+at the class level.
+
+MultiJSON tries to have intelligent defaulting. That is, if you have any of the
+supported engines already loaded, it will utilize them before attempting to
+load any. When loading, libraries are ordered by speed. First Oj, then Yajl,
+then the JSON gem, then JSON pure. If no other JSON library is available,
+MultiJSON falls back to [OkJson][], a simple, vendorable JSON parser.
+
+[okjson]: https://github.com/kr/okjson
+
+## Supported JSON Engines
+
+* [Oj](https://github.com/ohler55/oj) Optimized JSON by Peter Ohler
+* [Yajl](https://github.com/brianmario/yajl-ruby) Yet Another JSON Library by Brian Lopez
+* [JSON](https://github.com/flori/json) The default JSON gem with C-extensions (ships with Ruby 1.9)
+* [JSON Pure](https://github.com/flori/json) A Ruby variant of the JSON gem
+* [NSJSONSerialization](https://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html) Wrapper for Apple's NSJSONSerialization in the Cocoa Framework (MacRuby only)
+* [gson.rb](https://github.com/avsej/gson.rb) A Ruby wrapper for google-gson library (JRuby only)
+* [JrJackson](https://github.com/guyboertje/jrjackson) JRuby wrapper for Jackson (JRuby only)
+* [OkJson][okjson] A simple, vendorable JSON parser
+
+## Supported Ruby Versions
+This library aims to support and is [tested against][travis] the following Ruby
+implementations:
+
+* Ruby 1.8.7
+* Ruby 1.9.2
+* Ruby 1.9.3
+* Ruby 2.0.0
+* [JRuby][]
+* [Rubinius][]
+* [MacRuby][] (not tested on Travis CI)
+
+[jruby]: http://www.jruby.org/
+[rubinius]: http://rubini.us/
+[macruby]: http://www.macruby.org/
+
+If something doesn't work on one of these interpreters, it's a bug.
+
+This library may inadvertently work (or seem to work) on other Ruby
+implementations, however support will only be provided for the versions listed
+above.
+
+If you would like this library to support another Ruby version, you may
+volunteer to be a maintainer. Being a maintainer entails making sure all tests
+run and pass on that implementation. When something breaks on your
+implementation, you will be responsible for providing patches in a timely
+fashion. If critical issues for a particular implementation exist at the time
+of a major release, support for that Ruby version may be dropped.
+
+## Versioning
+
+This library aims to adhere to [Semantic Versioning 2.0.0][semver]. Violations
+of this scheme should be reported as bugs. Specifically, if a minor or patch
+version is released that breaks backward compatibility, that version should be
+immediately yanked and/or a new version should be immediately released that
+restores compatibility. Breaking changes to the public API will only be
+introduced with new major versions. As a result of this policy, you can (and
+should) specify a dependency on this gem using the [Pessimistic Version
+Constraint][pvc] with two digits of precision. For example:
+
+```ruby
+spec.add_dependency 'multi_json', '~> 1.0'
+```
+
+[semver]: http://semver.org/
+[pvc]: http://docs.rubygems.org/read/chapter/16#page74
+
+## Copyright
+Copyright (c) 2010-2013 Michael Bleigh, Josh Kalderimis, Erik Michaels-Ober,
+and Pavel Pravosud. See [LICENSE][] for details.
+
+[license]: LICENSE.md
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/Rakefile b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/Rakefile
new file mode 100644
index 0000000..7f64120
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/Rakefile
@@ -0,0 +1,12 @@
+require 'bundler'
+Bundler::GemHelper.install_tasks
+
+require 'rspec/core/rake_task'
+desc "Run all examples"
+RSpec::Core::RakeTask.new(:spec)
+
+task :default => :spec
+task :test => :spec
+
+require 'yard'
+YARD::Rake::YardocTask.new
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json.rb
new file mode 100644
index 0000000..6588a84
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json.rb
@@ -0,0 +1,160 @@
+require 'multi_json/options'
+require 'multi_json/version'
+
+module MultiJson
+  include Options
+  extend self
+
+  class << self
+    def cached_options
+      @cached_options || reset_cached_options!
+    end
+
+    def reset_cached_options!
+      @cached_options = {}
+    end
+  end
+
+  class LoadError < StandardError
+    attr_reader :data
+    def initialize(message='', backtrace=[], data='')
+      super(message)
+      self.set_backtrace(backtrace)
+      @data = data
+    end
+  end
+  DecodeError = LoadError # Legacy support
+
+  # Since `default_options` is deprecated, the
+  # reader is aliased to `dump_options` and the
+  # writer sets both `dump_options` and `load_options`
+  alias default_options dump_options
+
+  def default_options=(value)
+    Kernel.warn "MultiJson.default_options setter is deprecated\n" +
+      "Use MultiJson.load_options and MultiJson.dump_options instead"
+
+    self.load_options = self.dump_options = value
+  end
+
+  ALIASES = { 'jrjackson' => :jr_jackson }
+
+  REQUIREMENT_MAP = [
+    ['oj',           :oj],
+    ['yajl',         :yajl],
+    ['json/ext',     :json_gem],
+    ['gson',         :gson],
+    ['jrjackson',    :jr_jackson],
+    ['json/pure',    :json_pure]
+  ]
+
+  # The default adapter based on what you currently
+  # have loaded and installed. First checks to see
+  # if any adapters are already loaded, then checks
+  # to see which are installed if none are loaded.
+  def default_adapter
+    return :oj if defined?(::Oj)
+    return :yajl if defined?(::Yajl)
+    return :json_gem if defined?(::JSON)
+    return :gson if defined?(::Gson)
+    return :jr_jackson if defined?(::JrJackson)
+
+    REQUIREMENT_MAP.each do |library, adapter|
+      begin
+        require library
+        return adapter
+      rescue ::LoadError
+        next
+      end
+    end
+
+    Kernel.warn '[WARNING] MultiJson is using the default adapter (ok_json). We recommend loading a different JSON library to improve performance.'
+    :ok_json
+  end
+  alias default_engine default_adapter
+
+  # Get the current adapter class.
+  def adapter
+    return @adapter if defined?(@adapter) && @adapter
+
+    self.use nil # load default adapter
+
+    @adapter
+  end
+  alias engine adapter
+
+  # Set the JSON parser utilizing a symbol, string, or class.
+  # Supported by default are:
+  #
+  # * <tt>:oj</tt>
+  # * <tt>:json_gem</tt>
+  # * <tt>:json_pure</tt>
+  # * <tt>:ok_json</tt>
+  # * <tt>:yajl</tt>
+  # * <tt>:nsjsonserialization</tt> (MacRuby only)
+  # * <tt>:gson</tt> (JRuby only)
+  # * <tt>:jr_jackson</tt> (JRuby only)
+  def use(new_adapter)
+    @adapter = load_adapter(new_adapter)
+  end
+  alias adapter= use
+  alias engine= use
+
+  def load_adapter(new_adapter)
+    case new_adapter
+    when String, Symbol
+      new_adapter = ALIASES.fetch(new_adapter.to_s, new_adapter)
+      require "multi_json/adapters/#{new_adapter}"
+      klass_name = new_adapter.to_s.split('_').map(&:capitalize) * ''
+      MultiJson::Adapters.const_get(klass_name)
+    when NilClass, FalseClass
+      load_adapter default_adapter
+    when Class, Module
+      new_adapter
+    else
+      raise NameError
+    end
+  rescue NameError, ::LoadError
+    raise ArgumentError, 'Did not recognize your adapter specification.'
+  end
+
+  # Decode a JSON string into Ruby.
+  #
+  # <b>Options</b>
+  #
+  # <tt>:symbolize_keys</tt> :: If true, will use symbols instead of strings for the keys.
+  # <tt>:adapter</tt> :: If set, the selected adapter will be used for this call.
+  def load(string, options={})
+    adapter = current_adapter(options)
+    begin
+      adapter.load(string, options)
+    rescue adapter::ParseError => exception
+      raise LoadError.new(exception.message, exception.backtrace, string)
+    end
+  end
+  alias decode load
+
+  def current_adapter(options={})
+    if new_adapter = options[:adapter]
+      load_adapter(new_adapter)
+    else
+      adapter
+    end
+  end
+
+  # Encodes a Ruby object as JSON.
+  def dump(object, options={})
+    current_adapter(options).dump(object, options)
+  end
+  alias encode dump
+
+  #  Executes passed block using specified adapter.
+  def with_adapter(new_adapter)
+    old_adapter, self.adapter = adapter, new_adapter
+    yield
+  ensure
+    self.adapter = old_adapter
+  end
+  alias with_engine with_adapter
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapter.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapter.rb
new file mode 100644
index 0000000..f6bcbb8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapter.rb
@@ -0,0 +1,48 @@
+require 'singleton'
+require 'multi_json/options'
+
+module MultiJson
+  class Adapter
+    extend Options
+    include Singleton
+    class << self
+
+      def defaults(action, value)
+        metaclass = class << self; self; end
+
+        metaclass.instance_eval do
+          define_method("default_#{action}_options"){ value }
+        end
+      end
+
+      def load(string, options={})
+        instance.load(string, collect_load_options(options).clone)
+      end
+
+      def dump(object, options={})
+        instance.dump(object, collect_dump_options(options).clone)
+      end
+
+    protected
+
+      def collect_load_options(options)
+        cache('load', options){ collect_options(:load_options, options).merge(options) }
+      end
+
+      def collect_dump_options(options)
+        cache('dump', options){ collect_options(:dump_options, options).merge(options) }
+      end
+
+      def collect_options(method, *args)
+        global, local = *[MultiJson, self].map{ |r| r.send(method, *args) }
+        local.merge(global)
+      end
+
+      def cache(method, options)
+        cache_key = [self, options].map(&:hash).join + method
+        MultiJson.cached_options[cache_key] ||= yield
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/gson.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/gson.rb
new file mode 100644
index 0000000..bc80ce4
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/gson.rb
@@ -0,0 +1,19 @@
+require 'gson' unless defined?(::Gson)
+require 'multi_json/adapter'
+
+module MultiJson
+  module Adapters
+    # Use the gson.rb library to dump/load.
+    class Gson < Adapter
+      ParseError = ::Gson::DecodeError
+
+      def load(string, options={})
+        ::Gson::Decoder.new(options).decode(string)
+      end
+
+      def dump(object, options={})
+        ::Gson::Encoder.new(options).encode(object)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/jr_jackson.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/jr_jackson.rb
new file mode 100644
index 0000000..ab70dfa
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/jr_jackson.rb
@@ -0,0 +1,19 @@
+require 'jrjackson' unless defined?(::JrJackson)
+require 'multi_json/adapter'
+
+module MultiJson
+  module Adapters
+    # Use the jrjackson.rb library to dump/load.
+    class JrJackson < Adapter
+      ParseError = ::JrJackson::ParseError
+
+      def load(string, options={}) #:nodoc:
+        ::JrJackson::Json.load(string, options)
+      end
+
+      def dump(object, options={}) #:nodoc:
+        ::JrJackson::Json.dump(object)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/json_common.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/json_common.rb
new file mode 100644
index 0000000..e48cca2
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/json_common.rb
@@ -0,0 +1,25 @@
+require 'multi_json/adapter'
+
+module MultiJson
+  module Adapters
+    class JsonCommon < Adapter
+      defaults :load, :create_additions => false, :quirks_mode => true
+
+      def load(string, options={})
+        string = string.read if string.respond_to?(:read)
+
+        if string.respond_to?(:force_encoding)
+          string = string.dup.force_encoding(::Encoding::ASCII_8BIT)
+        end
+
+        options[:symbolize_names] = true if options.delete(:symbolize_keys)
+        ::JSON.parse(string, options)
+      end
+
+      def dump(object, options={})
+        options.merge!(::JSON::PRETTY_STATE_PROTOTYPE.to_h) if options.delete(:pretty)
+        object.to_json(options)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/json_gem.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/json_gem.rb
new file mode 100644
index 0000000..6fd5cbc
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/json_gem.rb
@@ -0,0 +1,11 @@
+require 'json' unless defined?(::JSON)
+require 'multi_json/adapters/json_common'
+
+module MultiJson
+  module Adapters
+    # Use the JSON gem to dump/load.
+    class JsonGem < JsonCommon
+      ParseError = ::JSON::ParserError
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/json_pure.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/json_pure.rb
new file mode 100644
index 0000000..9f8ad8d
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/json_pure.rb
@@ -0,0 +1,11 @@
+require 'json/pure' unless defined?(::JSON)
+require 'multi_json/adapters/json_common'
+
+module MultiJson
+  module Adapters
+    # Use JSON pure to dump/load.
+    class JsonPure < JsonCommon
+      ParseError = ::JSON::ParserError
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/nsjsonserialization.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/nsjsonserialization.rb
new file mode 100644
index 0000000..a50d596
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/nsjsonserialization.rb
@@ -0,0 +1,34 @@
+framework 'Foundation'
+require 'multi_json/adapters/ok_json'
+
+module MultiJson
+  module Adapters
+    class Nsjsonserialization < MultiJson::Adapters::OkJson
+      ParseError = ::MultiJson::OkJson::Error
+
+      def load(string, options={})
+        string = string.read if string.respond_to?(:read)
+        data = string.dataUsingEncoding(NSUTF8StringEncoding)
+        object = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves, error: nil)
+        if object
+          object = symbolize_keys(object) if options[:symbolize_keys]
+          object
+        else
+          super(string, options={})
+        end
+      end
+
+      def dump(object, options={})
+        pretty = options[:pretty] ? NSJSONWritingPrettyPrinted : 0
+        object = object.as_json if object.respond_to?(:as_json)
+        if NSJSONSerialization.isValidJSONObject(object)
+          data = NSJSONSerialization.dataWithJSONObject(object, options: pretty, error: nil)
+          NSMutableString.alloc.initWithData(data, encoding: NSUTF8StringEncoding)
+        else
+          super(object, options)
+        end
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/oj.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/oj.rb
new file mode 100644
index 0000000..30b4306
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/oj.rb
@@ -0,0 +1,24 @@
+require 'oj' unless defined?(::Oj)
+require 'multi_json/adapter'
+
+module MultiJson
+  module Adapters
+    # Use the Oj library to dump/load.
+    class Oj < Adapter
+      defaults :load, :mode => :strict, :symbolize_keys => false
+      defaults :dump, :mode => :compat, :time_format => :ruby
+
+      ParseError = defined?(::Oj::ParseError) ? ::Oj::ParseError : SyntaxError
+
+      def load(string, options={})
+        options[:symbol_keys] = options.delete(:symbolize_keys)
+        ::Oj.load(string, options)
+      end
+
+      def dump(object, options={})
+        options.merge!(:indent => 2) if options[:pretty]
+        ::Oj.dump(object, options)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/ok_json.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/ok_json.rb
new file mode 100644
index 0000000..c8432ba
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/ok_json.rb
@@ -0,0 +1,22 @@
+require 'multi_json/adapter'
+require 'multi_json/convertible_hash_keys'
+require 'multi_json/vendor/okjson'
+
+module MultiJson
+  module Adapters
+    class OkJson < Adapter
+      include ConvertibleHashKeys
+      ParseError = ::MultiJson::OkJson::Error
+
+      def load(string, options={})
+        string = string.read if string.respond_to?(:read)
+        result = ::MultiJson::OkJson.decode("[#{string}]").first
+        options[:symbolize_keys] ? symbolize_keys(result) : result
+      end
+
+      def dump(object, options={})
+        ::MultiJson::OkJson.valenc(stringify_keys(object))
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/yajl.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/yajl.rb
new file mode 100644
index 0000000..21f67d5
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/adapters/yajl.rb
@@ -0,0 +1,19 @@
+require 'yajl' unless defined?(::Yajl)
+require 'multi_json/adapter'
+
+module MultiJson
+  module Adapters
+    # Use the Yajl-Ruby library to dump/load.
+    class Yajl < Adapter
+      ParseError = ::Yajl::ParseError
+
+      def load(string, options={})
+        ::Yajl::Parser.new(:symbolize_keys => options[:symbolize_keys]).parse(string)
+      end
+
+      def dump(object, options={})
+        ::Yajl::Encoder.encode(object, options)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/convertible_hash_keys.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/convertible_hash_keys.rb
new file mode 100644
index 0000000..184425f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/convertible_hash_keys.rb
@@ -0,0 +1,43 @@
+module MultiJson
+  module ConvertibleHashKeys
+    private
+
+    def symbolize_keys(object)
+      prepare_object(object) do |key|
+        key.respond_to?(:to_sym) ? key.to_sym : key
+      end
+    end
+
+    def stringify_keys(object)
+      prepare_object(object) do |key|
+        key.respond_to?(:to_s) ? key.to_s : key
+      end
+    end
+
+    def prepare_object(object, &key_modifier)
+      return object unless block_given?
+      case object
+      when Array
+        object.map do |value|
+          prepare_object(value, &key_modifier)
+        end
+      when Hash
+        object.inject({}) do |result, (key, value)|
+          new_key   = key_modifier.call(key)
+          new_value = prepare_object(value, &key_modifier)
+          result.merge! new_key => new_value
+        end
+      when String, Numeric, true, false, nil
+        object
+      else
+        if object.respond_to?(:to_json)
+          object
+        elsif object.respond_to?(:to_s)
+          object.to_s
+        else
+          object
+        end
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/options.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/options.rb
new file mode 100644
index 0000000..78fefb1
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/options.rb
@@ -0,0 +1,48 @@
+module MultiJson
+  module Options
+
+    def load_options=(options)
+      MultiJson.reset_cached_options!
+      @load_options = options
+    end
+
+    def dump_options=(options)
+      MultiJson.reset_cached_options!
+      @dump_options = options
+    end
+
+    def load_options(*args)
+      get_options :load_options, *args
+    end
+
+    def dump_options(*args)
+      get_options :dump_options, *args
+    end
+
+    def default_load_options
+      @default_load_options ||= {}
+    end
+
+    def default_dump_options
+      @default_dump_options ||= {}
+    end
+
+    private
+
+    def get_options(ivar, *args)
+      defaults = send("default_#{ivar}")
+
+      return defaults unless instance_variable_defined?("@#{ivar}")
+
+      value = instance_variable_get("@#{ivar}")
+
+      if value.respond_to?(:call) and value.arity
+        value.arity == 0 ? value[] : value[*args]
+      elsif Hash === value or value.respond_to?(:to_hash)
+        value.to_hash
+      else
+        defaults
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/vendor/okjson.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/vendor/okjson.rb
new file mode 100644
index 0000000..9969ab2
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/vendor/okjson.rb
@@ -0,0 +1,600 @@
+# encoding: UTF-8
+#
+# Copyright 2011, 2012 Keith Rarick
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+# See https://github.com/kr/okjson for updates.
+
+require 'stringio'
+
+# Some parts adapted from
+# http://golang.org/src/pkg/json/decode.go and
+# http://golang.org/src/pkg/utf8/utf8.go
+module MultiJson
+  module OkJson
+    Upstream = '42'
+    extend self
+
+
+    # Decodes a json document in string s and
+    # returns the corresponding ruby value.
+    # String s must be valid UTF-8. If you have
+    # a string in some other encoding, convert
+    # it first.
+    #
+    # String values in the resulting structure
+    # will be UTF-8.
+    def decode(s)
+      ts = lex(s)
+      v, ts = textparse(ts)
+      if ts.length > 0
+        raise Error, 'trailing garbage'
+      end
+      v
+    end
+
+
+    # Encodes x into a json text. It may contain only
+    # Array, Hash, String, Numeric, true, false, nil.
+    # (Note, this list excludes Symbol.)
+    # X itself must be an Array or a Hash.
+    # No other value can be encoded, and an error will
+    # be raised if x contains any other value, such as
+    # Nan, Infinity, Symbol, and Proc, or if a Hash key
+    # is not a String.
+    # Strings contained in x must be valid UTF-8.
+    def encode(x)
+      case x
+      when Hash    then objenc(x)
+      when Array   then arrenc(x)
+      else valenc(x)
+      end
+    end
+
+
+    def valenc(x)
+      case x
+      when Hash    then objenc(x)
+      when Array   then arrenc(x)
+      when String  then strenc(x)
+      when Numeric then numenc(x)
+      when true    then "true"
+      when false   then "false"
+      when nil     then "null"
+      else
+        if x.respond_to?(:to_json)
+          x.to_json
+        else
+          raise Error, "cannot encode #{x.class}: #{x.inspect}"
+        end
+      end
+    end
+
+
+  private
+
+
+    # Parses a "json text" in the sense of RFC 4627.
+    # Returns the parsed value and any trailing tokens.
+    # Note: this is almost the same as valparse,
+    # except that it does not accept atomic values.
+    def textparse(ts)
+      if ts.length <= 0
+        raise Error, 'empty'
+      end
+
+      typ, _, val = ts[0]
+      case typ
+      when '{' then objparse(ts)
+      when '[' then arrparse(ts)
+      else
+        raise Error, "unexpected #{val.inspect}"
+      end
+    end
+
+
+    # Parses a "value" in the sense of RFC 4627.
+    # Returns the parsed value and any trailing tokens.
+    def valparse(ts)
+      if ts.length <= 0
+        raise Error, 'empty'
+      end
+
+      typ, _, val = ts[0]
+      case typ
+      when '{' then objparse(ts)
+      when '[' then arrparse(ts)
+      when :val,:str then [val, ts[1..-1]]
+      else
+        raise Error, "unexpected #{val.inspect}"
+      end
+    end
+
+
+    # Parses an "object" in the sense of RFC 4627.
+    # Returns the parsed value and any trailing tokens.
+    def objparse(ts)
+      ts = eat('{', ts)
+      obj = {}
+
+      if ts[0][0] == '}'
+        return obj, ts[1..-1]
+      end
+
+      k, v, ts = pairparse(ts)
+      obj[k] = v
+
+      if ts[0][0] == '}'
+        return obj, ts[1..-1]
+      end
+
+      loop do
+        ts = eat(',', ts)
+
+        k, v, ts = pairparse(ts)
+        obj[k] = v
+
+        if ts[0][0] == '}'
+          return obj, ts[1..-1]
+        end
+      end
+    end
+
+
+    # Parses a "member" in the sense of RFC 4627.
+    # Returns the parsed values and any trailing tokens.
+    def pairparse(ts)
+      (typ, _, k), ts = ts[0], ts[1..-1]
+      if typ != :str
+        raise Error, "unexpected #{k.inspect}"
+      end
+      ts = eat(':', ts)
+      v, ts = valparse(ts)
+      [k, v, ts]
+    end
+
+
+    # Parses an "array" in the sense of RFC 4627.
+    # Returns the parsed value and any trailing tokens.
+    def arrparse(ts)
+      ts = eat('[', ts)
+      arr = []
+
+      if ts[0][0] == ']'
+        return arr, ts[1..-1]
+      end
+
+      v, ts = valparse(ts)
+      arr << v
+
+      if ts[0][0] == ']'
+        return arr, ts[1..-1]
+      end
+
+      loop do
+        ts = eat(',', ts)
+
+        v, ts = valparse(ts)
+        arr << v
+
+        if ts[0][0] == ']'
+          return arr, ts[1..-1]
+        end
+      end
+    end
+
+
+    def eat(typ, ts)
+      if ts[0][0] != typ
+        raise Error, "expected #{typ} (got #{ts[0].inspect})"
+      end
+      ts[1..-1]
+    end
+
+
+    # Scans s and returns a list of json tokens,
+    # excluding white space (as defined in RFC 4627).
+    def lex(s)
+      ts = []
+      while s.length > 0
+        typ, lexeme, val = tok(s)
+        if typ == nil
+          raise Error, "invalid character at #{s[0,10].inspect}"
+        end
+        if typ != :space
+          ts << [typ, lexeme, val]
+        end
+        s = s[lexeme.length..-1]
+      end
+      ts
+    end
+
+
+    # Scans the first token in s and
+    # returns a 3-element list, or nil
+    # if s does not begin with a valid token.
+    #
+    # The first list element is one of
+    # '{', '}', ':', ',', '[', ']',
+    # :val, :str, and :space.
+    #
+    # The second element is the lexeme.
+    #
+    # The third element is the value of the
+    # token for :val and :str, otherwise
+    # it is the lexeme.
+    def tok(s)
+      case s[0]
+      when ?{ then ['{', s[0,1], s[0,1]]
+      when ?} then ['}', s[0,1], s[0,1]]
+      when ?: then [':', s[0,1], s[0,1]]
+      when ?, then [',', s[0,1], s[0,1]]
+      when ?[ then ['[', s[0,1], s[0,1]]
+      when ?] then [']', s[0,1], s[0,1]]
+      when ?n then nulltok(s)
+      when ?t then truetok(s)
+      when ?f then falsetok(s)
+      when ?" then strtok(s)
+      when Spc, ?\t, ?\n, ?\r then [:space, s[0,1], s[0,1]]
+      else
+        numtok(s)
+      end
+    end
+
+
+    def nulltok(s);  s[0,4] == 'null'  ? [:val, 'null',  nil]   : [] end
+    def truetok(s);  s[0,4] == 'true'  ? [:val, 'true',  true]  : [] end
+    def falsetok(s); s[0,5] == 'false' ? [:val, 'false', false] : [] end
+
+
+    def numtok(s)
+      m = /-?([1-9][0-9]+|[0-9])([.][0-9]+)?([eE][+-]?[0-9]+)?/.match(s)
+      if m && m.begin(0) == 0
+        if !m[2] && !m[3]
+          [:val, m[0], Integer(m[0])]
+        elsif m[2]
+          [:val, m[0], Float(m[0])]
+        else
+          [:val, m[0], Integer(m[1])*(10**Integer(m[3][1..-1]))]
+        end
+      else
+        []
+      end
+    end
+
+
+    def strtok(s)
+      m = /"([^"\\]|\\["\/\\bfnrt]|\\u[0-9a-fA-F]{4})*"/.match(s)
+      if ! m
+        raise Error, "invalid string literal at #{abbrev(s)}"
+      end
+      [:str, m[0], unquote(m[0])]
+    end
+
+
+    def abbrev(s)
+      t = s[0,10]
+      p = t['`']
+      t = t[0,p] if p
+      t = t + '...' if t.length < s.length
+      '`' + t + '`'
+    end
+
+
+    # Converts a quoted json string literal q into a UTF-8-encoded string.
+    # The rules are different than for Ruby, so we cannot use eval.
+    # Unquote will raise an error if q contains control characters.
+    def unquote(q)
+      q = q[1...-1]
+      a = q.dup # allocate a big enough string
+      # In ruby >= 1.9, a[w] is a codepoint, not a byte.
+      if rubydoesenc?
+        a.force_encoding('UTF-8')
+      end
+      r, w = 0, 0
+      while r < q.length
+        c = q[r]
+        if c == ?\\
+          r += 1
+          if r >= q.length
+            raise Error, "string literal ends with a \"\\\": \"#{q}\""
+          end
+
+          case q[r]
+          when ?",?\\,?/,?'
+            a[w] = q[r]
+            r += 1
+            w += 1
+          when ?b,?f,?n,?r,?t
+            a[w] = Unesc[q[r]]
+            r += 1
+            w += 1
+          when ?u
+            r += 1
+            uchar = begin
+              hexdec4(q[r,4])
+            rescue RuntimeError => e
+              raise Error, "invalid escape sequence \\u#{q[r,4]}: #{e}"
+            end
+            r += 4
+            if surrogate? uchar
+              if q.length >= r+6
+                uchar1 = hexdec4(q[r+2,4])
+                uchar = subst(uchar, uchar1)
+                if uchar != Ucharerr
+                  # A valid pair; consume.
+                  r += 6
+                end
+              end
+            end
+            if rubydoesenc?
+              a[w] = '' << uchar
+              w += 1
+            else
+              w += ucharenc(a, w, uchar)
+            end
+          else
+            raise Error, "invalid escape char #{q[r]} in \"#{q}\""
+          end
+        elsif c == ?" || c < Spc
+          raise Error, "invalid character in string literal \"#{q}\""
+        else
+          # Copy anything else byte-for-byte.
+          # Valid UTF-8 will remain valid UTF-8.
+          # Invalid UTF-8 will remain invalid UTF-8.
+          # In ruby >= 1.9, c is a codepoint, not a byte,
+          # in which case this is still what we want.
+          a[w] = c
+          r += 1
+          w += 1
+        end
+      end
+      a[0,w]
+    end
+
+
+    # Encodes unicode character u as UTF-8
+    # bytes in string a at position i.
+    # Returns the number of bytes written.
+    def ucharenc(a, i, u)
+      if u <= Uchar1max
+        a[i] = (u & 0xff).chr
+        1
+      elsif u <= Uchar2max
+        a[i+0] = (Utag2 | ((u>>6)&0xff)).chr
+        a[i+1] = (Utagx | (u&Umaskx)).chr
+        2
+      elsif u <= Uchar3max
+        a[i+0] = (Utag3 | ((u>>12)&0xff)).chr
+        a[i+1] = (Utagx | ((u>>6)&Umaskx)).chr
+        a[i+2] = (Utagx | (u&Umaskx)).chr
+        3
+      else
+        a[i+0] = (Utag4 | ((u>>18)&0xff)).chr
+        a[i+1] = (Utagx | ((u>>12)&Umaskx)).chr
+        a[i+2] = (Utagx | ((u>>6)&Umaskx)).chr
+        a[i+3] = (Utagx | (u&Umaskx)).chr
+        4
+      end
+    end
+
+
+    def hexdec4(s)
+      if s.length != 4
+        raise Error, 'short'
+      end
+      (nibble(s[0])<<12) | (nibble(s[1])<<8) | (nibble(s[2])<<4) | nibble(s[3])
+    end
+
+
+    def subst(u1, u2)
+      if Usurr1 <= u1 && u1 < Usurr2 && Usurr2 <= u2 && u2 < Usurr3
+        return ((u1-Usurr1)<<10) | (u2-Usurr2) + Usurrself
+      end
+      return Ucharerr
+    end
+
+
+    def surrogate?(u)
+      Usurr1 <= u && u < Usurr3
+    end
+
+
+    def nibble(c)
+      if ?0 <= c && c <= ?9 then c.ord - ?0.ord
+      elsif ?a <= c && c <= ?z then c.ord - ?a.ord + 10
+      elsif ?A <= c && c <= ?Z then c.ord - ?A.ord + 10
+      else
+        raise Error, "invalid hex code #{c}"
+      end
+    end
+
+
+    def objenc(x)
+      '{' + x.map{|k,v| keyenc(k) + ':' + valenc(v)}.join(',') + '}'
+    end
+
+
+    def arrenc(a)
+      '[' + a.map{|x| valenc(x)}.join(',') + ']'
+    end
+
+
+    def keyenc(k)
+      case k
+      when String then strenc(k)
+      else
+        raise Error, "Hash key is not a string: #{k.inspect}"
+      end
+    end
+
+
+    def strenc(s)
+      t = StringIO.new
+      t.putc(?")
+      r = 0
+
+      while r < s.length
+        case s[r]
+        when ?"  then t.print('\\"')
+        when ?\\ then t.print('\\\\')
+        when ?\b then t.print('\\b')
+        when ?\f then t.print('\\f')
+        when ?\n then t.print('\\n')
+        when ?\r then t.print('\\r')
+        when ?\t then t.print('\\t')
+        else
+          c = s[r]
+          # In ruby >= 1.9, s[r] is a codepoint, not a byte.
+          if rubydoesenc?
+            begin
+              c.ord # will raise an error if c is invalid UTF-8
+              t.write(c)
+            rescue
+              t.write(Ustrerr)
+            end
+          elsif Spc <= c && c <= ?~
+            t.putc(c)
+          else
+            n = ucharcopy(t, s, r) # ensure valid UTF-8 output
+            r += n - 1 # r is incremented below
+          end
+        end
+        r += 1
+      end
+      t.putc(?")
+      t.string
+    end
+
+
+    def numenc(x)
+      if ((x.nan? || x.infinite?) rescue false)
+        raise Error, "Numeric cannot be represented: #{x}"
+      end
+      "#{x}"
+    end
+
+
+    # Copies the valid UTF-8 bytes of a single character
+    # from string s at position i to I/O object t, and
+    # returns the number of bytes copied.
+    # If no valid UTF-8 char exists at position i,
+    # ucharcopy writes Ustrerr and returns 1.
+    def ucharcopy(t, s, i)
+      n = s.length - i
+      raise Utf8Error if n < 1
+
+      c0 = s[i].ord
+
+      # 1-byte, 7-bit sequence?
+      if c0 < Utagx
+        t.putc(c0)
+        return 1
+      end
+
+      raise Utf8Error if c0 < Utag2 # unexpected continuation byte?
+
+      raise Utf8Error if n < 2 # need continuation byte
+      c1 = s[i+1].ord
+      raise Utf8Error if c1 < Utagx || Utag2 <= c1
+
+      # 2-byte, 11-bit sequence?
+      if c0 < Utag3
+        raise Utf8Error if ((c0&Umask2)<<6 | (c1&Umaskx)) <= Uchar1max
+        t.putc(c0)
+        t.putc(c1)
+        return 2
+      end
+
+      # need second continuation byte
+      raise Utf8Error if n < 3
+
+      c2 = s[i+2].ord
+      raise Utf8Error if c2 < Utagx || Utag2 <= c2
+
+      # 3-byte, 16-bit sequence?
+      if c0 < Utag4
+        u = (c0&Umask3)<<12 | (c1&Umaskx)<<6 | (c2&Umaskx)
+        raise Utf8Error if u <= Uchar2max
+        t.putc(c0)
+        t.putc(c1)
+        t.putc(c2)
+        return 3
+      end
+
+      # need third continuation byte
+      raise Utf8Error if n < 4
+      c3 = s[i+3].ord
+      raise Utf8Error if c3 < Utagx || Utag2 <= c3
+
+      # 4-byte, 21-bit sequence?
+      if c0 < Utag5
+        u = (c0&Umask4)<<18 | (c1&Umaskx)<<12 | (c2&Umaskx)<<6 | (c3&Umaskx)
+        raise Utf8Error if u <= Uchar3max
+        t.putc(c0)
+        t.putc(c1)
+        t.putc(c2)
+        t.putc(c3)
+        return 4
+      end
+
+      raise Utf8Error
+    rescue Utf8Error
+      t.write(Ustrerr)
+      return 1
+    end
+
+
+    def rubydoesenc?
+      ::String.method_defined?(:force_encoding)
+    end
+
+
+    class Utf8Error < ::StandardError
+    end
+
+
+    class Error < ::StandardError
+    end
+
+
+    Utagx = 0b1000_0000
+    Utag2 = 0b1100_0000
+    Utag3 = 0b1110_0000
+    Utag4 = 0b1111_0000
+    Utag5 = 0b1111_1000
+    Umaskx = 0b0011_1111
+    Umask2 = 0b0001_1111
+    Umask3 = 0b0000_1111
+    Umask4 = 0b0000_0111
+    Uchar1max = (1<<7) - 1
+    Uchar2max = (1<<11) - 1
+    Uchar3max = (1<<16) - 1
+    Ucharerr = 0xFFFD # unicode "replacement char"
+    Ustrerr = "\xef\xbf\xbd" # unicode "replacement char"
+    Usurrself = 0x10000
+    Usurr1 = 0xd800
+    Usurr2 = 0xdc00
+    Usurr3 = 0xe000
+
+    Spc = ' '[0]
+    Unesc = {?b=>?\b, ?f=>?\f, ?n=>?\n, ?r=>?\r, ?t=>?\t}
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/version.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/version.rb
new file mode 100644
index 0000000..ad81c90
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/lib/multi_json/version.rb
@@ -0,0 +1,20 @@
+module MultiJson
+  class Version
+    MAJOR = 1 unless defined? MultiJson::Version::MAJOR
+    MINOR = 7 unless defined? MultiJson::Version::MINOR
+    PATCH = 7 unless defined? MultiJson::Version::PATCH
+    PRE = nil unless defined? MultiJson::Version::PRE
+
+    class << self
+
+      # @return [String]
+      def to_s
+        [MAJOR, MINOR, PATCH, PRE].compact.join('.')
+      end
+
+    end
+
+  end
+
+  VERSION = Version.to_s.freeze
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/multi_json.gemspec b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/multi_json.gemspec
new file mode 100644
index 0000000..6f1b1f8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/multi_json.gemspec
@@ -0,0 +1,22 @@
+# coding: utf-8
+lib = File.expand_path('../lib', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+require 'multi_json/version'
+
+Gem::Specification.new do |spec|
+  spec.add_development_dependency 'bundler', '~> 1.0'
+  spec.authors       = ["Michael Bleigh", "Josh Kalderimis", "Erik Michaels-Ober", "Pavel Pravosud"]
+  spec.cert_chain    = %w(certs/sferik.pem)
+  spec.description   = %q{A common interface to multiple JSON libraries, including Oj, Yajl, the JSON gem (with C-extensions), the pure-Ruby JSON gem, NSJSONSerialization, gson.rb, JrJackson, and OkJson.}
+  spec.email         = ['michael at intridea.com', 'josh.kalderimis at gmail.com', 'sferik at gmail.com']
+  spec.files         = Dir['.yardopts', 'CHANGELOG.md', 'CONTRIBUTING.md', 'LICENSE.md', 'README.md', 'Rakefile', 'multi_json.gemspec', 'Gemfile', '.document', '.rspec', '.travis.yml' ,'spec/**/*', 'lib/**/*']
+  spec.homepage      = 'http://github.com/intridea/multi_json'
+  spec.licenses      = ['MIT']
+  spec.name          = 'multi_json'
+  spec.require_paths = ['lib']
+  spec.required_rubygems_version = '>= 1.3.5'
+  spec.signing_key   = File.expand_path("~/.gem/private_key.pem") if $0 =~ /gem\z/
+  spec.summary       = %q{A common interface to multiple JSON libraries.}
+  spec.test_files    = Dir['spec/**/*']
+  spec.version       = MultiJson::Version
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/adapter_shared_example.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/adapter_shared_example.rb
new file mode 100644
index 0000000..4df9387
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/adapter_shared_example.rb
@@ -0,0 +1,235 @@
+# encoding: UTF-8
+
+shared_examples_for 'an adapter' do |adapter|
+
+  before do
+    begin
+      MultiJson.use adapter
+    rescue LoadError
+      pending "Adapter #{adapter} couldn't be loaded (not installed?)"
+    end
+  end
+
+  it_behaves_like 'has options', lambda{ MultiJson.adapter }
+
+  it 'does not modify argument hashes' do
+    options = { :symbolize_keys => true, :pretty => false, :adapter => :json_pure }
+    expect{MultiJson.load('{}', options)}.to_not change{options}
+    expect{MultiJson.dump([42], options)}.to_not change{options}
+  end
+
+  describe '.dump' do
+    describe '#dump_options' do
+      before{ MultiJson.dump_options = MultiJson.adapter.dump_options = {} }
+
+      after do
+        MultiJson.adapter.instance.should_receive(:dump).with(1, :foo=>'bar', :fizz=>'buzz')
+        MultiJson.dump(1, :fizz => 'buzz')
+        MultiJson.dump_options = MultiJson.adapter.dump_options = nil
+      end
+
+      it 'respects global dump options' do
+        MultiJson.dump_options = {:foo => 'bar'}
+      end
+
+      it 'respects per-adapter dump options' do
+        MultiJson.adapter.dump_options = {:foo => 'bar'}
+      end
+
+      it 'adapter-specific are overridden by global options' do
+        MultiJson.adapter.dump_options = {:foo => 'foo'}
+        MultiJson.dump_options = {:foo => 'bar'}
+      end
+    end
+
+    it 'writes decodable JSON' do
+      [
+        {'abc' => 'def'},
+        [1, 2, 3, '4', true, false, nil]
+      ].each do |example|
+        expect(MultiJson.load(MultiJson.dump(example))).to eq example
+      end
+    end
+
+    unless 'json_pure' == adapter || 'json_gem' == adapter
+      it 'dumps time in correct format' do
+        time = Time.at(1355218745).utc
+
+        # time does not respond to to_json method
+        class << time
+          undef_method :to_json
+        end
+
+        dumped_json = MultiJson.dump(time)
+        expected = if RUBY_VERSION > '1.9'
+          '2012-12-11 09:39:05 UTC'
+        else
+          'Tue Dec 11 09:39:05 UTC 2012'
+        end
+        expect(MultiJson.load(dumped_json)).to eq expected
+      end
+    end
+
+    it 'dumps symbol and fixnum keys as strings' do
+      [
+        [
+          {:foo => {:bar => 'baz'}},
+          {'foo' => {'bar' => 'baz'}},
+        ],
+        [
+          [{:foo => {:bar => 'baz'}}],
+          [{'foo' => {'bar' => 'baz'}}],
+        ],
+        [
+          {:foo => [{:bar => 'baz'}]},
+          {'foo' => [{'bar' => 'baz'}]},
+        ],
+        [
+          {1 => {2 => {3 => 'bar'}}},
+          {'1' => {'2' => {'3' => 'bar'}}}
+        ]
+      ].each do |example, expected|
+        dumped_json = MultiJson.dump(example)
+        expect(MultiJson.load(dumped_json)).to eq expected
+      end
+    end
+
+    it 'dumps rootless JSON' do
+      expect(MultiJson.dump('random rootless string')).to eq '"random rootless string"'
+      expect(MultiJson.dump(123)).to eq '123'
+    end
+
+    it 'passes options to the adapter' do
+      MultiJson.adapter.should_receive(:dump).with('foo', {:bar => :baz})
+      MultiJson.dump('foo', :bar => :baz)
+    end
+
+    # This behavior is currently not supported by gson.rb
+    # See discussion at https://github.com/intridea/multi_json/pull/71
+    unless %w(gson jr_jackson).include?(adapter)
+      it 'dumps custom objects that implement to_json' do
+        klass = Class.new do
+          def to_json(*)
+            '"foobar"'
+          end
+        end
+        expect(MultiJson.dump(klass.new)).to eq '"foobar"'
+      end
+    end
+
+    it 'allows to dump JSON values' do
+      expect(MultiJson.dump(42)).to eq '42'
+    end
+
+    it 'allows to dump JSON with UTF-8 characters' do
+      expect(MultiJson.dump({'color' => 'żółć'})).to eq('{"color":"żółć"}')
+    end
+  end
+
+  describe '.load' do
+    describe '#load_options' do
+      before{ MultiJson.load_options = MultiJson.adapter.load_options = {} }
+
+      after do
+        MultiJson.adapter.instance.should_receive(:load).with('1', :foo => 'bar', :fizz => 'buzz')
+        MultiJson.load('1', :fizz => 'buzz')
+        MultiJson.load_options = MultiJson.adapter.load_options = nil
+      end
+
+      it 'respects global load options' do
+        MultiJson.load_options = {:foo => 'bar'}
+      end
+
+      it 'respects per-adapter load options' do
+        MultiJson.adapter.load_options = {:foo => 'bar'}
+      end
+
+      it 'adapter-specific are overridden by global options' do
+        MultiJson.adapter.load_options = {:foo => 'foo'}
+        MultiJson.load_options = {:foo => 'bar'}
+      end
+    end
+
+    it 'does not modify input' do
+      input = %Q{\n\n  {"foo":"bar"} \n\n\t}
+      expect{
+        MultiJson.load(input)
+      }.to_not change{ input }
+    end
+
+    it 'does not modify input encoding' do
+      pending 'only in 1.9' unless RUBY_VERSION > '1.9'
+
+      input = '[123]'
+      input.force_encoding('iso-8859-1')
+
+      expect{
+        MultiJson.load(input)
+      }.to_not change{ input.encoding }
+    end
+
+    it 'properly loads valid JSON' do
+      expect(MultiJson.load('{"abc":"def"}')).to eq({'abc' => 'def'})
+    end
+
+    it 'raises MultiJson::LoadError on invalid JSON' do
+      expect{MultiJson.load('{"abc"}')}.to raise_error(MultiJson::LoadError)
+    end
+
+    it 'raises MultiJson::LoadError with data on invalid JSON' do
+      data = '{invalid}'
+      begin
+        MultiJson.load(data)
+      rescue MultiJson::LoadError => le
+        expect(le.data).to eq data
+      end
+    end
+
+    it 'catches MultiJson::DecodeError for legacy support' do
+      data = '{invalid}'
+      begin
+        MultiJson.load(data)
+      rescue MultiJson::DecodeError => de
+        expect(de.data).to eq data
+      end
+    end
+
+    it 'stringifys symbol keys when encoding' do
+      dumped_json = MultiJson.dump(:a => 1, :b => {:c => 2})
+      loaded_json = MultiJson.load(dumped_json)
+      expect(loaded_json).to eq({'a' => 1, 'b' => {'c' => 2}})
+    end
+
+    it 'properly loads valid JSON in StringIOs' do
+      json = StringIO.new('{"abc":"def"}')
+      expect(MultiJson.load(json)).to eq({'abc' => 'def'})
+    end
+
+    it 'allows for symbolization of keys' do
+      [
+        [
+          '{"abc":{"def":"hgi"}}',
+          {:abc => {:def => 'hgi'}},
+        ],
+        [
+          '[{"abc":{"def":"hgi"}}]',
+          [{:abc => {:def => 'hgi'}}],
+        ],
+        [
+          '{"abc":[{"def":"hgi"}]}',
+          {:abc => [{:def => 'hgi'}]},
+        ],
+      ].each do |example, expected|
+        expect(MultiJson.load(example, :symbolize_keys => true)).to eq expected
+      end
+    end
+
+    it 'allows to load JSON values' do
+      expect(MultiJson.load('42')).to eq 42
+    end
+
+    it 'allows to load JSON with UTF-8 characters' do
+      expect(MultiJson.load('{"color":"żółć"}')).to eq({'color' => 'żółć'})
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/has_options.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/has_options.rb
new file mode 100644
index 0000000..45f7ee0
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/has_options.rb
@@ -0,0 +1,74 @@
+shared_examples_for 'has options' do |object|
+
+  if object.respond_to?(:call)
+    subject{ object.call }
+  else
+    subject{ object }
+  end
+
+  %w(dump_options load_options).each do |getter|
+
+    let(:getter){ getter }
+    let(:default_getter){ "default_#{getter}" }
+    let(:setter){ "#{getter}=" }
+    let(:defaults){ subject.send(default_getter) }
+    let(:ivar){ "@#{getter}" }
+
+    describe getter.tr('_', ' ') do
+      before{ set nil }
+      after{ set nil }
+
+      def get(*args)
+        subject.send(getter, *args)
+      end
+
+      def set(value)
+        subject.send(setter, value)
+      end
+
+      it 'returns default options if not set' do
+        expect(get).to eq(defaults)
+      end
+
+      it 'allows hashes' do
+        set :foo => 'bar'
+        expect(get).to eq(:foo => 'bar')
+      end
+
+      it 'allows objects that implement #to_hash' do
+        value = Class.new do
+          def to_hash
+            {:foo=>'bar'}
+          end
+        end.new
+
+        set value
+        expect(get).to eq(:foo => 'bar')
+      end
+
+      it 'evaluates lambda returning options (with args)' do
+        set lambda{ |a1, a2| { a1 => a2 }}
+        expect(get('1', '2')).to eq('1' => '2')
+      end
+
+      it 'evaluates lambda returning options (with no args)' do
+        set lambda{{:foo => 'bar'}}
+        expect(get).to eq(:foo => 'bar')
+      end
+
+      it 'returns empty hash in all other cases' do
+        set true
+        expect(get).to eq(defaults)
+
+        set false
+        expect(get).to eq(defaults)
+
+        set 10
+        expect(get).to eq(defaults)
+
+        set nil
+        expect(get).to eq(defaults)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/helper.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/helper.rb
new file mode 100644
index 0000000..b5edfaf
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/helper.rb
@@ -0,0 +1,35 @@
+require 'simplecov'
+require 'coveralls'
+
+SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
+  SimpleCov::Formatter::HTMLFormatter,
+  Coveralls::SimpleCov::Formatter
+]
+SimpleCov.start do
+  add_filter 'spec'
+  add_filter 'vendor'
+end
+
+require 'multi_json'
+require 'rspec'
+
+RSpec.configure do |config|
+  config.expect_with :rspec do |c|
+    c.syntax = :expect
+  end
+end
+
+def silence_warnings
+  old_verbose, $VERBOSE = $VERBOSE, nil
+  yield
+ensure
+  $VERBOSE = old_verbose
+end
+
+def macruby?
+  defined?(RUBY_ENGINE) && RUBY_ENGINE == 'macruby'
+end
+
+def jruby?
+  defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/json_common_shared_example.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/json_common_shared_example.rb
new file mode 100644
index 0000000..d8c9d7c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/json_common_shared_example.rb
@@ -0,0 +1,30 @@
+shared_examples_for 'JSON-like adapter' do |adapter|
+  before{ MultiJson.use adapter }
+
+  describe '.dump' do
+    before{ MultiJson.dump_options = MultiJson.adapter.dump_options = nil }
+
+    describe 'with :pretty option set to true' do
+      it 'passes default pretty options' do
+        object = 'foo'
+        object.should_receive(:to_json).with(JSON::PRETTY_STATE_PROTOTYPE.to_h)
+        MultiJson.dump(object, :pretty => true)
+      end
+    end
+
+    describe 'with :indent option' do
+      it 'passes it on dump' do
+        object = 'foo'
+        object.should_receive(:to_json).with(:indent => "\t")
+        MultiJson.dump(object, :indent => "\t")
+      end
+    end
+  end
+
+  describe '.load' do
+    it 'passes :quirks_mode option' do
+      ::JSON.should_receive(:parse).with('[123]', {:quirks_mode => false, :create_additions => false})
+      MultiJson.load('[123]', :quirks_mode => false)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/multi_json_spec.rb b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/multi_json_spec.rb
new file mode 100644
index 0000000..e855d17
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/multi_json-1.7.7/spec/multi_json_spec.rb
@@ -0,0 +1,226 @@
+require 'helper'
+require 'adapter_shared_example'
+require 'json_common_shared_example'
+require 'has_options'
+require 'stringio'
+
+describe 'MultiJson' do
+  context 'adapters' do
+    before{ MultiJson.use nil }
+
+    context 'when no other json implementations are available' do
+      before do
+        @old_map = MultiJson::REQUIREMENT_MAP
+        @old_json = Object.const_get :JSON if Object.const_defined?(:JSON)
+        @old_oj = Object.const_get :Oj if Object.const_defined?(:Oj)
+        @old_yajl = Object.const_get :Yajl if Object.const_defined?(:Yajl)
+        @old_gson = Object.const_get :Gson if Object.const_defined?(:Gson)
+        @old_jrjackson = Object.const_get :JrJackson if Object.const_defined?(:JrJackson)
+
+        MultiJson::REQUIREMENT_MAP.each_with_index do |(library, adapter), index|
+          MultiJson::REQUIREMENT_MAP[index] = ["foo/#{library}", adapter]
+        end
+        Object.send :remove_const, :JSON if @old_json
+        Object.send :remove_const, :Oj if @old_oj
+        Object.send :remove_const, :Yajl if @old_yajl
+        Object.send :remove_const, :Gson if @old_gson
+        Object.send :remove_const, :JrJackson if @old_jrjackson
+      end
+
+      after do
+        @old_map.each_with_index do |(library, adapter), index|
+          MultiJson::REQUIREMENT_MAP[index] = [library, adapter]
+        end
+        Object.const_set :JSON, @old_json if @old_json
+        Object.const_set :Oj, @old_oj if @old_oj
+        Object.const_set :Yajl, @old_yajl if @old_yajl
+        Object.const_set :Gson, @old_gson if @old_gson
+        Object.const_set :JrJackson, @old_jrjackson if @old_jrjackson
+      end
+
+      it 'defaults to ok_json if no other json implementions are available' do
+        silence_warnings do
+          expect(MultiJson.default_adapter).to eq :ok_json
+        end
+      end
+
+      it 'prints a warning' do
+        Kernel.should_receive(:warn).with(/warning/i)
+        MultiJson.default_adapter
+      end
+    end
+
+    context 'caching' do
+      before{ MultiJson.use adapter }
+      let(:adapter){ MultiJson::Adapters::JsonGem }
+      let(:json_string){ '{"abc":"def"}' }
+
+      it 'busts caches on global options change' do
+        MultiJson.load_options = { :symbolize_keys => true }
+        expect(MultiJson.load(json_string)).to eq(:abc => 'def')
+        MultiJson.load_options = nil
+        expect(MultiJson.load(json_string)).to eq('abc' => 'def')
+      end
+
+      it 'busts caches on per-adapter options change' do
+        adapter.load_options = { :symbolize_keys => true }
+        expect(MultiJson.load(json_string)).to eq(:abc => 'def')
+        adapter.load_options = nil
+        expect(MultiJson.load(json_string)).to eq('abc' => 'def')
+      end
+
+    end
+
+    it 'defaults to the best available gem' do
+      # Clear cache variable already set by previous tests
+      MultiJson.send(:remove_instance_variable, :@adapter)
+      unless jruby?
+        expect(MultiJson.adapter).to eq MultiJson::Adapters::Oj
+      else
+        expect(MultiJson.adapter).to eq MultiJson::Adapters::JsonGem
+      end
+    end
+
+    it 'looks for adapter even if @adapter variable is nil' do
+      MultiJson.send(:instance_variable_set, :@adapter, nil)
+      MultiJson.should_receive(:default_adapter).and_return(:ok_json)
+      expect(MultiJson.adapter).to eq MultiJson::Adapters::OkJson
+    end
+
+    it 'is settable via a symbol' do
+      MultiJson.use :json_gem
+      expect(MultiJson.adapter).to eq MultiJson::Adapters::JsonGem
+    end
+
+    it 'is settable via a class' do
+      adapter = Class.new
+      MultiJson.use adapter
+      expect(MultiJson.adapter).to eq adapter
+    end
+
+    it 'is settable via a module' do
+      adapter = Module.new
+      MultiJson.use adapter
+      expect(MultiJson.adapter).to eq adapter
+    end
+
+    it 'throws ArgumentError on bad input' do
+      expect{ MultiJson.use 'bad adapter' }.to raise_error(ArgumentError)
+    end
+
+    context 'using one-shot parser' do
+      before do
+        MultiJson::Adapters::JsonPure.should_receive(:dump).once.and_return('dump_something')
+        MultiJson::Adapters::JsonPure.should_receive(:load).once.and_return('load_something')
+      end
+
+      it 'should use the defined parser just for the call' do
+        MultiJson.use :json_gem
+        expect(MultiJson.dump('', :adapter => :json_pure)).to eq 'dump_something'
+        expect(MultiJson.load('', :adapter => :json_pure)).to eq 'load_something'
+        expect(MultiJson.adapter).to eq MultiJson::Adapters::JsonGem
+      end
+    end
+  end
+
+  it 'can set adapter for a block' do
+    MultiJson.use :ok_json
+    MultiJson.with_adapter(:json_pure) do
+      MultiJson.with_engine(:json_gem) do
+        expect(MultiJson.adapter).to eq MultiJson::Adapters::JsonGem
+      end
+      expect(MultiJson.adapter).to eq MultiJson::Adapters::JsonPure
+    end
+    expect(MultiJson.adapter).to eq MultiJson::Adapters::OkJson
+  end
+
+  it 'JSON gem does not create symbols on parse' do
+    MultiJson.with_engine(:json_gem) do
+      MultiJson.load('{"json_class":"ZOMG"}') rescue nil
+
+      expect{
+        MultiJson.load('{"json_class":"OMG"}') rescue nil
+      }.to_not change{Symbol.all_symbols.count}
+    end
+  end
+
+  unless jruby?
+    it 'Oj does not create symbols on parse' do
+      MultiJson.with_engine(:oj) do
+        MultiJson.load('{"json_class":"ZOMG"}') rescue nil
+
+        expect{
+          MultiJson.load('{"json_class":"OMG"}') rescue nil
+        }.to_not change{Symbol.all_symbols.count}
+      end
+    end
+
+    context 'with Oj.default_settings' do
+
+      around do |example|
+        options = Oj.default_options
+        Oj.default_options = { :symbol_keys => true }
+        MultiJson.with_engine(:oj){ example.call }
+        Oj.default_options = options
+      end
+
+      it 'ignores global settings' do
+        MultiJson.with_engine(:oj) do
+          example = '{"a": 1, "b": 2}'
+          expected = { 'a' => 1, 'b' => 2 }
+          expect(MultiJson.load(example)).to eq expected
+        end
+      end
+    end
+  end
+
+  describe 'default options' do
+    after(:all){ MultiJson.load_options = MultiJson.dump_options = nil }
+
+    it 'is deprecated' do
+      Kernel.should_receive(:warn).with(/deprecated/i)
+      silence_warnings{ MultiJson.default_options = {:foo => 'bar'} }
+    end
+
+    it 'sets both load and dump options' do
+      MultiJson.should_receive(:dump_options=).with(:foo => 'bar')
+      MultiJson.should_receive(:load_options=).with(:foo => 'bar')
+      silence_warnings{ MultiJson.default_options = {:foo => 'bar'} }
+    end
+  end
+
+  it_behaves_like 'has options', MultiJson
+
+  %w(gson jr_jackson json_gem json_pure nsjsonserialization oj ok_json yajl).each do |adapter|
+    next if !jruby? && %w(gson jr_jackson).include?(adapter)
+    next if !macruby? && adapter == 'nsjsonserialization'
+    next if jruby? && %w(oj yajl).include?(adapter)
+
+    context adapter do
+      it_behaves_like 'an adapter', adapter
+    end
+  end
+
+  %w(json_gem json_pure).each do |adapter|
+    context adapter do
+      it_behaves_like 'JSON-like adapter', adapter
+    end
+  end
+
+  describe 'aliases' do
+    if jruby?
+      describe 'jrjackson' do
+        after{ expect(MultiJson.adapter).to eq(MultiJson::Adapters::JrJackson) }
+
+        it 'allows jrjackson alias as symbol' do
+          expect{ MultiJson.use :jrjackson }.not_to raise_error
+        end
+
+        it 'allows jrjackson alias as string' do
+          expect{ MultiJson.use 'jrjackson' }.not_to raise_error
+        end
+
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/COPYING b/.bundle/ruby/2.0.0/gems/rack-1.5.2/COPYING
new file mode 100644
index 0000000..a4fe222
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/COPYING
@@ -0,0 +1,18 @@
+Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012 Christian Neukirchen <purl.org/net/chneukirchen>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/KNOWN-ISSUES b/.bundle/ruby/2.0.0/gems/rack-1.5.2/KNOWN-ISSUES
new file mode 100644
index 0000000..e0373b2
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/KNOWN-ISSUES
@@ -0,0 +1,30 @@
+= Known issues with Rack and ECMA-262
+
+* Many users expect the escape() function defined in ECMA-262 to be compatible
+  with URI. Confusion is especially strong because the documentation for the
+  escape function includes a reference to the URI specifications. ECMA-262
+  escape is not however a URI escape function, it is a javascript escape
+  function, and is not fully compatible. Most notably, for characters outside of
+  the BMP. Users should use the more correct encodeURI functions.
+
+= Known issues with Rack and Web servers
+
+* Lighttpd sets wrong SCRIPT_NAME and PATH_INFO if you mount your
+  FastCGI app at "/".  This can be fixed by using this middleware:
+
+    class LighttpdScriptNameFix
+      def initialize(app)
+        @app = app
+      end
+
+      def call(env)
+        env["PATH_INFO"] = env["SCRIPT_NAME"].to_s + env["PATH_INFO"].to_s
+        env["SCRIPT_NAME"] = ""
+        @app.call(env)
+      end
+    end
+
+  Of course, use this only when your app runs at "/".
+
+  Since lighttpd 1.4.23, you also can use the "fix-root-scriptname" flag
+  in fastcgi.server.
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/README.rdoc b/.bundle/ruby/2.0.0/gems/rack-1.5.2/README.rdoc
new file mode 100644
index 0000000..02c1193
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/README.rdoc
@@ -0,0 +1,624 @@
+= Rack, a modular Ruby webserver interface {<img src="https://secure.travis-ci.org/rack/rack.png" alt="Build Status" />}[http://travis-ci.org/rack/rack] {<img src="https://gemnasium.com/rack/rack.png" alt="Dependency Status" />}[https://gemnasium.com/rack/rack]
+
+Rack provides a minimal, modular and adaptable interface for developing
+web applications in Ruby.  By wrapping HTTP requests and responses in
+the simplest way possible, it unifies and distills the API for web
+servers, web frameworks, and software in between (the so-called
+middleware) into a single method call.
+
+The exact details of this are described in the Rack specification,
+which all Rack applications should conform to.
+
+== Supported web servers
+
+The included *handlers* connect all kinds of web servers to Rack:
+* Mongrel
+* EventedMongrel
+* SwiftipliedMongrel
+* WEBrick
+* FCGI
+* CGI
+* SCGI
+* LiteSpeed
+* Thin
+
+These web servers include Rack handlers in their distributions:
+* Ebb
+* Fuzed
+* Glassfish v3
+* Phusion Passenger (which is mod_rack for Apache and for nginx)
+* Puma
+* Rainbows!
+* Reel
+* Unicorn
+* unixrack
+* uWSGI
+* Zbatery
+
+Any valid Rack app will run the same on all these handlers, without
+changing anything.
+
+== Supported web frameworks
+
+These frameworks include Rack adapters in their distributions:
+* Camping
+* Coset
+* Espresso
+* Halcyon
+* Mack
+* Maveric
+* Merb
+* Racktools::SimpleApplication
+* Ramaze
+* Ruby on Rails
+* Rum
+* Sinatra
+* Sin
+* Vintage
+* Waves
+* Wee
+* ... and many others.
+
+== Available middleware
+
+Between the server and the framework, Rack can be customized to your
+applications needs using middleware, for example:
+* Rack::URLMap, to route to multiple applications inside the same process.
+* Rack::CommonLogger, for creating Apache-style logfiles.
+* Rack::ShowException, for catching unhandled exceptions and
+  presenting them in a nice and helpful way with clickable backtrace.
+* Rack::File, for serving static files.
+* ...many others!
+
+All these components use the same interface, which is described in
+detail in the Rack specification.  These optional components can be
+used in any way you wish.
+
+== Convenience
+
+If you want to develop outside of existing frameworks, implement your
+own ones, or develop middleware, Rack provides many helpers to create
+Rack applications quickly and without doing the same web stuff all
+over:
+* Rack::Request, which also provides query string parsing and
+  multipart handling.
+* Rack::Response, for convenient generation of HTTP replies and
+  cookie handling.
+* Rack::MockRequest and Rack::MockResponse for efficient and quick
+  testing of Rack application without real HTTP round-trips.
+
+== rack-contrib
+
+The plethora of useful middleware created the need for a project that
+collects fresh Rack middleware.  rack-contrib includes a variety of
+add-on components for Rack and it is easy to contribute new modules.
+
+* http://github.com/rack/rack-contrib
+
+== rackup
+
+rackup is a useful tool for running Rack applications, which uses the
+Rack::Builder DSL to configure middleware and build up applications
+easily.
+
+rackup automatically figures out the environment it is run in, and
+runs your application as FastCGI, CGI, or standalone with Mongrel or
+WEBrick---all from the same configuration.
+
+== Quick start
+
+Try the lobster!
+
+Either with the embedded WEBrick starter:
+
+    ruby -Ilib lib/rack/lobster.rb
+
+Or with rackup:
+
+    bin/rackup -Ilib example/lobster.ru
+
+By default, the lobster is found at http://localhost:9292.
+
+== Installing with RubyGems
+
+A Gem of Rack is available at rubygems.org.  You can install it with:
+
+    gem install rack
+
+I also provide a local mirror of the gems (and development snapshots)
+at my site:
+
+    gem install rack --source http://chneukirchen.org/releases/gems/
+
+== Running the tests
+
+Testing Rack requires the bacon testing framework:
+
+    bundle install --without extra # to be able to run the fast tests
+
+Or:
+
+    bundle install # this assumes that you have installed native extensions!
+
+There are two rake-based test tasks:
+
+    rake test       tests all the fast tests (no Handlers or Adapters)
+    rake fulltest   runs all the tests
+
+The fast testsuite has no dependencies outside of the core Ruby
+installation and bacon.
+
+To run the test suite completely, you need:
+
+  * fcgi
+  * memcache-client
+  * mongrel
+  * thin
+
+The full set of tests test FCGI access with lighttpd (on port
+9203) so you will need lighttpd installed as well as the FCGI
+libraries and the fcgi gem:
+
+Download and install lighttpd:
+
+    http://www.lighttpd.net/download
+
+Installing the FCGI libraries:
+
+    curl -O http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz
+    tar xzvf fcgi-2.4.0.tar.gz
+    cd fcgi-2.4.0
+    ./configure --prefix=/usr/local
+    make
+    sudo make install
+    cd ..
+
+Installing the Ruby fcgi gem:
+
+    gem install fcgi
+
+Furthermore, to test Memcache sessions, you need memcached (will be
+run on port 11211) and memcache-client installed.
+
+== History
+
+* March 3rd, 2007: First public release 0.1.
+
+* May 16th, 2007: Second public release 0.2.
+  * HTTP Basic authentication.
+  * Cookie Sessions.
+  * Static file handler.
+  * Improved Rack::Request.
+  * Improved Rack::Response.
+  * Added Rack::ShowStatus, for better default error messages.
+  * Bug fixes in the Camping adapter.
+  * Removed Rails adapter, was too alpha.
+
+* February 26th, 2008: Third public release 0.3.
+  * LiteSpeed handler, by Adrian Madrid.
+  * SCGI handler, by Jeremy Evans.
+  * Pool sessions, by blink.
+  * OpenID authentication, by blink.
+  * :Port and :File options for opening FastCGI sockets, by blink.
+  * Last-Modified HTTP header for Rack::File, by blink.
+  * Rack::Builder#use now accepts blocks, by Corey Jewett.
+    (See example/protectedlobster.ru)
+  * HTTP status 201 can contain a Content-Type and a body now.
+  * Many bugfixes, especially related to Cookie handling.
+
+* August 21st, 2008: Fourth public release 0.4.
+  * New middleware, Rack::Deflater, by Christoffer Sawicki.
+  * OpenID authentication now needs ruby-openid 2.
+  * New Memcache sessions, by blink.
+  * Explicit EventedMongrel handler, by Joshua Peek <josh at joshpeek.com>
+  * Rack::Reloader is not loaded in rackup development mode.
+  * rackup can daemonize with -D.
+  * Many bugfixes, especially for pool sessions, URLMap, thread safety
+    and tempfile handling.
+  * Improved tests.
+  * Rack moved to Git.
+
+* January 6th, 2009: Fifth public release 0.9.
+  * Rack is now managed by the Rack Core Team.
+  * Rack::Lint is stricter and follows the HTTP RFCs more closely.
+  * Added ConditionalGet middleware.
+  * Added ContentLength middleware.
+  * Added Deflater middleware.
+  * Added Head middleware.
+  * Added MethodOverride middleware.
+  * Rack::Mime now provides popular MIME-types and their extension.
+  * Mongrel Header now streams.
+  * Added Thin handler.
+  * Official support for swiftiplied Mongrel.
+  * Secure cookies.
+  * Made HeaderHash case-preserving.
+  * Many bugfixes and small improvements.
+
+* January 9th, 2009: Sixth public release 0.9.1.
+  * Fix directory traversal exploits in Rack::File and Rack::Directory.
+
+* April 25th, 2009: Seventh public release 1.0.0.
+  * SPEC change: Rack::VERSION has been pushed to [1,0].
+  * SPEC change: header values must be Strings now, split on "\n".
+  * SPEC change: Content-Length can be missing, in this case chunked transfer
+    encoding is used.
+  * SPEC change: rack.input must be rewindable and support reading into
+    a buffer, wrap with Rack::RewindableInput if it isn't.
+  * SPEC change: rack.session is now specified.
+  * SPEC change: Bodies can now additionally respond to #to_path with
+    a filename to be served.
+  * NOTE: String bodies break in 1.9, use an Array consisting of a
+    single String instead.
+  * New middleware Rack::Lock.
+  * New middleware Rack::ContentType.
+  * Rack::Reloader has been rewritten.
+  * Major update to Rack::Auth::OpenID.
+  * Support for nested parameter parsing in Rack::Response.
+  * Support for redirects in Rack::Response.
+  * HttpOnly cookie support in Rack::Response.
+  * The Rakefile has been rewritten.
+  * Many bugfixes and small improvements.
+
+* October 18th, 2009: Eighth public release 1.0.1.
+  * Bump remainder of rack.versions.
+  * Support the pure Ruby FCGI implementation.
+  * Fix for form names containing "=": split first then unescape components
+  * Fixes the handling of the filename parameter with semicolons in names.
+  * Add anchor to nested params parsing regexp to prevent stack overflows
+  * Use more compatible gzip write api instead of "<<".
+  * Make sure that Reloader doesn't break when executed via ruby -e
+  * Make sure WEBrick respects the :Host option
+  * Many Ruby 1.9 fixes.
+
+* January 3rd, 2010: Ninth public release 1.1.0.
+  * Moved Auth::OpenID to rack-contrib.
+  * SPEC change that relaxes Lint slightly to allow subclasses of the
+    required types
+  * SPEC change to document rack.input binary mode in greator detail
+  * SPEC define optional rack.logger specification
+  * File servers support X-Cascade header
+  * Imported Config middleware
+  * Imported ETag middleware
+  * Imported Runtime middleware
+  * Imported Sendfile middleware
+  * New Logger and NullLogger middlewares
+  * Added mime type for .ogv and .manifest.
+  * Don't squeeze PATH_INFO slashes
+  * Use Content-Type to determine POST params parsing
+  * Update Rack::Utils::HTTP_STATUS_CODES hash
+  * Add status code lookup utility
+  * Response should call #to_i on the status
+  * Add Request#user_agent
+  * Request#host knows about forwared host
+  * Return an empty string for Request#host if HTTP_HOST and
+    SERVER_NAME are both missing
+  * Allow MockRequest to accept hash params
+  * Optimizations to HeaderHash
+  * Refactored rackup into Rack::Server
+  * Added Utils.build_nested_query to complement Utils.parse_nested_query
+  * Added Utils::Multipart.build_multipart to complement
+    Utils::Multipart.parse_multipart
+  * Extracted set and delete cookie helpers into Utils so they can be
+    used outside Response
+  * Extract parse_query and parse_multipart in Request so subclasses
+    can change their behavior
+  * Enforce binary encoding in RewindableInput
+  * Set correct external_encoding for handlers that don't use RewindableInput
+
+* June 13th, 2010: Tenth public release 1.2.0.
+  * Removed Camping adapter: Camping 2.0 supports Rack as-is
+  * Removed parsing of quoted values
+  * Add Request.trace? and Request.options?
+  * Add mime-type for .webm and .htc
+  * Fix HTTP_X_FORWARDED_FOR
+  * Various multipart fixes
+  * Switch test suite to bacon
+
+* June 15th, 2010: Eleventh public release 1.2.1.
+  * Make CGI handler rewindable
+  * Rename spec/ to test/ to not conflict with SPEC on lesser
+    operating systems
+
+* March 13th, 2011: Twelfth public release 1.2.2/1.1.2.
+  * Security fix in Rack::Auth::Digest::MD5: when authenticator
+    returned nil, permission was granted on empty password.
+
+* May 22nd, 2011: Thirteenth public release 1.3.0
+  * Various performance optimizations
+  * Various multipart fixes
+  * Various multipart refactors
+  * Infinite loop fix for multipart
+  * Test coverage for Rack::Server returns
+  * Allow files with '..', but not path components that are '..'
+  * rackup accepts handler-specific options on the command line
+  * Request#params no longer merges POST into GET (but returns the same)
+  * Use URI.encode_www_form_component instead. Use core methods for escaping.
+  * Allow multi-line comments in the config file
+  * Bug L#94 reported by Nikolai Lugovoi, query parameter unescaping.
+  * Rack::Response now deletes Content-Length when appropriate
+  * Rack::Deflater now supports streaming
+  * Improved Rack::Handler loading and searching
+  * Support for the PATCH verb
+  * env['rack.session.options'] now contains session options
+  * Cookies respect renew
+  * Session middleware uses SecureRandom.hex
+
+* May 22nd, 2011: Fourteenth public release 1.2.3
+  * Pulled in relevant bug fixes from 1.3
+  * Fixed 1.8.6 support
+
+* July 13, 2011: Fifteenth public release 1.3.1
+  * Fix 1.9.1 support
+  * Fix JRuby support
+  * Properly handle $KCODE in Rack::Utils.escape
+  * Make method_missing/respond_to behavior consistent for Rack::Lock,
+    Rack::Auth::Digest::Request and Rack::Multipart::UploadedFile
+  * Reenable passing rack.session to session middleware
+  * Rack::CommonLogger handles streaming responses correctly
+  * Rack::MockResponse calls close on the body object
+  * Fix a DOS vector from MRI stdlib backport
+
+* July 16, 2011: Sixteenth public release 1.3.2
+  * Fix for Rails and rack-test, Rack::Utils#escape calls to_s
+
+* September 16, 2011: Seventeenth public release 1.3.3
+  * Fix bug with broken query parameters in Rack::ShowExceptions
+  * Rack::Request#cookies no longer swallows exceptions on broken input
+  * Prevents XSS attacks enabled by bug in Ruby 1.8's regexp engine
+  * Rack::ConditionalGet handles broken If-Modified-Since helpers
+
+* September 16, 2011: Eighteenth public release 1.2.4
+  * Fix a bug with MRI regex engine to prevent XSS by malformed unicode
+
+* October 1, 2011: Nineteenth public release 1.3.4
+  * Backport security fix from 1.9.3, also fixes some roundtrip issues in URI
+  * Small documentation update
+  * Fix an issue where BodyProxy could cause an infinite recursion
+  * Add some supporting files for travis-ci
+
+* October 17, 2011: Twentieth public release 1.3.5
+  * Fix annoying warnings caused by the backport in 1.3.4
+
+* December 28th, 2011: Twenty first public release: 1.1.3.
+  * Security fix. http://www.ocert.org/advisories/ocert-2011-003.html
+    Further information here: http://jruby.org/2011/12/27/jruby-1-6-5-1
+
+* December 28th, 2011: Twenty fourth public release 1.4.0
+  * Ruby 1.8.6 support has officially been dropped. Not all tests pass.
+  * Raise sane error messages for broken config.ru
+  * Allow combining run and map in a config.ru
+  * Rack::ContentType will not set Content-Type for responses without a body
+  * Status code 205 does not send a response body
+  * Rack::Response::Helpers will not rely on instance variables
+  * Rack::Utils.build_query no longer outputs '=' for nil query values
+  * Various mime types added
+  * Rack::MockRequest now supports HEAD
+  * Rack::Directory now supports files that contain RFC3986 reserved chars
+  * Rack::File now only supports GET and HEAD requests
+  * Rack::Server#start now passes the block to Rack::Handler::<h>#run
+  * Rack::Static now supports an index option
+  * Added the Teapot status code
+  * rackup now defaults to Thin instead of Mongrel (if installed)
+  * Support added for HTTP_X_FORWARDED_SCHEME
+  * Numerous bug fixes, including many fixes for new and alternate rubies
+
+* January 22nd, 2012: Twenty fifth public release 1.4.1
+  * Alter the keyspace limit calculations to reduce issues with nested params
+  * Add a workaround for multipart parsing where files contain unescaped "%"
+  * Added Rack::Response::Helpers#method_not_allowed? (code 405)
+  * Rack::File now returns 404 for illegal directory traversals
+  * Rack::File now returns 405 for illegal methods (non HEAD/GET)
+  * Rack::Cascade now catches 405 by default, as well as 404
+  * Cookies missing '--' no longer cause an exception to be raised
+  * Various style changes and documentation spelling errors
+  * Rack::BodyProxy always ensures to execute its block
+  * Additional test coverage around cookies and secrets
+  * Rack::Session::Cookie can now be supplied either secret or old_secret
+  * Tests are no longer dependent on set order
+  * Rack::Static no longer defaults to serving index files
+  * Rack.release was fixed
+
+* January 6th, 2013: Twenty sixth public release 1.1.4
+  * Add warnings when users do not provide a session secret
+
+* January 6th, 2013: Twenty seventh public release 1.2.6
+  * Add warnings when users do not provide a session secret
+  * Fix parsing performance for unquoted filenames
+
+* January 6th, 2013: Twenty eighth public release 1.3.7
+  * Add warnings when users do not provide a session secret
+  * Fix parsing performance for unquoted filenames
+  * Updated URI backports
+  * Fix URI backport version matching, and silence constant warnings
+  * Correct parameter parsing with empty values
+  * Correct rackup '-I' flag, to allow multiple uses
+  * Correct rackup pidfile handling
+  * Report rackup line numbers correctly
+  * Fix request loops caused by non-stale nonces with time limits
+  * Fix reloader on Windows
+  * Prevent infinite recursions from Response#to_ary
+  * Various middleware better conforms to the body close specification
+  * Updated language for the body close specification
+  * Additional notes regarding ECMA escape compatibility issues
+  * Fix the parsing of multiple ranges in range headers
+
+* January 6th, 2013: Twenty ninth public release 1.4.2
+  * Add warnings when users do not provide a session secret
+  * Fix parsing performance for unquoted filenames
+  * Updated URI backports
+  * Fix URI backport version matching, and silence constant warnings
+  * Correct parameter parsing with empty values
+  * Correct rackup '-I' flag, to allow multiple uses
+  * Correct rackup pidfile handling
+  * Report rackup line numbers correctly
+  * Fix request loops caused by non-stale nonces with time limits
+  * Fix reloader on Windows
+  * Prevent infinite recursions from Response#to_ary
+  * Various middleware better conforms to the body close specification
+  * Updated language for the body close specification
+  * Additional notes regarding ECMA escape compatibility issues
+  * Fix the parsing of multiple ranges in range headers
+  * Prevent errors from empty parameter keys
+  * Added PATCH verb to Rack::Request
+  * Various documentation updates
+  * Fix session merge semantics (fixes rack-test)
+  * Rack::Static :index can now handle multiple directories
+  * All tests now utilize Rack::Lint (special thanks to Lars Gierth)
+  * Rack::File cache_control parameter is now deprecated, and removed by 1.5
+  * Correct Rack::Directory script name escaping
+  * Rack::Static supports header rules for sophisticated configurations
+  * Multipart parsing now works without a Content-Length header
+  * New logos courtesy of Zachary Scott!
+  * Rack::BodyProxy now explicitly defines #each, useful for C extensions
+  * Cookies that are not URI escaped no longer cause exceptions
+
+* January 7th, 2013: Thirtieth public release 1.3.8
+  * Security: Prevent unbounded reads in large multipart boundaries
+
+* January 7th, 2013: Thirty first public release 1.4.3
+  * Security: Prevent unbounded reads in large multipart boundaries
+
+* January 13th, 2013: Thirty second public release 1.4.4, 1.3.9, 1.2.7, 1.1.5
+  * [SEC] Rack::Auth::AbstractRequest no longer symbolizes arbitrary strings
+  * Fixed erroneous test case in the 1.3.x series
+
+* January 21st, 2013: Thirty third public release 1.5.0
+  * Introduced hijack SPEC, for before-response and after-response hijacking
+  * SessionHash is no longer a Hash subclass
+  * Rack::File cache_control parameter is removed, in place of headers options
+  * Rack::Auth::AbstractRequest#scheme now yields strings, not symbols
+  * Rack::Utils cookie functions now format expires in RFC 2822 format
+  * Rack::File now has a default mime type
+  * rackup -b 'run Rack::File.new(".")', option provides command line configs
+  * Rack::Deflater will no longer double encode bodies
+  * Rack::Mime#match? provides convenience for Accept header matching
+  * Rack::Utils#q_values provides splitting for Accept headers
+  * Rack::Utils#best_q_match provides a helper for Accept headers
+  * Rack::Handler.pick provides convenience for finding available servers
+  * Puma added to the list of default servers (preferred over Webrick)
+  * Various middleware now correctly close body when replacing it
+  * Rack::Request#params is no longer persistent with only GET params
+  * Rack::Request#update_param and #delete_param provide persistent operations
+  * Rack::Request#trusted_proxy? now returns true for local unix sockets
+  * Rack::Response no longer forces Content-Types
+  * Rack::Sendfile provides local mapping configuration options
+  * Rack::Utils#rfc2109 provides old netscape style time output
+  * Updated HTTP status codes
+  * Ruby 1.8.6 likely no longer passes tests, and is no longer fully supported
+
+* January 28th, 2013: Thirty fourth public release 1.5.1
+  * Rack::Lint check_hijack now conforms to other parts of SPEC
+  * Added hash-like methods to Abstract::ID::SessionHash for compatibility
+  * Various documentation corrections
+
+* February 7th, Thirty fifth public release 1.1.6, 1.2.8, 1.3.10
+  * Fix CVE-2013-0263, timing attack against Rack::Session::Cookie
+
+* February 7th, Thirty fifth public release 1.4.5
+  * Fix CVE-2013-0263, timing attack against Rack::Session::Cookie
+  * Fix CVE-2013-0262, symlink path traversal in Rack::File
+
+* February 7th, Thirty fifth public release 1.5.2
+  * Fix CVE-2013-0263, timing attack against Rack::Session::Cookie
+  * Fix CVE-2013-0262, symlink path traversal in Rack::File
+  * Add various methods to Session for enhanced Rails compatibility
+  * Request#trusted_proxy? now only matches whole stirngs
+  * Add JSON cookie coder, to be default in Rack 1.6+ due to security concerns
+  * URLMap host matching in environments that don't set the Host header fixed
+  * Fix a race condition that could result in overwritten pidfiles
+  * Various documentation additions
+
+== Contact
+
+Please post bugs, suggestions and patches to
+the bug tracker at <http://github.com/rack/rack/issues>.
+
+Please post security related bugs and suggestions to the core team at
+<https://groups.google.com/group/rack-core> or rack-core at googlegroups.com. This
+list is not public. Due to wide usage of the library, it is strongly preferred
+that we manage timing in order to provide viable patches at the time of
+disclosure. Your assistance in this matter is greatly appreciated.
+
+Mailing list archives are available at
+<http://groups.google.com/group/rack-devel>.
+
+Git repository (send Git patches to the mailing list):
+* http://github.com/rack/rack
+* http://git.vuxu.org/cgi-bin/gitweb.cgi?p=rack-github.git
+
+You are also welcome to join the #rack channel on irc.freenode.net.
+
+== Thanks
+
+The Rack Core Team, consisting of
+
+* Christian Neukirchen (chneukirchen)
+* James Tucker (raggi)
+* Josh Peek (josh)
+* Michael Fellinger (manveru)
+* Ryan Tomayko (rtomayko)
+* Scytrin dai Kinthra (scytrin)
+* Aaron Patterson (tenderlove)
+* Konstantin Haase (rkh)
+
+would like to thank:
+
+* Adrian Madrid, for the LiteSpeed handler.
+* Christoffer Sawicki, for the first Rails adapter and Rack::Deflater.
+* Tim Fletcher, for the HTTP authentication code.
+* Luc Heinrich for the Cookie sessions, the static file handler and bugfixes.
+* Armin Ronacher, for the logo and racktools.
+* Alex Beregszaszi, Alexander Kahn, Anil Wadghule, Aredridel, Ben
+  Alpert, Dan Kubb, Daniel Roethlisberger, Matt Todd, Tom Robinson,
+  Phil Hagelberg, S. Brent Faulkner, Bosko Milekic, Daniel Rodríguez
+  Troitiño, Genki Takiuchi, Geoffrey Grosenbach, Julien Sanchez, Kamal
+  Fariz Mahyuddin, Masayoshi Takahashi, Patrick Aljordm, Mig, Kazuhiro
+  Nishiyama, Jon Bardin, Konstantin Haase, Larry Siden, Matias
+  Korhonen, Sam Ruby, Simon Chiang, Tim Connor, Timur Batyrshin, and
+  Zach Brock for bug fixing and other improvements.
+* Eric Wong, Hongli Lai, Jeremy Kemper for their continuous support
+  and API improvements.
+* Yehuda Katz and Carl Lerche for refactoring rackup.
+* Brian Candler, for Rack::ContentType.
+* Graham Batty, for improved handler loading.
+* Stephen Bannasch, for bug reports and documentation.
+* Gary Wright, for proposing a better Rack::Response interface.
+* Jonathan Buch, for improvements regarding Rack::Response.
+* Armin Röhrl, for tracking down bugs in the Cookie generator.
+* Alexander Kellett for testing the Gem and reviewing the announcement.
+* Marcus Rückert, for help with configuring and debugging lighttpd.
+* The WSGI team for the well-done and documented work they've done and
+  Rack builds up on.
+* All bug reporters and patch contributors not mentioned above.
+
+== Copyright
+
+Copyright (C) 2007, 2008, 2009, 2010 Christian Neukirchen <http://purl.org/net/chneukirchen>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+== Links
+
+Rack:: <http://rack.github.com/>
+Official Rack repositories:: <http://github.com/rack>
+Rack Bug Tracking:: <http://github.com/rack/rack/issues>
+rack-devel mailing list:: <http://groups.google.com/group/rack-devel>
+Rack's Rubyforge project:: <http://rubyforge.org/projects/rack>
+
+Christian Neukirchen:: <http://chneukirchen.org/>
+
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/Rakefile b/.bundle/ruby/2.0.0/gems/rack-1.5.2/Rakefile
new file mode 100644
index 0000000..dcd253d
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/Rakefile
@@ -0,0 +1,125 @@
+# Rakefile for Rack.  -*-ruby-*-
+
+desc "Run all the tests"
+task :default => [:test]
+
+desc "Install gem dependencies"
+task :deps do
+  require 'rubygems'
+  require 'rbconfig'
+  spec = Gem::Specification.load('rack.gemspec')
+  spec.dependencies.each do |dep|
+    reqs = dep.requirements_list
+    reqs = (["-v"] * reqs.size).zip(reqs).flatten
+    # Use system over sh, because we want to ignore errors!
+    system Gem.ruby, "-S", "gem", "install", '--conservative', dep.name, *reqs
+  end
+end
+
+desc "Make an archive as .tar.gz"
+task :dist => %w[chmod ChangeLog SPEC rdoc] do
+  sh "git archive --format=tar --prefix=#{release}/ HEAD^{tree} >#{release}.tar"
+  sh "pax -waf #{release}.tar -s ':^:#{release}/:' SPEC ChangeLog doc rack.gemspec"
+  sh "gzip -f -9 #{release}.tar"
+end
+
+desc "Make an official release"
+task :officialrelease do
+  puts "Official build for #{release}..."
+  sh "rm -rf stage"
+  sh "git clone --shared . stage"
+  sh "cd stage && rake officialrelease_really"
+  sh "mv stage/#{release}.tar.gz stage/#{release}.gem ."
+end
+
+task :officialrelease_really => %w[SPEC dist gem] do
+  sh "sha1sum #{release}.tar.gz #{release}.gem"
+end
+
+def release
+  "rack-#{File.read("rack.gemspec")[/s.version *= *"(.*?)"/, 1]}"
+end
+
+desc "Make binaries executable"
+task :chmod do
+  Dir["bin/*"].each { |binary| File.chmod(0775, binary) }
+  Dir["test/cgi/test*"].each { |binary| File.chmod(0775, binary) }
+end
+
+desc "Generate a ChangeLog"
+task :changelog => %w[ChangeLog]
+
+file '.git/index'
+file "ChangeLog" => '.git/index' do
+  File.open("ChangeLog", "w") { |out|
+    log = `git log -z`
+    log.force_encoding(Encoding::BINARY) if log.respond_to?(:force_encoding)
+    log.split("\0").map { |chunk|
+      author = chunk[/Author: (.*)/, 1].strip
+      date = chunk[/Date: (.*)/, 1].strip
+      desc, detail = $'.strip.split("\n", 2)
+      detail ||= ""
+      detail = detail.gsub(/.*darcs-hash:.*/, '')
+      detail.rstrip!
+      out.puts "#{date}  #{author}"
+      out.puts "  * #{desc.strip}"
+      out.puts detail  unless detail.empty?
+      out.puts
+    }
+  }
+end
+
+file 'lib/rack/lint.rb'
+desc "Generate Rack Specification"
+file "SPEC" => 'lib/rack/lint.rb' do
+  File.open("SPEC", "wb") { |file|
+    IO.foreach("lib/rack/lint.rb") { |line|
+      if line =~ /## (.*)/
+        file.puts $1
+      end
+    }
+  }
+end
+
+desc "Run all the fast + platform agnostic tests"
+task :test => 'SPEC' do
+  opts     = ENV['TEST'] || '-a'
+  specopts = ENV['TESTOPTS'] ||
+    "-q -t '^(?!Rack::Adapter|Rack::Session::Memcache|Rack::Server|Rack::Handler)'"
+
+  sh "bacon -w -I./lib:./test #{opts} #{specopts}"
+end
+
+desc "Run all the tests we run on CI"
+task :ci => :test
+
+desc "Run all the tests"
+task :fulltest => %w[SPEC chmod] do
+  opts     = ENV['TEST'] || '-a'
+  specopts = ENV['TESTOPTS'] || '-q'
+  sh "bacon -r./test/gemloader -I./lib:./test -w #{opts} #{specopts}"
+end
+
+task :gem => ["SPEC"] do
+  sh "gem build rack.gemspec"
+end
+
+task :doc => :rdoc
+desc "Generate RDoc documentation"
+task :rdoc => %w[ChangeLog SPEC] do
+  sh(*%w{rdoc --line-numbers --main README.rdoc
+              --title 'Rack\ Documentation' --charset utf-8 -U -o doc} +
+              %w{README.rdoc KNOWN-ISSUES SPEC ChangeLog} +
+              `git ls-files lib/\*\*/\*.rb`.strip.split)
+  cp "contrib/rdoc.css", "doc/rdoc.css"
+end
+
+task :pushdoc => %w[rdoc] do
+  sh "rsync -avz doc/ rack.rubyforge.org:/var/www/gforge-projects/rack/doc/"
+end
+
+task :pushsite => %w[pushdoc] do
+  sh "cd site && git gc"
+  sh "rsync -avz site/ rack.rubyforge.org:/var/www/gforge-projects/rack/"
+  sh "cd site && git push"
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/SPEC b/.bundle/ruby/2.0.0/gems/rack-1.5.2/SPEC
new file mode 100644
index 0000000..9b28627
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/SPEC
@@ -0,0 +1,237 @@
+This specification aims to formalize the Rack protocol.  You
+can (and should) use Rack::Lint to enforce it.
+When you develop middleware, be sure to add a Lint before and
+after to catch all mistakes.
+= Rack applications
+A Rack application is a Ruby object (not a class) that
+responds to +call+.
+It takes exactly one argument, the *environment*
+and returns an Array of exactly three values:
+The *status*,
+the *headers*,
+and the *body*.
+== The Environment
+The environment must be an instance of Hash that includes
+CGI-like headers.  The application is free to modify the
+environment.
+The environment is required to include these variables
+(adopted from PEP333), except when they'd be empty, but see
+below.
+<tt>REQUEST_METHOD</tt>:: The HTTP request method, such as
+                          "GET" or "POST". This cannot ever
+                          be an empty string, and so is
+                          always required.
+<tt>SCRIPT_NAME</tt>:: The initial portion of the request
+                       URL's "path" that corresponds to the
+                       application object, so that the
+                       application knows its virtual
+                       "location". This may be an empty
+                       string, if the application corresponds
+                       to the "root" of the server.
+<tt>PATH_INFO</tt>:: The remainder of the request URL's
+                     "path", designating the virtual
+                     "location" of the request's target
+                     within the application. This may be an
+                     empty string, if the request URL targets
+                     the application root and does not have a
+                     trailing slash. This value may be
+                     percent-encoded when I originating from
+                     a URL.
+<tt>QUERY_STRING</tt>:: The portion of the request URL that
+                        follows the <tt>?</tt>, if any. May be
+                        empty, but is always required!
+<tt>SERVER_NAME</tt>, <tt>SERVER_PORT</tt>:: When combined with <tt>SCRIPT_NAME</tt> and <tt>PATH_INFO</tt>, these variables can be used to complete the URL. Note, however, that <tt>HTTP_HOST</tt>, if present, should be used in preference to <tt>SERVER_NAME</tt> for reconstructing the request URL.  <tt>SERVER_NAME</tt> and <tt>SERVER_PORT</tt> can never be empty strings, and so are always required.
+<tt>HTTP_</tt> Variables:: Variables corresponding to the
+                           client-supplied HTTP request
+                           headers (i.e., variables whose
+                           names begin with <tt>HTTP_</tt>). The
+                           presence or absence of these
+                           variables should correspond with
+                           the presence or absence of the
+                           appropriate HTTP header in the
+                           request. See <a href="https://tools.ietf.org/html/rfc3875#section-4.1.18">
+                           RFC3875 section 4.1.18</a> for specific behavior.
+In addition to this, the Rack environment must include these
+Rack-specific variables:
+<tt>rack.version</tt>:: The Array representing this version of Rack. See Rack::VERSION, that corresponds to the version of this SPEC.
+<tt>rack.url_scheme</tt>:: +http+ or +https+, depending on the request URL.
+<tt>rack.input</tt>:: See below, the input stream.
+<tt>rack.errors</tt>:: See below, the error stream.
+<tt>rack.multithread</tt>:: true if the application object may be simultaneously invoked by another thread in the same process, false otherwise.
+<tt>rack.multiprocess</tt>:: true if an equivalent application object may be simultaneously invoked by another process, false otherwise.
+<tt>rack.run_once</tt>:: true if the server expects (but does not guarantee!) that the application will only be invoked this one time during the life of its containing process. Normally, this will only be true for a server based on CGI (or something similar).
+<tt>rack.hijack?</tt>:: present and true if the server supports connection hijacking. See below, hijacking.
+<tt>rack.hijack</tt>:: an object responding to #call that must be called at least once before using rack.hijack_io. It is recommended #call return rack.hijack_io as well as setting it in env if necessary.
+<tt>rack.hijack_io</tt>:: if rack.hijack? is true, and rack.hijack has received #call, this will contain an object resembling an IO. See hijacking.
+Additional environment specifications have approved to
+standardized middleware APIs.  None of these are required to
+be implemented by the server.
+<tt>rack.session</tt>:: A hash like interface for storing request session data.
+                        The store must implement:
+                        store(key, value)         (aliased as []=);
+                        fetch(key, default = nil) (aliased as []);
+                        delete(key);
+                        clear;
+<tt>rack.logger</tt>:: A common object interface for logging messages.
+                       The object must implement:
+                        info(message, &block)
+                        debug(message, &block)
+                        warn(message, &block)
+                        error(message, &block)
+                        fatal(message, &block)
+The server or the application can store their own data in the
+environment, too.  The keys must contain at least one dot,
+and should be prefixed uniquely.  The prefix <tt>rack.</tt>
+is reserved for use with the Rack core distribution and other
+accepted specifications and must not be used otherwise.
+The environment must not contain the keys
+<tt>HTTP_CONTENT_TYPE</tt> or <tt>HTTP_CONTENT_LENGTH</tt>
+(use the versions without <tt>HTTP_</tt>).
+The CGI keys (named without a period) must have String values.
+There are the following restrictions:
+* <tt>rack.version</tt> must be an array of Integers.
+* <tt>rack.url_scheme</tt> must either be +http+ or +https+.
+* There must be a valid input stream in <tt>rack.input</tt>.
+* There must be a valid error stream in <tt>rack.errors</tt>.
+* There may be a valid hijack stream in <tt>rack.hijack_io</tt>
+* The <tt>REQUEST_METHOD</tt> must be a valid token.
+* The <tt>SCRIPT_NAME</tt>, if non-empty, must start with <tt>/</tt>
+* The <tt>PATH_INFO</tt>, if non-empty, must start with <tt>/</tt>
+* The <tt>CONTENT_LENGTH</tt>, if given, must consist of digits only.
+* One of <tt>SCRIPT_NAME</tt> or <tt>PATH_INFO</tt> must be
+  set.  <tt>PATH_INFO</tt> should be <tt>/</tt> if
+  <tt>SCRIPT_NAME</tt> is empty.
+  <tt>SCRIPT_NAME</tt> never should be <tt>/</tt>, but instead be empty.
+=== The Input Stream
+The input stream is an IO-like object which contains the raw HTTP
+POST data.
+When applicable, its external encoding must be "ASCII-8BIT" and it
+must be opened in binary mode, for Ruby 1.9 compatibility.
+The input stream must respond to +gets+, +each+, +read+ and +rewind+.
+* +gets+ must be called without arguments and return a string,
+  or +nil+ on EOF.
+* +read+ behaves like IO#read. Its signature is <tt>read([length, [buffer]])</tt>.
+  If given, +length+ must be a non-negative Integer (>= 0) or +nil+, and +buffer+ must
+  be a String and may not be nil. If +length+ is given and not nil, then this method
+  reads at most +length+ bytes from the input stream. If +length+ is not given or nil,
+  then this method reads all data until EOF.
+  When EOF is reached, this method returns nil if +length+ is given and not nil, or ""
+  if +length+ is not given or is nil.
+  If +buffer+ is given, then the read data will be placed into +buffer+ instead of a
+  newly created String object.
+* +each+ must be called without arguments and only yield Strings.
+* +rewind+ must be called without arguments. It rewinds the input
+  stream back to the beginning. It must not raise Errno::ESPIPE:
+  that is, it may not be a pipe or a socket. Therefore, handler
+  developers must buffer the input data into some rewindable object
+  if the underlying input stream is not rewindable.
+* +close+ must never be called on the input stream.
+=== The Error Stream
+The error stream must respond to +puts+, +write+ and +flush+.
+* +puts+ must be called with a single argument that responds to +to_s+.
+* +write+ must be called with a single argument that is a String.
+* +flush+ must be called without arguments and must be called
+  in order to make the error appear for sure.
+* +close+ must never be called on the error stream.
+=== Hijacking
+==== Request (before status)
+If rack.hijack? is true then rack.hijack must respond to #call.
+rack.hijack must return the io that will also be assigned (or is
+already present, in rack.hijack_io.
+
+rack.hijack_io must respond to:
+<tt>read, write, read_nonblock, write_nonblock, flush, close,
+close_read, close_write, closed?</tt>
+
+The semantics of these IO methods must be a best effort match to
+those of a normal ruby IO or Socket object, using standard
+arguments and raising standard exceptions. Servers are encouraged
+to simply pass on real IO objects, although it is recognized that
+this approach is not directly compatible with SPDY and HTTP 2.0.
+
+IO provided in rack.hijack_io should preference the
+IO::WaitReadable and IO::WaitWritable APIs wherever supported.
+
+There is a deliberate lack of full specification around
+rack.hijack_io, as semantics will change from server to server.
+Users are encouraged to utilize this API with a knowledge of their
+server choice, and servers may extend the functionality of
+hijack_io to provide additional features to users. The purpose of
+rack.hijack is for Rack to "get out of the way", as such, Rack only
+provides the minimum of specification and support.
+
+If rack.hijack? is false, then rack.hijack should not be set.
+
+If rack.hijack? is false, then rack.hijack_io should not be set.
+==== Response (after headers)
+It is also possible to hijack a response after the status and headers
+have been sent.
+In order to do this, an application may set the special header
+<tt>rack.hijack</tt> to an object that responds to <tt>call</tt>
+accepting an argument that conforms to the <tt>rack.hijack_io</tt>
+protocol.
+
+After the headers have been sent, and this hijack callback has been
+called, the application is now responsible for the remaining lifecycle
+of the IO. The application is also responsible for maintaining HTTP
+semantics. Of specific note, in almost all cases in the current SPEC,
+applications will have wanted to specify the header Connection:close in
+HTTP/1.1, and not Connection:keep-alive, as there is no protocol for
+returning hijacked sockets to the web server. For that purpose, use the
+body streaming API instead (progressively yielding strings via each).
+
+Servers must ignore the <tt>body</tt> part of the response tuple when
+the <tt>rack.hijack</tt> response API is in use.
+
+The special response header <tt>rack.hijack</tt> must only be set
+if the request env has <tt>rack.hijack?</tt> <tt>true</tt>.
+==== Conventions
+* Middleware should not use hijack unless it is handling the whole
+  response.
+* Middleware may wrap the IO object for the response pattern.
+* Middleware should not wrap the IO object for the request pattern. The
+  request pattern is intended to provide the hijacker with "raw tcp".
+== The Response
+=== The Status
+This is an HTTP status. When parsed as integer (+to_i+), it must be
+greater than or equal to 100.
+=== The Headers
+The header must respond to +each+, and yield values of key and value.
+Special headers starting "rack." are for communicating with the
+server, and must not be sent back to the client.
+The header keys must be Strings.
+The header must not contain a +Status+ key,
+contain keys with <tt>:</tt> or newlines in their name,
+contain keys names that end in <tt>-</tt> or <tt>_</tt>,
+but only contain keys that consist of
+letters, digits, <tt>_</tt> or <tt>-</tt> and start with a letter.
+The values of the header must be Strings,
+consisting of lines (for multiple header values, e.g. multiple
+<tt>Set-Cookie</tt> values) seperated by "\n".
+The lines must not contain characters below 037.
+=== The Content-Type
+There must not be a <tt>Content-Type</tt>, when the +Status+ is 1xx,
+204, 205 or 304.
+=== The Content-Length
+There must not be a <tt>Content-Length</tt> header when the
++Status+ is 1xx, 204, 205 or 304.
+=== The Body
+The Body must respond to +each+
+and must only yield String values.
+The Body itself should not be an instance of String, as this will
+break in Ruby 1.9.
+If the Body responds to +close+, it will be called after iteration. If
+the body is replaced by a middleware after action, the original body
+must be closed first, if it repsonds to close.
+If the Body responds to +to_path+, it must return a String
+identifying the location of a file whose contents are identical
+to that produced by calling +each+; this may be used by the
+server as an alternative, possibly more efficient way to
+transport the response.
+The Body commonly is an Array of Strings, the application
+instance itself, or a File-like object.
+== Thanks
+Some parts of this specification are adopted from PEP333: Python
+Web Server Gateway Interface
+v1.0 (http://www.python.org/dev/peps/pep-0333/). I'd like to thank
+everyone involved in that effort.
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/bin/rackup b/.bundle/ruby/2.0.0/gems/rack-1.5.2/bin/rackup
new file mode 100755
index 0000000..ad94af4
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/bin/rackup
@@ -0,0 +1,4 @@
+#!/usr/bin/env ruby
+
+require "rack"
+Rack::Server.start
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/contrib/rack.png b/.bundle/ruby/2.0.0/gems/rack-1.5.2/contrib/rack.png
new file mode 100644
index 0000000..0920c4f
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/rack-1.5.2/contrib/rack.png differ
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/contrib/rack.svg b/.bundle/ruby/2.0.0/gems/rack-1.5.2/contrib/rack.svg
new file mode 100644
index 0000000..0d3f961
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/contrib/rack.svg
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="rack.svg">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3837"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3839" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="230.49849"
+     inkscape:cy="656.46253"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="false"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1056"
+     inkscape:window-x="1920"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1">
+    <sodipodi:guide
+       orientation="1,0"
+       position="645.99255,757.10933"
+       id="guide2995" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="488.40876,686.90373"
+       id="guide2997" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="176.7767,748.52304"
+       id="guide2999" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="355.71429,782.85714"
+       id="guide3005" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="527.14286,642.85714"
+       id="guide3007" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="431.42857,507.85714"
+       id="guide3009" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="488.40876,783.57143"
+       id="guide3011" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="505,372.85714"
+       id="guide3013" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 176.28125,201.03125 0,0.625 0,395.125 0,0.375 0.34375,0.0937 312.34375,91.6875 0.625,0.1875 0,-0.65625 0.125,-419.09375 0,-0.40625 -0.40625,-0.0937 -312.4375,-67.71875 -0.59375,-0.125 z m 1,1.21875 311.4375,67.5 -0.125,418.0625 -311.3125,-91.375 0,-394.1875 z"
+       id="path2985"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 647.21875,206.59375 -0.6875,0.28125 -157.59375,62.21875 -0.3125,0.125 0,0.34375 0.1875,419.125 0,0.75 0.6875,-0.28125 156.0625,-63.1875 0.3125,-0.125 0,-0.34375 1.34375,-418.15625 0,-0.75 z m -1,1.4375 -1.34375,417.125 -155.0625,62.78125 -0.1875,-418.03125 156.59375,-61.875 z"
+       id="path2993"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.6875,137.40625 -0.15625,0.0625 L 176.96875,201.0625 177.3125,202 355.75,138.4375 646.78125,207.53125 647,206.5625 l -291.15625,-69.125 -0.15625,-0.0312 z"
+       id="path3003"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.71875,277.53125 -0.125,0.0312 -178.9375,47.96875 -1.8125,0.46875 1.8125,0.5 311.625,83.5 0.15625,0.0312 0.125,-0.0625 157.59375,-53.65625 1.5625,-0.53125 -1.59375,-0.4375 -290.28125,-77.78125 -0.125,-0.0312 z m 0,1.03125 L 644.3125,355.90625 488.375,409 178.71875,326 l 177,-47.4375 z"
+       id="path3015"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.21875,240.9375 0,37.125 1,0 0,-37.125 -1,0 z"
+       id="path3017"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 176.28125,202.65625 0,393.28125 1,0 0,-393.28125 -1,0 z"
+       id="path3019"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.71875,409 -0.125,0.0312 L 177,455.8125 l -1.78125,0.46875 1.78125,0.5 L 488.28125,545 l 0.15625,0.0312 0.125,-0.0625 156.71875,-56.25 1.46875,-0.53125 -1.53125,-0.40625 -289.375,-78.75 -0.125,-0.0312 z m 0,1.03125 287.6875,78.28125 L 488.375,544 179.03125,456.3125 355.71875,410.03125 z"
+       id="path3021"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.71875,544 -0.15625,0.0312 -178.5625,52.3125 0.28125,0.96875 178.4375,-52.28125 289.59375,80.25 0.28125,-0.96875 -289.75,-80.28125 -0.125,-0.0312 z"
+       id="path3023"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.21875,374.34375 0,35.15625 1,0 0,-35.15625 -1,0 z"
+       id="path3025"
+       inkscape:connector-curvature="0" />
+    <path
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:a [...]
+       d="m 355.1875,507.03125 0,37.4375 1.03125,0 0,-37.4375 -1.03125,0 z"
+       id="path3027"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/contrib/rack_logo.svg b/.bundle/ruby/2.0.0/gems/rack-1.5.2/contrib/rack_logo.svg
new file mode 100644
index 0000000..434175a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/contrib/rack_logo.svg
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/)
+  by Armin Ronacher (mitsuhiko), MIT-licensed.
+-->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="100"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.44"
+   version="1.0"
+   inkscape:export-filename="/home/blackbird/Desktop/rack_logo_final.png"
+   inkscape:export-xdpi="360"
+   inkscape:export-ydpi="360"
+   sodipodi:docbase="/home/blackbird/Desktop"
+   sodipodi:docname="rack_logo.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.959798"
+     inkscape:cx="148.56163"
+     inkscape:cy="67.007749"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     width="200px"
+     height="100px"
+     inkscape:window-width="1400"
+     inkscape:window-height="975"
+     inkscape:window-x="0"
+     inkscape:window-y="24" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="font-size:33.17043304px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Frutiger"
+       d="M 102.28876,57.97848 L 102.28876,64.972684 C 101.77662,64.784857 101.19214,64.690938 100.5353,64.690927 C 99.767107,64.690938 99.026757,64.873251 98.314248,65.237867 C 97.612848,65.591455 97.056197,66.050001 96.644288,66.613505 C 96.343688,67.022337 96.121018,67.541654 95.976308,68.171455 C 95.876091,68.558187 95.826008,69.094078 95.826016,69.779128 L 95.826016,75.861765 L 87.125504,75.861765 L 87.125504,58.144219 L 95.274924,58.144219 L 95.274924,62.105392 C 95.987422,60.56955 [...]
+       id="text2980" />
+    <path
+       style="font-size:9.72235012px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Frutiger45-Light"
+       d="M 87.460353,88.057465 L 88.081744,88.057465 L 88.081744,85.211201 L 88.101471,85.211201 C 88.259282,85.530647 88.463124,85.770232 88.712998,85.929955 C 88.962867,86.083288 89.281782,86.159955 89.669743,86.159955 C 90.33387,86.159955 90.843476,85.923565 91.198561,85.450785 C 91.560211,84.971618 91.741039,84.355087 91.741044,83.601194 C 91.741039,82.815359 91.579938,82.202023 91.25774,81.761184 C 91.086772,81.531188 90.869779,81.355493 90.60676,81.234098 C 90.343734,81.106325 90. [...]
+       id="text2985" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2.95839429;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 12.925286,86.778391 L 13.286986,19.159668 L 58.155285,26.942569 L 57.772633,93.67717 L 12.925286,86.778391 z "
+       id="path2990" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
+       d="M 13.488233,19.049404 L 37.172883,11.162464 L 77.786022,19.420245 L 57.107048,26.22552 L 13.488233,19.049404 z "
+       id="path3877" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 57.997556,93.629361 L 77.486975,86.74764 L 77.759697,19.547174 L 58.5016,26.445081 L 57.997556,93.629361 z "
+       id="path3879"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 14.330613,38.606641 L 36.912066,32.135194 L 76.635736,40.056811 L 58.346077,46.531185 L 14.330613,38.606641 z "
+       id="path3881"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 14.150271,65.640082 L 36.731724,59.168636 L 77.314157,65.640929 L 57.787539,72.680481 L 14.150271,65.640082 z "
+       id="path3883"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 13.820355,86.361841 L 35.130498,79.541609 L 76.834867,85.878963"
+       id="path3887" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 34.866065,79.042658 L 35.146638,69.563169"
+       id="path3889" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 36.154699,58.803397 L 36.535174,42.88001"
+       id="path3891" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 36.776858,31.759485 L 36.855284,23.494878"
+       id="path3893"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/contrib/rdoc.css b/.bundle/ruby/2.0.0/gems/rack-1.5.2/contrib/rdoc.css
new file mode 100644
index 0000000..f1e342f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/contrib/rdoc.css
@@ -0,0 +1,412 @@
+/* Forked from the Darkfish templates rdoc.css file, much hacked, probably
+ * imperfect */
+
+html { max-width: 960px; margin: 0 auto; }
+body {
+  font: 14px "Helvetica Neue", Helvetica, Tahoma, sans-serif;
+}
+body.file-popup {
+  font-size: 90%;
+  margin-left: 0;
+}
+
+h1 {
+  color: #4183C4;
+}
+
+:link,
+:visited {
+  color: #4183C4;
+  text-decoration: none;
+}
+:link:hover,
+:visited:hover {
+  border-bottom: 1px dotted #4183C4;
+}
+
+pre, pre.description {
+  font: 12px Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
+  padding: 1em;
+  overflow: auto;
+  line-height: 1.4;
+}
+
+/* @group Generic Classes */
+
+.initially-hidden {
+  display: none;
+}
+
+#search-field {
+  width: 98%;
+}
+
+.missing-docs {
+  font-size: 120%;
+  background: white url(images/wrench_orange.png) no-repeat 4px center;
+  color: #ccc;
+  line-height: 2em;
+  border: 1px solid #d00;
+  opacity: 1;
+  text-indent: 24px;
+  letter-spacing: 3px;
+  font-weight: bold;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+}
+
+.target-section {
+  border: 2px solid #dcce90;
+  border-left-width: 8px;
+  background: #fff3c2;
+}
+
+/* @end */
+
+/* @group Index Page, Standalone file pages */
+.indexpage ul {
+  line-height: 160%;
+  list-style: none;
+}
+.indexpage ul :link,
+.indexpage ul :visited {
+  font-size: 16px;
+}
+
+.indexpage li {
+  padding-left: 20px;
+}
+
+.indexpage ul > li {
+  background: url(images/bullet_black.png) no-repeat left 4px;
+}
+.indexpage li.method {
+  background: url(images/plugin.png) no-repeat left 4px;
+}
+.indexpage li.module {
+  background: url(images/package.png) no-repeat left 4px;
+}
+.indexpage li.class {
+  background: url(images/ruby.png) no-repeat left 4px;
+}
+.indexpage li.file {
+  background: url(images/page_white_text.png) no-repeat left 4px;
+}
+.indexpage li li {
+  background: url(images/tag_blue.png) no-repeat left 4px;
+}
+.indexpage li .toc-toggle {
+  width: 16px;
+  height: 16px;
+  background: url(images/add.png) no-repeat;
+}
+
+.indexpage li .toc-toggle.open {
+  background: url(images/delete.png) no-repeat;
+}
+
+/* @end */
+
+/* @group Top-Level Structure */
+
+.project-section, #file-metadata, #class-metadata {
+  display: block;
+  background: #f5f5f5;
+  margin-bottom: 1em;
+  padding: 0.5em;
+}
+.project-section h3, #file-metadata h3, #class-metadata h3 {
+  margin: 0;
+}
+
+#metadata {
+  float: left;
+  width: 280px;
+}
+
+#documentation {
+  margin: 2em 1em 2em 300px;
+}
+
+#validator-badges {
+  clear: both;
+  margin: 1em 1em 2em;
+  font-size: smaller;
+}
+
+/* @end */
+
+/* @group Metadata Section */
+
+#metadata ul,
+#metadata dl,
+#metadata p {
+  padding: 0px;
+  list-style: none;
+}
+
+dl.svninfo {
+  color: #666;
+  margin: 0;
+}
+dl.svninfo dt {
+  font-weight: bold;
+}
+
+ul.link-list li {
+  white-space: nowrap;
+}
+ul.link-list .type {
+  font-size: 8px;
+  text-transform: uppercase;
+  color: white;
+  background: #969696;
+}
+
+/* @end */
+
+/* @group Documentation Section */
+
+.note-list {
+  margin: 8px 0;
+}
+
+.label-list {
+  margin: 8px 1.5em;
+  border: 1px solid #ccc;
+}
+.description .label-list {
+  font-size: 14px;
+}
+
+.note-list dt {
+  font-weight: bold;
+}
+.note-list dd {
+}
+
+.label-list dt {
+  font-weight: bold;
+  background: #ddd;
+}
+.label-list dd {
+}
+.label-list dd + dt,
+.note-list dd + dt {
+  margin-top: 0.7em;
+}
+
+#documentation .section {
+  font-size: 90%;
+}
+
+#documentation h2.section-header {
+  color: #333;
+  font-size: 175%;
+}
+
+.documentation-section-title {
+  position: relative;
+}
+.documentation-section-title .section-click-top {
+  position: absolute;
+  top: 6px;
+  right: 12px;
+  font-size: 10px;
+  visibility: hidden;
+}
+
+.documentation-section-title:hover .section-click-top {
+  visibility: visible;
+}
+
+#documentation h3.section-header {
+  color: #333;
+  font-size: 150%;
+}
+
+#constants-list > dl,
+#attributes-list > dl {
+  margin: 1em 0 2em;
+  border: 0;
+}
+#constants-list > dl dt,
+#attributes-list > dl dt {
+  font-weight: bold;
+  font-family: Monaco, "Andale Mono";
+  background: inherit;
+}
+#constants-list > dl dt a,
+#attributes-list > dl dt a {
+  color: inherit;
+}
+#constants-list > dl dd,
+#attributes-list > dl dd {
+  margin: 0 0 1em 0;
+  color: #666;
+}
+
+.documentation-section h2 {
+  position: relative;
+}
+
+.documentation-section h2 a {
+  position: absolute;
+  top: 8px;
+  right: 10px;
+  font-size: 12px;
+  color: #9b9877;
+  visibility: hidden;
+}
+
+.documentation-section h2:hover a {
+  visibility: visible;
+}
+
+/* @group Method Details */
+
+#documentation .method-source-code {
+  display: none;
+}
+
+#documentation .method-detail {
+  margin: 0.2em 0.2em;
+  padding: 0.5em;
+}
+#documentation .method-detail:hover {
+  background-color: #f5f5f5;
+}
+#documentation .method-heading {
+  cursor: pointer;
+  position: relative;
+  font-size: 125%;
+  line-height: 125%;
+  font-weight: bold;
+  color: #333;
+  background: url(images/brick.png) no-repeat left bottom;
+  padding-left: 20px;
+}
+#documentation .method-heading :link,
+#documentation .method-heading :visited {
+  color: inherit;
+}
+#documentation .method-click-advice {
+  position: absolute;
+  right: 5px;
+  font-size: 10px;
+  color: #aaa;
+  visibility: hidden;
+  background: url(images/zoom.png) no-repeat right 5px;
+  padding-right: 20px;
+  overflow: show;
+}
+#documentation .method-heading:hover .method-click-advice {
+  visibility: visible;
+}
+
+#documentation .method-alias .method-heading {
+  color: #666;
+  background: url(images/brick_link.png) no-repeat left bottom;
+}
+
+#documentation .method-description,
+#documentation .aliases {
+  margin: 0 20px;
+  color: #666;
+}
+
+#documentation .method-description p,
+#documentation .aliases p {
+  line-height: 1.2em;
+}
+
+#documentation .aliases {
+  font-style: italic;
+  cursor: default;
+}
+#documentation .method-description p {
+  margin-bottom: 0.5em;
+}
+#documentation .method-description ul {
+  margin-left: 1.5em;
+}
+
+#documentation .attribute-method-heading {
+  background: url(images/tag_green.png) no-repeat left bottom;
+}
+#documentation #attribute-method-details .method-detail:hover {
+  background-color: transparent;
+  cursor: default;
+}
+#documentation .attribute-access-type {
+  font-size: 60%;
+  text-transform: uppercase;
+  vertical-align: super;
+}
+
+.method-section .method-source-code {
+  background: white;
+}
+
+/* @group Source Code */
+
+.ruby-constant .ruby-keyword .ruby-ivar .ruby-operator .ruby-identifier
+.ruby-node .ruby-comment .ruby-regexp .ruby-value {
+  background: transparent;
+}
+
+/* Thanks GitHub!!! */
+.ruby-constant   { color: #458; font-weight: bold; }
+.ruby-keyword    { color: black; font-weight: bold; }
+.ruby-ivar       { color: teal; }
+.ruby-operator   { color: #000; }
+.ruby-identifier { color: black; }
+.ruby-node       { color: red; }
+.ruby-comment    { color: #998; font-weight: bold; }
+.ruby-regexp     { color: #009926; }
+.ruby-value      { color: #099; }
+.ruby-string     { color: red; }
+
+/* @group search results */
+
+#search-section .section-header {
+  margin: 0;
+  padding: 0;
+}
+
+#search-results {
+  width: 100%;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+
+#search-results h1 {
+  font-size: 1em;
+  font-weight: normal;
+  text-shadow: none;
+}
+
+#search-results .current {
+  background: #eee;
+}
+
+#search-results li {
+  list-style: none;
+  line-height: 1em;
+  padding: 0.5em;
+  border-bottom: 1px solid black;
+}
+
+#search-results .search-namespace {
+  font-weight: bold;
+}
+
+#search-results li em {
+  background: yellow;
+  font-style: normal;
+}
+
+#search-results pre {
+  margin: 0.5em;
+}
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/example/lobster.ru b/.bundle/ruby/2.0.0/gems/rack-1.5.2/example/lobster.ru
new file mode 100644
index 0000000..cc7ffca
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/example/lobster.ru
@@ -0,0 +1,4 @@
+require 'rack/lobster'
+
+use Rack::ShowExceptions
+run Rack::Lobster.new
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/example/protectedlobster.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/example/protectedlobster.rb
new file mode 100644
index 0000000..d904b4c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/example/protectedlobster.rb
@@ -0,0 +1,14 @@
+require 'rack'
+require 'rack/lobster'
+
+lobster = Rack::Lobster.new
+
+protected_lobster = Rack::Auth::Basic.new(lobster) do |username, password|
+  'secret' == password
+end
+
+protected_lobster.realm = 'Lobster 2.0'
+
+pretty_protected_lobster = Rack::ShowStatus.new(Rack::ShowExceptions.new(protected_lobster))
+
+Rack::Server.start :app => pretty_protected_lobster, :Port => 9292
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/example/protectedlobster.ru b/.bundle/ruby/2.0.0/gems/rack-1.5.2/example/protectedlobster.ru
new file mode 100644
index 0000000..b0da62f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/example/protectedlobster.ru
@@ -0,0 +1,8 @@
+require 'rack/lobster'
+
+use Rack::ShowExceptions
+use Rack::Auth::Basic, "Lobster 2.0" do |username, password|
+  'secret' == password
+end
+
+run Rack::Lobster.new
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack.rb
new file mode 100644
index 0000000..57119df
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack.rb
@@ -0,0 +1,87 @@
+# Copyright (C) 2007, 2008, 2009, 2010 Christian Neukirchen <purl.org/net/chneukirchen>
+#
+# Rack is freely distributable under the terms of an MIT-style license.
+# See COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+# The Rack main module, serving as a namespace for all core Rack
+# modules and classes.
+#
+# All modules meant for use in your application are <tt>autoload</tt>ed here,
+# so it should be enough just to <tt>require rack.rb</tt> in your code.
+
+module Rack
+  # The Rack protocol version number implemented.
+  VERSION = [1,2]
+
+  # Return the Rack protocol version as a dotted string.
+  def self.version
+    VERSION.join(".")
+  end
+
+  # Return the Rack release as a dotted string.
+  def self.release
+    "1.5"
+  end
+
+  autoload :Builder, "rack/builder"
+  autoload :BodyProxy, "rack/body_proxy"
+  autoload :Cascade, "rack/cascade"
+  autoload :Chunked, "rack/chunked"
+  autoload :CommonLogger, "rack/commonlogger"
+  autoload :ConditionalGet, "rack/conditionalget"
+  autoload :Config, "rack/config"
+  autoload :ContentLength, "rack/content_length"
+  autoload :ContentType, "rack/content_type"
+  autoload :ETag, "rack/etag"
+  autoload :File, "rack/file"
+  autoload :Deflater, "rack/deflater"
+  autoload :Directory, "rack/directory"
+  autoload :ForwardRequest, "rack/recursive"
+  autoload :Handler, "rack/handler"
+  autoload :Head, "rack/head"
+  autoload :Lint, "rack/lint"
+  autoload :Lock, "rack/lock"
+  autoload :Logger, "rack/logger"
+  autoload :MethodOverride, "rack/methodoverride"
+  autoload :Mime, "rack/mime"
+  autoload :NullLogger, "rack/nulllogger"
+  autoload :Recursive, "rack/recursive"
+  autoload :Reloader, "rack/reloader"
+  autoload :Runtime, "rack/runtime"
+  autoload :Sendfile, "rack/sendfile"
+  autoload :Server, "rack/server"
+  autoload :ShowExceptions, "rack/showexceptions"
+  autoload :ShowStatus, "rack/showstatus"
+  autoload :Static, "rack/static"
+  autoload :URLMap, "rack/urlmap"
+  autoload :Utils, "rack/utils"
+  autoload :Multipart, "rack/multipart"
+
+  autoload :MockRequest, "rack/mock"
+  autoload :MockResponse, "rack/mock"
+
+  autoload :Request, "rack/request"
+  autoload :Response, "rack/response"
+
+  module Auth
+    autoload :Basic, "rack/auth/basic"
+    autoload :AbstractRequest, "rack/auth/abstract/request"
+    autoload :AbstractHandler, "rack/auth/abstract/handler"
+    module Digest
+      autoload :MD5, "rack/auth/digest/md5"
+      autoload :Nonce, "rack/auth/digest/nonce"
+      autoload :Params, "rack/auth/digest/params"
+      autoload :Request, "rack/auth/digest/request"
+    end
+  end
+
+  module Session
+    autoload :Cookie, "rack/session/cookie"
+    autoload :Pool, "rack/session/pool"
+    autoload :Memcache, "rack/session/memcache"
+  end
+
+  module Utils
+    autoload :OkJson, "rack/utils/okjson"
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/abstract/handler.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/abstract/handler.rb
new file mode 100644
index 0000000..214df62
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/abstract/handler.rb
@@ -0,0 +1,37 @@
+module Rack
+  module Auth
+    # Rack::Auth::AbstractHandler implements common authentication functionality.
+    #
+    # +realm+ should be set for all handlers.
+
+    class AbstractHandler
+
+      attr_accessor :realm
+
+      def initialize(app, realm=nil, &authenticator)
+        @app, @realm, @authenticator = app, realm, authenticator
+      end
+
+
+      private
+
+      def unauthorized(www_authenticate = challenge)
+        return [ 401,
+          { 'Content-Type' => 'text/plain',
+            'Content-Length' => '0',
+            'WWW-Authenticate' => www_authenticate.to_s },
+          []
+        ]
+      end
+
+      def bad_request
+        return [ 400,
+          { 'Content-Type' => 'text/plain',
+            'Content-Length' => '0' },
+          []
+        ]
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/abstract/request.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/abstract/request.rb
new file mode 100644
index 0000000..aa6bf8e
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/abstract/request.rb
@@ -0,0 +1,43 @@
+require 'rack/request'
+
+module Rack
+  module Auth
+    class AbstractRequest
+
+      def initialize(env)
+        @env = env
+      end
+
+      def request
+        @request ||= Request.new(@env)
+      end
+
+      def provided?
+        !authorization_key.nil?
+      end
+
+      def parts
+        @parts ||= @env[authorization_key].split(' ', 2)
+      end
+
+      def scheme
+        @scheme ||= parts.first.downcase
+      end
+
+      def params
+        @params ||= parts.last
+      end
+
+
+      private
+
+      AUTHORIZATION_KEYS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION']
+
+      def authorization_key
+        @authorization_key ||= AUTHORIZATION_KEYS.detect { |key| @env.has_key?(key) }
+      end
+
+    end
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/basic.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/basic.rb
new file mode 100644
index 0000000..7dd9a99
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/basic.rb
@@ -0,0 +1,58 @@
+require 'rack/auth/abstract/handler'
+require 'rack/auth/abstract/request'
+
+module Rack
+  module Auth
+    # Rack::Auth::Basic implements HTTP Basic Authentication, as per RFC 2617.
+    #
+    # Initialize with the Rack application that you want protecting,
+    # and a block that checks if a username and password pair are valid.
+    #
+    # See also: <tt>example/protectedlobster.rb</tt>
+
+    class Basic < AbstractHandler
+
+      def call(env)
+        auth = Basic::Request.new(env)
+
+        return unauthorized unless auth.provided?
+
+        return bad_request unless auth.basic?
+
+        if valid?(auth)
+          env['REMOTE_USER'] = auth.username
+
+          return @app.call(env)
+        end
+
+        unauthorized
+      end
+
+
+      private
+
+      def challenge
+        'Basic realm="%s"' % realm
+      end
+
+      def valid?(auth)
+        @authenticator.call(*auth.credentials)
+      end
+
+      class Request < Auth::AbstractRequest
+        def basic?
+          !parts.first.nil? && "basic" == scheme
+        end
+
+        def credentials
+          @credentials ||= params.unpack("m*").first.split(/:/, 2)
+        end
+
+        def username
+          credentials.first
+        end
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/digest/md5.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/digest/md5.rb
new file mode 100644
index 0000000..b5871d7
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/digest/md5.rb
@@ -0,0 +1,129 @@
+require 'rack/auth/abstract/handler'
+require 'rack/auth/digest/request'
+require 'rack/auth/digest/params'
+require 'rack/auth/digest/nonce'
+require 'digest/md5'
+
+module Rack
+  module Auth
+    module Digest
+      # Rack::Auth::Digest::MD5 implements the MD5 algorithm version of
+      # HTTP Digest Authentication, as per RFC 2617.
+      #
+      # Initialize with the [Rack] application that you want protecting,
+      # and a block that looks up a plaintext password for a given username.
+      #
+      # +opaque+ needs to be set to a constant base64/hexadecimal string.
+      #
+      class MD5 < AbstractHandler
+
+        attr_accessor :opaque
+
+        attr_writer :passwords_hashed
+
+        def initialize(app, realm=nil, opaque=nil, &authenticator)
+          @passwords_hashed = nil
+          if opaque.nil? and realm.respond_to? :values_at
+            realm, opaque, @passwords_hashed = realm.values_at :realm, :opaque, :passwords_hashed
+          end
+          super(app, realm, &authenticator)
+          @opaque = opaque
+        end
+
+        def passwords_hashed?
+          !!@passwords_hashed
+        end
+
+        def call(env)
+          auth = Request.new(env)
+
+          unless auth.provided?
+            return unauthorized
+          end
+
+          if !auth.digest? || !auth.correct_uri? || !valid_qop?(auth)
+            return bad_request
+          end
+
+          if valid?(auth)
+            if auth.nonce.stale?
+              return unauthorized(challenge(:stale => true))
+            else
+              env['REMOTE_USER'] = auth.username
+
+              return @app.call(env)
+            end
+          end
+
+          unauthorized
+        end
+
+
+        private
+
+        QOP = 'auth'.freeze
+
+        def params(hash = {})
+          Params.new do |params|
+            params['realm'] = realm
+            params['nonce'] = Nonce.new.to_s
+            params['opaque'] = H(opaque)
+            params['qop'] = QOP
+
+            hash.each { |k, v| params[k] = v }
+          end
+        end
+
+        def challenge(hash = {})
+          "Digest #{params(hash)}"
+        end
+
+        def valid?(auth)
+          valid_opaque?(auth) && valid_nonce?(auth) && valid_digest?(auth)
+        end
+
+        def valid_qop?(auth)
+          QOP == auth.qop
+        end
+
+        def valid_opaque?(auth)
+          H(opaque) == auth.opaque
+        end
+
+        def valid_nonce?(auth)
+          auth.nonce.valid?
+        end
+
+        def valid_digest?(auth)
+          pw = @authenticator.call(auth.username)
+          pw && digest(auth, pw) == auth.response
+        end
+
+        def md5(data)
+          ::Digest::MD5.hexdigest(data)
+        end
+
+        alias :H :md5
+
+        def KD(secret, data)
+          H([secret, data] * ':')
+        end
+
+        def A1(auth, password)
+          [ auth.username, auth.realm, password ] * ':'
+        end
+
+        def A2(auth)
+          [ auth.method, auth.uri ] * ':'
+        end
+
+        def digest(auth, password)
+          password_hash = passwords_hashed? ? password : H(A1(auth, password))
+
+          KD(password_hash, [ auth.nonce, auth.nc, auth.cnonce, QOP, H(A2(auth)) ] * ':')
+        end
+
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/digest/nonce.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/digest/nonce.rb
new file mode 100644
index 0000000..57089cb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/digest/nonce.rb
@@ -0,0 +1,51 @@
+require 'digest/md5'
+
+module Rack
+  module Auth
+    module Digest
+      # Rack::Auth::Digest::Nonce is the default nonce generator for the
+      # Rack::Auth::Digest::MD5 authentication handler.
+      #
+      # +private_key+ needs to set to a constant string.
+      #
+      # +time_limit+ can be optionally set to an integer (number of seconds),
+      # to limit the validity of the generated nonces.
+
+      class Nonce
+
+        class << self
+          attr_accessor :private_key, :time_limit
+        end
+
+        def self.parse(string)
+          new(*string.unpack("m*").first.split(' ', 2))
+        end
+
+        def initialize(timestamp = Time.now, given_digest = nil)
+          @timestamp, @given_digest = timestamp.to_i, given_digest
+        end
+
+        def to_s
+          [([ @timestamp, digest ] * ' ')].pack("m*").strip
+        end
+
+        def digest
+          ::Digest::MD5.hexdigest([ @timestamp, self.class.private_key ] * ':')
+        end
+
+        def valid?
+          digest == @given_digest
+        end
+
+        def stale?
+          !self.class.time_limit.nil? && (Time.now.to_i - @timestamp) > self.class.time_limit
+        end
+
+        def fresh?
+          !stale?
+        end
+
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/digest/params.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/digest/params.rb
new file mode 100644
index 0000000..f35a7ba
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/digest/params.rb
@@ -0,0 +1,53 @@
+module Rack
+  module Auth
+    module Digest
+      class Params < Hash
+
+        def self.parse(str)
+          Params[*split_header_value(str).map do |param|
+            k, v = param.split('=', 2)
+            [k, dequote(v)]
+          end.flatten]
+        end
+
+        def self.dequote(str) # From WEBrick::HTTPUtils
+          ret = (/\A"(.*)"\Z/ =~ str) ? $1 : str.dup
+          ret.gsub!(/\\(.)/, "\\1")
+          ret
+        end
+
+        def self.split_header_value(str)
+          str.scan( /(\w+\=(?:"[^\"]+"|[^,]+))/n ).collect{ |v| v[0] }
+        end
+
+        def initialize
+          super()
+
+          yield self if block_given?
+        end
+
+        def [](k)
+          super k.to_s
+        end
+
+        def []=(k, v)
+          super k.to_s, v.to_s
+        end
+
+        UNQUOTED = ['nc', 'stale']
+
+        def to_s
+          map do |k, v|
+            "#{k}=" + (UNQUOTED.include?(k) ? v.to_s : quote(v))
+          end.join(', ')
+        end
+
+        def quote(str) # From WEBrick::HTTPUtils
+          '"' << str.gsub(/[\\\"]/o, "\\\1") << '"'
+        end
+
+      end
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/digest/request.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/digest/request.rb
new file mode 100644
index 0000000..706c651
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/auth/digest/request.rb
@@ -0,0 +1,41 @@
+require 'rack/auth/abstract/request'
+require 'rack/auth/digest/params'
+require 'rack/auth/digest/nonce'
+
+module Rack
+  module Auth
+    module Digest
+      class Request < Auth::AbstractRequest
+        def method
+          @env['rack.methodoverride.original_method'] || @env['REQUEST_METHOD']
+        end
+
+        def digest?
+          "digest" == scheme
+        end
+
+        def correct_uri?
+          request.fullpath == uri
+        end
+
+        def nonce
+          @nonce ||= Nonce.parse(params['nonce'])
+        end
+
+        def params
+          @params ||= Params.parse(parts.last)
+        end
+
+        def respond_to?(sym, *)
+          super or params.has_key? sym.to_s
+        end
+
+        def method_missing(sym, *args)
+          return super unless params.has_key?(key = sym.to_s)
+          return params[key] if args.size == 0
+          raise ArgumentError, "wrong number of arguments (#{args.size} for 0)"
+        end
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/backports/uri/common_18.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/backports/uri/common_18.rb
new file mode 100644
index 0000000..0ea1998
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/backports/uri/common_18.rb
@@ -0,0 +1,56 @@
+# :stopdoc:
+
+# Stolen from ruby core's uri/common.rb, with modifications to support 1.8.x
+#
+# https://github.com/ruby/ruby/blob/trunk/lib/uri/common.rb
+#
+#
+
+module URI
+  TBLENCWWWCOMP_ = {} # :nodoc:
+  256.times do |i|
+    TBLENCWWWCOMP_[i.chr] = '%%%02X' % i
+  end
+  TBLENCWWWCOMP_[' '] = '+'
+  TBLENCWWWCOMP_.freeze
+  TBLDECWWWCOMP_ = {} # :nodoc:
+  256.times do |i|
+    h, l = i>>4, i&15
+    TBLDECWWWCOMP_['%%%X%X' % [h, l]] = i.chr
+    TBLDECWWWCOMP_['%%%x%X' % [h, l]] = i.chr
+    TBLDECWWWCOMP_['%%%X%x' % [h, l]] = i.chr
+    TBLDECWWWCOMP_['%%%x%x' % [h, l]] = i.chr
+  end
+  TBLDECWWWCOMP_['+'] = ' '
+  TBLDECWWWCOMP_.freeze
+
+  # Encode given +s+ to URL-encoded form data.
+  #
+  # This method doesn't convert *, -, ., 0-9, A-Z, _, a-z, but does convert SP
+  # (ASCII space) to + and converts others to %XX.
+  #
+  # This is an implementation of
+  # http://www.w3.org/TR/html5/forms.html#url-encoded-form-data
+  #
+  # See URI.decode_www_form_component, URI.encode_www_form
+  def self.encode_www_form_component(s)
+    str = s.to_s
+    if RUBY_VERSION < "1.9" && $KCODE =~ /u/i
+      str.gsub(/([^ a-zA-Z0-9_.-]+)/) do
+        '%' + $1.unpack('H2' * Rack::Utils.bytesize($1)).join('%').upcase
+      end.tr(' ', '+')
+    else
+      str.gsub(/[^*\-.0-9A-Z_a-z]/) {|m| TBLENCWWWCOMP_[m]}
+    end
+  end
+
+  # Decode given +str+ of URL-encoded form data.
+  #
+  # This decods + to SP.
+  #
+  # See URI.encode_www_form_component, URI.decode_www_form
+  def self.decode_www_form_component(str, enc=nil)
+    raise ArgumentError, "invalid %-encoding (#{str})" unless /\A(?:%[0-9a-fA-F]{2}|[^%])*\z/ =~ str
+    str.gsub(/\+|%[0-9a-fA-F]{2}/) {|m| TBLDECWWWCOMP_[m]}
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/backports/uri/common_192.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/backports/uri/common_192.rb
new file mode 100644
index 0000000..1a0522b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/backports/uri/common_192.rb
@@ -0,0 +1,52 @@
+# :stopdoc:
+
+# Stolen from ruby core's uri/common.rb @32618ba to fix DoS issues in 1.9.2
+#
+# https://github.com/ruby/ruby/blob/32618ba7438a2247042bba9b5d85b5d49070f5e5/lib/uri/common.rb
+#
+# Issue:
+# http://redmine.ruby-lang.org/issues/5149
+#
+# Relevant Fixes:
+# https://github.com/ruby/ruby/commit/b5f91deee04aa6ccbe07c23c8222b937c22a799b
+# https://github.com/ruby/ruby/commit/93177c1e5c3906abf14472ae0b905d8b5c72ce1b
+#
+# This should probably be removed once there is a Ruby 1.9.2 patch level that
+# includes this fix.
+
+require 'uri/common'
+
+module URI
+  TBLDECWWWCOMP_ = {} unless const_defined?(:TBLDECWWWCOMP_)  #:nodoc:
+  if TBLDECWWWCOMP_.empty?
+    256.times do |i|
+      h, l = i>>4, i&15
+      TBLDECWWWCOMP_['%%%X%X' % [h, l]] = i.chr
+      TBLDECWWWCOMP_['%%%x%X' % [h, l]] = i.chr
+      TBLDECWWWCOMP_['%%%X%x' % [h, l]] = i.chr
+      TBLDECWWWCOMP_['%%%x%x' % [h, l]] = i.chr
+    end
+    TBLDECWWWCOMP_['+'] = ' '
+    TBLDECWWWCOMP_.freeze
+  end
+
+  def self.decode_www_form(str, enc=Encoding::UTF_8)
+    return [] if str.empty?
+    unless /\A#{WFKV_}=#{WFKV_}(?:[;&]#{WFKV_}=#{WFKV_})*\z/o =~ str
+      raise ArgumentError, "invalid data of application/x-www-form-urlencoded (#{str})"
+    end
+    ary = []
+    $&.scan(/([^=;&]+)=([^;&]*)/) do
+      ary << [decode_www_form_component($1, enc), decode_www_form_component($2, enc)]
+    end
+    ary
+  end
+
+  def self.decode_www_form_component(str, enc=Encoding::UTF_8)
+    raise ArgumentError, "invalid %-encoding (#{str})" unless /\A[^%]*(?:%\h\h[^%]*)*\z/ =~ str
+    str.gsub(/\+|%\h\h/, TBLDECWWWCOMP_).force_encoding(enc)
+  end
+
+  remove_const :WFKV_ if const_defined?(:WFKV_)
+  WFKV_ = '(?:[^%#=;&]*(?:%\h\h[^%#=;&]*)*)' # :nodoc:
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/backports/uri/common_193.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/backports/uri/common_193.rb
new file mode 100644
index 0000000..2e58203
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/backports/uri/common_193.rb
@@ -0,0 +1,29 @@
+# :stopdoc:
+
+require 'uri/common'
+
+# Issue:
+# http://bugs.ruby-lang.org/issues/5925
+#
+# Relevant commit:
+# https://github.com/ruby/ruby/commit/edb7cdf1eabaff78dfa5ffedfbc2e91b29fa9ca1
+
+module URI
+  256.times do |i|
+    TBLENCWWWCOMP_[i.chr] = '%%%02X' % i
+  end
+  TBLENCWWWCOMP_[' '] = '+'
+  TBLENCWWWCOMP_.freeze
+
+  256.times do |i|
+    h, l = i>>4, i&15
+    TBLDECWWWCOMP_['%%%X%X' % [h, l]] = i.chr
+    TBLDECWWWCOMP_['%%%x%X' % [h, l]] = i.chr
+    TBLDECWWWCOMP_['%%%X%x' % [h, l]] = i.chr
+    TBLDECWWWCOMP_['%%%x%x' % [h, l]] = i.chr
+  end
+  TBLDECWWWCOMP_['+'] = ' '
+  TBLDECWWWCOMP_.freeze
+end
+
+# :startdoc:
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/body_proxy.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/body_proxy.rb
new file mode 100644
index 0000000..95a7462
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/body_proxy.rb
@@ -0,0 +1,39 @@
+module Rack
+  class BodyProxy
+    def initialize(body, &block)
+      @body, @block, @closed = body, block, false
+    end
+
+    def respond_to?(*args)
+      return false if args.first.to_s =~ /^to_ary$/
+      super or @body.respond_to?(*args)
+    end
+
+    def close
+      return if @closed
+      @closed = true
+      begin
+        @body.close if @body.respond_to? :close
+      ensure
+        @block.call
+      end
+    end
+
+    def closed?
+      @closed
+    end
+
+    # N.B. This method is a special case to address the bug described by #434.
+    # We are applying this special case for #each only. Future bugs of this
+    # class will be handled by requesting users to patch their ruby
+    # implementation, to save adding too many methods in this class.
+    def each(*args, &block)
+      @body.each(*args, &block)
+    end
+
+    def method_missing(*args, &block)
+      super if args.first.to_s =~ /^to_ary$/
+      @body.__send__(*args, &block)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb
new file mode 100644
index 0000000..66dc7bd
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb
@@ -0,0 +1,149 @@
+module Rack
+  # Rack::Builder implements a small DSL to iteratively construct Rack
+  # applications.
+  #
+  # Example:
+  #
+  #  require 'rack/lobster'
+  #  app = Rack::Builder.new do
+  #    use Rack::CommonLogger
+  #    use Rack::ShowExceptions
+  #    map "/lobster" do
+  #      use Rack::Lint
+  #      run Rack::Lobster.new
+  #    end
+  #  end
+  #
+  #  run app
+  #
+  # Or
+  #
+  #  app = Rack::Builder.app do
+  #    use Rack::CommonLogger
+  #    run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] }
+  #  end
+  #
+  #  run app
+  #
+  # +use+ adds middleware to the stack, +run+ dispatches to an application.
+  # You can use +map+ to construct a Rack::URLMap in a convenient way.
+
+  class Builder
+    def self.parse_file(config, opts = Server::Options.new)
+      options = {}
+      if config =~ /\.ru$/
+        cfgfile = ::File.read(config)
+        if cfgfile[/^#\\(.*)/] && opts
+          options = opts.parse! $1.split(/\s+/)
+        end
+        cfgfile.sub!(/^__END__\n.*\Z/m, '')
+        app = new_from_string cfgfile, config
+      else
+        require config
+        app = Object.const_get(::File.basename(config, '.rb').capitalize)
+      end
+      return app, options
+    end
+
+    def self.new_from_string(builder_script, file="(rackup)")
+      eval "Rack::Builder.new {\n" + builder_script + "\n}.to_app",
+        TOPLEVEL_BINDING, file, 0
+    end
+
+    def initialize(default_app = nil,&block)
+      @use, @map, @run = [], nil, default_app
+      instance_eval(&block) if block_given?
+    end
+
+    def self.app(default_app = nil, &block)
+      self.new(default_app, &block).to_app
+    end
+
+    # Specifies middleware to use in a stack.
+    #
+    #   class Middleware
+    #     def initialize(app)
+    #       @app = app
+    #     end
+    #
+    #     def call(env)
+    #       env["rack.some_header"] = "setting an example"
+    #       @app.call(env)
+    #     end
+    #   end
+    #
+    #   use Middleware
+    #   run lambda { |env| [200, { "Content-Type => "text/plain" }, ["OK"]] }
+    #
+    # All requests through to this application will first be processed by the middleware class.
+    # The +call+ method in this example sets an additional environment key which then can be
+    # referenced in the application if required.
+    def use(middleware, *args, &block)
+      if @map
+        mapping, @map = @map, nil
+        @use << proc { |app| generate_map app, mapping }
+      end
+      @use << proc { |app| middleware.new(app, *args, &block) }
+    end
+
+    # Takes an argument that is an object that responds to #call and returns a Rack response.
+    # The simplest form of this is a lambda object:
+    #
+    #   run lambda { |env| [200, { "Content-Type" => "text/plain" }, ["OK"]] }
+    #
+    # However this could also be a class:
+    #
+    #   class Heartbeat
+    #     def self.call(env)
+    #      [200, { "Content-Type" => "text/plain" }, ["OK"]]
+    #    end
+    #   end
+    #
+    #   run Heartbeat
+    def run(app)
+      @run = app
+    end
+
+    # Creates a route within the application.
+    #
+    #   Rack::Builder.app do
+    #     map '/' do
+    #       run Heartbeat
+    #     end
+    #   end
+    #
+    # The +use+ method can also be used here to specify middleware to run under a specific path:
+    #
+    #   Rack::Builder.app do
+    #     map '/' do
+    #       use Middleware
+    #       run Heartbeat
+    #     end
+    #   end
+    #
+    # This example includes a piece of middleware which will run before requests hit +Heartbeat+.
+    #
+    def map(path, &block)
+      @map ||= {}
+      @map[path] = block
+    end
+
+    def to_app
+      app = @map ? generate_map(@run, @map) : @run
+      fail "missing run or map statement" unless app
+      @use.reverse.inject(app) { |a,e| e[a] }
+    end
+
+    def call(env)
+      to_app.call(env)
+    end
+
+    private
+
+    def generate_map(default_app, mapping)
+      mapped = default_app ? {'/' => default_app} : {}
+      mapping.each { |r,b| mapped[r] = self.class.new(default_app, &b) }
+      URLMap.new(mapped)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/cascade.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/cascade.rb
new file mode 100644
index 0000000..d104a4b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/cascade.rb
@@ -0,0 +1,52 @@
+module Rack
+  # Rack::Cascade tries a request on several apps, and returns the
+  # first response that is not 404 or 405 (or in a list of configurable
+  # status codes).
+
+  class Cascade
+    NotFound = [404, {"Content-Type" => "text/plain"}, []]
+
+    attr_reader :apps
+
+    def initialize(apps, catch=[404, 405])
+      @apps = []; @has_app = {}
+      apps.each { |app| add app }
+
+      @catch = {}
+      [*catch].each { |status| @catch[status] = true }
+    end
+
+    def call(env)
+      result = NotFound
+
+      last_body = nil
+
+      @apps.each do |app|
+        # The SPEC says that the body must be closed after it has been iterated
+        # by the server, or if it is replaced by a middleware action. Cascade
+        # replaces the body each time a cascade happens. It is assumed that nil
+        # does not respond to close, otherwise the previous application body
+        # will be closed. The final application body will not be closed, as it
+        # will be passed to the server as a result.
+        last_body.close if last_body.respond_to? :close
+
+        result = app.call(env)
+        last_body = result[2]
+        break unless @catch.include?(result[0].to_i)
+      end
+
+      result
+    end
+
+    def add app
+      @has_app[app] = true
+      @apps << app
+    end
+
+    def include? app
+      @has_app.include? app
+    end
+
+    alias_method :<<, :add
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/chunked.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/chunked.rb
new file mode 100644
index 0000000..a400756
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/chunked.rb
@@ -0,0 +1,58 @@
+require 'rack/utils'
+
+module Rack
+
+  # Middleware that applies chunked transfer encoding to response bodies
+  # when the response does not include a Content-Length header.
+  class Chunked
+    include Rack::Utils
+
+    # A body wrapper that emits chunked responses
+    class Body
+      TERM = "\r\n"
+      TAIL = "0#{TERM}#{TERM}"
+
+      include Rack::Utils
+
+      def initialize(body)
+        @body = body
+      end
+
+      def each
+        term = TERM
+        @body.each do |chunk|
+          size = bytesize(chunk)
+          next if size == 0
+
+          chunk = chunk.dup.force_encoding(Encoding::BINARY) if chunk.respond_to?(:force_encoding)
+          yield [size.to_s(16), term, chunk, term].join
+        end
+        yield TAIL
+      end
+
+      def close
+        @body.close if @body.respond_to?(:close)
+      end
+    end
+
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+      headers = HeaderHash.new(headers)
+
+      if env['HTTP_VERSION'] == 'HTTP/1.0' ||
+         STATUS_WITH_NO_ENTITY_BODY.include?(status) ||
+         headers['Content-Length'] ||
+         headers['Transfer-Encoding']
+        [status, headers, body]
+      else
+        headers.delete('Content-Length')
+        headers['Transfer-Encoding'] = 'chunked'
+        [status, headers, Body.new(body)]
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/commonlogger.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/commonlogger.rb
new file mode 100644
index 0000000..7028615
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/commonlogger.rb
@@ -0,0 +1,64 @@
+require 'rack/body_proxy'
+
+module Rack
+  # Rack::CommonLogger forwards every request to the given +app+, and
+  # logs a line in the
+  # {Apache common log format}[http://httpd.apache.org/docs/1.3/logs.html#common]
+  # to the +logger+.
+  #
+  # If +logger+ is nil, CommonLogger will fall back +rack.errors+, which is
+  # an instance of Rack::NullLogger.
+  #
+  # +logger+ can be any class, including the standard library Logger, and is
+  # expected to have a +write+ method, which accepts the CommonLogger::FORMAT.
+  # According to the SPEC, the error stream must also respond to +puts+
+  # (which takes a single argument that responds to +to_s+), and +flush+
+  # (which is called without arguments in order to make the error appear for
+  # sure)
+  class CommonLogger
+    # Common Log Format: http://httpd.apache.org/docs/1.3/logs.html#common
+    #
+    #   lilith.local - - [07/Aug/2006 23:58:02] "GET / HTTP/1.1" 500 -
+    #
+    #   %{%s - %s [%s] "%s %s%s %s" %d %s\n} %
+    FORMAT = %{%s - %s [%s] "%s %s%s %s" %d %s %0.4f\n}
+
+    def initialize(app, logger=nil)
+      @app = app
+      @logger = logger
+    end
+
+    def call(env)
+      began_at = Time.now
+      status, header, body = @app.call(env)
+      header = Utils::HeaderHash.new(header)
+      body = BodyProxy.new(body) { log(env, status, header, began_at) }
+      [status, header, body]
+    end
+
+    private
+
+    def log(env, status, header, began_at)
+      now = Time.now
+      length = extract_content_length(header)
+
+      logger = @logger || env['rack.errors']
+      logger.write FORMAT % [
+        env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-",
+        env["REMOTE_USER"] || "-",
+        now.strftime("%d/%b/%Y %H:%M:%S"),
+        env["REQUEST_METHOD"],
+        env["PATH_INFO"],
+        env["QUERY_STRING"].empty? ? "" : "?"+env["QUERY_STRING"],
+        env["HTTP_VERSION"],
+        status.to_s[0..3],
+        length,
+        now - began_at ]
+    end
+
+    def extract_content_length(headers)
+      value = headers['Content-Length'] or return '-'
+      value.to_s == '0' ? '-' : value
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/conditionalget.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/conditionalget.rb
new file mode 100644
index 0000000..014e22f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/conditionalget.rb
@@ -0,0 +1,67 @@
+require 'rack/utils'
+
+module Rack
+
+  # Middleware that enables conditional GET using If-None-Match and
+  # If-Modified-Since. The application should set either or both of the
+  # Last-Modified or Etag response headers according to RFC 2616. When
+  # either of the conditions is met, the response body is set to be zero
+  # length and the response status is set to 304 Not Modified.
+  #
+  # Applications that defer response body generation until the body's each
+  # message is received will avoid response body generation completely when
+  # a conditional GET matches.
+  #
+  # Adapted from Michael Klishin's Merb implementation:
+  # https://github.com/wycats/merb/blob/master/merb-core/lib/merb-core/rack/middleware/conditional_get.rb
+  class ConditionalGet
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      case env['REQUEST_METHOD']
+      when "GET", "HEAD"
+        status, headers, body = @app.call(env)
+        headers = Utils::HeaderHash.new(headers)
+        if status == 200 && fresh?(env, headers)
+          status = 304
+          headers.delete('Content-Type')
+          headers.delete('Content-Length')
+          body = []
+        end
+        [status, headers, body]
+      else
+        @app.call(env)
+      end
+    end
+
+  private
+
+    def fresh?(env, headers)
+      modified_since = env['HTTP_IF_MODIFIED_SINCE']
+      none_match     = env['HTTP_IF_NONE_MATCH']
+
+      return false unless modified_since || none_match
+
+      success = true
+      success &&= modified_since?(to_rfc2822(modified_since), headers) if modified_since
+      success &&= etag_matches?(none_match, headers) if none_match
+      success
+    end
+
+    def etag_matches?(none_match, headers)
+      etag = headers['ETag'] and etag == none_match
+    end
+
+    def modified_since?(modified_since, headers)
+      last_modified = to_rfc2822(headers['Last-Modified']) and
+        modified_since and
+        modified_since >= last_modified
+    end
+
+    def to_rfc2822(since)
+      Time.rfc2822(since) rescue nil
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/config.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/config.rb
new file mode 100644
index 0000000..dc255d2
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/config.rb
@@ -0,0 +1,20 @@
+module Rack
+  # Rack::Config modifies the environment using the block given during
+  # initialization.
+  #
+  # Example:
+  #     use Rack::Config do |env|
+  #       env['my-key'] = 'some-value'
+  #     end
+  class Config
+    def initialize(app, &block)
+      @app = app
+      @block = block
+    end
+
+    def call(env)
+      @block.call(env)
+      @app.call(env)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/content_length.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/content_length.rb
new file mode 100644
index 0000000..634bdc4
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/content_length.rb
@@ -0,0 +1,33 @@
+require 'rack/utils'
+
+module Rack
+
+  # Sets the Content-Length header on responses with fixed-length bodies.
+  class ContentLength
+    include Rack::Utils
+
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+      headers = HeaderHash.new(headers)
+
+      if !STATUS_WITH_NO_ENTITY_BODY.include?(status.to_i) &&
+         !headers['Content-Length'] &&
+         !headers['Transfer-Encoding'] &&
+         body.respond_to?(:to_ary)
+
+        obody = body
+        body, length = [], 0
+        obody.each { |part| body << part; length += bytesize(part) }
+        obody.close if obody.respond_to?(:close)
+
+        headers['Content-Length'] = length.to_s
+      end
+
+      [status, headers, body]
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/content_type.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/content_type.rb
new file mode 100644
index 0000000..dd96e95
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/content_type.rb
@@ -0,0 +1,29 @@
+require 'rack/utils'
+
+module Rack
+
+  # Sets the Content-Type header on responses which don't have one.
+  #
+  # Builder Usage:
+  #   use Rack::ContentType, "text/plain"
+  #
+  # When no content type argument is provided, "text/html" is assumed.
+  class ContentType
+    include Rack::Utils
+
+    def initialize(app, content_type = "text/html")
+      @app, @content_type = app, content_type
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+      headers = Utils::HeaderHash.new(headers)
+
+      unless STATUS_WITH_NO_ENTITY_BODY.include?(status)
+        headers['Content-Type'] ||= @content_type
+      end
+
+      [status, headers, body]
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/deflater.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/deflater.rb
new file mode 100644
index 0000000..2f219f0
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/deflater.rb
@@ -0,0 +1,116 @@
+require "zlib"
+require "stringio"
+require "time"  # for Time.httpdate
+require 'rack/utils'
+
+module Rack
+  # This middleware enables compression of http responses.
+  #
+  # Currently supported compression algorithms:
+  #
+  #   * gzip
+  #   * deflate
+  #   * identity (no transformation)
+  #
+  # The middleware automatically detects when compression is supported
+  # and allowed. For example no transformation is made when a cache
+  # directive of 'no-transform' is present, or when the response status
+  # code is one that doesn't allow an entity body.
+  class Deflater
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+      headers = Utils::HeaderHash.new(headers)
+
+      # Skip compressing empty entity body responses and responses with
+      # no-transform set.
+      if Utils::STATUS_WITH_NO_ENTITY_BODY.include?(status) ||
+          headers['Cache-Control'].to_s =~ /\bno-transform\b/ ||
+         (headers['Content-Encoding'] && headers['Content-Encoding'] !~ /\bidentity\b/)
+        return [status, headers, body]
+      end
+
+      request = Request.new(env)
+
+      encoding = Utils.select_best_encoding(%w(gzip deflate identity),
+                                            request.accept_encoding)
+
+      # Set the Vary HTTP header.
+      vary = headers["Vary"].to_s.split(",").map { |v| v.strip }
+      unless vary.include?("*") || vary.include?("Accept-Encoding")
+        headers["Vary"] = vary.push("Accept-Encoding").join(",")
+      end
+
+      case encoding
+      when "gzip"
+        headers['Content-Encoding'] = "gzip"
+        headers.delete('Content-Length')
+        mtime = headers.key?("Last-Modified") ?
+          Time.httpdate(headers["Last-Modified"]) : Time.now
+        [status, headers, GzipStream.new(body, mtime)]
+      when "deflate"
+        headers['Content-Encoding'] = "deflate"
+        headers.delete('Content-Length')
+        [status, headers, DeflateStream.new(body)]
+      when "identity"
+        [status, headers, body]
+      when nil
+        body.close if body.respond_to?(:close)
+        message = "An acceptable encoding for the requested resource #{request.fullpath} could not be found."
+        [406, {"Content-Type" => "text/plain", "Content-Length" => message.length.to_s}, [message]]
+      end
+    end
+
+    class GzipStream
+      def initialize(body, mtime)
+        @body = body
+        @mtime = mtime
+      end
+
+      def each(&block)
+        @writer = block
+        gzip  =::Zlib::GzipWriter.new(self)
+        gzip.mtime = @mtime
+        @body.each { |part|
+          gzip.write(part)
+          gzip.flush
+        }
+      ensure
+        @body.close if @body.respond_to?(:close)
+        gzip.close
+        @writer = nil
+      end
+
+      def write(data)
+        @writer.call(data)
+      end
+    end
+
+    class DeflateStream
+      DEFLATE_ARGS = [
+        Zlib::DEFAULT_COMPRESSION,
+        # drop the zlib header which causes both Safari and IE to choke
+        -Zlib::MAX_WBITS,
+        Zlib::DEF_MEM_LEVEL,
+        Zlib::DEFAULT_STRATEGY
+      ]
+
+      def initialize(body)
+        @body = body
+      end
+
+      def each
+        deflater = ::Zlib::Deflate.new(*DEFLATE_ARGS)
+        @body.each { |part| yield deflater.deflate(part, Zlib::SYNC_FLUSH) }
+        yield deflater.finish
+        nil
+      ensure
+        @body.close if @body.respond_to?(:close)
+        deflater.close
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/directory.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/directory.rb
new file mode 100644
index 0000000..e90ee08
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/directory.rb
@@ -0,0 +1,161 @@
+require 'time'
+require 'rack/utils'
+require 'rack/mime'
+
+module Rack
+  # Rack::Directory serves entries below the +root+ given, according to the
+  # path info of the Rack request. If a directory is found, the file's contents
+  # will be presented in an html based index. If a file is found, the env will
+  # be passed to the specified +app+.
+  #
+  # If +app+ is not specified, a Rack::File of the same +root+ will be used.
+
+  class Directory
+    DIR_FILE = "<tr><td class='name'><a href='%s'>%s</a></td><td class='size'>%s</td><td class='type'>%s</td><td class='mtime'>%s</td></tr>"
+    DIR_PAGE = <<-PAGE
+<html><head>
+  <title>%s</title>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <style type='text/css'>
+table { width:100%%; }
+.name { text-align:left; }
+.size, .mtime { text-align:right; }
+.type { width:11em; }
+.mtime { width:15em; }
+  </style>
+</head><body>
+<h1>%s</h1>
+<hr />
+<table>
+  <tr>
+    <th class='name'>Name</th>
+    <th class='size'>Size</th>
+    <th class='type'>Type</th>
+    <th class='mtime'>Last Modified</th>
+  </tr>
+%s
+</table>
+<hr />
+</body></html>
+    PAGE
+
+    attr_reader :files
+    attr_accessor :root, :path
+
+    def initialize(root, app=nil)
+      @root = F.expand_path(root)
+      @app = app || Rack::File.new(@root)
+    end
+
+    def call(env)
+      dup._call(env)
+    end
+
+    F = ::File
+
+    def _call(env)
+      @env = env
+      @script_name = env['SCRIPT_NAME']
+      @path_info = Utils.unescape(env['PATH_INFO'])
+
+      if forbidden = check_forbidden
+        forbidden
+      else
+        @path = F.join(@root, @path_info)
+        list_path
+      end
+    end
+
+    def check_forbidden
+      return unless @path_info.include? ".."
+
+      body = "Forbidden\n"
+      size = Rack::Utils.bytesize(body)
+      return [403, {"Content-Type" => "text/plain",
+        "Content-Length" => size.to_s,
+        "X-Cascade" => "pass"}, [body]]
+    end
+
+    def list_directory
+      @files = [['../','Parent Directory','','','']]
+      glob = F.join(@path, '*')
+
+      url_head = (@script_name.split('/') + @path_info.split('/')).map do |part|
+        Rack::Utils.escape part
+      end
+
+      Dir[glob].sort.each do |node|
+        stat = stat(node)
+        next  unless stat
+        basename = F.basename(node)
+        ext = F.extname(node)
+
+        url = F.join(*url_head + [Rack::Utils.escape(basename)])
+        size = stat.size
+        type = stat.directory? ? 'directory' : Mime.mime_type(ext)
+        size = stat.directory? ? '-' : filesize_format(size)
+        mtime = stat.mtime.httpdate
+        url << '/'  if stat.directory?
+        basename << '/'  if stat.directory?
+
+        @files << [ url, basename, size, type, mtime ]
+      end
+
+      return [ 200, {'Content-Type'=>'text/html; charset=utf-8'}, self ]
+    end
+
+    def stat(node, max = 10)
+      F.stat(node)
+    rescue Errno::ENOENT, Errno::ELOOP
+      return nil
+    end
+
+    # TODO: add correct response if not readable, not sure if 404 is the best
+    #       option
+    def list_path
+      @stat = F.stat(@path)
+
+      if @stat.readable?
+        return @app.call(@env) if @stat.file?
+        return list_directory if @stat.directory?
+      else
+        raise Errno::ENOENT, 'No such file or directory'
+      end
+
+    rescue Errno::ENOENT, Errno::ELOOP
+      return entity_not_found
+    end
+
+    def entity_not_found
+      body = "Entity not found: #{@path_info}\n"
+      size = Rack::Utils.bytesize(body)
+      return [404, {"Content-Type" => "text/plain",
+        "Content-Length" => size.to_s,
+        "X-Cascade" => "pass"}, [body]]
+    end
+
+    def each
+      show_path = @path.sub(/^#{@root}/,'')
+      files = @files.map{|f| DIR_FILE % f }*"\n"
+      page  = DIR_PAGE % [ show_path, show_path , files ]
+      page.each_line{|l| yield l }
+    end
+
+    # Stolen from Ramaze
+
+    FILESIZE_FORMAT = [
+      ['%.1fT', 1 << 40],
+      ['%.1fG', 1 << 30],
+      ['%.1fM', 1 << 20],
+      ['%.1fK', 1 << 10],
+    ]
+
+    def filesize_format(int)
+      FILESIZE_FORMAT.each do |format, size|
+        return format % (int.to_f / size) if int >= size
+      end
+
+      int.to_s + 'B'
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/etag.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/etag.rb
new file mode 100644
index 0000000..3f5006a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/etag.rb
@@ -0,0 +1,64 @@
+require 'digest/md5'
+
+module Rack
+  # Automatically sets the ETag header on all String bodies.
+  #
+  # The ETag header is skipped if ETag or Last-Modified headers are sent or if
+  # a sendfile body (body.responds_to :to_path) is given (since such cases
+  # should be handled by apache/nginx).
+  #
+  # On initialization, you can pass two parameters: a Cache-Control directive
+  # used when Etag is absent and a directive when it is present. The first
+  # defaults to nil, while the second defaults to "max-age=0, private, must-revalidate"
+  class ETag
+    DEFAULT_CACHE_CONTROL = "max-age=0, private, must-revalidate".freeze
+
+    def initialize(app, no_cache_control = nil, cache_control = DEFAULT_CACHE_CONTROL)
+      @app = app
+      @cache_control = cache_control
+      @no_cache_control = no_cache_control
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+
+      if etag_status?(status) && etag_body?(body) && !skip_caching?(headers)
+        digest, body = digest_body(body)
+        headers['ETag'] = %("#{digest}") if digest
+      end
+
+      unless headers['Cache-Control']
+        if digest
+          headers['Cache-Control'] = @cache_control if @cache_control
+        else
+          headers['Cache-Control'] = @no_cache_control if @no_cache_control
+        end
+      end
+
+      [status, headers, body]
+    end
+
+    private
+
+      def etag_status?(status)
+        status == 200 || status == 201
+      end
+
+      def etag_body?(body)
+        !body.respond_to?(:to_path)
+      end
+
+      def skip_caching?(headers)
+        (headers['Cache-Control'] && headers['Cache-Control'].include?('no-cache')) ||
+          headers.key?('ETag') || headers.key?('Last-Modified')
+      end
+
+      def digest_body(body)
+        parts = []
+        body.each { |part| parts << part }
+        string_body = parts.join
+        digest = Digest::MD5.hexdigest(string_body) unless string_body.empty?
+        [digest, parts]
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/file.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/file.rb
new file mode 100644
index 0000000..ee58a1a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/file.rb
@@ -0,0 +1,138 @@
+require 'time'
+require 'rack/utils'
+require 'rack/mime'
+
+module Rack
+  # Rack::File serves files below the +root+ directory given, according to the
+  # path info of the Rack request.
+  # e.g. when Rack::File.new("/etc") is used, you can access 'passwd' file
+  # as http://localhost:9292/passwd
+  #
+  # Handlers can detect if bodies are a Rack::File, and use mechanisms
+  # like sendfile on the +path+.
+
+  class File
+    SEPS = Regexp.union(*[::File::SEPARATOR, ::File::ALT_SEPARATOR].compact)
+    ALLOWED_VERBS = %w[GET HEAD]
+
+    attr_accessor :root
+    attr_accessor :path
+    attr_accessor :cache_control
+
+    alias :to_path :path
+
+    def initialize(root, headers={}, default_mime = 'text/plain')
+      @root = root
+      @headers = headers
+      @default_mime = default_mime
+    end
+
+    def call(env)
+      dup._call(env)
+    end
+
+    F = ::File
+
+    def _call(env)
+      unless ALLOWED_VERBS.include? env["REQUEST_METHOD"]
+        return fail(405, "Method Not Allowed")
+      end
+
+      path_info = Utils.unescape(env["PATH_INFO"])
+      parts = path_info.split SEPS
+
+      clean = []
+
+      parts.each do |part|
+        next if part.empty? || part == '.'
+        part == '..' ? clean.pop : clean << part
+      end
+
+      @path = F.join(@root, *clean)
+
+      available = begin
+        F.file?(@path) && F.readable?(@path)
+      rescue SystemCallError
+        false
+      end
+
+      if available
+        serving(env)
+      else
+        fail(404, "File not found: #{path_info}")
+      end
+    end
+
+    def serving(env)
+      last_modified = F.mtime(@path).httpdate
+      return [304, {}, []] if env['HTTP_IF_MODIFIED_SINCE'] == last_modified
+
+      headers = { "Last-Modified" => last_modified }
+      mime = Mime.mime_type(F.extname(@path), @default_mime)
+      headers["Content-Type"] = mime if mime
+
+      # Set custom headers
+      @headers.each { |field, content| headers[field] = content } if @headers
+
+      response = [ 200, headers, env["REQUEST_METHOD"] == "HEAD" ? [] : self ]
+
+      # NOTE:
+      #   We check via File::size? whether this file provides size info
+      #   via stat (e.g. /proc files often don't), otherwise we have to
+      #   figure it out by reading the whole file into memory.
+      size = F.size?(@path) || Utils.bytesize(F.read(@path))
+
+      ranges = Rack::Utils.byte_ranges(env, size)
+      if ranges.nil? || ranges.length > 1
+        # No ranges, or multiple ranges (which we don't support):
+        # TODO: Support multiple byte-ranges
+        response[0] = 200
+        @range = 0..size-1
+      elsif ranges.empty?
+        # Unsatisfiable. Return error, and file size:
+        response = fail(416, "Byte range unsatisfiable")
+        response[1]["Content-Range"] = "bytes */#{size}"
+        return response
+      else
+        # Partial content:
+        @range = ranges[0]
+        response[0] = 206
+        response[1]["Content-Range"] = "bytes #{@range.begin}-#{@range.end}/#{size}"
+        size = @range.end - @range.begin + 1
+      end
+
+      response[1]["Content-Length"] = size.to_s
+      response
+    end
+
+    def each
+      F.open(@path, "rb") do |file|
+        file.seek(@range.begin)
+        remaining_len = @range.end- at range.begin+1
+        while remaining_len > 0
+          part = file.read([8192, remaining_len].min)
+          break unless part
+          remaining_len -= part.length
+
+          yield part
+        end
+      end
+    end
+
+    private
+
+    def fail(status, body)
+      body += "\n"
+      [
+        status,
+        {
+          "Content-Type" => "text/plain",
+          "Content-Length" => body.size.to_s,
+          "X-Cascade" => "pass"
+        },
+        [body]
+      ]
+    end
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler.rb
new file mode 100644
index 0000000..155dbfa
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler.rb
@@ -0,0 +1,107 @@
+module Rack
+  # *Handlers* connect web servers with Rack.
+  #
+  # Rack includes Handlers for Thin, WEBrick, FastCGI, CGI, SCGI
+  # and LiteSpeed.
+  #
+  # Handlers usually are activated by calling <tt>MyHandler.run(myapp)</tt>.
+  # A second optional hash can be passed to include server-specific
+  # configuration.
+  module Handler
+    def self.get(server)
+      return unless server
+      server = server.to_s
+
+      unless @handlers.include? server
+        load_error = try_require('rack/handler', server)
+      end
+
+      if klass = @handlers[server]
+        klass.split("::").inject(Object) { |o, x| o.const_get(x) }
+      else
+        const_get(server)
+      end
+
+    rescue NameError => name_error
+      raise load_error || name_error
+    end
+
+    # Select first available Rack handler given an `Array` of server names.
+    # Raises `LoadError` if no handler was found.
+    #
+    #   > pick ['thin', 'webrick']
+    #   => Rack::Handler::WEBrick
+    def self.pick(server_names)
+      server_names = Array(server_names)
+      server_names.each do |server_name|
+        begin
+          return get(server_name.to_s)
+        rescue LoadError, NameError
+        end
+      end
+
+      raise LoadError, "Couldn't find handler for: #{server_names.join(', ')}."
+    end
+
+    def self.default(options = {})
+      # Guess.
+      if ENV.include?("PHP_FCGI_CHILDREN")
+        # We already speak FastCGI
+        options.delete :File
+        options.delete :Port
+
+        Rack::Handler::FastCGI
+      elsif ENV.include?("REQUEST_METHOD")
+        Rack::Handler::CGI
+      else
+        pick ['thin', 'puma', 'webrick']
+      end
+    end
+
+    # Transforms server-name constants to their canonical form as filenames,
+    # then tries to require them but silences the LoadError if not found
+    #
+    # Naming convention:
+    #
+    #   Foo # => 'foo'
+    #   FooBar # => 'foo_bar.rb'
+    #   FooBAR # => 'foobar.rb'
+    #   FOObar # => 'foobar.rb'
+    #   FOOBAR # => 'foobar.rb'
+    #   FooBarBaz # => 'foo_bar_baz.rb'
+    def self.try_require(prefix, const_name)
+      file = const_name.gsub(/^[A-Z]+/) { |pre| pre.downcase }.
+        gsub(/[A-Z]+[^A-Z]/, '_\&').downcase
+
+      require(::File.join(prefix, file))
+      nil
+    rescue LoadError => error
+      error
+    end
+
+    def self.register(server, klass)
+      @handlers ||= {}
+      @handlers[server.to_s] = klass.to_s
+    end
+
+    autoload :CGI, "rack/handler/cgi"
+    autoload :FastCGI, "rack/handler/fastcgi"
+    autoload :Mongrel, "rack/handler/mongrel"
+    autoload :EventedMongrel, "rack/handler/evented_mongrel"
+    autoload :SwiftipliedMongrel, "rack/handler/swiftiplied_mongrel"
+    autoload :WEBrick, "rack/handler/webrick"
+    autoload :LSWS, "rack/handler/lsws"
+    autoload :SCGI, "rack/handler/scgi"
+    autoload :Thin, "rack/handler/thin"
+
+    register 'cgi', 'Rack::Handler::CGI'
+    register 'fastcgi', 'Rack::Handler::FastCGI'
+    register 'mongrel', 'Rack::Handler::Mongrel'
+    register 'emongrel', 'Rack::Handler::EventedMongrel'
+    register 'smongrel', 'Rack::Handler::SwiftipliedMongrel'
+    register 'webrick', 'Rack::Handler::WEBrick'
+    register 'lsws', 'Rack::Handler::LSWS'
+    register 'scgi', 'Rack::Handler::SCGI'
+    register 'thin', 'Rack::Handler::Thin'
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/cgi.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/cgi.rb
new file mode 100644
index 0000000..15af1ac
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/cgi.rb
@@ -0,0 +1,61 @@
+require 'rack/content_length'
+require 'rack/rewindable_input'
+
+module Rack
+  module Handler
+    class CGI
+      def self.run(app, options=nil)
+        $stdin.binmode
+        serve app
+      end
+
+      def self.serve(app)
+        env = ENV.to_hash
+        env.delete "HTTP_CONTENT_LENGTH"
+
+        env["SCRIPT_NAME"] = ""  if env["SCRIPT_NAME"] == "/"
+
+        env.update({"rack.version" => Rack::VERSION,
+                     "rack.input" => Rack::RewindableInput.new($stdin),
+                     "rack.errors" => $stderr,
+
+                     "rack.multithread" => false,
+                     "rack.multiprocess" => true,
+                     "rack.run_once" => true,
+
+                     "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
+                   })
+
+        env["QUERY_STRING"] ||= ""
+        env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
+        env["REQUEST_PATH"] ||= "/"
+
+        status, headers, body = app.call(env)
+        begin
+          send_headers status, headers
+          send_body body
+        ensure
+          body.close  if body.respond_to? :close
+        end
+      end
+
+      def self.send_headers(status, headers)
+        $stdout.print "Status: #{status}\r\n"
+        headers.each { |k, vs|
+          vs.split("\n").each { |v|
+            $stdout.print "#{k}: #{v}\r\n"
+          }
+        }
+        $stdout.print "\r\n"
+        $stdout.flush
+      end
+
+      def self.send_body(body)
+        body.each { |part|
+          $stdout.print part
+          $stdout.flush
+        }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/evented_mongrel.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/evented_mongrel.rb
new file mode 100644
index 0000000..0f5cbf7
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/evented_mongrel.rb
@@ -0,0 +1,8 @@
+require 'swiftcore/evented_mongrel'
+
+module Rack
+  module Handler
+    class EventedMongrel < Handler::Mongrel
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/fastcgi.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/fastcgi.rb
new file mode 100644
index 0000000..340e361
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/fastcgi.rb
@@ -0,0 +1,98 @@
+require 'fcgi'
+require 'socket'
+require 'rack/content_length'
+require 'rack/rewindable_input'
+
+if defined? FCGI::Stream
+  class FCGI::Stream
+    alias _rack_read_without_buffer read
+
+    def read(n, buffer=nil)
+      buf = _rack_read_without_buffer n
+      buffer.replace(buf.to_s)  if buffer
+      buf
+    end
+  end
+end
+
+module Rack
+  module Handler
+    class FastCGI
+      def self.run(app, options={})
+        if options[:File]
+          STDIN.reopen(UNIXServer.new(options[:File]))
+        elsif options[:Port]
+          STDIN.reopen(TCPServer.new(options[:Host], options[:Port]))
+        end
+        FCGI.each { |request|
+          serve request, app
+        }
+      end
+
+      def self.valid_options
+        {
+          "Host=HOST" => "Hostname to listen on (default: localhost)",
+          "Port=PORT" => "Port to listen on (default: 8080)",
+          "File=PATH" => "Creates a Domain socket at PATH instead of a TCP socket. Ignores Host and Port if set.",
+        }
+      end
+
+      def self.serve(request, app)
+        env = request.env
+        env.delete "HTTP_CONTENT_LENGTH"
+
+        env["SCRIPT_NAME"] = ""  if env["SCRIPT_NAME"] == "/"
+
+        rack_input = RewindableInput.new(request.in)
+
+        env.update({"rack.version" => Rack::VERSION,
+                     "rack.input" => rack_input,
+                     "rack.errors" => request.err,
+
+                     "rack.multithread" => false,
+                     "rack.multiprocess" => true,
+                     "rack.run_once" => false,
+
+                     "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
+                   })
+
+        env["QUERY_STRING"] ||= ""
+        env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
+        env["REQUEST_PATH"] ||= "/"
+        env.delete "CONTENT_TYPE"  if env["CONTENT_TYPE"] == ""
+        env.delete "CONTENT_LENGTH"  if env["CONTENT_LENGTH"] == ""
+
+        begin
+          status, headers, body = app.call(env)
+          begin
+            send_headers request.out, status, headers
+            send_body request.out, body
+          ensure
+            body.close  if body.respond_to? :close
+          end
+        ensure
+          rack_input.close
+          request.finish
+        end
+      end
+
+      def self.send_headers(out, status, headers)
+        out.print "Status: #{status}\r\n"
+        headers.each { |k, vs|
+          vs.split("\n").each { |v|
+            out.print "#{k}: #{v}\r\n"
+          }
+        }
+        out.print "\r\n"
+        out.flush
+      end
+
+      def self.send_body(out, body)
+        body.each { |part|
+          out.print part
+          out.flush
+        }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/lsws.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/lsws.rb
new file mode 100644
index 0000000..1dee78a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/lsws.rb
@@ -0,0 +1,61 @@
+require 'lsapi'
+require 'rack/content_length'
+require 'rack/rewindable_input'
+
+module Rack
+  module Handler
+    class LSWS
+      def self.run(app, options=nil)
+        while LSAPI.accept != nil
+          serve app
+        end
+      end
+      def self.serve(app)
+        env = ENV.to_hash
+        env.delete "HTTP_CONTENT_LENGTH"
+        env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
+
+        rack_input = RewindableInput.new($stdin.read.to_s)
+
+        env.update(
+          "rack.version" => Rack::VERSION,
+          "rack.input" => rack_input,
+          "rack.errors" => $stderr,
+          "rack.multithread" => false,
+          "rack.multiprocess" => true,
+          "rack.run_once" => false,
+          "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
+        )
+
+        env["QUERY_STRING"] ||= ""
+        env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
+        env["REQUEST_PATH"] ||= "/"
+        status, headers, body = app.call(env)
+        begin
+          send_headers status, headers
+          send_body body
+        ensure
+          body.close if body.respond_to? :close
+        end
+      ensure
+        rack_input.close
+      end
+      def self.send_headers(status, headers)
+        print "Status: #{status}\r\n"
+        headers.each { |k, vs|
+          vs.split("\n").each { |v|
+            print "#{k}: #{v}\r\n"
+          }
+        }
+        print "\r\n"
+        STDOUT.flush
+      end
+      def self.send_body(body)
+        body.each { |part|
+          print part
+          STDOUT.flush
+        }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/mongrel.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/mongrel.rb
new file mode 100644
index 0000000..1a702fd
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/mongrel.rb
@@ -0,0 +1,100 @@
+require 'mongrel'
+require 'stringio'
+require 'rack/content_length'
+require 'rack/chunked'
+
+module Rack
+  module Handler
+    class Mongrel < ::Mongrel::HttpHandler
+      def self.run(app, options={})
+        server = ::Mongrel::HttpServer.new(
+          options[:Host]           || '0.0.0.0',
+          options[:Port]           || 8080,
+          options[:num_processors] || 950,
+          options[:throttle]       || 0,
+          options[:timeout]        || 60)
+        # Acts like Rack::URLMap, utilizing Mongrel's own path finding methods.
+        # Use is similar to #run, replacing the app argument with a hash of
+        # { path=>app, ... } or an instance of Rack::URLMap.
+        if options[:map]
+          if app.is_a? Hash
+            app.each do |path, appl|
+              path = '/'+path unless path[0] == ?/
+              server.register(path, Rack::Handler::Mongrel.new(appl))
+            end
+          elsif app.is_a? URLMap
+            app.instance_variable_get(:@mapping).each do |(host, path, appl)|
+             next if !host.nil? && !options[:Host].nil? && options[:Host] != host
+             path = '/'+path unless path[0] == ?/
+             server.register(path, Rack::Handler::Mongrel.new(appl))
+            end
+          else
+            raise ArgumentError, "first argument should be a Hash or URLMap"
+          end
+        else
+          server.register('/', Rack::Handler::Mongrel.new(app))
+        end
+        yield server  if block_given?
+        server.run.join
+      end
+
+      def self.valid_options
+        {
+          "Host=HOST" => "Hostname to listen on (default: localhost)",
+          "Port=PORT" => "Port to listen on (default: 8080)",
+          "Processors=N" => "Number of concurrent processors to accept (default: 950)",
+          "Timeout=N" => "Time before a request is dropped for inactivity (default: 60)",
+          "Throttle=N" => "Throttle time between socket.accept calls in hundredths of a second (default: 0)",
+        }
+      end
+
+      def initialize(app)
+        @app = app
+      end
+
+      def process(request, response)
+        env = Hash[request.params]
+        env.delete "HTTP_CONTENT_TYPE"
+        env.delete "HTTP_CONTENT_LENGTH"
+
+        env["SCRIPT_NAME"] = ""  if env["SCRIPT_NAME"] == "/"
+
+        rack_input = request.body || StringIO.new('')
+        rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)
+
+        env.update({"rack.version" => Rack::VERSION,
+                     "rack.input" => rack_input,
+                     "rack.errors" => $stderr,
+
+                     "rack.multithread" => true,
+                     "rack.multiprocess" => false, # ???
+                     "rack.run_once" => false,
+
+                     "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
+                   })
+        env["QUERY_STRING"] ||= ""
+
+        status, headers, body = @app.call(env)
+
+        begin
+          response.status = status.to_i
+          response.send_status(nil)
+
+          headers.each { |k, vs|
+            vs.split("\n").each { |v|
+              response.header[k] = v
+            }
+          }
+          response.send_header
+
+          body.each { |part|
+            response.write part
+            response.socket.flush
+          }
+        ensure
+          body.close  if body.respond_to? :close
+        end
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/scgi.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/scgi.rb
new file mode 100644
index 0000000..a4fe6ce
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/scgi.rb
@@ -0,0 +1,67 @@
+require 'scgi'
+require 'stringio'
+require 'rack/content_length'
+require 'rack/chunked'
+
+module Rack
+  module Handler
+    class SCGI < ::SCGI::Processor
+      attr_accessor :app
+
+      def self.run(app, options=nil)
+        options[:Socket] = UNIXServer.new(options[:File]) if options[:File]
+        new(options.merge(:app=>app,
+                          :host=>options[:Host],
+                          :port=>options[:Port],
+                          :socket=>options[:Socket])).listen
+      end
+
+      def self.valid_options
+        {
+          "Host=HOST" => "Hostname to listen on (default: localhost)",
+          "Port=PORT" => "Port to listen on (default: 8080)",
+        }
+      end
+
+      def initialize(settings = {})
+        @app = settings[:app]
+        super(settings)
+      end
+
+      def process_request(request, input_body, socket)
+        env = Hash[request]
+        env.delete "HTTP_CONTENT_TYPE"
+        env.delete "HTTP_CONTENT_LENGTH"
+        env["REQUEST_PATH"], env["QUERY_STRING"] = env["REQUEST_URI"].split('?', 2)
+        env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
+        env["PATH_INFO"] = env["REQUEST_PATH"]
+        env["QUERY_STRING"] ||= ""
+        env["SCRIPT_NAME"] = ""
+
+        rack_input = StringIO.new(input_body)
+        rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)
+
+        env.update({"rack.version" => Rack::VERSION,
+                     "rack.input" => rack_input,
+                     "rack.errors" => $stderr,
+                     "rack.multithread" => true,
+                     "rack.multiprocess" => true,
+                     "rack.run_once" => false,
+
+                     "rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
+                   })
+        status, headers, body = app.call(env)
+        begin
+          socket.write("Status: #{status}\r\n")
+          headers.each do |k, vs|
+            vs.split("\n").each { |v| socket.write("#{k}: #{v}\r\n")}
+          end
+          socket.write("\r\n")
+          body.each {|s| socket.write(s)}
+        ensure
+          body.close if body.respond_to? :close
+        end
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/swiftiplied_mongrel.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/swiftiplied_mongrel.rb
new file mode 100644
index 0000000..4bafd0b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/swiftiplied_mongrel.rb
@@ -0,0 +1,8 @@
+require 'swiftcore/swiftiplied_mongrel'
+
+module Rack
+  module Handler
+    class SwiftipliedMongrel < Handler::Mongrel
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/thin.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/thin.rb
new file mode 100644
index 0000000..dc26972
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/thin.rb
@@ -0,0 +1,27 @@
+require "thin"
+require "rack/content_length"
+require "rack/chunked"
+
+module Rack
+  module Handler
+    class Thin
+      def self.run(app, options={})
+        host = options.delete(:Host) || '0.0.0.0'
+        port = options.delete(:Port) || 8080
+        args = [host, port, app, options]
+        # Thin versions below 0.8.0 do not support additional options
+        args.pop if ::Thin::VERSION::MAJOR < 1 && ::Thin::VERSION::MINOR < 8
+        server = ::Thin::Server.new(*args)
+        yield server if block_given?
+        server.start
+      end
+
+      def self.valid_options
+        {
+          "Host=HOST" => "Hostname to listen on (default: localhost)",
+          "Port=PORT" => "Port to listen on (default: 8080)",
+        }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/webrick.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/webrick.rb
new file mode 100644
index 0000000..487a0ea
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/handler/webrick.rb
@@ -0,0 +1,81 @@
+require 'webrick'
+require 'stringio'
+require 'rack/content_length'
+
+module Rack
+  module Handler
+    class WEBrick < ::WEBrick::HTTPServlet::AbstractServlet
+      def self.run(app, options={})
+        options[:BindAddress] = options.delete(:Host) if options[:Host]
+        options[:Port] ||= 8080
+        @server = ::WEBrick::HTTPServer.new(options)
+        @server.mount "/", Rack::Handler::WEBrick, app
+        yield @server  if block_given?
+        @server.start
+      end
+
+      def self.valid_options
+        {
+          "Host=HOST" => "Hostname to listen on (default: localhost)",
+          "Port=PORT" => "Port to listen on (default: 8080)",
+        }
+      end
+
+      def self.shutdown
+        @server.shutdown
+        @server = nil
+      end
+
+      def initialize(server, app)
+        super server
+        @app = app
+      end
+
+      def service(req, res)
+        env = req.meta_vars
+        env.delete_if { |k, v| v.nil? }
+
+        rack_input = StringIO.new(req.body.to_s)
+        rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)
+
+        env.update({"rack.version" => Rack::VERSION,
+                     "rack.input" => rack_input,
+                     "rack.errors" => $stderr,
+
+                     "rack.multithread" => true,
+                     "rack.multiprocess" => false,
+                     "rack.run_once" => false,
+
+                     "rack.url_scheme" => ["yes", "on", "1"].include?(ENV["HTTPS"]) ? "https" : "http"
+                   })
+
+        env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
+        env["QUERY_STRING"] ||= ""
+        unless env["PATH_INFO"] == ""
+          path, n = req.request_uri.path, env["SCRIPT_NAME"].length
+          env["PATH_INFO"] = path[n, path.length-n]
+        end
+        env["REQUEST_PATH"] ||= [env["SCRIPT_NAME"], env["PATH_INFO"]].join
+
+        status, headers, body = @app.call(env)
+        begin
+          res.status = status.to_i
+          headers.each { |k, vs|
+            if k.downcase == "set-cookie"
+              res.cookies.concat vs.split("\n")
+            else
+              # Since WEBrick won't accept repeated headers,
+              # merge the values per RFC 1945 section 4.2.
+              res[k] = vs.split("\n").join(", ")
+            end
+          }
+          body.each { |part|
+            res.body << part
+          }
+        ensure
+          body.close  if body.respond_to? :close
+        end
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/head.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/head.rb
new file mode 100644
index 0000000..7ffead6
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/head.rb
@@ -0,0 +1,22 @@
+module Rack
+
+class Head
+  # Rack::Head returns an empty body for all HEAD requests. It leaves
+  # all other requests unchanged.
+  def initialize(app)
+    @app = app
+  end
+
+  def call(env)
+    status, headers, body = @app.call(env)
+
+    if env["REQUEST_METHOD"] == "HEAD"
+      body.close if body.respond_to? :close
+      [status, headers, []]
+    else
+      [status, headers, body]
+    end
+  end
+end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/lint.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/lint.rb
new file mode 100644
index 0000000..fd21f77
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/lint.rb
@@ -0,0 +1,699 @@
+require 'rack/utils'
+require 'forwardable'
+
+module Rack
+  # Rack::Lint validates your application and the requests and
+  # responses according to the Rack spec.
+
+  class Lint
+    def initialize(app)
+      @app = app
+      @content_length = nil
+    end
+
+    # :stopdoc:
+
+    class LintError < RuntimeError; end
+    module Assertion
+      def assert(message, &block)
+        unless block.call
+          raise LintError, message
+        end
+      end
+    end
+    include Assertion
+
+    ## This specification aims to formalize the Rack protocol.  You
+    ## can (and should) use Rack::Lint to enforce it.
+    ##
+    ## When you develop middleware, be sure to add a Lint before and
+    ## after to catch all mistakes.
+
+    ## = Rack applications
+
+    ## A Rack application is a Ruby object (not a class) that
+    ## responds to +call+.
+    def call(env=nil)
+      dup._call(env)
+    end
+
+    def _call(env)
+      ## It takes exactly one argument, the *environment*
+      assert("No env given") { env }
+      check_env env
+
+      env['rack.input'] = InputWrapper.new(env['rack.input'])
+      env['rack.errors'] = ErrorWrapper.new(env['rack.errors'])
+
+      ## and returns an Array of exactly three values:
+      status, headers, @body = @app.call(env)
+      ## The *status*,
+      check_status status
+      ## the *headers*,
+      check_headers headers
+
+      check_hijack_response headers, env
+
+      ## and the *body*.
+      check_content_type status, headers
+      check_content_length status, headers
+      @head_request = env["REQUEST_METHOD"] == "HEAD"
+      [status, headers, self]
+    end
+
+    ## == The Environment
+    def check_env(env)
+      ## The environment must be an instance of Hash that includes
+      ## CGI-like headers.  The application is free to modify the
+      ## environment.
+      assert("env #{env.inspect} is not a Hash, but #{env.class}") {
+        env.kind_of? Hash
+      }
+
+      ##
+      ## The environment is required to include these variables
+      ## (adopted from PEP333), except when they'd be empty, but see
+      ## below.
+
+      ## <tt>REQUEST_METHOD</tt>:: The HTTP request method, such as
+      ##                           "GET" or "POST". This cannot ever
+      ##                           be an empty string, and so is
+      ##                           always required.
+
+      ## <tt>SCRIPT_NAME</tt>:: The initial portion of the request
+      ##                        URL's "path" that corresponds to the
+      ##                        application object, so that the
+      ##                        application knows its virtual
+      ##                        "location". This may be an empty
+      ##                        string, if the application corresponds
+      ##                        to the "root" of the server.
+
+      ## <tt>PATH_INFO</tt>:: The remainder of the request URL's
+      ##                      "path", designating the virtual
+      ##                      "location" of the request's target
+      ##                      within the application. This may be an
+      ##                      empty string, if the request URL targets
+      ##                      the application root and does not have a
+      ##                      trailing slash. This value may be
+      ##                      percent-encoded when I originating from
+      ##                      a URL.
+
+      ## <tt>QUERY_STRING</tt>:: The portion of the request URL that
+      ##                         follows the <tt>?</tt>, if any. May be
+      ##                         empty, but is always required!
+
+      ## <tt>SERVER_NAME</tt>, <tt>SERVER_PORT</tt>:: When combined with <tt>SCRIPT_NAME</tt> and <tt>PATH_INFO</tt>, these variables can be used to complete the URL. Note, however, that <tt>HTTP_HOST</tt>, if present, should be used in preference to <tt>SERVER_NAME</tt> for reconstructing the request URL.  <tt>SERVER_NAME</tt> and <tt>SERVER_PORT</tt> can never be empty strings, and so are always required.
+
+      ## <tt>HTTP_</tt> Variables:: Variables corresponding to the
+      ##                            client-supplied HTTP request
+      ##                            headers (i.e., variables whose
+      ##                            names begin with <tt>HTTP_</tt>). The
+      ##                            presence or absence of these
+      ##                            variables should correspond with
+      ##                            the presence or absence of the
+      ##                            appropriate HTTP header in the
+      ##                            request. See <a href="https://tools.ietf.org/html/rfc3875#section-4.1.18">
+      ##                            RFC3875 section 4.1.18</a> for specific behavior.
+
+      ## In addition to this, the Rack environment must include these
+      ## Rack-specific variables:
+
+      ## <tt>rack.version</tt>:: The Array representing this version of Rack. See Rack::VERSION, that corresponds to the version of this SPEC.
+      ## <tt>rack.url_scheme</tt>:: +http+ or +https+, depending on the request URL.
+      ## <tt>rack.input</tt>:: See below, the input stream.
+      ## <tt>rack.errors</tt>:: See below, the error stream.
+      ## <tt>rack.multithread</tt>:: true if the application object may be simultaneously invoked by another thread in the same process, false otherwise.
+      ## <tt>rack.multiprocess</tt>:: true if an equivalent application object may be simultaneously invoked by another process, false otherwise.
+      ## <tt>rack.run_once</tt>:: true if the server expects (but does not guarantee!) that the application will only be invoked this one time during the life of its containing process. Normally, this will only be true for a server based on CGI (or something similar).
+      ## <tt>rack.hijack?</tt>:: present and true if the server supports connection hijacking. See below, hijacking.
+      ## <tt>rack.hijack</tt>:: an object responding to #call that must be called at least once before using rack.hijack_io. It is recommended #call return rack.hijack_io as well as setting it in env if necessary.
+      ## <tt>rack.hijack_io</tt>:: if rack.hijack? is true, and rack.hijack has received #call, this will contain an object resembling an IO. See hijacking.
+      ##
+
+      ## Additional environment specifications have approved to
+      ## standardized middleware APIs.  None of these are required to
+      ## be implemented by the server.
+
+      ## <tt>rack.session</tt>:: A hash like interface for storing request session data.
+      ##                         The store must implement:
+      if session = env['rack.session']
+        ##                         store(key, value)         (aliased as []=);
+        assert("session #{session.inspect} must respond to store and []=") {
+          session.respond_to?(:store) && session.respond_to?(:[]=)
+        }
+
+        ##                         fetch(key, default = nil) (aliased as []);
+        assert("session #{session.inspect} must respond to fetch and []") {
+          session.respond_to?(:fetch) && session.respond_to?(:[])
+        }
+
+        ##                         delete(key);
+        assert("session #{session.inspect} must respond to delete") {
+          session.respond_to?(:delete)
+        }
+
+        ##                         clear;
+        assert("session #{session.inspect} must respond to clear") {
+          session.respond_to?(:clear)
+        }
+      end
+
+      ## <tt>rack.logger</tt>:: A common object interface for logging messages.
+      ##                        The object must implement:
+      if logger = env['rack.logger']
+        ##                         info(message, &block)
+        assert("logger #{logger.inspect} must respond to info") {
+          logger.respond_to?(:info)
+        }
+
+        ##                         debug(message, &block)
+        assert("logger #{logger.inspect} must respond to debug") {
+          logger.respond_to?(:debug)
+        }
+
+        ##                         warn(message, &block)
+        assert("logger #{logger.inspect} must respond to warn") {
+          logger.respond_to?(:warn)
+        }
+
+        ##                         error(message, &block)
+        assert("logger #{logger.inspect} must respond to error") {
+          logger.respond_to?(:error)
+        }
+
+        ##                         fatal(message, &block)
+        assert("logger #{logger.inspect} must respond to fatal") {
+          logger.respond_to?(:fatal)
+        }
+      end
+
+      ## The server or the application can store their own data in the
+      ## environment, too.  The keys must contain at least one dot,
+      ## and should be prefixed uniquely.  The prefix <tt>rack.</tt>
+      ## is reserved for use with the Rack core distribution and other
+      ## accepted specifications and must not be used otherwise.
+      ##
+
+      %w[REQUEST_METHOD SERVER_NAME SERVER_PORT
+         QUERY_STRING
+         rack.version rack.input rack.errors
+         rack.multithread rack.multiprocess rack.run_once].each { |header|
+        assert("env missing required key #{header}") { env.include? header }
+      }
+
+      ## The environment must not contain the keys
+      ## <tt>HTTP_CONTENT_TYPE</tt> or <tt>HTTP_CONTENT_LENGTH</tt>
+      ## (use the versions without <tt>HTTP_</tt>).
+      %w[HTTP_CONTENT_TYPE HTTP_CONTENT_LENGTH].each { |header|
+        assert("env contains #{header}, must use #{header[5,-1]}") {
+          not env.include? header
+        }
+      }
+
+      ## The CGI keys (named without a period) must have String values.
+      env.each { |key, value|
+        next  if key.include? "."   # Skip extensions
+        assert("env variable #{key} has non-string value #{value.inspect}") {
+          value.kind_of? String
+        }
+      }
+
+      ##
+      ## There are the following restrictions:
+
+      ## * <tt>rack.version</tt> must be an array of Integers.
+      assert("rack.version must be an Array, was #{env["rack.version"].class}") {
+        env["rack.version"].kind_of? Array
+      }
+      ## * <tt>rack.url_scheme</tt> must either be +http+ or +https+.
+      assert("rack.url_scheme unknown: #{env["rack.url_scheme"].inspect}") {
+        %w[http https].include? env["rack.url_scheme"]
+      }
+
+      ## * There must be a valid input stream in <tt>rack.input</tt>.
+      check_input env["rack.input"]
+      ## * There must be a valid error stream in <tt>rack.errors</tt>.
+      check_error env["rack.errors"]
+      ## * There may be a valid hijack stream in <tt>rack.hijack_io</tt>
+      check_hijack env
+
+      ## * The <tt>REQUEST_METHOD</tt> must be a valid token.
+      assert("REQUEST_METHOD unknown: #{env["REQUEST_METHOD"]}") {
+        env["REQUEST_METHOD"] =~ /\A[0-9A-Za-z!\#$%&'*+.^_`|~-]+\z/
+      }
+
+      ## * The <tt>SCRIPT_NAME</tt>, if non-empty, must start with <tt>/</tt>
+      assert("SCRIPT_NAME must start with /") {
+        !env.include?("SCRIPT_NAME") ||
+        env["SCRIPT_NAME"] == "" ||
+        env["SCRIPT_NAME"] =~ /\A\//
+      }
+      ## * The <tt>PATH_INFO</tt>, if non-empty, must start with <tt>/</tt>
+      assert("PATH_INFO must start with /") {
+        !env.include?("PATH_INFO") ||
+        env["PATH_INFO"] == "" ||
+        env["PATH_INFO"] =~ /\A\//
+      }
+      ## * The <tt>CONTENT_LENGTH</tt>, if given, must consist of digits only.
+      assert("Invalid CONTENT_LENGTH: #{env["CONTENT_LENGTH"]}") {
+        !env.include?("CONTENT_LENGTH") || env["CONTENT_LENGTH"] =~ /\A\d+\z/
+      }
+
+      ## * One of <tt>SCRIPT_NAME</tt> or <tt>PATH_INFO</tt> must be
+      ##   set.  <tt>PATH_INFO</tt> should be <tt>/</tt> if
+      ##   <tt>SCRIPT_NAME</tt> is empty.
+      assert("One of SCRIPT_NAME or PATH_INFO must be set (make PATH_INFO '/' if SCRIPT_NAME is empty)") {
+        env["SCRIPT_NAME"] || env["PATH_INFO"]
+      }
+      ##   <tt>SCRIPT_NAME</tt> never should be <tt>/</tt>, but instead be empty.
+      assert("SCRIPT_NAME cannot be '/', make it '' and PATH_INFO '/'") {
+        env["SCRIPT_NAME"] != "/"
+      }
+    end
+
+    ## === The Input Stream
+    ##
+    ## The input stream is an IO-like object which contains the raw HTTP
+    ## POST data.
+    def check_input(input)
+      ## When applicable, its external encoding must be "ASCII-8BIT" and it
+      ## must be opened in binary mode, for Ruby 1.9 compatibility.
+      assert("rack.input #{input} does not have ASCII-8BIT as its external encoding") {
+        input.external_encoding.name == "ASCII-8BIT"
+      } if input.respond_to?(:external_encoding)
+      assert("rack.input #{input} is not opened in binary mode") {
+        input.binmode?
+      } if input.respond_to?(:binmode?)
+
+      ## The input stream must respond to +gets+, +each+, +read+ and +rewind+.
+      [:gets, :each, :read, :rewind].each { |method|
+        assert("rack.input #{input} does not respond to ##{method}") {
+          input.respond_to? method
+        }
+      }
+    end
+
+    class InputWrapper
+      include Assertion
+
+      def initialize(input)
+        @input = input
+      end
+
+      ## * +gets+ must be called without arguments and return a string,
+      ##   or +nil+ on EOF.
+      def gets(*args)
+        assert("rack.input#gets called with arguments") { args.size == 0 }
+        v = @input.gets
+        assert("rack.input#gets didn't return a String") {
+          v.nil? or v.kind_of? String
+        }
+        v
+      end
+
+      ## * +read+ behaves like IO#read. Its signature is <tt>read([length, [buffer]])</tt>.
+      ##   If given, +length+ must be a non-negative Integer (>= 0) or +nil+, and +buffer+ must
+      ##   be a String and may not be nil. If +length+ is given and not nil, then this method
+      ##   reads at most +length+ bytes from the input stream. If +length+ is not given or nil,
+      ##   then this method reads all data until EOF.
+      ##   When EOF is reached, this method returns nil if +length+ is given and not nil, or ""
+      ##   if +length+ is not given or is nil.
+      ##   If +buffer+ is given, then the read data will be placed into +buffer+ instead of a
+      ##   newly created String object.
+      def read(*args)
+        assert("rack.input#read called with too many arguments") {
+          args.size <= 2
+        }
+        if args.size >= 1
+          assert("rack.input#read called with non-integer and non-nil length") {
+            args.first.kind_of?(Integer) || args.first.nil?
+          }
+          assert("rack.input#read called with a negative length") {
+            args.first.nil? || args.first >= 0
+          }
+        end
+        if args.size >= 2
+          assert("rack.input#read called with non-String buffer") {
+            args[1].kind_of?(String)
+          }
+        end
+
+        v = @input.read(*args)
+
+        assert("rack.input#read didn't return nil or a String") {
+          v.nil? or v.kind_of? String
+        }
+        if args[0].nil?
+          assert("rack.input#read(nil) returned nil on EOF") {
+            !v.nil?
+          }
+        end
+
+        v
+      end
+
+      ## * +each+ must be called without arguments and only yield Strings.
+      def each(*args)
+        assert("rack.input#each called with arguments") { args.size == 0 }
+        @input.each { |line|
+          assert("rack.input#each didn't yield a String") {
+            line.kind_of? String
+          }
+          yield line
+        }
+      end
+
+      ## * +rewind+ must be called without arguments. It rewinds the input
+      ##   stream back to the beginning. It must not raise Errno::ESPIPE:
+      ##   that is, it may not be a pipe or a socket. Therefore, handler
+      ##   developers must buffer the input data into some rewindable object
+      ##   if the underlying input stream is not rewindable.
+      def rewind(*args)
+        assert("rack.input#rewind called with arguments") { args.size == 0 }
+        assert("rack.input#rewind raised Errno::ESPIPE") {
+          begin
+            @input.rewind
+            true
+          rescue Errno::ESPIPE
+            false
+          end
+        }
+      end
+
+      ## * +close+ must never be called on the input stream.
+      def close(*args)
+        assert("rack.input#close must not be called") { false }
+      end
+    end
+
+    ## === The Error Stream
+    def check_error(error)
+      ## The error stream must respond to +puts+, +write+ and +flush+.
+      [:puts, :write, :flush].each { |method|
+        assert("rack.error #{error} does not respond to ##{method}") {
+          error.respond_to? method
+        }
+      }
+    end
+
+    class ErrorWrapper
+      include Assertion
+
+      def initialize(error)
+        @error = error
+      end
+
+      ## * +puts+ must be called with a single argument that responds to +to_s+.
+      def puts(str)
+        @error.puts str
+      end
+
+      ## * +write+ must be called with a single argument that is a String.
+      def write(str)
+        assert("rack.errors#write not called with a String") { str.kind_of? String }
+        @error.write str
+      end
+
+      ## * +flush+ must be called without arguments and must be called
+      ##   in order to make the error appear for sure.
+      def flush
+        @error.flush
+      end
+
+      ## * +close+ must never be called on the error stream.
+      def close(*args)
+        assert("rack.errors#close must not be called") { false }
+      end
+    end
+
+    class HijackWrapper
+      include Assertion
+      extend Forwardable
+
+      REQUIRED_METHODS = [
+        :read, :write, :read_nonblock, :write_nonblock, :flush, :close,
+        :close_read, :close_write, :closed?
+      ]
+
+      def_delegators :@io, *REQUIRED_METHODS
+
+      def initialize(io)
+        @io = io
+        REQUIRED_METHODS.each do |meth|
+          assert("rack.hijack_io must respond to #{meth}") { io.respond_to? meth }
+        end
+      end
+    end
+
+    ## === Hijacking
+    #
+    # AUTHORS: n.b. The trailing whitespace between paragraphs is important and
+    # should not be removed. The whitespace creates paragraphs in the RDoc
+    # output.
+    #
+    ## ==== Request (before status)
+    def check_hijack(env)
+      if env['rack.hijack?']
+        ## If rack.hijack? is true then rack.hijack must respond to #call.
+        original_hijack = env['rack.hijack']
+        assert("rack.hijack must respond to call") { original_hijack.respond_to?(:call) }
+        env['rack.hijack'] = proc do
+          ## rack.hijack must return the io that will also be assigned (or is
+          ## already present, in rack.hijack_io.
+          io = original_hijack.call
+          HijackWrapper.new(io)
+          ## 
+          ## rack.hijack_io must respond to:
+          ## <tt>read, write, read_nonblock, write_nonblock, flush, close,
+          ## close_read, close_write, closed?</tt>
+          ## 
+          ## The semantics of these IO methods must be a best effort match to
+          ## those of a normal ruby IO or Socket object, using standard
+          ## arguments and raising standard exceptions. Servers are encouraged
+          ## to simply pass on real IO objects, although it is recognized that
+          ## this approach is not directly compatible with SPDY and HTTP 2.0.
+          ## 
+          ## IO provided in rack.hijack_io should preference the
+          ## IO::WaitReadable and IO::WaitWritable APIs wherever supported.
+          ## 
+          ## There is a deliberate lack of full specification around
+          ## rack.hijack_io, as semantics will change from server to server.
+          ## Users are encouraged to utilize this API with a knowledge of their
+          ## server choice, and servers may extend the functionality of
+          ## hijack_io to provide additional features to users. The purpose of
+          ## rack.hijack is for Rack to "get out of the way", as such, Rack only
+          ## provides the minimum of specification and support.
+          env['rack.hijack_io'] = HijackWrapper.new(env['rack.hijack_io'])
+          io
+        end
+      else
+        ## 
+        ## If rack.hijack? is false, then rack.hijack should not be set.
+        assert("rack.hijack? is false, but rack.hijack is present") { env['rack.hijack'].nil? }
+        ## 
+        ## If rack.hijack? is false, then rack.hijack_io should not be set.
+        assert("rack.hijack? is false, but rack.hijack_io is present") { env['rack.hijack_io'].nil? }
+      end
+    end
+
+    ## ==== Response (after headers)
+    ## It is also possible to hijack a response after the status and headers
+    ## have been sent.
+    def check_hijack_response(headers, env)
+
+      # this check uses headers like a hash, but the spec only requires
+      # headers respond to #each
+      headers = Rack::Utils::HeaderHash.new(headers)
+
+      ## In order to do this, an application may set the special header
+      ## <tt>rack.hijack</tt> to an object that responds to <tt>call</tt>
+      ## accepting an argument that conforms to the <tt>rack.hijack_io</tt>
+      ## protocol.
+      ## 
+      ## After the headers have been sent, and this hijack callback has been
+      ## called, the application is now responsible for the remaining lifecycle
+      ## of the IO. The application is also responsible for maintaining HTTP
+      ## semantics. Of specific note, in almost all cases in the current SPEC,
+      ## applications will have wanted to specify the header Connection:close in
+      ## HTTP/1.1, and not Connection:keep-alive, as there is no protocol for
+      ## returning hijacked sockets to the web server. For that purpose, use the
+      ## body streaming API instead (progressively yielding strings via each).
+      ## 
+      ## Servers must ignore the <tt>body</tt> part of the response tuple when
+      ## the <tt>rack.hijack</tt> response API is in use.
+
+      if env['rack.hijack?'] && headers['rack.hijack']
+        assert('rack.hijack header must respond to #call') {
+          headers['rack.hijack'].respond_to? :call
+        }
+        original_hijack = headers['rack.hijack']
+        headers['rack.hijack'] = proc do |io|
+          original_hijack.call HijackWrapper.new(io)
+        end
+      else
+        ## 
+        ## The special response header <tt>rack.hijack</tt> must only be set
+        ## if the request env has <tt>rack.hijack?</tt> <tt>true</tt>.
+        assert('rack.hijack header must not be present if server does not support hijacking') {
+          headers['rack.hijack'].nil?
+        }
+      end
+    end
+    ## ==== Conventions
+    ## * Middleware should not use hijack unless it is handling the whole
+    ##   response.
+    ## * Middleware may wrap the IO object for the response pattern.
+    ## * Middleware should not wrap the IO object for the request pattern. The
+    ##   request pattern is intended to provide the hijacker with "raw tcp".
+
+    ## == The Response
+
+    ## === The Status
+    def check_status(status)
+      ## This is an HTTP status. When parsed as integer (+to_i+), it must be
+      ## greater than or equal to 100.
+      assert("Status must be >=100 seen as integer") { status.to_i >= 100 }
+    end
+
+    ## === The Headers
+    def check_headers(header)
+      ## The header must respond to +each+, and yield values of key and value.
+      assert("headers object should respond to #each, but doesn't (got #{header.class} as headers)") {
+         header.respond_to? :each
+      }
+      header.each { |key, value|
+        ## Special headers starting "rack." are for communicating with the
+        ## server, and must not be sent back to the client.
+        next if key =~ /^rack\..+$/
+
+        ## The header keys must be Strings.
+        assert("header key must be a string, was #{key.class}") {
+          key.kind_of? String
+        }
+        ## The header must not contain a +Status+ key,
+        assert("header must not contain Status") { key.downcase != "status" }
+        ## contain keys with <tt>:</tt> or newlines in their name,
+        assert("header names must not contain : or \\n") { key !~ /[:\n]/ }
+        ## contain keys names that end in <tt>-</tt> or <tt>_</tt>,
+        assert("header names must not end in - or _") { key !~ /[-_]\z/ }
+        ## but only contain keys that consist of
+        ## letters, digits, <tt>_</tt> or <tt>-</tt> and start with a letter.
+        assert("invalid header name: #{key}") { key =~ /\A[a-zA-Z][a-zA-Z0-9_-]*\z/ }
+
+        ## The values of the header must be Strings,
+        assert("a header value must be a String, but the value of " +
+          "'#{key}' is a #{value.class}") { value.kind_of? String }
+        ## consisting of lines (for multiple header values, e.g. multiple
+        ## <tt>Set-Cookie</tt> values) seperated by "\n".
+        value.split("\n").each { |item|
+          ## The lines must not contain characters below 037.
+          assert("invalid header value #{key}: #{item.inspect}") {
+            item !~ /[\000-\037]/
+          }
+        }
+      }
+    end
+
+    ## === The Content-Type
+    def check_content_type(status, headers)
+      headers.each { |key, value|
+        ## There must not be a <tt>Content-Type</tt>, when the +Status+ is 1xx,
+        ## 204, 205 or 304.
+        if key.downcase == "content-type"
+          assert("Content-Type header found in #{status} response, not allowed") {
+            not Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.include? status.to_i
+          }
+          return
+        end
+      }
+    end
+
+    ## === The Content-Length
+    def check_content_length(status, headers)
+      headers.each { |key, value|
+        if key.downcase == 'content-length'
+          ## There must not be a <tt>Content-Length</tt> header when the
+          ## +Status+ is 1xx, 204, 205 or 304.
+          assert("Content-Length header found in #{status} response, not allowed") {
+            not Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.include? status.to_i
+          }
+          @content_length = value
+        end
+      }
+    end
+
+    def verify_content_length(bytes)
+      if @head_request
+        assert("Response body was given for HEAD request, but should be empty") {
+          bytes == 0
+        }
+      elsif @content_length
+        assert("Content-Length header was #{@content_length}, but should be #{bytes}") {
+          @content_length == bytes.to_s
+        }
+      end
+    end
+
+    ## === The Body
+    def each
+      @closed = false
+      bytes = 0
+
+      ## The Body must respond to +each+
+      assert("Response body must respond to each") do
+        @body.respond_to?(:each)
+      end
+
+      @body.each { |part|
+        ## and must only yield String values.
+        assert("Body yielded non-string value #{part.inspect}") {
+          part.kind_of? String
+        }
+        bytes += Rack::Utils.bytesize(part)
+        yield part
+      }
+      verify_content_length(bytes)
+
+      ##
+      ## The Body itself should not be an instance of String, as this will
+      ## break in Ruby 1.9.
+      ##
+      ## If the Body responds to +close+, it will be called after iteration. If
+      ## the body is replaced by a middleware after action, the original body
+      ## must be closed first, if it repsonds to close.
+      # XXX howto: assert("Body has not been closed") { @closed }
+
+
+      ##
+      ## If the Body responds to +to_path+, it must return a String
+      ## identifying the location of a file whose contents are identical
+      ## to that produced by calling +each+; this may be used by the
+      ## server as an alternative, possibly more efficient way to
+      ## transport the response.
+
+      if @body.respond_to?(:to_path)
+        assert("The file identified by body.to_path does not exist") {
+          ::File.exist? @body.to_path
+        }
+      end
+
+      ##
+      ## The Body commonly is an Array of Strings, the application
+      ## instance itself, or a File-like object.
+    end
+
+    def close
+      @closed = true
+      @body.close  if @body.respond_to?(:close)
+    end
+
+    # :startdoc:
+
+  end
+end
+
+## == Thanks
+## Some parts of this specification are adopted from PEP333: Python
+## Web Server Gateway Interface
+## v1.0 (http://www.python.org/dev/peps/pep-0333/). I'd like to thank
+## everyone involved in that effort.
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/lobster.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/lobster.rb
new file mode 100644
index 0000000..d1a7f7b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/lobster.rb
@@ -0,0 +1,65 @@
+require 'zlib'
+
+require 'rack/request'
+require 'rack/response'
+
+module Rack
+  # Paste has a Pony, Rack has a Lobster!
+  class Lobster
+    LobsterString = Zlib::Inflate.inflate("eJx9kEEOwyAMBO99xd7MAcytUhPlJyj2
+    P6jy9i4k9EQyGAnBarEXeCBqSkntNXsi/ZCvC48zGQoZKikGrFMZvgS5ZHd+aGWVuWwhVF0
+    t1drVmiR42HcWNz5w3QanT+2gIvTVCiE1lm1Y0eU4JGmIIbaKwextKn8rvW+p5PIwFl8ZWJ
+    I8jyiTlhTcYXkekJAzTyYN6E08A+dk8voBkAVTJQ==".delete("\n ").unpack("m*")[0])
+
+    LambdaLobster = lambda { |env|
+      if env["QUERY_STRING"].include?("flip")
+        lobster = LobsterString.split("\n").
+          map { |line| line.ljust(42).reverse }.
+          join("\n")
+        href = "?"
+      else
+        lobster = LobsterString
+        href = "?flip"
+      end
+
+      content = ["<title>Lobstericious!</title>",
+                 "<pre>", lobster, "</pre>",
+                 "<a href='#{href}'>flip!</a>"]
+      length = content.inject(0) { |a,e| a+e.size }.to_s
+      [200, {"Content-Type" => "text/html", "Content-Length" => length}, content]
+    }
+
+    def call(env)
+      req = Request.new(env)
+      if req.GET["flip"] == "left"
+        lobster = LobsterString.split("\n").
+          map { |line| line.ljust(42).reverse }.
+          join("\n")
+        href = "?flip=right"
+      elsif req.GET["flip"] == "crash"
+        raise "Lobster crashed"
+      else
+        lobster = LobsterString
+        href = "?flip=left"
+      end
+
+      res = Response.new
+      res.write "<title>Lobstericious!</title>"
+      res.write "<pre>"
+      res.write lobster
+      res.write "</pre>"
+      res.write "<p><a href='#{href}'>flip!</a></p>"
+      res.write "<p><a href='?flip=crash'>crash!</a></p>"
+      res.finish
+    end
+
+  end
+end
+
+if $0 == __FILE__
+  require 'rack'
+  require 'rack/showexceptions'
+  Rack::Server.start(
+    :app => Rack::ShowExceptions.new(Rack::Lint.new(Rack::Lobster.new)), :Port => 9292
+  )
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/lock.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/lock.rb
new file mode 100644
index 0000000..b3139c0
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/lock.rb
@@ -0,0 +1,26 @@
+require 'thread'
+require 'rack/body_proxy'
+
+module Rack
+  # Rack::Lock locks every request inside a mutex, so that every request
+  # will effectively be executed synchronously.
+  class Lock
+    FLAG = 'rack.multithread'.freeze
+
+    def initialize(app, mutex = Mutex.new)
+      @app, @mutex = app, mutex
+    end
+
+    def call(env)
+      old, env[FLAG] = env[FLAG], false
+      @mutex.lock
+      response = @app.call(env)
+      body = BodyProxy.new(response[2]) { @mutex.unlock }
+      response[2] = body
+      response
+    ensure
+      @mutex.unlock unless body
+      env[FLAG] = old
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/logger.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/logger.rb
new file mode 100644
index 0000000..88f9837
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/logger.rb
@@ -0,0 +1,18 @@
+require 'logger'
+
+module Rack
+  # Sets up rack.logger to write to rack.errors stream
+  class Logger
+    def initialize(app, level = ::Logger::INFO)
+      @app, @level = app, level
+    end
+
+    def call(env)
+      logger = ::Logger.new(env['rack.errors'])
+      logger.level = @level
+
+      env['rack.logger'] = logger
+      @app.call(env)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/methodoverride.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/methodoverride.rb
new file mode 100644
index 0000000..1bdaca8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/methodoverride.rb
@@ -0,0 +1,31 @@
+module Rack
+  class MethodOverride
+    HTTP_METHODS = %w(GET HEAD PUT POST DELETE OPTIONS PATCH)
+
+    METHOD_OVERRIDE_PARAM_KEY = "_method".freeze
+    HTTP_METHOD_OVERRIDE_HEADER = "HTTP_X_HTTP_METHOD_OVERRIDE".freeze
+
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      if env["REQUEST_METHOD"] == "POST"
+        method = method_override(env)
+        if HTTP_METHODS.include?(method)
+          env["rack.methodoverride.original_method"] = env["REQUEST_METHOD"]
+          env["REQUEST_METHOD"] = method
+        end
+      end
+
+      @app.call(env)
+    end
+
+    def method_override(env)
+      req = Request.new(env)
+      method = req.POST[METHOD_OVERRIDE_PARAM_KEY] ||
+        env[HTTP_METHOD_OVERRIDE_HEADER]
+      method.to_s.upcase
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/mime.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/mime.rb
new file mode 100644
index 0000000..5d05022
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/mime.rb
@@ -0,0 +1,677 @@
+module Rack
+  module Mime
+    # Returns String with mime type if found, otherwise use +fallback+.
+    # +ext+ should be filename extension in the '.ext' format that
+    #       File.extname(file) returns.
+    # +fallback+ may be any object
+    #
+    # Also see the documentation for MIME_TYPES
+    #
+    # Usage:
+    #     Rack::Mime.mime_type('.foo')
+    #
+    # This is a shortcut for:
+    #     Rack::Mime::MIME_TYPES.fetch('.foo', 'application/octet-stream')
+
+    def mime_type(ext, fallback='application/octet-stream')
+      MIME_TYPES.fetch(ext.to_s.downcase, fallback)
+    end
+    module_function :mime_type
+
+    # Returns true if the given value is a mime match for the given mime match
+    # specification, false otherwise.
+    #
+    #    Rack::Mime.match?('text/html', 'text/*') => true
+    #    Rack::Mime.match?('text/plain', '*') => true
+    #    Rack::Mime.match?('text/html', 'application/json') => false
+
+    def match?(value, matcher)
+      v1, v2 = value.split('/', 2)
+      m1, m2 = matcher.split('/', 2)
+
+      if m1 == '*'
+        if m2.nil? || m2 == '*'
+          return true
+        elsif m2 == v2
+          return true
+        else
+          return false
+        end
+      end
+
+      return false if v1 != m1
+
+      return true if m2.nil? || m2 == '*'
+
+      m2 == v2
+    end
+    module_function :match?
+
+    # List of most common mime-types, selected various sources
+    # according to their usefulness in a webserving scope for Ruby
+    # users.
+    #
+    # To amend this list with your local mime.types list you can use:
+    #
+    #     require 'webrick/httputils'
+    #     list = WEBrick::HTTPUtils.load_mime_types('/etc/mime.types')
+    #     Rack::Mime::MIME_TYPES.merge!(list)
+    #
+    # N.B. On Ubuntu the mime.types file does not include the leading period, so
+    # users may need to modify the data before merging into the hash.
+    #
+    # To add the list mongrel provides, use:
+    #
+    #     require 'mongrel/handlers'
+    #     Rack::Mime::MIME_TYPES.merge!(Mongrel::DirHandler::MIME_TYPES)
+
+    MIME_TYPES = {
+      ".123"       => "application/vnd.lotus-1-2-3",
+      ".3dml"      => "text/vnd.in3d.3dml",
+      ".3g2"       => "video/3gpp2",
+      ".3gp"       => "video/3gpp",
+      ".a"         => "application/octet-stream",
+      ".acc"       => "application/vnd.americandynamics.acc",
+      ".ace"       => "application/x-ace-compressed",
+      ".acu"       => "application/vnd.acucobol",
+      ".aep"       => "application/vnd.audiograph",
+      ".afp"       => "application/vnd.ibm.modcap",
+      ".ai"        => "application/postscript",
+      ".aif"       => "audio/x-aiff",
+      ".aiff"      => "audio/x-aiff",
+      ".ami"       => "application/vnd.amiga.ami",
+      ".appcache"  => "text/cache-manifest",
+      ".apr"       => "application/vnd.lotus-approach",
+      ".asc"       => "application/pgp-signature",
+      ".asf"       => "video/x-ms-asf",
+      ".asm"       => "text/x-asm",
+      ".aso"       => "application/vnd.accpac.simply.aso",
+      ".asx"       => "video/x-ms-asf",
+      ".atc"       => "application/vnd.acucorp",
+      ".atom"      => "application/atom+xml",
+      ".atomcat"   => "application/atomcat+xml",
+      ".atomsvc"   => "application/atomsvc+xml",
+      ".atx"       => "application/vnd.antix.game-component",
+      ".au"        => "audio/basic",
+      ".avi"       => "video/x-msvideo",
+      ".bat"       => "application/x-msdownload",
+      ".bcpio"     => "application/x-bcpio",
+      ".bdm"       => "application/vnd.syncml.dm+wbxml",
+      ".bh2"       => "application/vnd.fujitsu.oasysprs",
+      ".bin"       => "application/octet-stream",
+      ".bmi"       => "application/vnd.bmi",
+      ".bmp"       => "image/bmp",
+      ".box"       => "application/vnd.previewsystems.box",
+      ".btif"      => "image/prs.btif",
+      ".bz"        => "application/x-bzip",
+      ".bz2"       => "application/x-bzip2",
+      ".c"         => "text/x-c",
+      ".c4g"       => "application/vnd.clonk.c4group",
+      ".cab"       => "application/vnd.ms-cab-compressed",
+      ".cc"        => "text/x-c",
+      ".ccxml"     => "application/ccxml+xml",
+      ".cdbcmsg"   => "application/vnd.contact.cmsg",
+      ".cdkey"     => "application/vnd.mediastation.cdkey",
+      ".cdx"       => "chemical/x-cdx",
+      ".cdxml"     => "application/vnd.chemdraw+xml",
+      ".cdy"       => "application/vnd.cinderella",
+      ".cer"       => "application/pkix-cert",
+      ".cgm"       => "image/cgm",
+      ".chat"      => "application/x-chat",
+      ".chm"       => "application/vnd.ms-htmlhelp",
+      ".chrt"      => "application/vnd.kde.kchart",
+      ".cif"       => "chemical/x-cif",
+      ".cii"       => "application/vnd.anser-web-certificate-issue-initiation",
+      ".cil"       => "application/vnd.ms-artgalry",
+      ".cla"       => "application/vnd.claymore",
+      ".class"     => "application/octet-stream",
+      ".clkk"      => "application/vnd.crick.clicker.keyboard",
+      ".clkp"      => "application/vnd.crick.clicker.palette",
+      ".clkt"      => "application/vnd.crick.clicker.template",
+      ".clkw"      => "application/vnd.crick.clicker.wordbank",
+      ".clkx"      => "application/vnd.crick.clicker",
+      ".clp"       => "application/x-msclip",
+      ".cmc"       => "application/vnd.cosmocaller",
+      ".cmdf"      => "chemical/x-cmdf",
+      ".cml"       => "chemical/x-cml",
+      ".cmp"       => "application/vnd.yellowriver-custom-menu",
+      ".cmx"       => "image/x-cmx",
+      ".com"       => "application/x-msdownload",
+      ".conf"      => "text/plain",
+      ".cpio"      => "application/x-cpio",
+      ".cpp"       => "text/x-c",
+      ".cpt"       => "application/mac-compactpro",
+      ".crd"       => "application/x-mscardfile",
+      ".crl"       => "application/pkix-crl",
+      ".crt"       => "application/x-x509-ca-cert",
+      ".csh"       => "application/x-csh",
+      ".csml"      => "chemical/x-csml",
+      ".csp"       => "application/vnd.commonspace",
+      ".css"       => "text/css",
+      ".csv"       => "text/csv",
+      ".curl"      => "application/vnd.curl",
+      ".cww"       => "application/prs.cww",
+      ".cxx"       => "text/x-c",
+      ".daf"       => "application/vnd.mobius.daf",
+      ".davmount"  => "application/davmount+xml",
+      ".dcr"       => "application/x-director",
+      ".dd2"       => "application/vnd.oma.dd2+xml",
+      ".ddd"       => "application/vnd.fujixerox.ddd",
+      ".deb"       => "application/x-debian-package",
+      ".der"       => "application/x-x509-ca-cert",
+      ".dfac"      => "application/vnd.dreamfactory",
+      ".diff"      => "text/x-diff",
+      ".dis"       => "application/vnd.mobius.dis",
+      ".djv"       => "image/vnd.djvu",
+      ".djvu"      => "image/vnd.djvu",
+      ".dll"       => "application/x-msdownload",
+      ".dmg"       => "application/octet-stream",
+      ".dna"       => "application/vnd.dna",
+      ".doc"       => "application/msword",
+      ".docx"      => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+      ".dot"       => "application/msword",
+      ".dp"        => "application/vnd.osgi.dp",
+      ".dpg"       => "application/vnd.dpgraph",
+      ".dsc"       => "text/prs.lines.tag",
+      ".dtd"       => "application/xml-dtd",
+      ".dts"       => "audio/vnd.dts",
+      ".dtshd"     => "audio/vnd.dts.hd",
+      ".dv"        => "video/x-dv",
+      ".dvi"       => "application/x-dvi",
+      ".dwf"       => "model/vnd.dwf",
+      ".dwg"       => "image/vnd.dwg",
+      ".dxf"       => "image/vnd.dxf",
+      ".dxp"       => "application/vnd.spotfire.dxp",
+      ".ear"       => "application/java-archive",
+      ".ecelp4800" => "audio/vnd.nuera.ecelp4800",
+      ".ecelp7470" => "audio/vnd.nuera.ecelp7470",
+      ".ecelp9600" => "audio/vnd.nuera.ecelp9600",
+      ".ecma"      => "application/ecmascript",
+      ".edm"       => "application/vnd.novadigm.edm",
+      ".edx"       => "application/vnd.novadigm.edx",
+      ".efif"      => "application/vnd.picsel",
+      ".ei6"       => "application/vnd.pg.osasli",
+      ".eml"       => "message/rfc822",
+      ".eol"       => "audio/vnd.digital-winds",
+      ".eot"       => "application/vnd.ms-fontobject",
+      ".eps"       => "application/postscript",
+      ".es3"       => "application/vnd.eszigno3+xml",
+      ".esf"       => "application/vnd.epson.esf",
+      ".etx"       => "text/x-setext",
+      ".exe"       => "application/x-msdownload",
+      ".ext"       => "application/vnd.novadigm.ext",
+      ".ez"        => "application/andrew-inset",
+      ".ez2"       => "application/vnd.ezpix-album",
+      ".ez3"       => "application/vnd.ezpix-package",
+      ".f"         => "text/x-fortran",
+      ".f77"       => "text/x-fortran",
+      ".f90"       => "text/x-fortran",
+      ".fbs"       => "image/vnd.fastbidsheet",
+      ".fdf"       => "application/vnd.fdf",
+      ".fe_launch" => "application/vnd.denovo.fcselayout-link",
+      ".fg5"       => "application/vnd.fujitsu.oasysgp",
+      ".fli"       => "video/x-fli",
+      ".flo"       => "application/vnd.micrografx.flo",
+      ".flv"       => "video/x-flv",
+      ".flw"       => "application/vnd.kde.kivio",
+      ".flx"       => "text/vnd.fmi.flexstor",
+      ".fly"       => "text/vnd.fly",
+      ".fm"        => "application/vnd.framemaker",
+      ".fnc"       => "application/vnd.frogans.fnc",
+      ".for"       => "text/x-fortran",
+      ".fpx"       => "image/vnd.fpx",
+      ".fsc"       => "application/vnd.fsc.weblaunch",
+      ".fst"       => "image/vnd.fst",
+      ".ftc"       => "application/vnd.fluxtime.clip",
+      ".fti"       => "application/vnd.anser-web-funds-transfer-initiation",
+      ".fvt"       => "video/vnd.fvt",
+      ".fzs"       => "application/vnd.fuzzysheet",
+      ".g3"        => "image/g3fax",
+      ".gac"       => "application/vnd.groove-account",
+      ".gdl"       => "model/vnd.gdl",
+      ".gem"       => "application/octet-stream",
+      ".gemspec"   => "text/x-script.ruby",
+      ".ghf"       => "application/vnd.groove-help",
+      ".gif"       => "image/gif",
+      ".gim"       => "application/vnd.groove-identity-message",
+      ".gmx"       => "application/vnd.gmx",
+      ".gph"       => "application/vnd.flographit",
+      ".gqf"       => "application/vnd.grafeq",
+      ".gram"      => "application/srgs",
+      ".grv"       => "application/vnd.groove-injector",
+      ".grxml"     => "application/srgs+xml",
+      ".gtar"      => "application/x-gtar",
+      ".gtm"       => "application/vnd.groove-tool-message",
+      ".gtw"       => "model/vnd.gtw",
+      ".gv"        => "text/vnd.graphviz",
+      ".gz"        => "application/x-gzip",
+      ".h"         => "text/x-c",
+      ".h261"      => "video/h261",
+      ".h263"      => "video/h263",
+      ".h264"      => "video/h264",
+      ".hbci"      => "application/vnd.hbci",
+      ".hdf"       => "application/x-hdf",
+      ".hh"        => "text/x-c",
+      ".hlp"       => "application/winhlp",
+      ".hpgl"      => "application/vnd.hp-hpgl",
+      ".hpid"      => "application/vnd.hp-hpid",
+      ".hps"       => "application/vnd.hp-hps",
+      ".hqx"       => "application/mac-binhex40",
+      ".htc"       => "text/x-component",
+      ".htke"      => "application/vnd.kenameaapp",
+      ".htm"       => "text/html",
+      ".html"      => "text/html",
+      ".hvd"       => "application/vnd.yamaha.hv-dic",
+      ".hvp"       => "application/vnd.yamaha.hv-voice",
+      ".hvs"       => "application/vnd.yamaha.hv-script",
+      ".icc"       => "application/vnd.iccprofile",
+      ".ice"       => "x-conference/x-cooltalk",
+      ".ico"       => "image/vnd.microsoft.icon",
+      ".ics"       => "text/calendar",
+      ".ief"       => "image/ief",
+      ".ifb"       => "text/calendar",
+      ".ifm"       => "application/vnd.shana.informed.formdata",
+      ".igl"       => "application/vnd.igloader",
+      ".igs"       => "model/iges",
+      ".igx"       => "application/vnd.micrografx.igx",
+      ".iif"       => "application/vnd.shana.informed.interchange",
+      ".imp"       => "application/vnd.accpac.simply.imp",
+      ".ims"       => "application/vnd.ms-ims",
+      ".ipk"       => "application/vnd.shana.informed.package",
+      ".irm"       => "application/vnd.ibm.rights-management",
+      ".irp"       => "application/vnd.irepository.package+xml",
+      ".iso"       => "application/octet-stream",
+      ".itp"       => "application/vnd.shana.informed.formtemplate",
+      ".ivp"       => "application/vnd.immervision-ivp",
+      ".ivu"       => "application/vnd.immervision-ivu",
+      ".jad"       => "text/vnd.sun.j2me.app-descriptor",
+      ".jam"       => "application/vnd.jam",
+      ".jar"       => "application/java-archive",
+      ".java"      => "text/x-java-source",
+      ".jisp"      => "application/vnd.jisp",
+      ".jlt"       => "application/vnd.hp-jlyt",
+      ".jnlp"      => "application/x-java-jnlp-file",
+      ".joda"      => "application/vnd.joost.joda-archive",
+      ".jp2"       => "image/jp2",
+      ".jpeg"      => "image/jpeg",
+      ".jpg"       => "image/jpeg",
+      ".jpgv"      => "video/jpeg",
+      ".jpm"       => "video/jpm",
+      ".js"        => "application/javascript",
+      ".json"      => "application/json",
+      ".karbon"    => "application/vnd.kde.karbon",
+      ".kfo"       => "application/vnd.kde.kformula",
+      ".kia"       => "application/vnd.kidspiration",
+      ".kml"       => "application/vnd.google-earth.kml+xml",
+      ".kmz"       => "application/vnd.google-earth.kmz",
+      ".kne"       => "application/vnd.kinar",
+      ".kon"       => "application/vnd.kde.kontour",
+      ".kpr"       => "application/vnd.kde.kpresenter",
+      ".ksp"       => "application/vnd.kde.kspread",
+      ".ktz"       => "application/vnd.kahootz",
+      ".kwd"       => "application/vnd.kde.kword",
+      ".latex"     => "application/x-latex",
+      ".lbd"       => "application/vnd.llamagraphics.life-balance.desktop",
+      ".lbe"       => "application/vnd.llamagraphics.life-balance.exchange+xml",
+      ".les"       => "application/vnd.hhe.lesson-player",
+      ".link66"    => "application/vnd.route66.link66+xml",
+      ".log"       => "text/plain",
+      ".lostxml"   => "application/lost+xml",
+      ".lrm"       => "application/vnd.ms-lrm",
+      ".ltf"       => "application/vnd.frogans.ltf",
+      ".lvp"       => "audio/vnd.lucent.voice",
+      ".lwp"       => "application/vnd.lotus-wordpro",
+      ".m3u"       => "audio/x-mpegurl",
+      ".m4a"       => "audio/mp4a-latm",
+      ".m4v"       => "video/mp4",
+      ".ma"        => "application/mathematica",
+      ".mag"       => "application/vnd.ecowin.chart",
+      ".man"       => "text/troff",
+      ".manifest"  => "text/cache-manifest",
+      ".mathml"    => "application/mathml+xml",
+      ".mbk"       => "application/vnd.mobius.mbk",
+      ".mbox"      => "application/mbox",
+      ".mc1"       => "application/vnd.medcalcdata",
+      ".mcd"       => "application/vnd.mcd",
+      ".mdb"       => "application/x-msaccess",
+      ".mdi"       => "image/vnd.ms-modi",
+      ".mdoc"      => "text/troff",
+      ".me"        => "text/troff",
+      ".mfm"       => "application/vnd.mfmp",
+      ".mgz"       => "application/vnd.proteus.magazine",
+      ".mid"       => "audio/midi",
+      ".midi"      => "audio/midi",
+      ".mif"       => "application/vnd.mif",
+      ".mime"      => "message/rfc822",
+      ".mj2"       => "video/mj2",
+      ".mlp"       => "application/vnd.dolby.mlp",
+      ".mmd"       => "application/vnd.chipnuts.karaoke-mmd",
+      ".mmf"       => "application/vnd.smaf",
+      ".mml"       => "application/mathml+xml",
+      ".mmr"       => "image/vnd.fujixerox.edmics-mmr",
+      ".mng"       => "video/x-mng",
+      ".mny"       => "application/x-msmoney",
+      ".mov"       => "video/quicktime",
+      ".movie"     => "video/x-sgi-movie",
+      ".mp3"       => "audio/mpeg",
+      ".mp4"       => "video/mp4",
+      ".mp4a"      => "audio/mp4",
+      ".mp4s"      => "application/mp4",
+      ".mp4v"      => "video/mp4",
+      ".mpc"       => "application/vnd.mophun.certificate",
+      ".mpeg"      => "video/mpeg",
+      ".mpg"       => "video/mpeg",
+      ".mpga"      => "audio/mpeg",
+      ".mpkg"      => "application/vnd.apple.installer+xml",
+      ".mpm"       => "application/vnd.blueice.multipass",
+      ".mpn"       => "application/vnd.mophun.application",
+      ".mpp"       => "application/vnd.ms-project",
+      ".mpy"       => "application/vnd.ibm.minipay",
+      ".mqy"       => "application/vnd.mobius.mqy",
+      ".mrc"       => "application/marc",
+      ".ms"        => "text/troff",
+      ".mscml"     => "application/mediaservercontrol+xml",
+      ".mseq"      => "application/vnd.mseq",
+      ".msf"       => "application/vnd.epson.msf",
+      ".msh"       => "model/mesh",
+      ".msi"       => "application/x-msdownload",
+      ".msl"       => "application/vnd.mobius.msl",
+      ".msty"      => "application/vnd.muvee.style",
+      ".mts"       => "model/vnd.mts",
+      ".mus"       => "application/vnd.musician",
+      ".mvb"       => "application/x-msmediaview",
+      ".mwf"       => "application/vnd.mfer",
+      ".mxf"       => "application/mxf",
+      ".mxl"       => "application/vnd.recordare.musicxml",
+      ".mxml"      => "application/xv+xml",
+      ".mxs"       => "application/vnd.triscape.mxs",
+      ".mxu"       => "video/vnd.mpegurl",
+      ".n"         => "application/vnd.nokia.n-gage.symbian.install",
+      ".nc"        => "application/x-netcdf",
+      ".ngdat"     => "application/vnd.nokia.n-gage.data",
+      ".nlu"       => "application/vnd.neurolanguage.nlu",
+      ".nml"       => "application/vnd.enliven",
+      ".nnd"       => "application/vnd.noblenet-directory",
+      ".nns"       => "application/vnd.noblenet-sealer",
+      ".nnw"       => "application/vnd.noblenet-web",
+      ".npx"       => "image/vnd.net-fpx",
+      ".nsf"       => "application/vnd.lotus-notes",
+      ".oa2"       => "application/vnd.fujitsu.oasys2",
+      ".oa3"       => "application/vnd.fujitsu.oasys3",
+      ".oas"       => "application/vnd.fujitsu.oasys",
+      ".obd"       => "application/x-msbinder",
+      ".oda"       => "application/oda",
+      ".odc"       => "application/vnd.oasis.opendocument.chart",
+      ".odf"       => "application/vnd.oasis.opendocument.formula",
+      ".odg"       => "application/vnd.oasis.opendocument.graphics",
+      ".odi"       => "application/vnd.oasis.opendocument.image",
+      ".odp"       => "application/vnd.oasis.opendocument.presentation",
+      ".ods"       => "application/vnd.oasis.opendocument.spreadsheet",
+      ".odt"       => "application/vnd.oasis.opendocument.text",
+      ".oga"       => "audio/ogg",
+      ".ogg"       => "application/ogg",
+      ".ogv"       => "video/ogg",
+      ".ogx"       => "application/ogg",
+      ".org"       => "application/vnd.lotus-organizer",
+      ".otc"       => "application/vnd.oasis.opendocument.chart-template",
+      ".otf"       => "application/vnd.oasis.opendocument.formula-template",
+      ".otg"       => "application/vnd.oasis.opendocument.graphics-template",
+      ".oth"       => "application/vnd.oasis.opendocument.text-web",
+      ".oti"       => "application/vnd.oasis.opendocument.image-template",
+      ".otm"       => "application/vnd.oasis.opendocument.text-master",
+      ".ots"       => "application/vnd.oasis.opendocument.spreadsheet-template",
+      ".ott"       => "application/vnd.oasis.opendocument.text-template",
+      ".oxt"       => "application/vnd.openofficeorg.extension",
+      ".p"         => "text/x-pascal",
+      ".p10"       => "application/pkcs10",
+      ".p12"       => "application/x-pkcs12",
+      ".p7b"       => "application/x-pkcs7-certificates",
+      ".p7m"       => "application/pkcs7-mime",
+      ".p7r"       => "application/x-pkcs7-certreqresp",
+      ".p7s"       => "application/pkcs7-signature",
+      ".pas"       => "text/x-pascal",
+      ".pbd"       => "application/vnd.powerbuilder6",
+      ".pbm"       => "image/x-portable-bitmap",
+      ".pcl"       => "application/vnd.hp-pcl",
+      ".pclxl"     => "application/vnd.hp-pclxl",
+      ".pcx"       => "image/x-pcx",
+      ".pdb"       => "chemical/x-pdb",
+      ".pdf"       => "application/pdf",
+      ".pem"       => "application/x-x509-ca-cert",
+      ".pfr"       => "application/font-tdpfr",
+      ".pgm"       => "image/x-portable-graymap",
+      ".pgn"       => "application/x-chess-pgn",
+      ".pgp"       => "application/pgp-encrypted",
+      ".pic"       => "image/x-pict",
+      ".pict"      => "image/pict",
+      ".pkg"       => "application/octet-stream",
+      ".pki"       => "application/pkixcmp",
+      ".pkipath"   => "application/pkix-pkipath",
+      ".pl"        => "text/x-script.perl",
+      ".plb"       => "application/vnd.3gpp.pic-bw-large",
+      ".plc"       => "application/vnd.mobius.plc",
+      ".plf"       => "application/vnd.pocketlearn",
+      ".pls"       => "application/pls+xml",
+      ".pm"        => "text/x-script.perl-module",
+      ".pml"       => "application/vnd.ctc-posml",
+      ".png"       => "image/png",
+      ".pnm"       => "image/x-portable-anymap",
+      ".pntg"      => "image/x-macpaint",
+      ".portpkg"   => "application/vnd.macports.portpkg",
+      ".ppd"       => "application/vnd.cups-ppd",
+      ".ppm"       => "image/x-portable-pixmap",
+      ".pps"       => "application/vnd.ms-powerpoint",
+      ".ppt"       => "application/vnd.ms-powerpoint",
+      ".prc"       => "application/vnd.palm",
+      ".pre"       => "application/vnd.lotus-freelance",
+      ".prf"       => "application/pics-rules",
+      ".ps"        => "application/postscript",
+      ".psb"       => "application/vnd.3gpp.pic-bw-small",
+      ".psd"       => "image/vnd.adobe.photoshop",
+      ".ptid"      => "application/vnd.pvi.ptid1",
+      ".pub"       => "application/x-mspublisher",
+      ".pvb"       => "application/vnd.3gpp.pic-bw-var",
+      ".pwn"       => "application/vnd.3m.post-it-notes",
+      ".py"        => "text/x-script.python",
+      ".pya"       => "audio/vnd.ms-playready.media.pya",
+      ".pyv"       => "video/vnd.ms-playready.media.pyv",
+      ".qam"       => "application/vnd.epson.quickanime",
+      ".qbo"       => "application/vnd.intu.qbo",
+      ".qfx"       => "application/vnd.intu.qfx",
+      ".qps"       => "application/vnd.publishare-delta-tree",
+      ".qt"        => "video/quicktime",
+      ".qtif"      => "image/x-quicktime",
+      ".qxd"       => "application/vnd.quark.quarkxpress",
+      ".ra"        => "audio/x-pn-realaudio",
+      ".rake"      => "text/x-script.ruby",
+      ".ram"       => "audio/x-pn-realaudio",
+      ".rar"       => "application/x-rar-compressed",
+      ".ras"       => "image/x-cmu-raster",
+      ".rb"        => "text/x-script.ruby",
+      ".rcprofile" => "application/vnd.ipunplugged.rcprofile",
+      ".rdf"       => "application/rdf+xml",
+      ".rdz"       => "application/vnd.data-vision.rdz",
+      ".rep"       => "application/vnd.businessobjects",
+      ".rgb"       => "image/x-rgb",
+      ".rif"       => "application/reginfo+xml",
+      ".rl"        => "application/resource-lists+xml",
+      ".rlc"       => "image/vnd.fujixerox.edmics-rlc",
+      ".rld"       => "application/resource-lists-diff+xml",
+      ".rm"        => "application/vnd.rn-realmedia",
+      ".rmp"       => "audio/x-pn-realaudio-plugin",
+      ".rms"       => "application/vnd.jcp.javame.midlet-rms",
+      ".rnc"       => "application/relax-ng-compact-syntax",
+      ".roff"      => "text/troff",
+      ".rpm"       => "application/x-redhat-package-manager",
+      ".rpss"      => "application/vnd.nokia.radio-presets",
+      ".rpst"      => "application/vnd.nokia.radio-preset",
+      ".rq"        => "application/sparql-query",
+      ".rs"        => "application/rls-services+xml",
+      ".rsd"       => "application/rsd+xml",
+      ".rss"       => "application/rss+xml",
+      ".rtf"       => "application/rtf",
+      ".rtx"       => "text/richtext",
+      ".ru"        => "text/x-script.ruby",
+      ".s"         => "text/x-asm",
+      ".saf"       => "application/vnd.yamaha.smaf-audio",
+      ".sbml"      => "application/sbml+xml",
+      ".sc"        => "application/vnd.ibm.secure-container",
+      ".scd"       => "application/x-msschedule",
+      ".scm"       => "application/vnd.lotus-screencam",
+      ".scq"       => "application/scvp-cv-request",
+      ".scs"       => "application/scvp-cv-response",
+      ".sdkm"      => "application/vnd.solent.sdkm+xml",
+      ".sdp"       => "application/sdp",
+      ".see"       => "application/vnd.seemail",
+      ".sema"      => "application/vnd.sema",
+      ".semd"      => "application/vnd.semd",
+      ".semf"      => "application/vnd.semf",
+      ".setpay"    => "application/set-payment-initiation",
+      ".setreg"    => "application/set-registration-initiation",
+      ".sfd"       => "application/vnd.hydrostatix.sof-data",
+      ".sfs"       => "application/vnd.spotfire.sfs",
+      ".sgm"       => "text/sgml",
+      ".sgml"      => "text/sgml",
+      ".sh"        => "application/x-sh",
+      ".shar"      => "application/x-shar",
+      ".shf"       => "application/shf+xml",
+      ".sig"       => "application/pgp-signature",
+      ".sit"       => "application/x-stuffit",
+      ".sitx"      => "application/x-stuffitx",
+      ".skp"       => "application/vnd.koan",
+      ".slt"       => "application/vnd.epson.salt",
+      ".smi"       => "application/smil+xml",
+      ".snd"       => "audio/basic",
+      ".so"        => "application/octet-stream",
+      ".spf"       => "application/vnd.yamaha.smaf-phrase",
+      ".spl"       => "application/x-futuresplash",
+      ".spot"      => "text/vnd.in3d.spot",
+      ".spp"       => "application/scvp-vp-response",
+      ".spq"       => "application/scvp-vp-request",
+      ".src"       => "application/x-wais-source",
+      ".srx"       => "application/sparql-results+xml",
+      ".sse"       => "application/vnd.kodak-descriptor",
+      ".ssf"       => "application/vnd.epson.ssf",
+      ".ssml"      => "application/ssml+xml",
+      ".stf"       => "application/vnd.wt.stf",
+      ".stk"       => "application/hyperstudio",
+      ".str"       => "application/vnd.pg.format",
+      ".sus"       => "application/vnd.sus-calendar",
+      ".sv4cpio"   => "application/x-sv4cpio",
+      ".sv4crc"    => "application/x-sv4crc",
+      ".svd"       => "application/vnd.svd",
+      ".svg"       => "image/svg+xml",
+      ".svgz"      => "image/svg+xml",
+      ".swf"       => "application/x-shockwave-flash",
+      ".swi"       => "application/vnd.arastra.swi",
+      ".t"         => "text/troff",
+      ".tao"       => "application/vnd.tao.intent-module-archive",
+      ".tar"       => "application/x-tar",
+      ".tbz"       => "application/x-bzip-compressed-tar",
+      ".tcap"      => "application/vnd.3gpp2.tcap",
+      ".tcl"       => "application/x-tcl",
+      ".tex"       => "application/x-tex",
+      ".texi"      => "application/x-texinfo",
+      ".texinfo"   => "application/x-texinfo",
+      ".text"      => "text/plain",
+      ".tif"       => "image/tiff",
+      ".tiff"      => "image/tiff",
+      ".tmo"       => "application/vnd.tmobile-livetv",
+      ".torrent"   => "application/x-bittorrent",
+      ".tpl"       => "application/vnd.groove-tool-template",
+      ".tpt"       => "application/vnd.trid.tpt",
+      ".tr"        => "text/troff",
+      ".tra"       => "application/vnd.trueapp",
+      ".trm"       => "application/x-msterminal",
+      ".tsv"       => "text/tab-separated-values",
+      ".ttf"       => "application/octet-stream",
+      ".twd"       => "application/vnd.simtech-mindmapper",
+      ".txd"       => "application/vnd.genomatix.tuxedo",
+      ".txf"       => "application/vnd.mobius.txf",
+      ".txt"       => "text/plain",
+      ".ufd"       => "application/vnd.ufdl",
+      ".umj"       => "application/vnd.umajin",
+      ".unityweb"  => "application/vnd.unity",
+      ".uoml"      => "application/vnd.uoml+xml",
+      ".uri"       => "text/uri-list",
+      ".ustar"     => "application/x-ustar",
+      ".utz"       => "application/vnd.uiq.theme",
+      ".uu"        => "text/x-uuencode",
+      ".vcd"       => "application/x-cdlink",
+      ".vcf"       => "text/x-vcard",
+      ".vcg"       => "application/vnd.groove-vcard",
+      ".vcs"       => "text/x-vcalendar",
+      ".vcx"       => "application/vnd.vcx",
+      ".vis"       => "application/vnd.visionary",
+      ".viv"       => "video/vnd.vivo",
+      ".vrml"      => "model/vrml",
+      ".vsd"       => "application/vnd.visio",
+      ".vsf"       => "application/vnd.vsf",
+      ".vtu"       => "model/vnd.vtu",
+      ".vxml"      => "application/voicexml+xml",
+      ".war"       => "application/java-archive",
+      ".wav"       => "audio/x-wav",
+      ".wax"       => "audio/x-ms-wax",
+      ".wbmp"      => "image/vnd.wap.wbmp",
+      ".wbs"       => "application/vnd.criticaltools.wbs+xml",
+      ".wbxml"     => "application/vnd.wap.wbxml",
+      ".webm"      => "video/webm",
+      ".wm"        => "video/x-ms-wm",
+      ".wma"       => "audio/x-ms-wma",
+      ".wmd"       => "application/x-ms-wmd",
+      ".wmf"       => "application/x-msmetafile",
+      ".wml"       => "text/vnd.wap.wml",
+      ".wmlc"      => "application/vnd.wap.wmlc",
+      ".wmls"      => "text/vnd.wap.wmlscript",
+      ".wmlsc"     => "application/vnd.wap.wmlscriptc",
+      ".wmv"       => "video/x-ms-wmv",
+      ".wmx"       => "video/x-ms-wmx",
+      ".wmz"       => "application/x-ms-wmz",
+      ".woff"      => "application/font-woff",
+      ".wpd"       => "application/vnd.wordperfect",
+      ".wpl"       => "application/vnd.ms-wpl",
+      ".wps"       => "application/vnd.ms-works",
+      ".wqd"       => "application/vnd.wqd",
+      ".wri"       => "application/x-mswrite",
+      ".wrl"       => "model/vrml",
+      ".wsdl"      => "application/wsdl+xml",
+      ".wspolicy"  => "application/wspolicy+xml",
+      ".wtb"       => "application/vnd.webturbo",
+      ".wvx"       => "video/x-ms-wvx",
+      ".x3d"       => "application/vnd.hzn-3d-crossword",
+      ".xar"       => "application/vnd.xara",
+      ".xbd"       => "application/vnd.fujixerox.docuworks.binder",
+      ".xbm"       => "image/x-xbitmap",
+      ".xdm"       => "application/vnd.syncml.dm+xml",
+      ".xdp"       => "application/vnd.adobe.xdp+xml",
+      ".xdw"       => "application/vnd.fujixerox.docuworks",
+      ".xenc"      => "application/xenc+xml",
+      ".xer"       => "application/patch-ops-error+xml",
+      ".xfdf"      => "application/vnd.adobe.xfdf",
+      ".xfdl"      => "application/vnd.xfdl",
+      ".xhtml"     => "application/xhtml+xml",
+      ".xif"       => "image/vnd.xiff",
+      ".xls"       => "application/vnd.ms-excel",
+      ".xlsx"      => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+      ".xml"       => "application/xml",
+      ".xo"        => "application/vnd.olpc-sugar",
+      ".xop"       => "application/xop+xml",
+      ".xpm"       => "image/x-xpixmap",
+      ".xpr"       => "application/vnd.is-xpr",
+      ".xps"       => "application/vnd.ms-xpsdocument",
+      ".xpw"       => "application/vnd.intercon.formnet",
+      ".xsl"       => "application/xml",
+      ".xslt"      => "application/xslt+xml",
+      ".xsm"       => "application/vnd.syncml+xml",
+      ".xspf"      => "application/xspf+xml",
+      ".xul"       => "application/vnd.mozilla.xul+xml",
+      ".xwd"       => "image/x-xwindowdump",
+      ".xyz"       => "chemical/x-xyz",
+      ".yaml"      => "text/yaml",
+      ".yml"       => "text/yaml",
+      ".zaz"       => "application/vnd.zzazz.deck+xml",
+      ".zip"       => "application/zip",
+      ".zmm"       => "application/vnd.handheld-entertainment+xml",
+    }
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/mock.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/mock.rb
new file mode 100644
index 0000000..ac7ef08
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/mock.rb
@@ -0,0 +1,190 @@
+require 'uri'
+require 'stringio'
+require 'rack'
+require 'rack/lint'
+require 'rack/utils'
+require 'rack/response'
+
+module Rack
+  # Rack::MockRequest helps testing your Rack application without
+  # actually using HTTP.
+  #
+  # After performing a request on a URL with get/post/put/patch/delete, it
+  # returns a MockResponse with useful helper methods for effective
+  # testing.
+  #
+  # You can pass a hash with additional configuration to the
+  # get/post/put/patch/delete.
+  # <tt>:input</tt>:: A String or IO-like to be used as rack.input.
+  # <tt>:fatal</tt>:: Raise a FatalWarning if the app writes to rack.errors.
+  # <tt>:lint</tt>:: If true, wrap the application in a Rack::Lint.
+
+  class MockRequest
+    class FatalWarning < RuntimeError
+    end
+
+    class FatalWarner
+      def puts(warning)
+        raise FatalWarning, warning
+      end
+
+      def write(warning)
+        raise FatalWarning, warning
+      end
+
+      def flush
+      end
+
+      def string
+        ""
+      end
+    end
+
+    DEFAULT_ENV = {
+      "rack.version" => Rack::VERSION,
+      "rack.input" => StringIO.new,
+      "rack.errors" => StringIO.new,
+      "rack.multithread" => true,
+      "rack.multiprocess" => true,
+      "rack.run_once" => false,
+    }
+
+    def initialize(app)
+      @app = app
+    end
+
+    def get(uri, opts={})    request("GET", uri, opts)    end
+    def post(uri, opts={})   request("POST", uri, opts)   end
+    def put(uri, opts={})    request("PUT", uri, opts)    end
+    def patch(uri, opts={})  request("PATCH", uri, opts)    end
+    def delete(uri, opts={}) request("DELETE", uri, opts) end
+    def head(uri, opts={})   request("HEAD", uri, opts)   end
+
+    def request(method="GET", uri="", opts={})
+      env = self.class.env_for(uri, opts.merge(:method => method))
+
+      if opts[:lint]
+        app = Rack::Lint.new(@app)
+      else
+        app = @app
+      end
+
+      errors = env["rack.errors"]
+      status, headers, body  = app.call(env)
+      MockResponse.new(status, headers, body, errors)
+    ensure
+      body.close if body.respond_to?(:close)
+    end
+
+    # Return the Rack environment used for a request to +uri+.
+    def self.env_for(uri="", opts={})
+      uri = URI(uri)
+      uri.path = "/#{uri.path}" unless uri.path[0] == ?/
+
+      env = DEFAULT_ENV.dup
+
+      env["REQUEST_METHOD"] = opts[:method] ? opts[:method].to_s.upcase : "GET"
+      env["SERVER_NAME"] = uri.host || "example.org"
+      env["SERVER_PORT"] = uri.port ? uri.port.to_s : "80"
+      env["QUERY_STRING"] = uri.query.to_s
+      env["PATH_INFO"] = (!uri.path || uri.path.empty?) ? "/" : uri.path
+      env["rack.url_scheme"] = uri.scheme || "http"
+      env["HTTPS"] = env["rack.url_scheme"] == "https" ? "on" : "off"
+
+      env["SCRIPT_NAME"] = opts[:script_name] || ""
+
+      if opts[:fatal]
+        env["rack.errors"] = FatalWarner.new
+      else
+        env["rack.errors"] = StringIO.new
+      end
+
+      if params = opts[:params]
+        if env["REQUEST_METHOD"] == "GET"
+          params = Utils.parse_nested_query(params) if params.is_a?(String)
+          params.update(Utils.parse_nested_query(env["QUERY_STRING"]))
+          env["QUERY_STRING"] = Utils.build_nested_query(params)
+        elsif !opts.has_key?(:input)
+          opts["CONTENT_TYPE"] = "application/x-www-form-urlencoded"
+          if params.is_a?(Hash)
+            if data = Utils::Multipart.build_multipart(params)
+              opts[:input] = data
+              opts["CONTENT_LENGTH"] ||= data.length.to_s
+              opts["CONTENT_TYPE"] = "multipart/form-data; boundary=#{Utils::Multipart::MULTIPART_BOUNDARY}"
+            else
+              opts[:input] = Utils.build_nested_query(params)
+            end
+          else
+            opts[:input] = params
+          end
+        end
+      end
+
+      empty_str = ""
+      empty_str.force_encoding("ASCII-8BIT") if empty_str.respond_to? :force_encoding
+      opts[:input] ||= empty_str
+      if String === opts[:input]
+        rack_input = StringIO.new(opts[:input])
+      else
+        rack_input = opts[:input]
+      end
+
+      rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)
+      env['rack.input'] = rack_input
+
+      env["CONTENT_LENGTH"] ||= env["rack.input"].length.to_s
+
+      opts.each { |field, value|
+        env[field] = value  if String === field
+      }
+
+      env
+    end
+  end
+
+  # Rack::MockResponse provides useful helpers for testing your apps.
+  # Usually, you don't create the MockResponse on your own, but use
+  # MockRequest.
+
+  class MockResponse < Rack::Response
+    # Headers
+    attr_reader :original_headers
+
+    # Errors
+    attr_accessor :errors
+
+    def initialize(status, headers, body, errors=StringIO.new(""))
+      @original_headers = headers
+      @errors           = errors.string if errors.respond_to?(:string)
+      @body_string      = nil
+
+      super(body, status, headers)
+    end
+
+    def =~(other)
+      body =~ other
+    end
+
+    def match(other)
+      body.match other
+    end
+
+    def body
+      # FIXME: apparently users of MockResponse expect the return value of
+      # MockResponse#body to be a string.  However, the real response object
+      # returns the body as a list.
+      #
+      # See spec_showstatus.rb:
+      #
+      #   should "not replace existing messages" do
+      #     ...
+      #     res.body.should == "foo!"
+      #   end
+      super.join
+    end
+
+    def empty?
+      [201, 204, 205, 304].include? status
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/multipart.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/multipart.rb
new file mode 100644
index 0000000..6849248
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/multipart.rb
@@ -0,0 +1,34 @@
+module Rack
+  # A multipart form data parser, adapted from IOWA.
+  #
+  # Usually, Rack::Request#POST takes care of calling this.
+  module Multipart
+    autoload :UploadedFile, 'rack/multipart/uploaded_file'
+    autoload :Parser, 'rack/multipart/parser'
+    autoload :Generator, 'rack/multipart/generator'
+
+    EOL = "\r\n"
+    MULTIPART_BOUNDARY = "AaB03x"
+    MULTIPART = %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|n
+    TOKEN = /[^\s()<>,;:\\"\/\[\]?=]+/
+    CONDISP = /Content-Disposition:\s*#{TOKEN}\s*/i
+    DISPPARM = /;\s*(#{TOKEN})=("(?:\\"|[^"])*"|#{TOKEN})/
+    RFC2183 = /^#{CONDISP}(#{DISPPARM})+$/i
+    BROKEN_QUOTED = /^#{CONDISP}.*;\sfilename="(.*?)"(?:\s*$|\s*;\s*#{TOKEN}=)/i
+    BROKEN_UNQUOTED = /^#{CONDISP}.*;\sfilename=(#{TOKEN})/i
+    MULTIPART_CONTENT_TYPE = /Content-Type: (.*)#{EOL}/ni
+    MULTIPART_CONTENT_DISPOSITION = /Content-Disposition:.*\s+name="?([^\";]*)"?/ni
+    MULTIPART_CONTENT_ID = /Content-ID:\s*([^#{EOL}]*)/ni
+
+    class << self
+      def parse_multipart(env)
+        Parser.new(env).parse
+      end
+
+      def build_multipart(params, first = true)
+        Generator.new(params, first).dump
+      end
+    end
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/multipart/generator.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/multipart/generator.rb
new file mode 100644
index 0000000..1c586b7
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/multipart/generator.rb
@@ -0,0 +1,93 @@
+module Rack
+  module Multipart
+    class Generator
+      def initialize(params, first = true)
+        @params, @first = params, first
+
+        if @first && !@params.is_a?(Hash)
+          raise ArgumentError, "value must be a Hash"
+        end
+      end
+
+      def dump
+        return nil if @first && !multipart?
+        return flattened_params if !@first
+
+        flattened_params.map do |name, file|
+          if file.respond_to?(:original_filename)
+            ::File.open(file.path, "rb") do |f|
+              f.set_encoding(Encoding::BINARY) if f.respond_to?(:set_encoding)
+              content_for_tempfile(f, file, name)
+            end
+          else
+            content_for_other(file, name)
+          end
+        end.join + "--#{MULTIPART_BOUNDARY}--\r"
+      end
+
+      private
+      def multipart?
+        multipart = false
+
+        query = lambda { |value|
+          case value
+          when Array
+            value.each(&query)
+          when Hash
+            value.values.each(&query)
+          when Rack::Multipart::UploadedFile
+            multipart = true
+          end
+        }
+        @params.values.each(&query)
+
+        multipart
+      end
+
+      def flattened_params
+        @flattened_params ||= begin
+          h = Hash.new
+          @params.each do |key, value|
+            k = @first ? key.to_s : "[#{key}]"
+
+            case value
+            when Array
+              value.map { |v|
+                Multipart.build_multipart(v, false).each { |subkey, subvalue|
+                  h["#{k}[]#{subkey}"] = subvalue
+                }
+              }
+            when Hash
+              Multipart.build_multipart(value, false).each { |subkey, subvalue|
+                h[k + subkey] = subvalue
+              }
+            else
+              h[k] = value
+            end
+          end
+          h
+        end
+      end
+
+      def content_for_tempfile(io, file, name)
+<<-EOF
+--#{MULTIPART_BOUNDARY}\r
+Content-Disposition: form-data; name="#{name}"; filename="#{Utils.escape(file.original_filename)}"\r
+Content-Type: #{file.content_type}\r
+Content-Length: #{::File.stat(file.path).size}\r
+\r
+#{io.read}\r
+EOF
+      end
+
+      def content_for_other(file, name)
+<<-EOF
+--#{MULTIPART_BOUNDARY}\r
+Content-Disposition: form-data; name="#{name}"\r
+\r
+#{file}\r
+EOF
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/multipart/parser.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/multipart/parser.rb
new file mode 100644
index 0000000..1315c7b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/multipart/parser.rb
@@ -0,0 +1,176 @@
+require 'rack/utils'
+
+module Rack
+  module Multipart
+    class Parser
+      BUFSIZE = 16384
+
+      def initialize(env)
+        @env = env
+      end
+
+      def parse
+        return nil unless setup_parse
+
+        fast_forward_to_first_boundary
+
+        loop do
+          head, filename, content_type, name, body =
+            get_current_head_and_filename_and_content_type_and_name_and_body
+
+          # Save the rest.
+          if i = @buf.index(rx)
+            body << @buf.slice!(0, i)
+            @buf.slice!(0, @boundary_size+2)
+
+            @content_length = -1  if $1 == "--"
+          end
+
+          filename, data = get_data(filename, body, content_type, name, head)
+
+          Utils.normalize_params(@params, name, data) unless data.nil?
+
+          # break if we're at the end of a buffer, but not if it is the end of a field
+          break if (@buf.empty? && $1 != EOL) || @content_length == -1
+        end
+
+        @io.rewind
+
+        @params.to_params_hash
+      end
+
+      private
+      def setup_parse
+        return false unless @env['CONTENT_TYPE'] =~ MULTIPART
+
+        @boundary = "--#{$1}"
+
+        @buf = ""
+        @params = Utils::KeySpaceConstrainedParams.new
+
+        @io = @env['rack.input']
+        @io.rewind
+
+        @boundary_size = Utils.bytesize(@boundary) + EOL.size
+
+        if @content_length = @env['CONTENT_LENGTH']
+          @content_length = @content_length.to_i
+          @content_length -= @boundary_size
+        end
+        true
+      end
+
+      def full_boundary
+        @boundary + EOL
+      end
+
+      def rx
+        @rx ||= /(?:#{EOL})?#{Regexp.quote(@boundary)}(#{EOL}|--)/n
+      end
+
+      def fast_forward_to_first_boundary
+        loop do
+          content = @io.read(BUFSIZE)
+          raise EOFError, "bad content body" unless content
+          @buf << content
+
+          while @buf.gsub!(/\A([^\n]*\n)/, '')
+            read_buffer = $1
+            return if read_buffer == full_boundary
+          end
+
+          raise EOFError, "bad content body" if Utils.bytesize(@buf) >= BUFSIZE
+        end
+      end
+
+      def get_current_head_and_filename_and_content_type_and_name_and_body
+        head = nil
+        body = ''
+        filename = content_type = name = nil
+        content = nil
+
+        until head && @buf =~ rx
+          if !head && i = @buf.index(EOL+EOL)
+            head = @buf.slice!(0, i+2) # First \r\n
+
+            @buf.slice!(0, 2)          # Second \r\n
+
+            content_type = head[MULTIPART_CONTENT_TYPE, 1]
+            name = head[MULTIPART_CONTENT_DISPOSITION, 1] || head[MULTIPART_CONTENT_ID, 1]
+
+            filename = get_filename(head)
+
+            if filename
+              body = Tempfile.new("RackMultipart")
+              body.binmode  if body.respond_to?(:binmode)
+            end
+
+            next
+          end
+
+          # Save the read body part.
+          if head && (@boundary_size+4 < @buf.size)
+            body << @buf.slice!(0, @buf.size - (@boundary_size+4))
+          end
+
+          content = @io.read(@content_length && BUFSIZE >= @content_length ? @content_length : BUFSIZE)
+          raise EOFError, "bad content body"  if content.nil? || content.empty?
+
+          @buf << content
+          @content_length -= content.size if @content_length
+        end
+
+        [head, filename, content_type, name, body]
+      end
+
+      def get_filename(head)
+        filename = nil
+        if head =~ RFC2183
+          filename = Hash[head.scan(DISPPARM)]['filename']
+          filename = $1 if filename and filename =~ /^"(.*)"$/
+        elsif head =~ BROKEN_QUOTED
+          filename = $1
+        elsif head =~ BROKEN_UNQUOTED
+          filename = $1
+        end
+
+        if filename && filename.scan(/%.?.?/).all? { |s| s =~ /%[0-9a-fA-F]{2}/ }
+          filename = Utils.unescape(filename)
+        end
+        if filename && filename !~ /\\[^\\"]/
+          filename = filename.gsub(/\\(.)/, '\1')
+        end
+        filename
+      end
+
+      def get_data(filename, body, content_type, name, head)
+        data = nil
+        if filename == ""
+          # filename is blank which means no file has been selected
+          return data
+        elsif filename
+          body.rewind
+
+          # Take the basename of the upload's original filename.
+          # This handles the full Windows paths given by Internet Explorer
+          # (and perhaps other broken user agents) without affecting
+          # those which give the lone filename.
+          filename = filename.split(/[\/\\]/).last
+
+          data = {:filename => filename, :type => content_type,
+                  :name => name, :tempfile => body, :head => head}
+        elsif !filename && content_type && body.is_a?(IO)
+          body.rewind
+
+          # Generic multipart cases, not coming from a form
+          data = {:type => content_type,
+                  :name => name, :tempfile => body, :head => head}
+        else
+          data = body
+        end
+
+        [filename, data]
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/multipart/uploaded_file.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/multipart/uploaded_file.rb
new file mode 100644
index 0000000..11932b1
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/multipart/uploaded_file.rb
@@ -0,0 +1,34 @@
+module Rack
+  module Multipart
+    class UploadedFile
+      # The filename, *not* including the path, of the "uploaded" file
+      attr_reader :original_filename
+
+      # The content type of the "uploaded" file
+      attr_accessor :content_type
+
+      def initialize(path, content_type = "text/plain", binary = false)
+        raise "#{path} file does not exist" unless ::File.exist?(path)
+        @content_type = content_type
+        @original_filename = ::File.basename(path)
+        @tempfile = Tempfile.new(@original_filename)
+        @tempfile.set_encoding(Encoding::BINARY) if @tempfile.respond_to?(:set_encoding)
+        @tempfile.binmode if binary
+        FileUtils.copy_file(path, @tempfile.path)
+      end
+
+      def path
+        @tempfile.path
+      end
+      alias_method :local_path, :path
+
+      def respond_to?(*args)
+        super or @tempfile.respond_to?(*args)
+      end
+
+      def method_missing(method_name, *args, &block) #:nodoc:
+        @tempfile.__send__(method_name, *args, &block)
+      end
+    end
+  end
+end
\ No newline at end of file
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/nulllogger.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/nulllogger.rb
new file mode 100644
index 0000000..77fb637
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/nulllogger.rb
@@ -0,0 +1,18 @@
+module Rack
+  class NullLogger
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      env['rack.logger'] = self
+      @app.call(env)
+    end
+
+    def info(progname = nil, &block);  end
+    def debug(progname = nil, &block); end
+    def warn(progname = nil, &block);  end
+    def error(progname = nil, &block); end
+    def fatal(progname = nil, &block); end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/recursive.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/recursive.rb
new file mode 100644
index 0000000..b431d4d
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/recursive.rb
@@ -0,0 +1,61 @@
+require 'uri'
+
+module Rack
+  # Rack::ForwardRequest gets caught by Rack::Recursive and redirects
+  # the current request to the app at +url+.
+  #
+  #   raise ForwardRequest.new("/not-found")
+  #
+
+  class ForwardRequest < Exception
+    attr_reader :url, :env
+
+    def initialize(url, env={})
+      @url = URI(url)
+      @env = env
+
+      @env["PATH_INFO"] =       @url.path
+      @env["QUERY_STRING"] =    @url.query  if @url.query
+      @env["HTTP_HOST"] =       @url.host   if @url.host
+      @env["HTTP_PORT"] =       @url.port   if @url.port
+      @env["rack.url_scheme"] = @url.scheme if @url.scheme
+
+      super "forwarding to #{url}"
+    end
+  end
+
+  # Rack::Recursive allows applications called down the chain to
+  # include data from other applications (by using
+  # <tt>rack['rack.recursive.include'][...]</tt> or raise a
+  # ForwardRequest to redirect internally.
+
+  class Recursive
+    def initialize(app)
+      @app = app
+    end
+
+    def call(env)
+      dup._call(env)
+    end
+
+    def _call(env)
+      @script_name = env["SCRIPT_NAME"]
+      @app.call(env.merge('rack.recursive.include' => method(:include)))
+    rescue ForwardRequest => req
+      call(env.merge(req.env))
+    end
+
+    def include(env, path)
+      unless path.index(@script_name) == 0 && (path[@script_name.size] == ?/ ||
+                                               path[@script_name.size].nil?)
+        raise ArgumentError, "can only include below #{@script_name}, not #{path}"
+      end
+
+      env = env.merge("PATH_INFO" => path, "SCRIPT_NAME" => @script_name,
+                      "REQUEST_METHOD" => "GET",
+                      "CONTENT_LENGTH" => "0", "CONTENT_TYPE" => "",
+                      "rack.input" => StringIO.new(""))
+      @app.call(env)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/reloader.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/reloader.rb
new file mode 100644
index 0000000..5f64359
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/reloader.rb
@@ -0,0 +1,109 @@
+#          Copyright (c) 2009 Michael Fellinger m.fellinger at gmail.com
+#       Rack::Reloader is subject to the terms of an MIT-style license.
+#      See COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+require 'pathname'
+
+module Rack
+
+  # High performant source reloader
+  #
+  # This class acts as Rack middleware.
+  #
+  # What makes it especially suited for use in a production environment is that
+  # any file will only be checked once and there will only be made one system
+  # call stat(2).
+  #
+  # Please note that this will not reload files in the background, it does so
+  # only when actively called.
+  #
+  # It is performing a check/reload cycle at the start of every request, but
+  # also respects a cool down time, during which nothing will be done.
+  class Reloader
+    def initialize(app, cooldown = 10, backend = Stat)
+      @app = app
+      @cooldown = cooldown
+      @last = (Time.now - cooldown)
+      @cache = {}
+      @mtimes = {}
+
+      extend backend
+    end
+
+    def call(env)
+      if @cooldown and Time.now > @last + @cooldown
+        if Thread.list.size > 1
+          Thread.exclusive{ reload! }
+        else
+          reload!
+        end
+
+        @last = Time.now
+      end
+
+      @app.call(env)
+    end
+
+    def reload!(stderr = $stderr)
+      rotation do |file, mtime|
+        previous_mtime = @mtimes[file] ||= mtime
+        safe_load(file, mtime, stderr) if mtime > previous_mtime
+      end
+    end
+
+    # A safe Kernel::load, issuing the hooks depending on the results
+    def safe_load(file, mtime, stderr = $stderr)
+      load(file)
+      stderr.puts "#{self.class}: reloaded `#{file}'"
+      file
+    rescue LoadError, SyntaxError => ex
+      stderr.puts ex
+    ensure
+      @mtimes[file] = mtime
+    end
+
+    module Stat
+      def rotation
+        files = [$0, *$LOADED_FEATURES].uniq
+        paths = ['./', *$LOAD_PATH].uniq
+
+        files.map{|file|
+          next if file =~ /\.(so|bundle)$/ # cannot reload compiled files
+
+          found, stat = figure_path(file, paths)
+          next unless found && stat && mtime = stat.mtime
+
+          @cache[file] = found
+
+          yield(found, mtime)
+        }.compact
+      end
+
+      # Takes a relative or absolute +file+ name, a couple possible +paths+ that
+      # the +file+ might reside in. Returns the full path and File::Stat for the
+      # path.
+      def figure_path(file, paths)
+        found = @cache[file]
+        found = file if !found and Pathname.new(file).absolute?
+        found, stat = safe_stat(found)
+        return found, stat if found
+
+        paths.find do |possible_path|
+          path = ::File.join(possible_path, file)
+          found, stat = safe_stat(path)
+          return ::File.expand_path(found), stat if found
+        end
+
+        return false, false
+      end
+
+      def safe_stat(file)
+        return unless file
+        stat = ::File.stat(file)
+        return file, stat if stat.file?
+      rescue Errno::ENOENT, Errno::ENOTDIR, Errno::ESRCH
+        @cache.delete(file) and false
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/request.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/request.rb
new file mode 100644
index 0000000..e8734d7
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/request.rb
@@ -0,0 +1,380 @@
+require 'rack/utils'
+
+module Rack
+  # Rack::Request provides a convenient interface to a Rack
+  # environment.  It is stateless, the environment +env+ passed to the
+  # constructor will be directly modified.
+  #
+  #   req = Rack::Request.new(env)
+  #   req.post?
+  #   req.params["data"]
+  #
+  # The environment hash passed will store a reference to the Request object
+  # instantiated so that it will only instantiate if an instance of the Request
+  # object doesn't already exist.
+
+  class Request
+    # The environment of the request.
+    attr_reader :env
+
+    def initialize(env)
+      @env = env
+    end
+
+    def body;            @env["rack.input"]                       end
+    def script_name;     @env["SCRIPT_NAME"].to_s                 end
+    def path_info;       @env["PATH_INFO"].to_s                   end
+    def request_method;  @env["REQUEST_METHOD"]                   end
+    def query_string;    @env["QUERY_STRING"].to_s                end
+    def content_length;  @env['CONTENT_LENGTH']                   end
+
+    def content_type
+      content_type = @env['CONTENT_TYPE']
+      content_type.nil? || content_type.empty? ? nil : content_type
+    end
+
+    def session;         @env['rack.session'] ||= {}              end
+    def session_options; @env['rack.session.options'] ||= {}      end
+    def logger;          @env['rack.logger']                      end
+
+    # The media type (type/subtype) portion of the CONTENT_TYPE header
+    # without any media type parameters. e.g., when CONTENT_TYPE is
+    # "text/plain;charset=utf-8", the media-type is "text/plain".
+    #
+    # For more information on the use of media types in HTTP, see:
+    # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7
+    def media_type
+      content_type && content_type.split(/\s*[;,]\s*/, 2).first.downcase
+    end
+
+    # The media type parameters provided in CONTENT_TYPE as a Hash, or
+    # an empty Hash if no CONTENT_TYPE or media-type parameters were
+    # provided.  e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8",
+    # this method responds with the following Hash:
+    #   { 'charset' => 'utf-8' }
+    def media_type_params
+      return {} if content_type.nil?
+      Hash[*content_type.split(/\s*[;,]\s*/)[1..-1].
+        collect { |s| s.split('=', 2) }.
+        map { |k,v| [k.downcase, v] }.flatten]
+    end
+
+    # The character set of the request body if a "charset" media type
+    # parameter was given, or nil if no "charset" was specified. Note
+    # that, per RFC2616, text/* media types that specify no explicit
+    # charset are to be considered ISO-8859-1.
+    def content_charset
+      media_type_params['charset']
+    end
+
+    def scheme
+      if @env['HTTPS'] == 'on'
+        'https'
+      elsif @env['HTTP_X_FORWARDED_SSL'] == 'on'
+        'https'
+      elsif @env['HTTP_X_FORWARDED_SCHEME']
+        @env['HTTP_X_FORWARDED_SCHEME']
+      elsif @env['HTTP_X_FORWARDED_PROTO']
+        @env['HTTP_X_FORWARDED_PROTO'].split(',')[0]
+      else
+        @env["rack.url_scheme"]
+      end
+    end
+
+    def ssl?
+      scheme == 'https'
+    end
+
+    def host_with_port
+      if forwarded = @env["HTTP_X_FORWARDED_HOST"]
+        forwarded.split(/,\s?/).last
+      else
+        @env['HTTP_HOST'] || "#{@env['SERVER_NAME'] || @env['SERVER_ADDR']}:#{@env['SERVER_PORT']}"
+      end
+    end
+
+    def port
+      if port = host_with_port.split(/:/)[1]
+        port.to_i
+      elsif port = @env['HTTP_X_FORWARDED_PORT']
+        port.to_i
+      elsif @env.has_key?("HTTP_X_FORWARDED_HOST")
+        DEFAULT_PORTS[scheme]
+      else
+        @env["SERVER_PORT"].to_i
+      end
+    end
+
+    def host
+      # Remove port number.
+      host_with_port.to_s.gsub(/:\d+\z/, '')
+    end
+
+    def script_name=(s); @env["SCRIPT_NAME"] = s.to_s             end
+    def path_info=(s);   @env["PATH_INFO"] = s.to_s               end
+
+
+    # Checks the HTTP request method (or verb) to see if it was of type DELETE
+    def delete?;  request_method == "DELETE"  end
+
+    # Checks the HTTP request method (or verb) to see if it was of type GET
+    def get?;     request_method == "GET"     end
+
+    # Checks the HTTP request method (or verb) to see if it was of type HEAD
+    def head?;    request_method == "HEAD"    end
+
+    # Checks the HTTP request method (or verb) to see if it was of type OPTIONS
+    def options?; request_method == "OPTIONS" end
+
+    # Checks the HTTP request method (or verb) to see if it was of type PATCH
+    def patch?;   request_method == "PATCH"   end
+
+    # Checks the HTTP request method (or verb) to see if it was of type POST
+    def post?;    request_method == "POST"    end
+
+    # Checks the HTTP request method (or verb) to see if it was of type PUT
+    def put?;     request_method == "PUT"     end
+
+    # Checks the HTTP request method (or verb) to see if it was of type TRACE
+    def trace?;   request_method == "TRACE"   end
+
+
+    # The set of form-data media-types. Requests that do not indicate
+    # one of the media types presents in this list will not be eligible
+    # for form-data / param parsing.
+    FORM_DATA_MEDIA_TYPES = [
+      'application/x-www-form-urlencoded',
+      'multipart/form-data'
+    ]
+
+    # The set of media-types. Requests that do not indicate
+    # one of the media types presents in this list will not be eligible
+    # for param parsing like soap attachments or generic multiparts
+    PARSEABLE_DATA_MEDIA_TYPES = [
+      'multipart/related',
+      'multipart/mixed'
+    ]
+
+    # Default ports depending on scheme. Used to decide whether or not
+    # to include the port in a generated URI.
+    DEFAULT_PORTS = { 'http' => 80, 'https' => 443, 'coffee' => 80 }
+
+    # Determine whether the request body contains form-data by checking
+    # the request Content-Type for one of the media-types:
+    # "application/x-www-form-urlencoded" or "multipart/form-data". The
+    # list of form-data media types can be modified through the
+    # +FORM_DATA_MEDIA_TYPES+ array.
+    #
+    # A request body is also assumed to contain form-data when no
+    # Content-Type header is provided and the request_method is POST.
+    def form_data?
+      type = media_type
+      meth = env["rack.methodoverride.original_method"] || env['REQUEST_METHOD']
+      (meth == 'POST' && type.nil?) || FORM_DATA_MEDIA_TYPES.include?(type)
+    end
+
+    # Determine whether the request body contains data by checking
+    # the request media_type against registered parse-data media-types
+    def parseable_data?
+      PARSEABLE_DATA_MEDIA_TYPES.include?(media_type)
+    end
+
+    # Returns the data received in the query string.
+    def GET
+      if @env["rack.request.query_string"] == query_string
+        @env["rack.request.query_hash"]
+      else
+        @env["rack.request.query_string"] = query_string
+        @env["rack.request.query_hash"]   = parse_query(query_string)
+      end
+    end
+
+    # Returns the data received in the request body.
+    #
+    # This method support both application/x-www-form-urlencoded and
+    # multipart/form-data.
+    def POST
+      if @env["rack.input"].nil?
+        raise "Missing rack.input"
+      elsif @env["rack.request.form_input"].eql? @env["rack.input"]
+        @env["rack.request.form_hash"]
+      elsif form_data? || parseable_data?
+        @env["rack.request.form_input"] = @env["rack.input"]
+        unless @env["rack.request.form_hash"] = parse_multipart(env)
+          form_vars = @env["rack.input"].read
+
+          # Fix for Safari Ajax postings that always append \0
+          # form_vars.sub!(/\0\z/, '') # performance replacement:
+          form_vars.slice!(-1) if form_vars[-1] == ?\0
+
+          @env["rack.request.form_vars"] = form_vars
+          @env["rack.request.form_hash"] = parse_query(form_vars)
+
+          @env["rack.input"].rewind
+        end
+        @env["rack.request.form_hash"]
+      else
+        {}
+      end
+    end
+
+    # The union of GET and POST data.
+    #
+    # Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params.
+    def params
+      @params ||= self.GET.merge(self.POST)
+    rescue EOFError
+      self.GET.dup
+    end
+
+    # Destructively update a parameter, whether it's in GET and/or POST. Returns nil.
+    #
+    # The parameter is updated wherever it was previous defined, so GET, POST, or both. If it wasn't previously defined, it's inserted into GET.
+    #
+    # env['rack.input'] is not touched.
+    def update_param(k, v)
+      found = false
+      if self.GET.has_key?(k)
+        found = true
+        self.GET[k] = v
+      end
+      if self.POST.has_key?(k)
+        found = true
+        self.POST[k] = v
+      end
+      unless found
+        self.GET[k] = v
+      end
+      @params = nil
+      nil
+    end
+
+    # Destructively delete a parameter, whether it's in GET or POST. Returns the value of the deleted parameter.
+    #
+    # If the parameter is in both GET and POST, the POST value takes precedence since that's how #params works.
+    #
+    # env['rack.input'] is not touched.
+    def delete_param(k)
+      v = [ self.POST.delete(k), self.GET.delete(k) ].compact.first
+      @params = nil
+      v
+    end
+
+    # shortcut for request.params[key]
+    def [](key)
+      params[key.to_s]
+    end
+
+    # shortcut for request.params[key] = value
+    #
+    # Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params.
+    def []=(key, value)
+      params[key.to_s] = value
+    end
+
+    # like Hash#values_at
+    def values_at(*keys)
+      keys.map{|key| params[key] }
+    end
+
+    # the referer of the client
+    def referer
+      @env['HTTP_REFERER']
+    end
+    alias referrer referer
+
+    def user_agent
+      @env['HTTP_USER_AGENT']
+    end
+
+    def cookies
+      hash   = @env["rack.request.cookie_hash"] ||= {}
+      string = @env["HTTP_COOKIE"]
+
+      return hash if string == @env["rack.request.cookie_string"]
+      hash.clear
+
+      # According to RFC 2109:
+      #   If multiple cookies satisfy the criteria above, they are ordered in
+      #   the Cookie header such that those with more specific Path attributes
+      #   precede those with less specific.  Ordering with respect to other
+      #   attributes (e.g., Domain) is unspecified.
+      cookies = Utils.parse_query(string, ';,') { |s| Rack::Utils.unescape(s) rescue s }
+      cookies.each { |k,v| hash[k] = Array === v ? v.first : v }
+      @env["rack.request.cookie_string"] = string
+      hash
+    end
+
+    def xhr?
+      @env["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest"
+    end
+
+    def base_url
+      url = "#{scheme}://#{host}"
+      url << ":#{port}" if port != DEFAULT_PORTS[scheme]
+      url
+    end
+
+    # Tries to return a remake of the original request URL as a string.
+    def url
+      base_url + fullpath
+    end
+
+    def path
+      script_name + path_info
+    end
+
+    def fullpath
+      query_string.empty? ? path : "#{path}?#{query_string}"
+    end
+
+    def accept_encoding
+      @env["HTTP_ACCEPT_ENCODING"].to_s.split(/\s*,\s*/).map do |part|
+        encoding, parameters = part.split(/\s*;\s*/, 2)
+        quality = 1.0
+        if parameters and /\Aq=([\d.]+)/ =~ parameters
+          quality = $1.to_f
+        end
+        [encoding, quality]
+      end
+    end
+
+    def trusted_proxy?(ip)
+      ip =~ /\A127\.0\.0\.1\Z|\A(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.|\A::1\Z|\Afd[0-9a-f]{2}:.+|\Alocalhost\Z|\Aunix\Z|\Aunix:/i
+    end
+
+    def ip
+      remote_addrs = split_ip_addresses(@env['REMOTE_ADDR'])
+      remote_addrs = reject_trusted_ip_addresses(remote_addrs)
+
+      return remote_addrs.first if remote_addrs.any?
+
+      forwarded_ips = split_ip_addresses(@env['HTTP_X_FORWARDED_FOR'])
+
+      if client_ip = @env['HTTP_CLIENT_IP']
+        # If forwarded_ips doesn't include the client_ip, it might be an
+        # ip spoofing attempt, so we ignore HTTP_CLIENT_IP
+        return client_ip if forwarded_ips.include?(client_ip)
+      end
+
+      return reject_trusted_ip_addresses(forwarded_ips).last || @env["REMOTE_ADDR"]
+    end
+
+    protected
+      def split_ip_addresses(ip_addresses)
+        ip_addresses ? ip_addresses.strip.split(/[,\s]+/) : []
+      end
+
+      def reject_trusted_ip_addresses(ip_addresses)
+        ip_addresses.reject { |ip| trusted_proxy?(ip) }
+      end
+
+      def parse_query(qs)
+        Utils.parse_nested_query(qs)
+      end
+
+      def parse_multipart(env)
+        Rack::Multipart.parse_multipart(env)
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/response.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/response.rb
new file mode 100644
index 0000000..2beba7a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/response.rb
@@ -0,0 +1,155 @@
+require 'rack/request'
+require 'rack/utils'
+require 'time'
+
+module Rack
+  # Rack::Response provides a convenient interface to create a Rack
+  # response.
+  #
+  # It allows setting of headers and cookies, and provides useful
+  # defaults (a OK response containing HTML).
+  #
+  # You can use Response#write to iteratively generate your response,
+  # but note that this is buffered by Rack::Response until you call
+  # +finish+.  +finish+ however can take a block inside which calls to
+  # +write+ are synchronous with the Rack response.
+  #
+  # Your application's +call+ should end returning Response#finish.
+
+  class Response
+    attr_accessor :length
+
+    def initialize(body=[], status=200, header={})
+      @status = status.to_i
+      @header = Utils::HeaderHash.new.merge(header)
+
+      @chunked = "chunked" == @header['Transfer-Encoding']
+      @writer  = lambda { |x| @body << x }
+      @block   = nil
+      @length  = 0
+
+      @body = []
+
+      if body.respond_to? :to_str
+        write body.to_str
+      elsif body.respond_to?(:each)
+        body.each { |part|
+          write part.to_s
+        }
+      else
+        raise TypeError, "stringable or iterable required"
+      end
+
+      yield self  if block_given?
+    end
+
+    attr_reader :header
+    attr_accessor :status, :body
+
+    def [](key)
+      header[key]
+    end
+
+    def []=(key, value)
+      header[key] = value
+    end
+
+    def set_cookie(key, value)
+      Utils.set_cookie_header!(header, key, value)
+    end
+
+    def delete_cookie(key, value={})
+      Utils.delete_cookie_header!(header, key, value)
+    end
+
+    def redirect(target, status=302)
+      self.status = status
+      self["Location"] = target
+    end
+
+    def finish(&block)
+      @block = block
+
+      if [204, 205, 304].include?(status.to_i)
+        header.delete "Content-Type"
+        header.delete "Content-Length"
+        close
+        [status.to_i, header, []]
+      else
+        [status.to_i, header, BodyProxy.new(self){}]
+      end
+    end
+    alias to_a finish           # For *response
+    alias to_ary finish         # For implicit-splat on Ruby 1.9.2
+
+    def each(&callback)
+      @body.each(&callback)
+      @writer = callback
+      @block.call(self)  if @block
+    end
+
+    # Append to body and update Content-Length.
+    #
+    # NOTE: Do not mix #write and direct #body access!
+    #
+    def write(str)
+      s = str.to_s
+      @length += Rack::Utils.bytesize(s) unless @chunked
+      @writer.call s
+
+      header["Content-Length"] = @length.to_s unless @chunked
+      str
+    end
+
+    def close
+      body.close if body.respond_to?(:close)
+    end
+
+    def empty?
+      @block == nil && @body.empty?
+    end
+
+    alias headers header
+
+    module Helpers
+      def invalid?;            status < 100 || status >= 600;        end
+
+      def informational?;      status >= 100 && status < 200;        end
+      def successful?;         status >= 200 && status < 300;        end
+      def redirection?;        status >= 300 && status < 400;        end
+      def client_error?;       status >= 400 && status < 500;        end
+      def server_error?;       status >= 500 && status < 600;        end
+
+      def ok?;                 status == 200;                        end
+      def bad_request?;        status == 400;                        end
+      def forbidden?;          status == 403;                        end
+      def not_found?;          status == 404;                        end
+      def method_not_allowed?; status == 405;                        end
+      def unprocessable?;      status == 422;                        end
+
+      def redirect?;           [301, 302, 303, 307].include? status; end
+
+      # Headers
+      attr_reader :headers, :original_headers
+
+      def include?(header)
+        !!headers[header]
+      end
+
+      def content_type
+        headers["Content-Type"]
+      end
+
+      def content_length
+        cl = headers["Content-Length"]
+        cl ? cl.to_i : cl
+      end
+
+      def location
+        headers["Location"]
+      end
+    end
+
+    include Helpers
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/rewindable_input.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/rewindable_input.rb
new file mode 100644
index 0000000..15ecc58
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/rewindable_input.rb
@@ -0,0 +1,104 @@
+# -*- encoding: binary -*-
+require 'tempfile'
+require 'rack/utils'
+
+module Rack
+  # Class which can make any IO object rewindable, including non-rewindable ones. It does
+  # this by buffering the data into a tempfile, which is rewindable.
+  #
+  # rack.input is required to be rewindable, so if your input stream IO is non-rewindable
+  # by nature (e.g. a pipe or a socket) then you can wrap it in an object of this class
+  # to easily make it rewindable.
+  #
+  # Don't forget to call #close when you're done. This frees up temporary resources that
+  # RewindableInput uses, though it does *not* close the original IO object.
+  class RewindableInput
+    def initialize(io)
+      @io = io
+      @rewindable_io = nil
+      @unlinked = false
+    end
+
+    def gets
+      make_rewindable unless @rewindable_io
+      @rewindable_io.gets
+    end
+
+    def read(*args)
+      make_rewindable unless @rewindable_io
+      @rewindable_io.read(*args)
+    end
+
+    def each(&block)
+      make_rewindable unless @rewindable_io
+      @rewindable_io.each(&block)
+    end
+
+    def rewind
+      make_rewindable unless @rewindable_io
+      @rewindable_io.rewind
+    end
+
+    # Closes this RewindableInput object without closing the originally
+    # wrapped IO oject. Cleans up any temporary resources that this RewindableInput
+    # has created.
+    #
+    # This method may be called multiple times. It does nothing on subsequent calls.
+    def close
+      if @rewindable_io
+        if @unlinked
+          @rewindable_io.close
+        else
+          @rewindable_io.close!
+        end
+        @rewindable_io = nil
+      end
+    end
+
+    private
+
+    # Ruby's Tempfile class has a bug. Subclass it and fix it.
+    class Tempfile < ::Tempfile
+      def _close
+        @tmpfile.close if @tmpfile
+        @data[1] = nil if @data
+        @tmpfile = nil
+      end
+    end
+
+    def make_rewindable
+      # Buffer all data into a tempfile. Since this tempfile is private to this
+      # RewindableInput object, we chmod it so that nobody else can read or write
+      # it. On POSIX filesystems we also unlink the file so that it doesn't
+      # even have a file entry on the filesystem anymore, though we can still
+      # access it because we have the file handle open.
+      @rewindable_io = Tempfile.new('RackRewindableInput')
+      @rewindable_io.chmod(0000)
+      @rewindable_io.set_encoding(Encoding::BINARY) if @rewindable_io.respond_to?(:set_encoding)
+      @rewindable_io.binmode
+      if filesystem_has_posix_semantics?
+        # Use ::File.unlink as 1.9.1 Tempfile has a bug where unlink closes the file!
+        ::File.unlink @rewindable_io.path
+        raise 'Unlink failed. IO closed.' if @rewindable_io.closed?
+        @unlinked = true
+      end
+
+      buffer = ""
+      while @io.read(1024 * 4, buffer)
+        entire_buffer_written_out = false
+        while !entire_buffer_written_out
+          written = @rewindable_io.write(buffer)
+          entire_buffer_written_out = written == Rack::Utils.bytesize(buffer)
+          if !entire_buffer_written_out
+            buffer.slice!(0 .. written - 1)
+          end
+        end
+      end
+      @rewindable_io.rewind
+    end
+
+    def filesystem_has_posix_semantics?
+      RUBY_PLATFORM !~ /(mswin|mingw|cygwin|java)/
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/runtime.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/runtime.rb
new file mode 100644
index 0000000..1bd411f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/runtime.rb
@@ -0,0 +1,27 @@
+module Rack
+  # Sets an "X-Runtime" response header, indicating the response
+  # time of the request, in seconds
+  #
+  # You can put it right before the application to see the processing
+  # time, or before all the other middlewares to include time for them,
+  # too.
+  class Runtime
+    def initialize(app, name = nil)
+      @app = app
+      @header_name = "X-Runtime"
+      @header_name << "-#{name}" if name
+    end
+
+    def call(env)
+      start_time = Time.now
+      status, headers, body = @app.call(env)
+      request_time = Time.now - start_time
+
+      if !headers.has_key?(@header_name)
+        headers[@header_name] = "%0.6f" % request_time
+      end
+
+      [status, headers, body]
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/sendfile.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/sendfile.rb
new file mode 100644
index 0000000..bc04ca2
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/sendfile.rb
@@ -0,0 +1,155 @@
+require 'rack/file'
+
+module Rack
+
+  # = Sendfile
+  #
+  # The Sendfile middleware intercepts responses whose body is being
+  # served from a file and replaces it with a server specific X-Sendfile
+  # header. The web server is then responsible for writing the file contents
+  # to the client. This can dramatically reduce the amount of work required
+  # by the Ruby backend and takes advantage of the web server's optimized file
+  # delivery code.
+  #
+  # In order to take advantage of this middleware, the response body must
+  # respond to +to_path+ and the request must include an X-Sendfile-Type
+  # header. Rack::File and other components implement +to_path+ so there's
+  # rarely anything you need to do in your application. The X-Sendfile-Type
+  # header is typically set in your web servers configuration. The following
+  # sections attempt to document
+  #
+  # === Nginx
+  #
+  # Nginx supports the X-Accel-Redirect header. This is similar to X-Sendfile
+  # but requires parts of the filesystem to be mapped into a private URL
+  # hierarachy.
+  #
+  # The following example shows the Nginx configuration required to create
+  # a private "/files/" area, enable X-Accel-Redirect, and pass the special
+  # X-Sendfile-Type and X-Accel-Mapping headers to the backend:
+  #
+  #   location ~ /files/(.*) {
+  #     internal;
+  #     alias /var/www/$1;
+  #   }
+  #
+  #   location / {
+  #     proxy_redirect     off;
+  #
+  #     proxy_set_header   Host                $host;
+  #     proxy_set_header   X-Real-IP           $remote_addr;
+  #     proxy_set_header   X-Forwarded-For     $proxy_add_x_forwarded_for;
+  #
+  #     proxy_set_header   X-Sendfile-Type     X-Accel-Redirect;
+  #     proxy_set_header   X-Accel-Mapping     /var/www/=/files/;
+  #
+  #     proxy_pass         http://127.0.0.1:8080/;
+  #   }
+  #
+  # Note that the X-Sendfile-Type header must be set exactly as shown above.
+  # The X-Accel-Mapping header should specify the location on the file system,
+  # followed by an equals sign (=), followed name of the private URL pattern
+  # that it maps to. The middleware performs a simple substitution on the
+  # resulting path.
+  #
+  # See Also: http://wiki.codemongers.com/NginxXSendfile
+  #
+  # === lighttpd
+  #
+  # Lighttpd has supported some variation of the X-Sendfile header for some
+  # time, although only recent version support X-Sendfile in a reverse proxy
+  # configuration.
+  #
+  #   $HTTP["host"] == "example.com" {
+  #      proxy-core.protocol = "http"
+  #      proxy-core.balancer = "round-robin"
+  #      proxy-core.backends = (
+  #        "127.0.0.1:8000",
+  #        "127.0.0.1:8001",
+  #        ...
+  #      )
+  #
+  #      proxy-core.allow-x-sendfile = "enable"
+  #      proxy-core.rewrite-request = (
+  #        "X-Sendfile-Type" => (".*" => "X-Sendfile")
+  #      )
+  #    }
+  #
+  # See Also: http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModProxyCore
+  #
+  # === Apache
+  #
+  # X-Sendfile is supported under Apache 2.x using a separate module:
+  #
+  # https://tn123.org/mod_xsendfile/
+  #
+  # Once the module is compiled and installed, you can enable it using
+  # XSendFile config directive:
+  #
+  #   RequestHeader Set X-Sendfile-Type X-Sendfile
+  #   ProxyPassReverse / http://localhost:8001/
+  #   XSendFile on
+  #
+  # === Mapping parameter
+  #
+  # The third parameter allows for an overriding extension of the
+  # X-Accel-Mapping header. Mappings should be provided in tuples of internal to
+  # external. The internal values may contain regular expression syntax, they
+  # will be matched with case indifference.
+
+  class Sendfile
+    F = ::File
+
+    def initialize(app, variation=nil, mappings=[])
+      @app = app
+      @variation = variation
+      @mappings = mappings.map do |internal, external|
+        [/^#{internal}/i, external]
+      end
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+      if body.respond_to?(:to_path)
+        case type = variation(env)
+        when 'X-Accel-Redirect'
+          path = F.expand_path(body.to_path)
+          if url = map_accel_path(env, path)
+            headers['Content-Length'] = '0'
+            headers[type] = url
+            body.close if body.respond_to?(:close)
+            body = []
+          else
+            env['rack.errors'].puts "X-Accel-Mapping header missing"
+          end
+        when 'X-Sendfile', 'X-Lighttpd-Send-File'
+          path = F.expand_path(body.to_path)
+          headers['Content-Length'] = '0'
+          headers[type] = path
+          body.close if body.respond_to?(:close)
+          body = []
+        when '', nil
+        else
+          env['rack.errors'].puts "Unknown x-sendfile variation: '#{variation}'.\n"
+        end
+      end
+      [status, headers, body]
+    end
+
+    private
+    def variation(env)
+      @variation ||
+        env['sendfile.type'] ||
+        env['HTTP_X_SENDFILE_TYPE']
+    end
+
+    def map_accel_path(env, path)
+      if mapping = @mappings.find { |internal,_| internal =~ path }
+        path.sub(*mapping)
+      elsif mapping = env['HTTP_X_ACCEL_MAPPING']
+        internal, external = mapping.split('=', 2).map{ |p| p.strip }
+        path.sub(/^#{internal}/i, external)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/server.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/server.rb
new file mode 100644
index 0000000..dfaed3f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/server.rb
@@ -0,0 +1,362 @@
+require 'optparse'
+
+module Rack
+  class Server
+    class Options
+      def parse!(args)
+        options = {}
+        opt_parser = OptionParser.new("", 24, '  ') do |opts|
+          opts.banner = "Usage: rackup [ruby options] [rack options] [rackup config]"
+
+          opts.separator ""
+          opts.separator "Ruby options:"
+
+          lineno = 1
+          opts.on("-e", "--eval LINE", "evaluate a LINE of code") { |line|
+            eval line, TOPLEVEL_BINDING, "-e", lineno
+            lineno += 1
+          }
+
+          opts.on("-b", "--builder BUILDER_LINE", "evaluate a BUILDER_LINE of code as a builder script") { |line|
+            options[:builder] = line
+          }
+
+          opts.on("-d", "--debug", "set debugging flags (set $DEBUG to true)") {
+            options[:debug] = true
+          }
+          opts.on("-w", "--warn", "turn warnings on for your script") {
+            options[:warn] = true
+          }
+
+          opts.on("-I", "--include PATH",
+                  "specify $LOAD_PATH (may be used more than once)") { |path|
+            (options[:include] ||= []).concat(path.split(":"))
+          }
+
+          opts.on("-r", "--require LIBRARY",
+                  "require the library, before executing your script") { |library|
+            options[:require] = library
+          }
+
+          opts.separator ""
+          opts.separator "Rack options:"
+          opts.on("-s", "--server SERVER", "serve using SERVER (thin/puma/webrick/mongrel)") { |s|
+            options[:server] = s
+          }
+
+          opts.on("-o", "--host HOST", "listen on HOST (default: 0.0.0.0)") { |host|
+            options[:Host] = host
+          }
+
+          opts.on("-p", "--port PORT", "use PORT (default: 9292)") { |port|
+            options[:Port] = port
+          }
+
+          opts.on("-O", "--option NAME[=VALUE]", "pass VALUE to the server as option NAME. If no VALUE, sets it to true. Run '#{$0} -s SERVER -h' to get a list of options for SERVER") { |name|
+            name, value = name.split('=', 2)
+            value = true if value.nil?
+            options[name.to_sym] = value
+          }
+
+          opts.on("-E", "--env ENVIRONMENT", "use ENVIRONMENT for defaults (default: development)") { |e|
+            options[:environment] = e
+          }
+
+          opts.on("-D", "--daemonize", "run daemonized in the background") { |d|
+            options[:daemonize] = d ? true : false
+          }
+
+          opts.on("-P", "--pid FILE", "file to store PID (default: rack.pid)") { |f|
+            options[:pid] = ::File.expand_path(f)
+          }
+
+          opts.separator ""
+          opts.separator "Common options:"
+
+          opts.on_tail("-h", "-?", "--help", "Show this message") do
+            puts opts
+            puts handler_opts(options)
+
+            exit
+          end
+
+          opts.on_tail("--version", "Show version") do
+            puts "Rack #{Rack.version} (Release: #{Rack.release})"
+            exit
+          end
+        end
+
+        begin
+          opt_parser.parse! args
+        rescue OptionParser::InvalidOption => e
+          warn e.message
+          abort opt_parser.to_s
+        end
+
+        options[:config] = args.last if args.last
+        options
+      end
+
+      def handler_opts(options)
+        begin
+          info = []
+          server = Rack::Handler.get(options[:server]) || Rack::Handler.default(options)
+          if server && server.respond_to?(:valid_options)
+            info << ""
+            info << "Server-specific options for #{server.name}:"
+
+            has_options = false
+            server.valid_options.each do |name, description|
+              next if name.to_s.match(/^(Host|Port)[^a-zA-Z]/) # ignore handler's host and port options, we do our own.
+              info << "  -O %-21s %s" % [name, description]
+              has_options = true
+            end
+            return "" if !has_options
+          end
+          info.join("\n")
+        rescue NameError
+          return "Warning: Could not find handler specified (#{options[:server] || 'default'}) to determine handler-specific options"
+        end
+      end
+    end
+
+    # Start a new rack server (like running rackup). This will parse ARGV and
+    # provide standard ARGV rackup options, defaulting to load 'config.ru'.
+    #
+    # Providing an options hash will prevent ARGV parsing and will not include
+    # any default options.
+    #
+    # This method can be used to very easily launch a CGI application, for
+    # example:
+    #
+    #  Rack::Server.start(
+    #    :app => lambda do |e|
+    #      [200, {'Content-Type' => 'text/html'}, ['hello world']]
+    #    end,
+    #    :server => 'cgi'
+    #  )
+    #
+    # Further options available here are documented on Rack::Server#initialize
+    def self.start(options = nil)
+      new(options).start
+    end
+
+    attr_writer :options
+
+    # Options may include:
+    # * :app
+    #     a rack application to run (overrides :config)
+    # * :config
+    #     a rackup configuration file path to load (.ru)
+    # * :environment
+    #     this selects the middleware that will be wrapped around
+    #     your application. Default options available are:
+    #       - development: CommonLogger, ShowExceptions, and Lint
+    #       - deployment: CommonLogger
+    #       - none: no extra middleware
+    #     note: when the server is a cgi server, CommonLogger is not included.
+    # * :server
+    #     choose a specific Rack::Handler, e.g. cgi, fcgi, webrick
+    # * :daemonize
+    #     if true, the server will daemonize itself (fork, detach, etc)
+    # * :pid
+    #     path to write a pid file after daemonize
+    # * :Host
+    #     the host address to bind to (used by supporting Rack::Handler)
+    # * :Port
+    #     the port to bind to (used by supporting Rack::Handler)
+    # * :AccessLog
+    #     webrick acess log options (or supporting Rack::Handler)
+    # * :debug
+    #     turn on debug output ($DEBUG = true)
+    # * :warn
+    #     turn on warnings ($-w = true)
+    # * :include
+    #     add given paths to $LOAD_PATH
+    # * :require
+    #     require the given libraries
+    def initialize(options = nil)
+      @options = options
+      @app = options[:app] if options && options[:app]
+    end
+
+    def options
+      @options ||= parse_options(ARGV)
+    end
+
+    def default_options
+      {
+        :environment => ENV['RACK_ENV'] || "development",
+        :pid         => nil,
+        :Port        => 9292,
+        :Host        => "0.0.0.0",
+        :AccessLog   => [],
+        :config      => "config.ru"
+      }
+    end
+
+    def app
+      @app ||= options[:builder] ? build_app_from_string : build_app_and_options_from_config
+    end
+
+    def self.logging_middleware
+      lambda { |server|
+        server.server.name =~ /CGI/ ? nil : [Rack::CommonLogger, $stderr]
+      }
+    end
+
+    def self.middleware
+      @middleware ||= begin
+        m = Hash.new {|h,k| h[k] = []}
+        m["deployment"].concat [
+          [Rack::ContentLength],
+          [Rack::Chunked],
+          logging_middleware
+        ]
+        m["development"].concat m["deployment"] + [[Rack::ShowExceptions], [Rack::Lint]]
+        m
+      end
+    end
+
+    def middleware
+      self.class.middleware
+    end
+
+    def start &blk
+      if options[:warn]
+        $-w = true
+      end
+
+      if includes = options[:include]
+        $LOAD_PATH.unshift(*includes)
+      end
+
+      if library = options[:require]
+        require library
+      end
+
+      if options[:debug]
+        $DEBUG = true
+        require 'pp'
+        p options[:server]
+        pp wrapped_app
+        pp app
+      end
+
+      check_pid! if options[:pid]
+
+      # Touch the wrapped app, so that the config.ru is loaded before
+      # daemonization (i.e. before chdir, etc).
+      wrapped_app
+
+      daemonize_app if options[:daemonize]
+
+      write_pid if options[:pid]
+
+      trap(:INT) do
+        if server.respond_to?(:shutdown)
+          server.shutdown
+        else
+          exit
+        end
+      end
+
+      server.run wrapped_app, options, &blk
+    end
+
+    def server
+      @_server ||= Rack::Handler.get(options[:server]) || Rack::Handler.default(options)
+    end
+
+    private
+      def build_app_and_options_from_config
+        if !::File.exist? options[:config]
+          abort "configuration #{options[:config]} not found"
+        end
+
+        app, options = Rack::Builder.parse_file(self.options[:config], opt_parser)
+        self.options.merge! options
+        app
+      end
+
+      def build_app_from_string
+        Rack::Builder.new_from_string(self.options[:builder])
+      end
+
+      def parse_options(args)
+        options = default_options
+
+        # Don't evaluate CGI ISINDEX parameters.
+        # http://www.meb.uni-bonn.de/docs/cgi/cl.html
+        args.clear if ENV.include?("REQUEST_METHOD")
+
+        options.merge! opt_parser.parse!(args)
+        options[:config] = ::File.expand_path(options[:config])
+        ENV["RACK_ENV"] = options[:environment]
+        options
+      end
+
+      def opt_parser
+        Options.new
+      end
+
+      def build_app(app)
+        middleware[options[:environment]].reverse_each do |middleware|
+          middleware = middleware.call(self) if middleware.respond_to?(:call)
+          next unless middleware
+          klass, *args = middleware
+          app = klass.new(app, *args)
+        end
+        app
+      end
+
+      def wrapped_app
+        @wrapped_app ||= build_app app
+      end
+
+      def daemonize_app
+        if RUBY_VERSION < "1.9"
+          exit if fork
+          Process.setsid
+          exit if fork
+          Dir.chdir "/"
+          STDIN.reopen "/dev/null"
+          STDOUT.reopen "/dev/null", "a"
+          STDERR.reopen "/dev/null", "a"
+        else
+          Process.daemon
+        end
+      end
+
+      def write_pid
+        ::File.open(options[:pid], ::File::CREAT | ::File::EXCL | ::File::WRONLY ){ |f| f.write("#{Process.pid}") }
+        at_exit { ::File.delete(options[:pid]) if ::File.exist?(options[:pid]) }
+      rescue Errno::EEXIST
+        check_pid!
+        retry
+      end
+
+      def check_pid!
+        case pidfile_process_status
+        when :running, :not_owned
+          $stderr.puts "A server is already running. Check #{options[:pid]}."
+          exit(1)
+        when :dead
+          ::File.delete(options[:pid])
+        end
+      end
+
+      def pidfile_process_status
+        return :exited unless ::File.exist?(options[:pid])
+
+        pid = ::File.read(options[:pid]).to_i
+        Process.kill(0, pid)
+        :running
+      rescue Errno::ESRCH
+        :dead
+      rescue Errno::EPERM
+        :not_owned
+      end
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/abstract/id.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/abstract/id.rb
new file mode 100644
index 0000000..0e0ad35
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/abstract/id.rb
@@ -0,0 +1,398 @@
+# AUTHOR: blink <blinketje at gmail.com>; blink#ruby-lang at irc.freenode.net
+# bugrep: Andreas Zehnder
+
+require 'time'
+require 'rack/request'
+require 'rack/response'
+begin
+  require 'securerandom'
+rescue LoadError
+  # We just won't get securerandom
+end
+
+module Rack
+
+  module Session
+
+    module Abstract
+      ENV_SESSION_KEY = 'rack.session'.freeze
+      ENV_SESSION_OPTIONS_KEY = 'rack.session.options'.freeze
+
+      # SessionHash is responsible to lazily load the session from store.
+
+      class SessionHash
+        include Enumerable
+        attr_writer :id
+
+        def self.find(env)
+          env[ENV_SESSION_KEY]
+        end
+
+        def self.set(env, session)
+          env[ENV_SESSION_KEY] = session
+        end
+
+        def self.set_options(env, options)
+          env[ENV_SESSION_OPTIONS_KEY] = options.dup
+        end
+
+        def initialize(store, env)
+          @store = store
+          @env = env
+          @loaded = false
+        end
+
+        def id
+          return @id if @loaded or instance_variable_defined?(:@id)
+          @id = @store.send(:extract_session_id, @env)
+        end
+
+        def options
+          @env[ENV_SESSION_OPTIONS_KEY]
+        end
+
+        def each(&block)
+          load_for_read!
+          @data.each(&block)
+        end
+
+        def [](key)
+          load_for_read!
+          @data[key.to_s]
+        end
+        alias :fetch :[]
+
+        def has_key?(key)
+          load_for_read!
+          @data.has_key?(key.to_s)
+        end
+        alias :key? :has_key?
+        alias :include? :has_key?
+
+        def []=(key, value)
+          load_for_write!
+          @data[key.to_s] = value
+        end
+        alias :store :[]=
+
+        def clear
+          load_for_write!
+          @data.clear
+        end
+
+        def destroy
+          clear
+          @id = @store.send(:destroy_session, @env, id, options)
+        end
+
+        def to_hash
+          load_for_read!
+          @data.dup
+        end
+
+        def update(hash)
+          load_for_write!
+          @data.update(stringify_keys(hash))
+        end
+        alias :merge! :update
+
+        def replace(hash)
+          load_for_write!
+          @data.replace(stringify_keys(hash))
+        end
+
+        def delete(key)
+          load_for_write!
+          @data.delete(key.to_s)
+        end
+
+        def inspect
+          if loaded?
+            @data.inspect
+          else
+            "#<#{self.class}:0x#{self.object_id.to_s(16)} not yet loaded>"
+          end
+        end
+
+        def exists?
+          return @exists if instance_variable_defined?(:@exists)
+          @data = {}
+          @exists = @store.send(:session_exists?, @env)
+        end
+
+        def loaded?
+          @loaded
+        end
+
+        def empty?
+          load_for_read!
+          @data.empty?
+        end
+
+        def keys
+          @data.keys
+        end
+
+        def values
+          @data.values
+        end
+
+      private
+
+        def load_for_read!
+          load! if !loaded? && exists?
+        end
+
+        def load_for_write!
+          load! unless loaded?
+        end
+
+        def load!
+          @id, session = @store.send(:load_session, @env)
+          @data = stringify_keys(session)
+          @loaded = true
+        end
+
+        def stringify_keys(other)
+          hash = {}
+          other.each do |key, value|
+            hash[key.to_s] = value
+          end
+          hash
+        end
+      end
+
+      # ID sets up a basic framework for implementing an id based sessioning
+      # service. Cookies sent to the client for maintaining sessions will only
+      # contain an id reference. Only #get_session and #set_session are
+      # required to be overwritten.
+      #
+      # All parameters are optional.
+      # * :key determines the name of the cookie, by default it is
+      #   'rack.session'
+      # * :path, :domain, :expire_after, :secure, and :httponly set the related
+      #   cookie options as by Rack::Response#add_cookie
+      # * :skip will not a set a cookie in the response nor update the session state
+      # * :defer will not set a cookie in the response but still update the session
+      #   state if it is used with a backend
+      # * :renew (implementation dependent) will prompt the generation of a new
+      #   session id, and migration of data to be referenced at the new id. If
+      #   :defer is set, it will be overridden and the cookie will be set.
+      # * :sidbits sets the number of bits in length that a generated session
+      #   id will be.
+      #
+      # These options can be set on a per request basis, at the location of
+      # env['rack.session.options']. Additionally the id of the session can be
+      # found within the options hash at the key :id. It is highly not
+      # recommended to change its value.
+      #
+      # Is Rack::Utils::Context compatible.
+      #
+      # Not included by default; you must require 'rack/session/abstract/id'
+      # to use.
+
+      class ID
+        DEFAULT_OPTIONS = {
+          :key =>           'rack.session',
+          :path =>          '/',
+          :domain =>        nil,
+          :expire_after =>  nil,
+          :secure =>        false,
+          :httponly =>      true,
+          :defer =>         false,
+          :renew =>         false,
+          :sidbits =>       128,
+          :cookie_only =>   true,
+          :secure_random => (::SecureRandom rescue false)
+        }
+
+        attr_reader :key, :default_options
+
+        def initialize(app, options={})
+          @app = app
+          @default_options = self.class::DEFAULT_OPTIONS.merge(options)
+          @key = @default_options.delete(:key)
+          @cookie_only = @default_options.delete(:cookie_only)
+          initialize_sid
+        end
+
+        def call(env)
+          context(env)
+        end
+
+        def context(env, app=@app)
+          prepare_session(env)
+          status, headers, body = app.call(env)
+          commit_session(env, status, headers, body)
+        end
+
+        private
+
+        def initialize_sid
+          @sidbits = @default_options[:sidbits]
+          @sid_secure = @default_options[:secure_random]
+          @sid_length = @sidbits / 4
+        end
+
+        # Generate a new session id using Ruby #rand.  The size of the
+        # session id is controlled by the :sidbits option.
+        # Monkey patch this to use custom methods for session id generation.
+
+        def generate_sid(secure = @sid_secure)
+          if secure
+            secure.hex(@sid_length)
+          else
+            "%0#{@sid_length}x" % Kernel.rand(2**@sidbits - 1)
+          end
+        rescue NotImplementedError
+          generate_sid(false)
+        end
+
+        # Sets the lazy session at 'rack.session' and places options and session
+        # metadata into 'rack.session.options'.
+
+        def prepare_session(env)
+          session_was                  = env[ENV_SESSION_KEY]
+          env[ENV_SESSION_KEY]         = session_class.new(self, env)
+          env[ENV_SESSION_OPTIONS_KEY] = @default_options.dup
+          env[ENV_SESSION_KEY].merge! session_was if session_was
+        end
+
+        # Extracts the session id from provided cookies and passes it and the
+        # environment to #get_session.
+
+        def load_session(env)
+          sid = current_session_id(env)
+          sid, session = get_session(env, sid)
+          [sid, session || {}]
+        end
+
+        # Extract session id from request object.
+
+        def extract_session_id(env)
+          request = Rack::Request.new(env)
+          sid = request.cookies[@key]
+          sid ||= request.params[@key] unless @cookie_only
+          sid
+        end
+
+        # Returns the current session id from the SessionHash.
+
+        def current_session_id(env)
+          env[ENV_SESSION_KEY].id
+        end
+
+        # Check if the session exists or not.
+
+        def session_exists?(env)
+          value = current_session_id(env)
+          value && !value.empty?
+        end
+
+        # Session should be commited if it was loaded, any of specific options like :renew, :drop
+        # or :expire_after was given and the security permissions match. Skips if skip is given.
+
+        def commit_session?(env, session, options)
+          if options[:skip]
+            false
+          else
+            has_session = loaded_session?(session) || forced_session_update?(session, options)
+            has_session && security_matches?(env, options)
+          end
+        end
+
+        def loaded_session?(session)
+          !session.is_a?(session_class) || session.loaded?
+        end
+
+        def forced_session_update?(session, options)
+          force_options?(options) && session && !session.empty?
+        end
+
+        def force_options?(options)
+          options.values_at(:renew, :drop, :defer, :expire_after).any?
+        end
+
+        def security_matches?(env, options)
+          return true unless options[:secure]
+          request = Rack::Request.new(env)
+          request.ssl?
+        end
+
+        # Acquires the session from the environment and the session id from
+        # the session options and passes them to #set_session. If successful
+        # and the :defer option is not true, a cookie will be added to the
+        # response with the session's id.
+
+        def commit_session(env, status, headers, body)
+          session = env[ENV_SESSION_KEY]
+          options = session.options
+
+          if options[:drop] || options[:renew]
+            session_id = destroy_session(env, session.id || generate_sid, options)
+            return [status, headers, body] unless session_id
+          end
+
+          return [status, headers, body] unless commit_session?(env, session, options)
+
+          session.send(:load!) unless loaded_session?(session)
+          session_id ||= session.id
+          session_data = session.to_hash.delete_if { |k,v| v.nil? }
+
+          if not data = set_session(env, session_id, session_data, options)
+            env["rack.errors"].puts("Warning! #{self.class.name} failed to save session. Content dropped.")
+          elsif options[:defer] and not options[:renew]
+            env["rack.errors"].puts("Defering cookie for #{session_id}") if $VERBOSE
+          else
+            cookie = Hash.new
+            cookie[:value] = data
+            cookie[:expires] = Time.now + options[:expire_after] if options[:expire_after]
+            set_cookie(env, headers, cookie.merge!(options))
+          end
+
+          [status, headers, body]
+        end
+
+        # Sets the cookie back to the client with session id. We skip the cookie
+        # setting if the value didn't change (sid is the same) or expires was given.
+
+        def set_cookie(env, headers, cookie)
+          request = Rack::Request.new(env)
+          if request.cookies[@key] != cookie[:value] || cookie[:expires]
+            Utils.set_cookie_header!(headers, @key, cookie)
+          end
+        end
+
+        # Allow subclasses to prepare_session for different Session classes
+
+        def session_class
+          SessionHash
+        end
+
+        # All thread safety and session retrival proceedures should occur here.
+        # Should return [session_id, session].
+        # If nil is provided as the session id, generation of a new valid id
+        # should occur within.
+
+        def get_session(env, sid)
+          raise '#get_session not implemented.'
+        end
+
+        # All thread safety and session storage proceedures should occur here.
+        # Must return the session id if the session was saved successfully, or
+        # false if the session could not be saved.
+
+        def set_session(env, sid, session, options)
+          raise '#set_session not implemented.'
+        end
+
+        # All thread safety and session destroy proceedures should occur here.
+        # Should return a new session id or nil if options[:drop]
+
+        def destroy_session(env, sid, options)
+          raise '#destroy_session not implemented'
+        end
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/cookie.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/cookie.rb
new file mode 100644
index 0000000..5aa80cb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/cookie.rb
@@ -0,0 +1,178 @@
+require 'openssl'
+require 'rack/request'
+require 'rack/response'
+require 'rack/session/abstract/id'
+
+module Rack
+
+  module Session
+
+    # Rack::Session::Cookie provides simple cookie based session management.
+    # By default, the session is a Ruby Hash stored as base64 encoded marshalled
+    # data set to :key (default: rack.session).  The object that encodes the
+    # session data is configurable and must respond to +encode+ and +decode+.
+    # Both methods must take a string and return a string.
+    #
+    # When the secret key is set, cookie data is checked for data integrity.
+    # The old secret key is also accepted and allows graceful secret rotation.
+    #
+    # Example:
+    #
+    #     use Rack::Session::Cookie, :key => 'rack.session',
+    #                                :domain => 'foo.com',
+    #                                :path => '/',
+    #                                :expire_after => 2592000,
+    #                                :secret => 'change_me',
+    #                                :old_secret => 'also_change_me'
+    #
+    #     All parameters are optional.
+    #
+    # Example of a cookie with no encoding:
+    #
+    #   Rack::Session::Cookie.new(application, {
+    #     :coder => Rack::Session::Cookie::Identity.new
+    #   })
+    #
+    # Example of a cookie with custom encoding:
+    #
+    #   Rack::Session::Cookie.new(application, {
+    #     :coder => Class.new {
+    #       def encode(str); str.reverse; end
+    #       def decode(str); str.reverse; end
+    #     }.new
+    #   })
+    #
+
+    class Cookie < Abstract::ID
+      # Encode session cookies as Base64
+      class Base64
+        def encode(str)
+          [str].pack('m')
+        end
+
+        def decode(str)
+          str.unpack('m').first
+        end
+
+        # Encode session cookies as Marshaled Base64 data
+        class Marshal < Base64
+          def encode(str)
+            super(::Marshal.dump(str))
+          end
+
+          def decode(str)
+            return unless str
+            ::Marshal.load(super(str)) rescue nil
+          end
+        end
+
+        # N.B. Unlike other encoding methods, the contained objects must be a
+        # valid JSON composite type, either a Hash or an Array.
+        class JSON < Base64
+          def encode(obj)
+            super(::Rack::Utils::OkJson.encode(obj))
+          end
+
+          def decode(str)
+            return unless str
+            ::Rack::Utils::OkJson.decode(super(str)) rescue nil
+          end
+        end
+      end
+
+      # Use no encoding for session cookies
+      class Identity
+        def encode(str); str; end
+        def decode(str); str; end
+      end
+
+      # Reverse string encoding. (trollface)
+      class Reverse
+        def encode(str); str.reverse; end
+        def decode(str); str.reverse; end
+      end
+
+      attr_reader :coder
+
+      def initialize(app, options={})
+        @secrets = options.values_at(:secret, :old_secret).compact
+        warn <<-MSG unless @secrets.size >= 1
+        SECURITY WARNING: No secret option provided to Rack::Session::Cookie.
+        This poses a security threat. It is strongly recommended that you
+        provide a secret to prevent exploits that may be possible from crafted
+        cookies. This will not be supported in future versions of Rack, and
+        future versions will even invalidate your existing user cookies.
+
+        Called from: #{caller[0]}.
+        MSG
+        @coder  = options[:coder] ||= Base64::Marshal.new
+        super(app, options.merge!(:cookie_only => true))
+      end
+
+      private
+
+      def get_session(env, sid)
+        data = unpacked_cookie_data(env)
+        data = persistent_session_id!(data)
+        [data["session_id"], data]
+      end
+
+      def extract_session_id(env)
+        unpacked_cookie_data(env)["session_id"]
+      end
+
+      def unpacked_cookie_data(env)
+        env["rack.session.unpacked_cookie_data"] ||= begin
+          request = Rack::Request.new(env)
+          session_data = request.cookies[@key]
+
+          if @secrets.size > 0 && session_data
+            session_data, digest = session_data.split("--")
+            session_data = nil unless digest_match?(session_data, digest)
+          end
+
+          coder.decode(session_data) || {}
+        end
+      end
+
+      def persistent_session_id!(data, sid=nil)
+        data ||= {}
+        data["session_id"] ||= sid || generate_sid
+        data
+      end
+
+      def set_session(env, session_id, session, options)
+        session = session.merge("session_id" => session_id)
+        session_data = coder.encode(session)
+
+        if @secrets.first
+          session_data << "--#{generate_hmac(session_data, @secrets.first)}"
+        end
+
+        if session_data.size > (4096 - @key.size)
+          env["rack.errors"].puts("Warning! Rack::Session::Cookie data size exceeds 4K.")
+          nil
+        else
+          session_data
+        end
+      end
+
+      def destroy_session(env, session_id, options)
+        # Nothing to do here, data is in the client
+        generate_sid unless options[:drop]
+      end
+
+      def digest_match?(data, digest)
+        return unless data && digest
+        @secrets.any? do |secret|
+          Rack::Utils.secure_compare(digest, generate_hmac(data, secret))
+        end
+      end
+
+      def generate_hmac(data, secret)
+        OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA1.new, secret, data)
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/memcache.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/memcache.rb
new file mode 100644
index 0000000..53261fd
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/memcache.rb
@@ -0,0 +1,93 @@
+# AUTHOR: blink <blinketje at gmail.com>; blink#ruby-lang at irc.freenode.net
+
+require 'rack/session/abstract/id'
+require 'memcache'
+
+module Rack
+  module Session
+    # Rack::Session::Memcache provides simple cookie based session management.
+    # Session data is stored in memcached. The corresponding session key is
+    # maintained in the cookie.
+    # You may treat Session::Memcache as you would Session::Pool with the
+    # following caveats.
+    #
+    # * Setting :expire_after to 0 would note to the Memcache server to hang
+    #   onto the session data until it would drop it according to it's own
+    #   specifications. However, the cookie sent to the client would expire
+    #   immediately.
+    #
+    # Note that memcache does drop data before it may be listed to expire. For
+    # a full description of behaviour, please see memcache's documentation.
+
+    class Memcache < Abstract::ID
+      attr_reader :mutex, :pool
+
+      DEFAULT_OPTIONS = Abstract::ID::DEFAULT_OPTIONS.merge \
+        :namespace => 'rack:session',
+        :memcache_server => 'localhost:11211'
+
+      def initialize(app, options={})
+        super
+
+        @mutex = Mutex.new
+        mserv = @default_options[:memcache_server]
+        mopts = @default_options.reject{|k,v| !MemCache::DEFAULT_OPTIONS.include? k }
+
+        @pool = options[:cache] || MemCache.new(mserv, mopts)
+        unless @pool.active? and @pool.servers.any?{|c| c.alive? }
+          raise 'No memcache servers'
+        end
+      end
+
+      def generate_sid
+        loop do
+          sid = super
+          break sid unless @pool.get(sid, true)
+        end
+      end
+
+      def get_session(env, sid)
+        with_lock(env, [nil, {}]) do
+          unless sid and session = @pool.get(sid)
+            sid, session = generate_sid, {}
+            unless /^STORED/ =~ @pool.add(sid, session)
+              raise "Session collision on '#{sid.inspect}'"
+            end
+          end
+          [sid, session]
+        end
+      end
+
+      def set_session(env, session_id, new_session, options)
+        expiry = options[:expire_after]
+        expiry = expiry.nil? ? 0 : expiry + 1
+
+        with_lock(env, false) do
+          @pool.set session_id, new_session, expiry
+          session_id
+        end
+      end
+
+      def destroy_session(env, session_id, options)
+        with_lock(env) do
+          @pool.delete(session_id)
+          generate_sid unless options[:drop]
+        end
+      end
+
+      def with_lock(env, default=nil)
+        @mutex.lock if env['rack.multithread']
+        yield
+      rescue MemCache::MemCacheError, Errno::ECONNREFUSED
+        if $VERBOSE
+          warn "#{self} is unable to find memcached server."
+          warn $!.inspect
+        end
+        default
+      ensure
+        @mutex.unlock if @mutex.locked?
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/pool.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/pool.rb
new file mode 100644
index 0000000..d4774fe
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/session/pool.rb
@@ -0,0 +1,79 @@
+# AUTHOR: blink <blinketje at gmail.com>; blink#ruby-lang at irc.freenode.net
+# THANKS:
+#   apeiros, for session id generation, expiry setup, and threadiness
+#   sergio, threadiness and bugreps
+
+require 'rack/session/abstract/id'
+require 'thread'
+
+module Rack
+  module Session
+    # Rack::Session::Pool provides simple cookie based session management.
+    # Session data is stored in a hash held by @pool.
+    # In the context of a multithreaded environment, sessions being
+    # committed to the pool is done in a merging manner.
+    #
+    # The :drop option is available in rack.session.options if you wish to
+    # explicitly remove the session from the session cache.
+    #
+    # Example:
+    #   myapp = MyRackApp.new
+    #   sessioned = Rack::Session::Pool.new(myapp,
+    #     :domain => 'foo.com',
+    #     :expire_after => 2592000
+    #   )
+    #   Rack::Handler::WEBrick.run sessioned
+
+    class Pool < Abstract::ID
+      attr_reader :mutex, :pool
+      DEFAULT_OPTIONS = Abstract::ID::DEFAULT_OPTIONS.merge :drop => false
+
+      def initialize(app, options={})
+        super
+        @pool = Hash.new
+        @mutex = Mutex.new
+      end
+
+      def generate_sid
+        loop do
+          sid = super
+          break sid unless @pool.key? sid
+        end
+      end
+
+      def get_session(env, sid)
+        with_lock(env, [nil, {}]) do
+          unless sid and session = @pool[sid]
+            sid, session = generate_sid, {}
+            @pool.store sid, session
+          end
+          [sid, session]
+        end
+      end
+
+      def set_session(env, session_id, new_session, options)
+        with_lock(env, false) do
+          @pool.store session_id, new_session
+          session_id
+        end
+      end
+
+      def destroy_session(env, session_id, options)
+        with_lock(env) do
+          @pool.delete(session_id)
+          generate_sid unless options[:drop]
+        end
+      end
+
+      def with_lock(env, default=nil)
+        @mutex.lock if env['rack.multithread']
+        yield
+      rescue
+        default
+      ensure
+        @mutex.unlock if @mutex.locked?
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/showexceptions.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/showexceptions.rb
new file mode 100644
index 0000000..c91ca07
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/showexceptions.rb
@@ -0,0 +1,378 @@
+require 'ostruct'
+require 'erb'
+require 'rack/request'
+require 'rack/utils'
+
+module Rack
+  # Rack::ShowExceptions catches all exceptions raised from the app it
+  # wraps.  It shows a useful backtrace with the sourcefile and
+  # clickable context, the whole Rack environment and the request
+  # data.
+  #
+  # Be careful when you use this on public-facing sites as it could
+  # reveal information helpful to attackers.
+
+  class ShowExceptions
+    CONTEXT = 7
+
+    def initialize(app)
+      @app = app
+      @template = ERB.new(TEMPLATE)
+    end
+
+    def call(env)
+      @app.call(env)
+    rescue StandardError, LoadError, SyntaxError => e
+      exception_string = dump_exception(e)
+
+      env["rack.errors"].puts(exception_string)
+      env["rack.errors"].flush
+
+      if prefers_plain_text?(env)
+        content_type = "text/plain"
+        body = [exception_string]
+      else
+        content_type = "text/html"
+        body = pretty(env, e)
+      end
+
+      [500,
+       {"Content-Type" => content_type,
+        "Content-Length" => Rack::Utils.bytesize(body.join).to_s},
+       body]
+    end
+
+    def prefers_plain_text?(env)
+      env["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest" && (!env["HTTP_ACCEPT"] || !env["HTTP_ACCEPT"].include?("text/html"))
+    end
+
+    def dump_exception(exception)
+      string = "#{exception.class}: #{exception.message}\n"
+      string << exception.backtrace.map { |l| "\t#{l}" }.join("\n")
+      string
+    end
+
+    def pretty(env, exception)
+      req = Rack::Request.new(env)
+
+      # This double assignment is to prevent an "unused variable" warning on
+      # Ruby 1.9.3.  Yes, it is dumb, but I don't like Ruby yelling at me.
+      path = path = (req.script_name + req.path_info).squeeze("/")
+
+      # This double assignment is to prevent an "unused variable" warning on
+      # Ruby 1.9.3.  Yes, it is dumb, but I don't like Ruby yelling at me.
+      frames = frames = exception.backtrace.map { |line|
+        frame = OpenStruct.new
+        if line =~ /(.*?):(\d+)(:in `(.*)')?/
+          frame.filename = $1
+          frame.lineno = $2.to_i
+          frame.function = $4
+
+          begin
+            lineno = frame.lineno-1
+            lines = ::File.readlines(frame.filename)
+            frame.pre_context_lineno = [lineno-CONTEXT, 0].max
+            frame.pre_context = lines[frame.pre_context_lineno...lineno]
+            frame.context_line = lines[lineno].chomp
+            frame.post_context_lineno = [lineno+CONTEXT, lines.size].min
+            frame.post_context = lines[lineno+1..frame.post_context_lineno]
+          rescue
+          end
+
+          frame
+        else
+          nil
+        end
+      }.compact
+
+      [@template.result(binding)]
+    end
+
+    def h(obj)                  # :nodoc:
+      case obj
+      when String
+        Utils.escape_html(obj)
+      else
+        Utils.escape_html(obj.inspect)
+      end
+    end
+
+    # :stopdoc:
+
+# adapted from Django <djangoproject.com>
+# Copyright (c) 2005, the Lawrence Journal-World
+# Used under the modified BSD license:
+# http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5
+TEMPLATE = <<'HTML'
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <meta name="robots" content="NONE,NOARCHIVE" />
+  <title><%=h exception.class %> at <%=h path %></title>
+  <style type="text/css">
+    html * { padding:0; margin:0; }
+    body * { padding:10px 20px; }
+    body * * { padding:0; }
+    body { font:small sans-serif; }
+    body>div { border-bottom:1px solid #ddd; }
+    h1 { font-weight:normal; }
+    h2 { margin-bottom:.8em; }
+    h2 span { font-size:80%; color:#666; font-weight:normal; }
+    h3 { margin:1em 0 .5em 0; }
+    h4 { margin:0 0 .5em 0; font-weight: normal; }
+    table {
+        border:1px solid #ccc; border-collapse: collapse; background:white; }
+    tbody td, tbody th { vertical-align:top; padding:2px 3px; }
+    thead th {
+        padding:1px 6px 1px 3px; background:#fefefe; text-align:left;
+        font-weight:normal; font-size:11px; border:1px solid #ddd; }
+    tbody th { text-align:right; color:#666; padding-right:.5em; }
+    table.vars { margin:5px 0 2px 40px; }
+    table.vars td, table.req td { font-family:monospace; }
+    table td.code { width:100%;}
+    table td.code div { overflow:hidden; }
+    table.source th { color:#666; }
+    table.source td {
+        font-family:monospace; white-space:pre; border-bottom:1px solid #eee; }
+    ul.traceback { list-style-type:none; }
+    ul.traceback li.frame { margin-bottom:1em; }
+    div.context { margin: 10px 0; }
+    div.context ol {
+        padding-left:30px; margin:0 10px; list-style-position: inside; }
+    div.context ol li {
+        font-family:monospace; white-space:pre; color:#666; cursor:pointer; }
+    div.context ol.context-line li { color:black; background-color:#ccc; }
+    div.context ol.context-line li span { float: right; }
+    div.commands { margin-left: 40px; }
+    div.commands a { color:black; text-decoration:none; }
+    #summary { background: #ffc; }
+    #summary h2 { font-weight: normal; color: #666; }
+    #summary ul#quicklinks { list-style-type: none; margin-bottom: 2em; }
+    #summary ul#quicklinks li { float: left; padding: 0 1em; }
+    #summary ul#quicklinks>li+li { border-left: 1px #666 solid; }
+    #explanation { background:#eee; }
+    #template, #template-not-exist { background:#f6f6f6; }
+    #template-not-exist ul { margin: 0 0 0 20px; }
+    #traceback { background:#eee; }
+    #requestinfo { background:#f6f6f6; padding-left:120px; }
+    #summary table { border:none; background:transparent; }
+    #requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; }
+    #requestinfo h3 { margin-bottom:-1em; }
+    .error { background: #ffc; }
+    .specific { color:#cc3300; font-weight:bold; }
+  </style>
+  <script type="text/javascript">
+  //<!--
+    function getElementsByClassName(oElm, strTagName, strClassName){
+        // Written by Jonathan Snook, http://www.snook.ca/jon;
+        // Add-ons by Robert Nyman, http://www.robertnyman.com
+        var arrElements = (strTagName == "*" && document.all)? document.all :
+        oElm.getElementsByTagName(strTagName);
+        var arrReturnElements = new Array();
+        strClassName = strClassName.replace(/\-/g, "\\-");
+        var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$$)");
+        var oElement;
+        for(var i=0; i<arrElements.length; i++){
+            oElement = arrElements[i];
+            if(oRegExp.test(oElement.className)){
+                arrReturnElements.push(oElement);
+            }
+        }
+        return (arrReturnElements)
+    }
+    function hideAll(elems) {
+      for (var e = 0; e < elems.length; e++) {
+        elems[e].style.display = 'none';
+      }
+    }
+    window.onload = function() {
+      hideAll(getElementsByClassName(document, 'table', 'vars'));
+      hideAll(getElementsByClassName(document, 'ol', 'pre-context'));
+      hideAll(getElementsByClassName(document, 'ol', 'post-context'));
+    }
+    function toggle() {
+      for (var i = 0; i < arguments.length; i++) {
+        var e = document.getElementById(arguments[i]);
+        if (e) {
+          e.style.display = e.style.display == 'none' ? 'block' : 'none';
+        }
+      }
+      return false;
+    }
+    function varToggle(link, id) {
+      toggle('v' + id);
+      var s = link.getElementsByTagName('span')[0];
+      var uarr = String.fromCharCode(0x25b6);
+      var darr = String.fromCharCode(0x25bc);
+      s.innerHTML = s.innerHTML == uarr ? darr : uarr;
+      return false;
+    }
+    //-->
+  </script>
+</head>
+<body>
+
+<div id="summary">
+  <h1><%=h exception.class %> at <%=h path %></h1>
+  <h2><%=h exception.message %></h2>
+  <table><tr>
+    <th>Ruby</th>
+    <td>
+<% if first = frames.first %>
+      <code><%=h first.filename %></code>: in <code><%=h first.function %></code>, line <%=h frames.first.lineno %>
+<% else %>
+      unknown location
+<% end %>
+    </td>
+  </tr><tr>
+    <th>Web</th>
+    <td><code><%=h req.request_method %> <%=h(req.host + path)%></code></td>
+  </tr></table>
+
+  <h3>Jump to:</h3>
+  <ul id="quicklinks">
+    <li><a href="#get-info">GET</a></li>
+    <li><a href="#post-info">POST</a></li>
+    <li><a href="#cookie-info">Cookies</a></li>
+    <li><a href="#env-info">ENV</a></li>
+  </ul>
+</div>
+
+<div id="traceback">
+  <h2>Traceback <span>(innermost first)</span></h2>
+  <ul class="traceback">
+<% frames.each { |frame| %>
+      <li class="frame">
+        <code><%=h frame.filename %></code>: in <code><%=h frame.function %></code>
+
+          <% if frame.context_line %>
+          <div class="context" id="c<%=h frame.object_id %>">
+              <% if frame.pre_context %>
+              <ol start="<%=h frame.pre_context_lineno+1 %>" class="pre-context" id="pre<%=h frame.object_id %>">
+                <% frame.pre_context.each { |line| %>
+                <li onclick="toggle('pre<%=h frame.object_id %>', 'post<%=h frame.object_id %>')"><%=h line %></li>
+                <% } %>
+              </ol>
+              <% end %>
+
+            <ol start="<%=h frame.lineno %>" class="context-line">
+              <li onclick="toggle('pre<%=h frame.object_id %>', 'post<%=h frame.object_id %>')"><%=h frame.context_line %><span>...</span></li></ol>
+
+              <% if frame.post_context %>
+              <ol start='<%=h frame.lineno+1 %>' class="post-context" id="post<%=h frame.object_id %>">
+                <% frame.post_context.each { |line| %>
+                <li onclick="toggle('pre<%=h frame.object_id %>', 'post<%=h frame.object_id %>')"><%=h line %></li>
+                <% } %>
+              </ol>
+              <% end %>
+          </div>
+          <% end %>
+      </li>
+<% } %>
+  </ul>
+</div>
+
+<div id="requestinfo">
+  <h2>Request information</h2>
+
+  <h3 id="get-info">GET</h3>
+  <% if req.GET and not req.GET.empty? %>
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+          <% req.GET.sort_by { |k, v| k.to_s }.each { |key, val| %>
+          <tr>
+            <td><%=h key %></td>
+            <td class="code"><div><%=h val.inspect %></div></td>
+          </tr>
+          <% } %>
+      </tbody>
+    </table>
+  <% else %>
+    <p>No GET data.</p>
+  <% end %>
+
+  <h3 id="post-info">POST</h3>
+  <% if req.POST and not req.POST.empty? %>
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+          <% req.POST.sort_by { |k, v| k.to_s }.each { |key, val| %>
+          <tr>
+            <td><%=h key %></td>
+            <td class="code"><div><%=h val.inspect %></div></td>
+          </tr>
+          <% } %>
+      </tbody>
+    </table>
+  <% else %>
+    <p>No POST data.</p>
+  <% end %>
+
+
+  <h3 id="cookie-info">COOKIES</h3>
+  <% unless req.cookies.empty? %>
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+        <% req.cookies.each { |key, val| %>
+          <tr>
+            <td><%=h key %></td>
+            <td class="code"><div><%=h val.inspect %></div></td>
+          </tr>
+        <% } %>
+      </tbody>
+    </table>
+  <% else %>
+    <p>No cookie data.</p>
+  <% end %>
+
+  <h3 id="env-info">Rack ENV</h3>
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+          <% env.sort_by { |k, v| k.to_s }.each { |key, val| %>
+          <tr>
+            <td><%=h key %></td>
+            <td class="code"><div><%=h val %></div></td>
+          </tr>
+          <% } %>
+      </tbody>
+    </table>
+
+</div>
+
+<div id="explanation">
+  <p>
+    You're seeing this error because you use <code>Rack::ShowExceptions</code>.
+  </p>
+</div>
+
+</body>
+</html>
+HTML
+
+    # :startdoc:
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/showstatus.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/showstatus.rb
new file mode 100644
index 0000000..5a9506f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/showstatus.rb
@@ -0,0 +1,113 @@
+require 'erb'
+require 'rack/request'
+require 'rack/utils'
+
+module Rack
+  # Rack::ShowStatus catches all empty responses and replaces them 
+  # with a site explaining the error.
+  #
+  # Additional details can be put into <tt>rack.showstatus.detail</tt>
+  # and will be shown as HTML.  If such details exist, the error page
+  # is always rendered, even if the reply was not empty.
+
+  class ShowStatus
+    def initialize(app)
+      @app = app
+      @template = ERB.new(TEMPLATE)
+    end
+
+    def call(env)
+      status, headers, body = @app.call(env)
+      headers = Utils::HeaderHash.new(headers)
+      empty = headers['Content-Length'].to_i <= 0
+
+      # client or server error, or explicit message
+      if (status.to_i >= 400 && empty) || env["rack.showstatus.detail"]
+        # This double assignment is to prevent an "unused variable" warning on
+        # Ruby 1.9.3.  Yes, it is dumb, but I don't like Ruby yelling at me.
+        req = req = Rack::Request.new(env)
+
+        message = Rack::Utils::HTTP_STATUS_CODES[status.to_i] || status.to_s
+
+        # This double assignment is to prevent an "unused variable" warning on
+        # Ruby 1.9.3.  Yes, it is dumb, but I don't like Ruby yelling at me.
+        detail = detail = env["rack.showstatus.detail"] || message
+
+        body = @template.result(binding)
+        size = Rack::Utils.bytesize(body)
+        [status, headers.merge("Content-Type" => "text/html", "Content-Length" => size.to_s), [body]]
+      else
+        [status, headers, body]
+      end
+    end
+
+    def h(obj)                  # :nodoc:
+      case obj
+      when String
+        Utils.escape_html(obj)
+      else
+        Utils.escape_html(obj.inspect)
+      end
+    end
+
+    # :stopdoc:
+
+# adapted from Django <djangoproject.com>
+# Copyright (c) 2005, the Lawrence Journal-World
+# Used under the modified BSD license:
+# http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5
+TEMPLATE = <<'HTML'
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <title><%=h message %> at <%=h req.script_name + req.path_info %></title>
+  <meta name="robots" content="NONE,NOARCHIVE" />
+  <style type="text/css">
+    html * { padding:0; margin:0; }
+    body * { padding:10px 20px; }
+    body * * { padding:0; }
+    body { font:small sans-serif; background:#eee; }
+    body>div { border-bottom:1px solid #ddd; }
+    h1 { font-weight:normal; margin-bottom:.4em; }
+    h1 span { font-size:60%; color:#666; font-weight:normal; }
+    table { border:none; border-collapse: collapse; width:100%; }
+    td, th { vertical-align:top; padding:2px 3px; }
+    th { width:12em; text-align:right; color:#666; padding-right:.5em; }
+    #info { background:#f6f6f6; }
+    #info ol { margin: 0.5em 4em; }
+    #info ol li { font-family: monospace; }
+    #summary { background: #ffc; }
+    #explanation { background:#eee; border-bottom: 0px none; }
+  </style>
+</head>
+<body>
+  <div id="summary">
+    <h1><%=h message %> <span>(<%= status.to_i %>)</span></h1>
+    <table class="meta">
+      <tr>
+        <th>Request Method:</th>
+        <td><%=h req.request_method %></td>
+      </tr>
+      <tr>
+        <th>Request URL:</th>
+      <td><%=h req.url %></td>
+      </tr>
+    </table>
+  </div>
+  <div id="info">
+    <p><%= detail %></p>
+  </div>
+
+  <div id="explanation">
+    <p>
+    You're seeing this error because you use <code>Rack::ShowStatus</code>.
+    </p>
+  </div>
+</body>
+</html>
+HTML
+
+    # :startdoc:
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/static.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/static.rb
new file mode 100644
index 0000000..46bc66d
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/static.rb
@@ -0,0 +1,153 @@
+module Rack
+
+  # The Rack::Static middleware intercepts requests for static files
+  # (javascript files, images, stylesheets, etc) based on the url prefixes or
+  # route mappings passed in the options, and serves them using a Rack::File
+  # object. This allows a Rack stack to serve both static and dynamic content.
+  #
+  # Examples:
+  #
+  # Serve all requests beginning with /media from the "media" folder located
+  # in the current directory (ie media/*):
+  #
+  #     use Rack::Static, :urls => ["/media"]
+  #
+  # Serve all requests beginning with /css or /images from the folder "public"
+  # in the current directory (ie public/css/* and public/images/*):
+  #
+  #     use Rack::Static, :urls => ["/css", "/images"], :root => "public"
+  #
+  # Serve all requests to / with "index.html" from the folder "public" in the
+  # current directory (ie public/index.html):
+  #
+  #     use Rack::Static, :urls => {"/" => 'index.html'}, :root => 'public'
+  #
+  # Serve all requests normally from the folder "public" in the current
+  # directory but uses index.html as default route for "/"
+  #
+  #     use Rack::Static, :urls => [""], :root => 'public', :index =>
+  #     'index.html'
+  #
+  # Set custom HTTP Headers for based on rules:
+  #
+  #     use Rack::Static, :root => 'public',
+  #         :header_rules => [
+  #           [rule, {header_field => content, header_field => content}],
+  #           [rule, {header_field => content}]
+  #         ]
+  #
+  #  Rules for selecting files:
+  #
+  #  1) All files
+  #     Provide the :all symbol
+  #     :all => Matches every file
+  #
+  #  2) Folders
+  #     Provide the folder path as a string
+  #     '/folder' or '/folder/subfolder' => Matches files in a certain folder
+  #
+  #  3) File Extensions
+  #     Provide the file extensions as an array
+  #     ['css', 'js'] or %w(css js) => Matches files ending in .css or .js
+  #
+  #  4) Regular Expressions / Regexp
+  #     Provide a regular expression
+  #     %r{\.(?:css|js)\z} => Matches files ending in .css or .js
+  #     /\.(?:eot|ttf|otf|woff|svg)\z/ => Matches files ending in
+  #       the most common web font formats (.eot, .ttf, .otf, .woff, .svg)
+  #       Note: This Regexp is available as a shortcut, using the :fonts rule
+  #
+  #  5) Font Shortcut
+  #     Provide the :fonts symbol
+  #     :fonts => Uses the Regexp rule stated right above to match all common web font endings
+  #
+  #  Rule Ordering:
+  #    Rules are applied in the order that they are provided.
+  #    List rather general rules above special ones.
+  #
+  #  Complete example use case including HTTP header rules:
+  #
+  #     use Rack::Static, :root => 'public',
+  #         :header_rules => [
+  #           # Cache all static files in public caches (e.g. Rack::Cache)
+  #           #  as well as in the browser
+  #           [:all, {'Cache-Control' => 'public, max-age=31536000'}],
+  #
+  #           # Provide web fonts with cross-origin access-control-headers
+  #           #  Firefox requires this when serving assets using a Content Delivery Network
+  #           [:fonts, {'Access-Control-Allow-Origin' => '*'}]
+  #         ]
+  #
+  class Static
+
+    def initialize(app, options={})
+      @app = app
+      @urls = options[:urls] || ["/favicon.ico"]
+      @index = options[:index]
+      root = options[:root] || Dir.pwd
+
+      # HTTP Headers
+      @header_rules = options[:header_rules] || []
+      # Allow for legacy :cache_control option while prioritizing global header_rules setting
+      @header_rules.insert(0, [:all, {'Cache-Control' => options[:cache_control]}]) if options[:cache_control]
+      @headers = {}
+
+      @file_server = Rack::File.new(root, @headers)
+    end
+
+    def overwrite_file_path(path)
+      @urls.kind_of?(Hash) && @urls.key?(path) || @index && path =~ /\/$/
+    end
+
+    def route_file(path)
+      @urls.kind_of?(Array) && @urls.any? { |url| path.index(url) == 0 }
+    end
+
+    def can_serve(path)
+      route_file(path) || overwrite_file_path(path)
+    end
+
+    def call(env)
+      path = env["PATH_INFO"]
+
+      if can_serve(path)
+        env["PATH_INFO"] = (path =~ /\/$/ ? path + @index : @urls[path]) if overwrite_file_path(path)
+        @path = env["PATH_INFO"]
+        apply_header_rules
+        @file_server.call(env)
+      else
+        @app.call(env)
+      end
+    end
+
+    # Convert HTTP header rules to HTTP headers
+    def apply_header_rules
+      @header_rules.each do |rule, headers|
+        apply_rule(rule, headers)
+      end
+    end
+
+    def apply_rule(rule, headers)
+      case rule
+      when :all    # All files
+        set_headers(headers)
+      when :fonts  # Fonts Shortcut
+        set_headers(headers) if @path.match(/\.(?:ttf|otf|eot|woff|svg)\z/)
+      when String  # Folder
+        path = ::Rack::Utils.unescape(@path)
+        set_headers(headers) if (path.start_with?(rule) || path.start_with?('/' + rule))
+      when Array   # Extension/Extensions
+        extensions = rule.join('|')
+        set_headers(headers) if @path.match(/\.(#{extensions})\z/)
+      when Regexp  # Flexible Regexp
+        set_headers(headers) if @path.match(rule)
+      else
+      end
+    end
+
+    def set_headers(headers)
+      headers.each { |field, content| @headers[field] = content }
+    end
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/urlmap.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/urlmap.rb
new file mode 100644
index 0000000..d301ce9
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/urlmap.rb
@@ -0,0 +1,76 @@
+module Rack
+  # Rack::URLMap takes a hash mapping urls or paths to apps, and
+  # dispatches accordingly.  Support for HTTP/1.1 host names exists if
+  # the URLs start with <tt>http://</tt> or <tt>https://</tt>.
+  #
+  # URLMap modifies the SCRIPT_NAME and PATH_INFO such that the part
+  # relevant for dispatch is in the SCRIPT_NAME, and the rest in the
+  # PATH_INFO.  This should be taken care of when you need to
+  # reconstruct the URL in order to create links.
+  #
+  # URLMap dispatches in such a way that the longest paths are tried
+  # first, since they are most specific.
+
+  class URLMap
+    NEGATIVE_INFINITY = -1.0 / 0.0
+    INFINITY = 1.0 / 0.0
+
+    def initialize(map = {})
+      remap(map)
+    end
+
+    def remap(map)
+      @mapping = map.map { |location, app|
+        if location =~ %r{\Ahttps?://(.*?)(/.*)}
+          host, location = $1, $2
+        else
+          host = nil
+        end
+
+        unless location[0] == ?/
+          raise ArgumentError, "paths need to start with /"
+        end
+
+        location = location.chomp('/')
+        match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n')
+
+        [host, location, match, app]
+      }.sort_by do |(host, location, _, _)|
+        [host ? -host.size : INFINITY, -location.size]
+      end
+    end
+
+    def call(env)
+      path = env["PATH_INFO"]
+      script_name = env['SCRIPT_NAME']
+      hHost = env['HTTP_HOST']
+      sName = env['SERVER_NAME']
+      sPort = env['SERVER_PORT']
+
+      @mapping.each do |host, location, match, app|
+        unless hHost == host \
+            || sName == host \
+            || (!host && (hHost == sName || hHost == sName+':'+sPort))
+          next
+        end
+
+        next unless m = match.match(path.to_s)
+
+        rest = m[1]
+        next unless !rest || rest.empty? || rest[0] == ?/
+
+        env['SCRIPT_NAME'] = (script_name + location)
+        env['PATH_INFO'] = rest
+
+        return app.call(env)
+      end
+
+      [404, {"Content-Type" => "text/plain", "X-Cascade" => "pass"}, ["Not Found: #{path}"]]
+
+    ensure
+      env['PATH_INFO'] = path
+      env['SCRIPT_NAME'] = script_name
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/utils.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/utils.rb
new file mode 100644
index 0000000..561e46e
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/utils.rb
@@ -0,0 +1,628 @@
+# -*- encoding: binary -*-
+require 'fileutils'
+require 'set'
+require 'tempfile'
+require 'rack/multipart'
+require 'time'
+
+major, minor, patch = RUBY_VERSION.split('.').map { |v| v.to_i }
+
+if major == 1 && minor < 9
+  require 'rack/backports/uri/common_18'
+elsif major == 1 && minor == 9 && patch == 2 && RUBY_PATCHLEVEL <= 320 && RUBY_ENGINE != 'jruby'
+  require 'rack/backports/uri/common_192'
+elsif major == 1 && minor == 9 && patch == 3 && RUBY_PATCHLEVEL < 125
+  require 'rack/backports/uri/common_193'
+else
+  require 'uri/common'
+end
+
+module Rack
+  # Rack::Utils contains a grab-bag of useful methods for writing web
+  # applications adopted from all kinds of Ruby libraries.
+
+  module Utils
+    # URI escapes. (CGI style space to +)
+    def escape(s)
+      URI.encode_www_form_component(s)
+    end
+    module_function :escape
+
+    # Like URI escaping, but with %20 instead of +. Strictly speaking this is
+    # true URI escaping.
+    def escape_path(s)
+      escape(s).gsub('+', '%20')
+    end
+    module_function :escape_path
+
+    # Unescapes a URI escaped string with +encoding+. +encoding+ will be the
+    # target encoding of the string returned, and it defaults to UTF-8
+    if defined?(::Encoding)
+      def unescape(s, encoding = Encoding::UTF_8)
+        URI.decode_www_form_component(s, encoding)
+      end
+    else
+      def unescape(s, encoding = nil)
+        URI.decode_www_form_component(s, encoding)
+      end
+    end
+    module_function :unescape
+
+    DEFAULT_SEP = /[&;] */n
+
+    class << self
+      attr_accessor :key_space_limit
+    end
+
+    # The default number of bytes to allow parameter keys to take up.
+    # This helps prevent a rogue client from flooding a Request.
+    self.key_space_limit = 65536
+
+    # Stolen from Mongrel, with some small modifications:
+    # Parses a query string by breaking it up at the '&'
+    # and ';' characters.  You can also use this to parse
+    # cookies by changing the characters used in the second
+    # parameter (which defaults to '&;').
+    def parse_query(qs, d = nil, &unescaper)
+      unescaper ||= method(:unescape)
+
+      params = KeySpaceConstrainedParams.new
+
+      (qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p|
+        next if p.empty?
+        k, v = p.split('=', 2).map(&unescaper)
+
+        if cur = params[k]
+          if cur.class == Array
+            params[k] << v
+          else
+            params[k] = [cur, v]
+          end
+        else
+          params[k] = v
+        end
+      end
+
+      return params.to_params_hash
+    end
+    module_function :parse_query
+
+    def parse_nested_query(qs, d = nil)
+      params = KeySpaceConstrainedParams.new
+
+      (qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p|
+        k, v = p.split('=', 2).map { |s| unescape(s) }
+
+        normalize_params(params, k, v)
+      end
+
+      return params.to_params_hash
+    end
+    module_function :parse_nested_query
+
+    def normalize_params(params, name, v = nil)
+      name =~ %r(\A[\[\]]*([^\[\]]+)\]*)
+      k = $1 || ''
+      after = $' || ''
+
+      return if k.empty?
+
+      if after == ""
+        params[k] = v
+      elsif after == "[]"
+        params[k] ||= []
+        raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
+        params[k] << v
+      elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$)
+        child_key = $1
+        params[k] ||= []
+        raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
+        if params_hash_type?(params[k].last) && !params[k].last.key?(child_key)
+          normalize_params(params[k].last, child_key, v)
+        else
+          params[k] << normalize_params(params.class.new, child_key, v)
+        end
+      else
+        params[k] ||= params.class.new
+        raise TypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params_hash_type?(params[k])
+        params[k] = normalize_params(params[k], after, v)
+      end
+
+      return params
+    end
+    module_function :normalize_params
+
+    def params_hash_type?(obj)
+      obj.kind_of?(KeySpaceConstrainedParams) || obj.kind_of?(Hash)
+    end
+    module_function :params_hash_type?
+
+    def build_query(params)
+      params.map { |k, v|
+        if v.class == Array
+          build_query(v.map { |x| [k, x] })
+        else
+          v.nil? ? escape(k) : "#{escape(k)}=#{escape(v)}"
+        end
+      }.join("&")
+    end
+    module_function :build_query
+
+    def build_nested_query(value, prefix = nil)
+      case value
+      when Array
+        value.map { |v|
+          build_nested_query(v, "#{prefix}[]")
+        }.join("&")
+      when Hash
+        value.map { |k, v|
+          build_nested_query(v, prefix ? "#{prefix}[#{escape(k)}]" : escape(k))
+        }.join("&")
+      when String
+        raise ArgumentError, "value must be a Hash" if prefix.nil?
+        "#{prefix}=#{escape(value)}"
+      else
+        prefix
+      end
+    end
+    module_function :build_nested_query
+
+    def q_values(q_value_header)
+      q_value_header.to_s.split(/\s*,\s*/).map do |part|
+        value, parameters = part.split(/\s*;\s*/, 2)
+        quality = 1.0
+        if md = /\Aq=([\d.]+)/.match(parameters)
+          quality = md[1].to_f
+        end
+        [value, quality]
+      end
+    end
+    module_function :q_values
+
+    def best_q_match(q_value_header, available_mimes)
+      values = q_values(q_value_header)
+
+      values.map do |req_mime, quality|
+        match = available_mimes.first { |am| Rack::Mime.match?(am, req_mime) }
+        next unless match
+        [match, quality]
+      end.compact.sort_by do |match, quality|
+        (match.split('/', 2).count('*') * -10) + quality
+      end.last.first
+    end
+    module_function :best_q_match
+
+    ESCAPE_HTML = {
+      "&" => "&",
+      "<" => "<",
+      ">" => ">",
+      "'" => "&#x27;",
+      '"' => """,
+      "/" => "&#x2F;"
+    }
+    if //.respond_to?(:encoding)
+      ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys)
+    else
+      # On 1.8, there is a kcode = 'u' bug that allows for XSS otherwhise
+      # TODO doesn't apply to jruby, so a better condition above might be preferable?
+      ESCAPE_HTML_PATTERN = /#{Regexp.union(*ESCAPE_HTML.keys)}/n
+    end
+
+    # Escape ampersands, brackets and quotes to their HTML/XML entities.
+    def escape_html(string)
+      string.to_s.gsub(ESCAPE_HTML_PATTERN){|c| ESCAPE_HTML[c] }
+    end
+    module_function :escape_html
+
+    def select_best_encoding(available_encodings, accept_encoding)
+      # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
+
+      expanded_accept_encoding =
+        accept_encoding.map { |m, q|
+          if m == "*"
+            (available_encodings - accept_encoding.map { |m2, _| m2 }).map { |m2| [m2, q] }
+          else
+            [[m, q]]
+          end
+        }.inject([]) { |mem, list|
+          mem + list
+        }
+
+      encoding_candidates = expanded_accept_encoding.sort_by { |_, q| -q }.map { |m, _| m }
+
+      unless encoding_candidates.include?("identity")
+        encoding_candidates.push("identity")
+      end
+
+      expanded_accept_encoding.find_all { |m, q|
+        q == 0.0
+      }.each { |m, _|
+        encoding_candidates.delete(m)
+      }
+
+      return (encoding_candidates & available_encodings)[0]
+    end
+    module_function :select_best_encoding
+
+    def set_cookie_header!(header, key, value)
+      case value
+      when Hash
+        domain  = "; domain="  + value[:domain] if value[:domain]
+        path    = "; path="    + value[:path]   if value[:path]
+        max_age = "; max-age=" + value[:max_age] if value[:max_age]
+        # There is an RFC mess in the area of date formatting for Cookies. Not
+        # only are there contradicting RFCs and examples within RFC text, but
+        # there are also numerous conflicting names of fields and partially
+        # cross-applicable specifications.
+        #
+        # These are best described in RFC 2616 3.3.1. This RFC text also
+        # specifies that RFC 822 as updated by RFC 1123 is preferred. That is a
+        # fixed length format with space-date delimeted fields.
+        #
+        # See also RFC 1123 section 5.2.14.
+        #
+        # RFC 6265 also specifies "sane-cookie-date" as RFC 1123 date, defined
+        # in RFC 2616 3.3.1. RFC 6265 also gives examples that clearly denote
+        # the space delimited format. These formats are compliant with RFC 2822.
+        #
+        # For reference, all involved RFCs are:
+        # RFC 822
+        # RFC 1123
+        # RFC 2109
+        # RFC 2616
+        # RFC 2822
+        # RFC 2965
+        # RFC 6265
+        expires = "; expires=" +
+          rfc2822(value[:expires].clone.gmtime) if value[:expires]
+        secure = "; secure"  if value[:secure]
+        httponly = "; HttpOnly" if value[:httponly]
+        value = value[:value]
+      end
+      value = [value] unless Array === value
+      cookie = escape(key) + "=" +
+        value.map { |v| escape v }.join("&") +
+        "#{domain}#{path}#{max_age}#{expires}#{secure}#{httponly}"
+
+      case header["Set-Cookie"]
+      when nil, ''
+        header["Set-Cookie"] = cookie
+      when String
+        header["Set-Cookie"] = [header["Set-Cookie"], cookie].join("\n")
+      when Array
+        header["Set-Cookie"] = (header["Set-Cookie"] + [cookie]).join("\n")
+      end
+
+      nil
+    end
+    module_function :set_cookie_header!
+
+    def delete_cookie_header!(header, key, value = {})
+      case header["Set-Cookie"]
+      when nil, ''
+        cookies = []
+      when String
+        cookies = header["Set-Cookie"].split("\n")
+      when Array
+        cookies = header["Set-Cookie"]
+      end
+
+      cookies.reject! { |cookie|
+        if value[:domain]
+          cookie =~ /\A#{escape(key)}=.*domain=#{value[:domain]}/
+        elsif value[:path]
+          cookie =~ /\A#{escape(key)}=.*path=#{value[:path]}/
+        else
+          cookie =~ /\A#{escape(key)}=/
+        end
+      }
+
+      header["Set-Cookie"] = cookies.join("\n")
+
+      set_cookie_header!(header, key,
+                 {:value => '', :path => nil, :domain => nil,
+                   :max_age => '0',
+                   :expires => Time.at(0) }.merge(value))
+
+      nil
+    end
+    module_function :delete_cookie_header!
+
+    # Return the bytesize of String; uses String#size under Ruby 1.8 and
+    # String#bytesize under 1.9.
+    if ''.respond_to?(:bytesize)
+      def bytesize(string)
+        string.bytesize
+      end
+    else
+      def bytesize(string)
+        string.size
+      end
+    end
+    module_function :bytesize
+
+    def rfc2822(time)
+      time.rfc2822
+    end
+    module_function :rfc2822
+
+    # Modified version of stdlib time.rb Time#rfc2822 to use '%d-%b-%Y' instead
+    # of '% %b %Y'.
+    # It assumes that the time is in GMT to comply to the RFC 2109.
+    #
+    # NOTE: I'm not sure the RFC says it requires GMT, but is ambigous enough
+    # that I'm certain someone implemented only that option.
+    # Do not use %a and %b from Time.strptime, it would use localized names for
+    # weekday and month.
+    #
+    def rfc2109(time)
+      wday = Time::RFC2822_DAY_NAME[time.wday]
+      mon = Time::RFC2822_MONTH_NAME[time.mon - 1]
+      time.strftime("#{wday}, %d-#{mon}-%Y %H:%M:%S GMT")
+    end
+    module_function :rfc2109
+
+    # Parses the "Range:" header, if present, into an array of Range objects.
+    # Returns nil if the header is missing or syntactically invalid.
+    # Returns an empty array if none of the ranges are satisfiable.
+    def byte_ranges(env, size)
+      # See <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35>
+      http_range = env['HTTP_RANGE']
+      return nil unless http_range && http_range =~ /bytes=([^;]+)/
+      ranges = []
+      $1.split(/,\s*/).each do |range_spec|
+        return nil  unless range_spec =~ /(\d*)-(\d*)/
+        r0,r1 = $1, $2
+        if r0.empty?
+          return nil  if r1.empty?
+          # suffix-byte-range-spec, represents trailing suffix of file
+          r0 = size - r1.to_i
+          r0 = 0  if r0 < 0
+          r1 = size - 1
+        else
+          r0 = r0.to_i
+          if r1.empty?
+            r1 = size - 1
+          else
+            r1 = r1.to_i
+            return nil  if r1 < r0  # backwards range is syntactically invalid
+            r1 = size-1  if r1 >= size
+          end
+        end
+        ranges << (r0..r1)  if r0 <= r1
+      end
+      ranges
+    end
+    module_function :byte_ranges
+
+    # Constant time string comparison.
+    def secure_compare(a, b)
+      return false unless bytesize(a) == bytesize(b)
+
+      l = a.unpack("C*")
+
+      r, i = 0, -1
+      b.each_byte { |v| r |= v ^ l[i+=1] }
+      r == 0
+    end
+    module_function :secure_compare
+
+    # Context allows the use of a compatible middleware at different points
+    # in a request handling stack. A compatible middleware must define
+    # #context which should take the arguments env and app. The first of which
+    # would be the request environment. The second of which would be the rack
+    # application that the request would be forwarded to.
+    class Context
+      attr_reader :for, :app
+
+      def initialize(app_f, app_r)
+        raise 'running context does not respond to #context' unless app_f.respond_to? :context
+        @for, @app = app_f, app_r
+      end
+
+      def call(env)
+        @for.context(env, @app)
+      end
+
+      def recontext(app)
+        self.class.new(@for, app)
+      end
+
+      def context(env, app=@app)
+        recontext(app).call(env)
+      end
+    end
+
+    # A case-insensitive Hash that preserves the original case of a
+    # header when set.
+    class HeaderHash < Hash
+      def self.new(hash={})
+        HeaderHash === hash ? hash : super(hash)
+      end
+
+      def initialize(hash={})
+        super()
+        @names = {}
+        hash.each { |k, v| self[k] = v }
+      end
+
+      def each
+        super do |k, v|
+          yield(k, v.respond_to?(:to_ary) ? v.to_ary.join("\n") : v)
+        end
+      end
+
+      def to_hash
+        hash = {}
+        each { |k,v| hash[k] = v }
+        hash
+      end
+
+      def [](k)
+        super(k) || super(@names[k.downcase])
+      end
+
+      def []=(k, v)
+        canonical = k.downcase
+        delete k if @names[canonical] && @names[canonical] != k # .delete is expensive, don't invoke it unless necessary
+        @names[k] = @names[canonical] = k
+        super k, v
+      end
+
+      def delete(k)
+        canonical = k.downcase
+        result = super @names.delete(canonical)
+        @names.delete_if { |name,| name.downcase == canonical }
+        result
+      end
+
+      def include?(k)
+        @names.include?(k) || @names.include?(k.downcase)
+      end
+
+      alias_method :has_key?, :include?
+      alias_method :member?, :include?
+      alias_method :key?, :include?
+
+      def merge!(other)
+        other.each { |k, v| self[k] = v }
+        self
+      end
+
+      def merge(other)
+        hash = dup
+        hash.merge! other
+      end
+
+      def replace(other)
+        clear
+        other.each { |k, v| self[k] = v }
+        self
+      end
+    end
+
+    class KeySpaceConstrainedParams
+      def initialize(limit = Utils.key_space_limit)
+        @limit  = limit
+        @size   = 0
+        @params = {}
+      end
+
+      def [](key)
+        @params[key]
+      end
+
+      def []=(key, value)
+        @size += key.size if key && !@params.key?(key)
+        raise RangeError, 'exceeded available parameter key space' if @size > @limit
+        @params[key] = value
+      end
+
+      def key?(key)
+        @params.key?(key)
+      end
+
+      def to_params_hash
+        hash = @params
+        hash.keys.each do |key|
+          value = hash[key]
+          if value.kind_of?(self.class)
+            hash[key] = value.to_params_hash
+          elsif value.kind_of?(Array)
+            value.map! {|x| x.kind_of?(self.class) ? x.to_params_hash : x}
+          end
+        end
+        hash
+      end
+    end
+
+    # Every standard HTTP code mapped to the appropriate message.
+    # Generated with:
+    # irb -ropen-uri -rnokogiri
+    # > Nokogiri::XML(open("http://www.iana.org/assignments/http-status-codes/http-status-codes.xml")).css("record").each{|r|
+    #         puts "#{r.css('value').text} => '#{r.css('description').text}'"}
+    HTTP_STATUS_CODES = {
+      100 => 'Continue',
+      101 => 'Switching Protocols',
+      102 => 'Processing',
+      200 => 'OK',
+      201 => 'Created',
+      202 => 'Accepted',
+      203 => 'Non-Authoritative Information',
+      204 => 'No Content',
+      205 => 'Reset Content',
+      206 => 'Partial Content',
+      207 => 'Multi-Status',
+      208 => 'Already Reported',
+      226 => 'IM Used',
+      300 => 'Multiple Choices',
+      301 => 'Moved Permanently',
+      302 => 'Found',
+      303 => 'See Other',
+      304 => 'Not Modified',
+      305 => 'Use Proxy',
+      306 => 'Reserved',
+      307 => 'Temporary Redirect',
+      308 => 'Permanent Redirect',
+      400 => 'Bad Request',
+      401 => 'Unauthorized',
+      402 => 'Payment Required',
+      403 => 'Forbidden',
+      404 => 'Not Found',
+      405 => 'Method Not Allowed',
+      406 => 'Not Acceptable',
+      407 => 'Proxy Authentication Required',
+      408 => 'Request Timeout',
+      409 => 'Conflict',
+      410 => 'Gone',
+      411 => 'Length Required',
+      412 => 'Precondition Failed',
+      413 => 'Request Entity Too Large',
+      414 => 'Request-URI Too Long',
+      415 => 'Unsupported Media Type',
+      416 => 'Requested Range Not Satisfiable',
+      417 => 'Expectation Failed',
+      422 => 'Unprocessable Entity',
+      423 => 'Locked',
+      424 => 'Failed Dependency',
+      425 => 'Reserved for WebDAV advanced collections expired proposal',
+      426 => 'Upgrade Required',
+      427 => 'Unassigned',
+      428 => 'Precondition Required',
+      429 => 'Too Many Requests',
+      430 => 'Unassigned',
+      431 => 'Request Header Fields Too Large',
+      500 => 'Internal Server Error',
+      501 => 'Not Implemented',
+      502 => 'Bad Gateway',
+      503 => 'Service Unavailable',
+      504 => 'Gateway Timeout',
+      505 => 'HTTP Version Not Supported',
+      506 => 'Variant Also Negotiates (Experimental)',
+      507 => 'Insufficient Storage',
+      508 => 'Loop Detected',
+      509 => 'Unassigned',
+      510 => 'Not Extended',
+      511 => 'Network Authentication Required'
+    }
+
+    # Responses with HTTP status codes that should not have an entity body
+    STATUS_WITH_NO_ENTITY_BODY = Set.new((100..199).to_a << 204 << 205 << 304)
+
+    SYMBOL_TO_STATUS_CODE = Hash[*HTTP_STATUS_CODES.map { |code, message|
+      [message.downcase.gsub(/\s|-/, '_').to_sym, code]
+    }.flatten]
+
+    def status_code(status)
+      if status.is_a?(Symbol)
+        SYMBOL_TO_STATUS_CODE[status] || 500
+      else
+        status.to_i
+      end
+    end
+    module_function :status_code
+
+    Multipart = Rack::Multipart
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/utils/okjson.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/utils/okjson.rb
new file mode 100644
index 0000000..dcf80e5
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/lib/rack/utils/okjson.rb
@@ -0,0 +1,599 @@
+# encoding: UTF-8
+#
+# Copyright 2011, 2012 Keith Rarick
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+# See https://github.com/kr/okjson for updates.
+# Imported from the above repo @ d4e8643ad92e14b37d11326855499c7e4108ed17
+# Namespace modified for vendoring under Rack::Utils
+
+require 'stringio'
+
+# Some parts adapted from
+# http://golang.org/src/pkg/json/decode.go and
+# http://golang.org/src/pkg/utf8/utf8.go
+module Rack::Utils::OkJson
+  Upstream = 'LTD7LBKLZWFF7OZK'
+  extend self
+
+
+  # Decodes a json document in string s and
+  # returns the corresponding ruby value.
+  # String s must be valid UTF-8. If you have
+  # a string in some other encoding, convert
+  # it first.
+  #
+  # String values in the resulting structure
+  # will be UTF-8.
+  def decode(s)
+    ts = lex(s)
+    v, ts = textparse(ts)
+    if ts.length > 0
+      raise Error, 'trailing garbage'
+    end
+    v
+  end
+
+
+  # Parses a "json text" in the sense of RFC 4627.
+  # Returns the parsed value and any trailing tokens.
+  # Note: this is almost the same as valparse,
+  # except that it does not accept atomic values.
+  def textparse(ts)
+    if ts.length < 0
+      raise Error, 'empty'
+    end
+
+    typ, _, val = ts[0]
+    case typ
+    when '{' then objparse(ts)
+    when '[' then arrparse(ts)
+    else
+      raise Error, "unexpected #{val.inspect}"
+    end
+  end
+
+
+  # Parses a "value" in the sense of RFC 4627.
+  # Returns the parsed value and any trailing tokens.
+  def valparse(ts)
+    if ts.length < 0
+      raise Error, 'empty'
+    end
+
+    typ, _, val = ts[0]
+    case typ
+    when '{' then objparse(ts)
+    when '[' then arrparse(ts)
+    when :val,:str then [val, ts[1..-1]]
+    else
+      raise Error, "unexpected #{val.inspect}"
+    end
+  end
+
+
+  # Parses an "object" in the sense of RFC 4627.
+  # Returns the parsed value and any trailing tokens.
+  def objparse(ts)
+    ts = eat('{', ts)
+    obj = {}
+
+    if ts[0][0] == '}'
+      return obj, ts[1..-1]
+    end
+
+    k, v, ts = pairparse(ts)
+    obj[k] = v
+
+    if ts[0][0] == '}'
+      return obj, ts[1..-1]
+    end
+
+    loop do
+      ts = eat(',', ts)
+
+      k, v, ts = pairparse(ts)
+      obj[k] = v
+
+      if ts[0][0] == '}'
+        return obj, ts[1..-1]
+      end
+    end
+  end
+
+
+  # Parses a "member" in the sense of RFC 4627.
+  # Returns the parsed values and any trailing tokens.
+  def pairparse(ts)
+    (typ, _, k), ts = ts[0], ts[1..-1]
+    if typ != :str
+      raise Error, "unexpected #{k.inspect}"
+    end
+    ts = eat(':', ts)
+    v, ts = valparse(ts)
+    [k, v, ts]
+  end
+
+
+  # Parses an "array" in the sense of RFC 4627.
+  # Returns the parsed value and any trailing tokens.
+  def arrparse(ts)
+    ts = eat('[', ts)
+    arr = []
+
+    if ts[0][0] == ']'
+      return arr, ts[1..-1]
+    end
+
+    v, ts = valparse(ts)
+    arr << v
+
+    if ts[0][0] == ']'
+      return arr, ts[1..-1]
+    end
+
+    loop do
+      ts = eat(',', ts)
+
+      v, ts = valparse(ts)
+      arr << v
+
+      if ts[0][0] == ']'
+        return arr, ts[1..-1]
+      end
+    end
+  end
+
+
+  def eat(typ, ts)
+    if ts[0][0] != typ
+      raise Error, "expected #{typ} (got #{ts[0].inspect})"
+    end
+    ts[1..-1]
+  end
+
+
+  # Scans s and returns a list of json tokens,
+  # excluding white space (as defined in RFC 4627).
+  def lex(s)
+    ts = []
+    while s.length > 0
+      typ, lexeme, val = tok(s)
+      if typ == nil
+        raise Error, "invalid character at #{s[0,10].inspect}"
+      end
+      if typ != :space
+        ts << [typ, lexeme, val]
+      end
+      s = s[lexeme.length..-1]
+    end
+    ts
+  end
+
+
+  # Scans the first token in s and
+  # returns a 3-element list, or nil
+  # if s does not begin with a valid token.
+  #
+  # The first list element is one of
+  # '{', '}', ':', ',', '[', ']',
+  # :val, :str, and :space.
+  #
+  # The second element is the lexeme.
+  #
+  # The third element is the value of the
+  # token for :val and :str, otherwise
+  # it is the lexeme.
+  def tok(s)
+    case s[0]
+    when ?{  then ['{', s[0,1], s[0,1]]
+    when ?}  then ['}', s[0,1], s[0,1]]
+    when ?:  then [':', s[0,1], s[0,1]]
+    when ?,  then [',', s[0,1], s[0,1]]
+    when ?[  then ['[', s[0,1], s[0,1]]
+    when ?]  then [']', s[0,1], s[0,1]]
+    when ?n  then nulltok(s)
+    when ?t  then truetok(s)
+    when ?f  then falsetok(s)
+    when ?"  then strtok(s)
+    when Spc then [:space, s[0,1], s[0,1]]
+    when ?\t then [:space, s[0,1], s[0,1]]
+    when ?\n then [:space, s[0,1], s[0,1]]
+    when ?\r then [:space, s[0,1], s[0,1]]
+    else          numtok(s)
+    end
+  end
+
+
+  def nulltok(s);  s[0,4] == 'null'  ? [:val, 'null',  nil]   : [] end
+  def truetok(s);  s[0,4] == 'true'  ? [:val, 'true',  true]  : [] end
+  def falsetok(s); s[0,5] == 'false' ? [:val, 'false', false] : [] end
+
+
+  def numtok(s)
+    m = /-?([1-9][0-9]+|[0-9])([.][0-9]+)?([eE][+-]?[0-9]+)?/.match(s)
+    if m && m.begin(0) == 0
+      if m[3] && !m[2]
+        [:val, m[0], Integer(m[1])*(10**Integer(m[3][1..-1]))]
+      elsif m[2]
+        [:val, m[0], Float(m[0])]
+      else
+        [:val, m[0], Integer(m[0])]
+      end
+    else
+      []
+    end
+  end
+
+
+  def strtok(s)
+    m = /"([^"\\]|\\["\/\\bfnrt]|\\u[0-9a-fA-F]{4})*"/.match(s)
+    if ! m
+      raise Error, "invalid string literal at #{abbrev(s)}"
+    end
+    [:str, m[0], unquote(m[0])]
+  end
+
+
+  def abbrev(s)
+    t = s[0,10]
+    p = t['`']
+    t = t[0,p] if p
+    t = t + '...' if t.length < s.length
+    '`' + t + '`'
+  end
+
+
+  # Converts a quoted json string literal q into a UTF-8-encoded string.
+  # The rules are different than for Ruby, so we cannot use eval.
+  # Unquote will raise an error if q contains control characters.
+  def unquote(q)
+    q = q[1...-1]
+    a = q.dup # allocate a big enough string
+    rubydoesenc = false
+    # In ruby >= 1.9, a[w] is a codepoint, not a byte.
+    if a.class.method_defined?(:force_encoding)
+      a.force_encoding('UTF-8')
+      rubydoesenc = true
+    end
+    r, w = 0, 0
+    while r < q.length
+      c = q[r]
+      case true
+      when c == ?\\
+        r += 1
+        if r >= q.length
+          raise Error, "string literal ends with a \"\\\": \"#{q}\""
+        end
+
+        case q[r]
+        when ?",?\\,?/,?'
+          a[w] = q[r]
+          r += 1
+          w += 1
+        when ?b,?f,?n,?r,?t
+          a[w] = Unesc[q[r]]
+          r += 1
+          w += 1
+        when ?u
+          r += 1
+          uchar = begin
+            hexdec4(q[r,4])
+          rescue RuntimeError => e
+            raise Error, "invalid escape sequence \\u#{q[r,4]}: #{e}"
+          end
+          r += 4
+          if surrogate? uchar
+            if q.length >= r+6
+              uchar1 = hexdec4(q[r+2,4])
+              uchar = subst(uchar, uchar1)
+              if uchar != Ucharerr
+                # A valid pair; consume.
+                r += 6
+              end
+            end
+          end
+          if rubydoesenc
+            a[w] = '' << uchar
+            w += 1
+          else
+            w += ucharenc(a, w, uchar)
+          end
+        else
+          raise Error, "invalid escape char #{q[r]} in \"#{q}\""
+        end
+      when c == ?", c < Spc
+        raise Error, "invalid character in string literal \"#{q}\""
+      else
+        # Copy anything else byte-for-byte.
+        # Valid UTF-8 will remain valid UTF-8.
+        # Invalid UTF-8 will remain invalid UTF-8.
+        # In ruby >= 1.9, c is a codepoint, not a byte,
+        # in which case this is still what we want.
+        a[w] = c
+        r += 1
+        w += 1
+      end
+    end
+    a[0,w]
+  end
+
+
+  # Encodes unicode character u as UTF-8
+  # bytes in string a at position i.
+  # Returns the number of bytes written.
+  def ucharenc(a, i, u)
+    case true
+    when u <= Uchar1max
+      a[i] = (u & 0xff).chr
+      1
+    when u <= Uchar2max
+      a[i+0] = (Utag2 | ((u>>6)&0xff)).chr
+      a[i+1] = (Utagx | (u&Umaskx)).chr
+      2
+    when u <= Uchar3max
+      a[i+0] = (Utag3 | ((u>>12)&0xff)).chr
+      a[i+1] = (Utagx | ((u>>6)&Umaskx)).chr
+      a[i+2] = (Utagx | (u&Umaskx)).chr
+      3
+    else
+      a[i+0] = (Utag4 | ((u>>18)&0xff)).chr
+      a[i+1] = (Utagx | ((u>>12)&Umaskx)).chr
+      a[i+2] = (Utagx | ((u>>6)&Umaskx)).chr
+      a[i+3] = (Utagx | (u&Umaskx)).chr
+      4
+    end
+  end
+
+
+  def hexdec4(s)
+    if s.length != 4
+      raise Error, 'short'
+    end
+    (nibble(s[0])<<12) | (nibble(s[1])<<8) | (nibble(s[2])<<4) | nibble(s[3])
+  end
+
+
+  def subst(u1, u2)
+    if Usurr1 <= u1 && u1 < Usurr2 && Usurr2 <= u2 && u2 < Usurr3
+      return ((u1-Usurr1)<<10) | (u2-Usurr2) + Usurrself
+    end
+    return Ucharerr
+  end
+
+
+  def surrogate?(u)
+    Usurr1 <= u && u < Usurr3
+  end
+
+
+  def nibble(c)
+    case true
+    when ?0 <= c && c <= ?9 then c.ord - ?0.ord
+    when ?a <= c && c <= ?z then c.ord - ?a.ord + 10
+    when ?A <= c && c <= ?Z then c.ord - ?A.ord + 10
+    else
+      raise Error, "invalid hex code #{c}"
+    end
+  end
+
+
+  # Encodes x into a json text. It may contain only
+  # Array, Hash, String, Numeric, true, false, nil.
+  # (Note, this list excludes Symbol.)
+  # X itself must be an Array or a Hash.
+  # No other value can be encoded, and an error will
+  # be raised if x contains any other value, such as
+  # Nan, Infinity, Symbol, and Proc, or if a Hash key
+  # is not a String.
+  # Strings contained in x must be valid UTF-8.
+  def encode(x)
+    case x
+    when Hash    then objenc(x)
+    when Array   then arrenc(x)
+    else
+      raise Error, 'root value must be an Array or a Hash'
+    end
+  end
+
+
+  def valenc(x)
+    case x
+    when Hash    then objenc(x)
+    when Array   then arrenc(x)
+    when String  then strenc(x)
+    when Numeric then numenc(x)
+    when true    then "true"
+    when false   then "false"
+    when nil     then "null"
+    else
+      raise Error, "cannot encode #{x.class}: #{x.inspect}"
+    end
+  end
+
+
+  def objenc(x)
+    '{' + x.map{|k,v| keyenc(k) + ':' + valenc(v)}.join(',') + '}'
+  end
+
+
+  def arrenc(a)
+    '[' + a.map{|x| valenc(x)}.join(',') + ']'
+  end
+
+
+  def keyenc(k)
+    case k
+    when String then strenc(k)
+    else
+      raise Error, "Hash key is not a string: #{k.inspect}"
+    end
+  end
+
+
+  def strenc(s)
+    t = StringIO.new
+    t.putc(?")
+    r = 0
+
+    # In ruby >= 1.9, s[r] is a codepoint, not a byte.
+    rubydoesenc = s.class.method_defined?(:encoding)
+
+    while r < s.length
+      case s[r]
+      when ?"  then t.print('\\"')
+      when ?\\ then t.print('\\\\')
+      when ?\b then t.print('\\b')
+      when ?\f then t.print('\\f')
+      when ?\n then t.print('\\n')
+      when ?\r then t.print('\\r')
+      when ?\t then t.print('\\t')
+      else
+        c = s[r]
+        case true
+        when rubydoesenc
+          begin
+            c.ord # will raise an error if c is invalid UTF-8
+            t.write(c)
+          rescue
+            t.write(Ustrerr)
+          end
+        when Spc <= c && c <= ?~
+          t.putc(c)
+        else
+          n = ucharcopy(t, s, r) # ensure valid UTF-8 output
+          r += n - 1 # r is incremented below
+        end
+      end
+      r += 1
+    end
+    t.putc(?")
+    t.string
+  end
+
+
+  def numenc(x)
+    if ((x.nan? || x.infinite?) rescue false)
+      raise Error, "Numeric cannot be represented: #{x}"
+    end
+    "#{x}"
+  end
+
+
+  # Copies the valid UTF-8 bytes of a single character
+  # from string s at position i to I/O object t, and
+  # returns the number of bytes copied.
+  # If no valid UTF-8 char exists at position i,
+  # ucharcopy writes Ustrerr and returns 1.
+  def ucharcopy(t, s, i)
+    n = s.length - i
+    raise Utf8Error if n < 1
+
+    c0 = s[i].ord
+
+    # 1-byte, 7-bit sequence?
+    if c0 < Utagx
+      t.putc(c0)
+      return 1
+    end
+
+    raise Utf8Error if c0 < Utag2 # unexpected continuation byte?
+
+    raise Utf8Error if n < 2 # need continuation byte
+    c1 = s[i+1].ord
+    raise Utf8Error if c1 < Utagx || Utag2 <= c1
+
+    # 2-byte, 11-bit sequence?
+    if c0 < Utag3
+      raise Utf8Error if ((c0&Umask2)<<6 | (c1&Umaskx)) <= Uchar1max
+      t.putc(c0)
+      t.putc(c1)
+      return 2
+    end
+
+    # need second continuation byte
+    raise Utf8Error if n < 3
+
+    c2 = s[i+2].ord
+    raise Utf8Error if c2 < Utagx || Utag2 <= c2
+
+    # 3-byte, 16-bit sequence?
+    if c0 < Utag4
+      u = (c0&Umask3)<<12 | (c1&Umaskx)<<6 | (c2&Umaskx)
+      raise Utf8Error if u <= Uchar2max
+      t.putc(c0)
+      t.putc(c1)
+      t.putc(c2)
+      return 3
+    end
+
+    # need third continuation byte
+    raise Utf8Error if n < 4
+    c3 = s[i+3].ord
+    raise Utf8Error if c3 < Utagx || Utag2 <= c3
+
+    # 4-byte, 21-bit sequence?
+    if c0 < Utag5
+      u = (c0&Umask4)<<18 | (c1&Umaskx)<<12 | (c2&Umaskx)<<6 | (c3&Umaskx)
+      raise Utf8Error if u <= Uchar3max
+      t.putc(c0)
+      t.putc(c1)
+      t.putc(c2)
+      t.putc(c3)
+      return 4
+    end
+
+    raise Utf8Error
+  rescue Utf8Error
+    t.write(Ustrerr)
+    return 1
+  end
+
+
+  class Utf8Error < ::StandardError
+  end
+
+
+  class Error < ::StandardError
+  end
+
+
+  Utagx = 0x80 # 1000 0000
+  Utag2 = 0xc0 # 1100 0000
+  Utag3 = 0xe0 # 1110 0000
+  Utag4 = 0xf0 # 1111 0000
+  Utag5 = 0xF8 # 1111 1000
+  Umaskx = 0x3f # 0011 1111
+  Umask2 = 0x1f # 0001 1111
+  Umask3 = 0x0f # 0000 1111
+  Umask4 = 0x07 # 0000 0111
+  Uchar1max = (1<<7) - 1
+  Uchar2max = (1<<11) - 1
+  Uchar3max = (1<<16) - 1
+  Ucharerr = 0xFFFD # unicode "replacement char"
+  Ustrerr = "\xef\xbf\xbd" # unicode "replacement char"
+  Usurrself = 0x10000
+  Usurr1 = 0xd800
+  Usurr2 = 0xdc00
+  Usurr3 = 0xe000
+
+  Spc = ' '[0]
+  Unesc = {?b=>?\b, ?f=>?\f, ?n=>?\n, ?r=>?\r, ?t=>?\t}
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/rack.gemspec b/.bundle/ruby/2.0.0/gems/rack-1.5.2/rack.gemspec
new file mode 100644
index 0000000..388d6ed
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/rack.gemspec
@@ -0,0 +1,33 @@
+Gem::Specification.new do |s|
+  s.name            = "rack"
+  s.version         = "1.5.2"
+  s.platform        = Gem::Platform::RUBY
+  s.summary         = "a modular Ruby webserver interface"
+  s.license         = "MIT"
+
+  s.description = <<-EOF
+Rack provides a minimal, modular and adaptable interface for developing
+web applications in Ruby.  By wrapping HTTP requests and responses in
+the simplest way possible, it unifies and distills the API for web
+servers, web frameworks, and software in between (the so-called
+middleware) into a single method call.
+
+Also see http://rack.github.com/.
+EOF
+
+  s.files           = Dir['{bin/*,contrib/*,example/*,lib/**/*,test/**/*}'] +
+                        %w(COPYING KNOWN-ISSUES rack.gemspec Rakefile README.rdoc SPEC)
+  s.bindir          = 'bin'
+  s.executables     << 'rackup'
+  s.require_path    = 'lib'
+  s.extra_rdoc_files = ['README.rdoc', 'KNOWN-ISSUES']
+  s.test_files      = Dir['test/spec_*.rb']
+
+  s.author          = 'Christian Neukirchen'
+  s.email           = 'chneukirchen at gmail.com'
+  s.homepage        = 'http://rack.github.com/'
+  s.rubyforge_project = 'rack'
+
+  s.add_development_dependency 'bacon'
+  s.add_development_dependency 'rake'
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/anything.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/anything.rb
new file mode 100644
index 0000000..c07f82c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/anything.rb
@@ -0,0 +1,5 @@
+class Anything
+  def self.call(env)
+    [200, {'Content-Type' => 'text/plain'}, ['OK']]
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/comment.ru b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/comment.ru
new file mode 100644
index 0000000..0722f0a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/comment.ru
@@ -0,0 +1,4 @@
+=begin
+
+=end
+run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] }
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/end.ru b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/end.ru
new file mode 100644
index 0000000..7f36d8c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/end.ru
@@ -0,0 +1,5 @@
+run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] }
+__END__
+Should not be evaluated
+Neither should
+This
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/line.ru b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/line.ru
new file mode 100644
index 0000000..f4c84ad
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/line.ru
@@ -0,0 +1 @@
+run lambda{ |env| [200, {'Content-Type' => 'text/plain'}, [__LINE__.to_s]] }
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/options.ru b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/options.ru
new file mode 100644
index 0000000..8562da6
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/builder/options.ru
@@ -0,0 +1,2 @@
+#\ -d
+run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] }
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/folder/test.js b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/folder/test.js
new file mode 100644
index 0000000..6874e45
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/folder/test.js
@@ -0,0 +1 @@
+### TestFile ###
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/fonts/font.eot b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/fonts/font.eot
new file mode 100644
index 0000000..6874e45
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/fonts/font.eot
@@ -0,0 +1 @@
+### TestFile ###
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/images/image.png b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/images/image.png
new file mode 100644
index 0000000..6874e45
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/images/image.png
@@ -0,0 +1 @@
+### TestFile ###
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/index.html b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/index.html
new file mode 100644
index 0000000..6874e45
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/index.html
@@ -0,0 +1 @@
+### TestFile ###
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/javascripts/app.js b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/javascripts/app.js
new file mode 100644
index 0000000..6874e45
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/javascripts/app.js
@@ -0,0 +1 @@
+### TestFile ###
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/stylesheets/app.css b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/stylesheets/app.css
new file mode 100644
index 0000000..6874e45
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/assets/stylesheets/app.css
@@ -0,0 +1 @@
+### TestFile ###
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/lighttpd.conf b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/lighttpd.conf
new file mode 100755
index 0000000..c195f78
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/lighttpd.conf
@@ -0,0 +1,26 @@
+server.modules = ("mod_fastcgi", "mod_cgi")
+server.document-root = "."
+server.errorlog = var.CWD + "/lighttpd.errors"
+server.port = 9203
+server.bind = "127.0.0.1"
+
+server.event-handler = "select"
+
+cgi.assign = ("/test" => "",
+#              ".ru" => ""
+             )
+
+fastcgi.server = (
+                  "test.fcgi" => ("localhost" =>
+                    ("min-procs" => 1,
+                     "socket" => "/tmp/rack-test-fcgi",
+                     "bin-path" => "test.fcgi")),
+                  "test.ru" => ("localhost" =>
+                    ("min-procs" => 1,
+                     "socket" => "/tmp/rack-test-ru-fcgi",
+                     "bin-path" => CWD + "/rackup_stub.rb test.ru")),
+                  "sample_rackup.ru" => ("localhost" =>
+                    ("min-procs" => 1,
+                     "socket" => "/tmp/rack-test-rackup-fcgi",
+                     "bin-path" => CWD + "/rackup_stub.rb sample_rackup.ru")),
+                 )
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/rackup_stub.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/rackup_stub.rb
new file mode 100755
index 0000000..a216cdc
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/rackup_stub.rb
@@ -0,0 +1,6 @@
+#!/usr/bin/env ruby
+# -*- ruby -*-
+
+$:.unshift '../../lib'
+require 'rack'
+Rack::Server.start
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/sample_rackup.ru b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/sample_rackup.ru
new file mode 100755
index 0000000..a73df81
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/sample_rackup.ru
@@ -0,0 +1,5 @@
+# -*- ruby -*-
+
+require '../testrequest'
+
+run Rack::Lint.new(TestRequest.new)
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test
new file mode 100755
index 0000000..e4837a4
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test
@@ -0,0 +1,9 @@
+#!/usr/bin/env ruby
+# -*- ruby -*-
+
+$: << File.join(File.dirname(__FILE__), "..", "..", "lib")
+
+require 'rack'
+require '../testrequest'
+
+Rack::Handler::CGI.run(Rack::Lint.new(TestRequest.new))
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test+directory/test+file b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test+directory/test+file
new file mode 100644
index 0000000..f4273fb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test+directory/test+file
@@ -0,0 +1 @@
+this file has plusses!
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test.fcgi b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test.fcgi
new file mode 100755
index 0000000..5e104fc
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test.fcgi
@@ -0,0 +1,8 @@
+#!/usr/bin/env ruby
+# -*- ruby -*-
+
+$:.unshift '../../lib'
+require 'rack'
+require '../testrequest'
+
+Rack::Handler::FastCGI.run(Rack::Lint.new(TestRequest.new))
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test.ru b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test.ru
new file mode 100755
index 0000000..7913ef7
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/cgi/test.ru
@@ -0,0 +1,5 @@
+#!../../bin/rackup
+# -*- ruby -*-
+
+require '../testrequest'
+run Rack::Lint.new(TestRequest.new)
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/gemloader.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/gemloader.rb
new file mode 100644
index 0000000..22be697
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/gemloader.rb
@@ -0,0 +1,10 @@
+require 'rubygems'
+project = 'rack'
+gemspec = File.expand_path("#{project}.gemspec", Dir.pwd)
+Gem::Specification.load(gemspec).dependencies.each do |dep|
+  begin
+    gem dep.name, *dep.requirement.as_list
+  rescue Gem::LoadError
+    warn "Cannot load #{dep.name} #{dep.requirement.to_s}"
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/bad_robots b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/bad_robots
new file mode 100644
index 0000000..7e5bd41
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/bad_robots
@@ -0,0 +1,259 @@
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="bbbbbbbbbbbbbbb"
+
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="ccccccc"
+
+ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="file.name"
+
+INPUTMSG.gz
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="file.content_type"
+
+application/octet-stream
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="file.path"
+
+/var/tmp/uploads/4/0001728414
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="file.md5"
+
+aa73198feb4b4c1c3186f5e7466cbbcc
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="file.size"
+
+13212
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="size"
+
+80892
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="mail_server_id"
+
+<1111111111.22222222.3333333333333.JavaMail.app at ffff-aaaa.dddd>
+
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="addresses"
+
+{"campsy_programmer at pinkedum.com":{"domain":"pinkedum.com","name":"Campsy Programmer","type":["env_sender"],"mailbox":"campsy_programmer"},"tex at rapidcity.com":{"domain":"rapidcity.com","name":"Big Tex","type":["env_recipients","to"],"mailbox":"tex"},"group-digests at linkedin.com":{"domain":"linkedin.com","name":"Group Members","type":["from"],"mailbox":"group-digests"}}
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="received_on"
+
+2009-11-15T14:21:11Z
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="id"
+
+dbfd9804d26d11deab24e3037639bf77
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon
+Content-Disposition: form-data; name="ip_address"
+
+127.0.0.1
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/binary b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/binary
new file mode 100644
index 0000000..a3bd67c
Binary files /dev/null and b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/binary differ
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/content_type_and_no_filename b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/content_type_and_no_filename
new file mode 100644
index 0000000..bd4c89b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/content_type_and_no_filename
@@ -0,0 +1,6 @@
+--AaB03x
+Content-Disposition: form-data; name="text"
+Content-Type: text/plain; charset=US-ASCII
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/empty b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/empty
new file mode 100644
index 0000000..f0f7983
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/empty
@@ -0,0 +1,10 @@
+--AaB03x
+Content-Disposition: form-data; name="submit-name"
+
+Larry
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="file1.txt"
+Content-Type: text/plain
+
+
+--AaB03x--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/fail_16384_nofile b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/fail_16384_nofile
new file mode 100644
index 0000000..bdcd332
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/fail_16384_nofile
@@ -0,0 +1,814 @@
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="_method"
+
+put
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="authenticity_token"
+
+XCUgSyYsZ+iHQunq/yCSKFzjeVmsXV/WcphHQ0J+05I=
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[SESE]"
+
+BooBar
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[BBBBBBBBB]"
+
+18
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[CCCCCCCCCCCCCCCCCCC]"
+
+0
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[STARTFOO]"
+
+2009-11-04
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[ENDFOO]"
+
+2009-12-01
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[DDDDDDDD]"
+
+0
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[DDDDDDDD]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[EEEEEEEEEE]"
+
+10000
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[FFFFFFFFF]"
+
+boskoizcool
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[GGGGGGGGGGG]"
+
+0
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[GGGGGGGGGGG]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[YYYYYYYYYYYYYYY]"
+
+5.00
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[ZZZZZZZZZZZZZ]"
+
+mille
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[XXXXXXXXXXXXXXXXXXXXX]"
+
+0
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][1][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][2][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][3][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][4][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][5][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][6][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][9]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][10]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][11]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][12]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][13]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][14]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][15]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][16]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][17]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][18]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][19]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][20]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][21]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][22]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][23]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][0]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][1]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][2]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][3]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][4]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][5]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][6]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][7]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[VVVVVVVVVVVVVVVVVVVVVVV][0][8]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[WWWWWWWWWWWWWWWWWWWWWWWWW][678][ZEZE]"
+
+PLAPLAPLAINCINCINC
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[WWWWWWWWWWWWWWWWWWWWWWWWW][678][123412341234e]"
+
+SITE
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[WWWWWWWWWWWWWWWWWWWWWWWWW][678][12345678901]"
+
+56
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_type]"
+
+none
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][has_hashashas_has]"
+
+0
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][frefrefre_fre_freee]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][frefrefre_fre_frefre]"
+
+forever
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][self_block]"
+
+0
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][GGG_RULES][][COUCOUN]"
+
+
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][GGG_RULES][][REGREG]"
+
+
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_wizard][GGG_RULES][][c1c1]"
+
+
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA_TARTARTAR_wizard_rule"
+
+
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[TARTARTAR_rule]"
+
+
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[selection_selection]"
+
+R
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[PLAPLAPLA_MEMMEMMEMM_ATTRATTRER][new][-1][selection_selection]"
+
+1
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[PLAPLAPLA_MEMMEMMEMM_ATTRATTRER][new][-1][ba_unit_id]"
+
+1015
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[PLAPLAPLA_MEMMEMMEMM_ATTRATTRER][new][-2][selection_selection]"
+
+2
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[PLAPLAPLA_MEMMEMMEMM_ATTRATTRER][new][-2][ba_unit_id]"
+
+1017
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo
+Content-Disposition: form-data; name="AAAAAAAAAAAAAAAAAAA[tile_name]"
+
+
+------WebKitFormBoundaryWsY0GnpbI5U7ztzo--
+
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/file1.txt b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/file1.txt
new file mode 100644
index 0000000..0839b2e
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/file1.txt
@@ -0,0 +1 @@
+contents
\ No newline at end of file
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_and_modification_param b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_and_modification_param
new file mode 100644
index 0000000..20893f4
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_and_modification_param
@@ -0,0 +1,7 @@
+--AaB03x
+Content-Type: image/jpeg
+Content-Disposition: attachment; name="files"; filename=genome.jpeg; modification-date="Wed, 12 Feb 1997 16:29:51 -0500";
+Content-Description: a complete map of the human genome
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_escaped_quotes b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_escaped_quotes
new file mode 100644
index 0000000..0a332df
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_escaped_quotes
@@ -0,0 +1,6 @@
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="escape \"quotes"
+Content-Type: application/octet-stream
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_escaped_quotes_and_modification_param b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_escaped_quotes_and_modification_param
new file mode 100644
index 0000000..7619bd5
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_escaped_quotes_and_modification_param
@@ -0,0 +1,7 @@
+--AaB03x
+Content-Type: image/jpeg
+Content-Disposition: attachment; name="files"; filename=""human" genome.jpeg"; modification-date="Wed, 12 Feb 1997 16:29:51 -0500";
+Content-Description: a complete map of the human genome
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_percent_escaped_quotes b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_percent_escaped_quotes
new file mode 100644
index 0000000..7db0641
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_percent_escaped_quotes
@@ -0,0 +1,6 @@
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="escape %22quotes"
+Content-Type: application/octet-stream
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages
new file mode 100644
index 0000000..f63dd22
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages
@@ -0,0 +1,6 @@
+------WebKitFormBoundary2NHc7OhsgU68l3Al
+Content-Disposition: form-data; name="document[attachment]"; filename="100% of a photo.jpeg"
+Content-Type: image/jpeg
+
+contents
+------WebKitFormBoundary2NHc7OhsgU68l3Al--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages2 b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages2
new file mode 100644
index 0000000..83eac36
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages2
@@ -0,0 +1,6 @@
+------WebKitFormBoundary2NHc7OhsgU68l3Al
+Content-Disposition: form-data; name="document[attachment]"; filename="100%a"
+Content-Type: image/jpeg
+
+contents
+------WebKitFormBoundary2NHc7OhsgU68l3Al--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages3 b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages3
new file mode 100644
index 0000000..4dba3c8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_unescaped_percentages3
@@ -0,0 +1,6 @@
+------WebKitFormBoundary2NHc7OhsgU68l3Al
+Content-Disposition: form-data; name="document[attachment]"; filename="100%"
+Content-Type: image/jpeg
+
+contents
+------WebKitFormBoundary2NHc7OhsgU68l3Al--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_unescaped_quotes b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_unescaped_quotes
new file mode 100644
index 0000000..9a291e8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/filename_with_unescaped_quotes
@@ -0,0 +1,6 @@
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="escape "quotes"
+Content-Type: application/octet-stream
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/ie b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/ie
new file mode 100644
index 0000000..eae06ab
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/ie
@@ -0,0 +1,6 @@
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="C:\Documents and Settings\Administrator\Desktop\file1.txt"
+Content-Type: text/plain
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/mixed_files b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/mixed_files
new file mode 100644
index 0000000..624d804
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/mixed_files
@@ -0,0 +1,21 @@
+--AaB03x
+Content-Disposition: form-data; name="foo"
+
+bar
+--AaB03x
+Content-Disposition: form-data; name="files"
+Content-Type: multipart/mixed, boundary=BbC04y
+
+--BbC04y
+Content-Disposition: attachment; filename="file.txt"
+Content-Type: text/plain
+
+contents
+--BbC04y
+Content-Disposition: attachment; filename="flowers.jpg"
+Content-Type: image/jpeg
+Content-Transfer-Encoding: binary
+
+contents
+--BbC04y--
+--AaB03x--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/nested b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/nested
new file mode 100644
index 0000000..5197882
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/nested
@@ -0,0 +1,10 @@
+--AaB03x
+Content-Disposition: form-data; name="foo[submit-name]"
+
+Larry
+--AaB03x
+Content-Disposition: form-data; name="foo[files]"; filename="file1.txt"
+Content-Type: text/plain
+
+contents
+--AaB03x--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/none b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/none
new file mode 100644
index 0000000..d66f473
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/none
@@ -0,0 +1,9 @@
+--AaB03x
+Content-Disposition: form-data; name="submit-name"
+
+Larry
+--AaB03x
+Content-Disposition: form-data; name="files"; filename=""
+
+
+--AaB03x--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/semicolon b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/semicolon
new file mode 100644
index 0000000..00fd68a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/semicolon
@@ -0,0 +1,6 @@
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="fi;le1.txt"
+Content-Type: text/plain
+
+contents
+--AaB03x--
\ No newline at end of file
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/text b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/text
new file mode 100644
index 0000000..01376d0
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/text
@@ -0,0 +1,15 @@
+--AaB03x
+Content-Disposition: form-data; name="submit-name"
+
+Larry
+--AaB03x
+Content-Disposition: form-data; name="submit-name-with-content"
+Content-Type: text/plain
+
+Berry
+--AaB03x
+Content-Disposition: form-data; name="files"; filename="file1.txt"
+Content-Type: text/plain
+
+contents
+--AaB03x--
\ No newline at end of file
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/webkit b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/webkit
new file mode 100644
index 0000000..1375af3
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/multipart/webkit
@@ -0,0 +1,32 @@
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="_method"
+
+put
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="profile[blog]"
+
+
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="profile[public_email]"
+
+
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="profile[interests]"
+
+
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="profile[bio]"
+
+hello
+
+"quote"
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="media"; filename=""
+Content-Type: application/octet-stream
+
+
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR
+Content-Disposition: form-data; name="commit"
+
+Save
+------WebKitFormBoundaryWLHCs9qmcJJoyjKR--
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/rackup/config.ru b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/rackup/config.ru
new file mode 100644
index 0000000..f1e2e1f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/rackup/config.ru
@@ -0,0 +1,31 @@
+require "#{File.dirname(__FILE__)}/../testrequest"
+
+$stderr = File.open("#{File.dirname(__FILE__)}/log_output", "w")
+
+class EnvMiddleware
+  def initialize(app)
+    @app = app
+  end
+
+  def call(env)
+    # provides a way to test that lint is present
+    if env["PATH_INFO"] == "/broken_lint"
+      return [200, {}, ["Broken Lint"]]
+    # provides a way to kill the process without knowing the pid
+    elsif env["PATH_INFO"] == "/die"
+      exit!
+    end
+
+    env["test.$DEBUG"]      = $DEBUG
+    env["test.$EVAL"]       = BUKKIT if defined?(BUKKIT)
+    env["test.$VERBOSE"]    = $VERBOSE
+    env["test.$LOAD_PATH"]  = $LOAD_PATH
+    env["test.stderr"]      = File.expand_path($stderr.path)
+    env["test.Ping"]        = defined?(Ping)
+    env["test.pid"]         = Process.pid
+    @app.call(env)
+  end
+end
+
+use EnvMiddleware
+run TestRequest.new
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/registering_handler/rack/handler/registering_myself.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/registering_handler/rack/handler/registering_myself.rb
new file mode 100644
index 0000000..1635efa
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/registering_handler/rack/handler/registering_myself.rb
@@ -0,0 +1,8 @@
+module Rack
+  module Handler
+    class RegisteringMyself
+    end
+
+    register :registering_myself, RegisteringMyself
+  end
+end
\ No newline at end of file
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_auth_basic.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_auth_basic.rb
new file mode 100644
index 0000000..af8e779
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_auth_basic.rb
@@ -0,0 +1,81 @@
+require 'rack/auth/basic'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Auth::Basic do
+  def realm
+    'WallysWorld'
+  end
+
+  def unprotected_app
+    Rack::Lint.new lambda { |env|
+      [ 200, {'Content-Type' => 'text/plain'}, ["Hi #{env['REMOTE_USER']}"] ]
+    }
+  end
+
+  def protected_app
+    app = Rack::Auth::Basic.new(unprotected_app) { |username, password| 'Boss' == username }
+    app.realm = realm
+    app
+  end
+
+  before do
+    @request = Rack::MockRequest.new(protected_app)
+  end
+
+  def request_with_basic_auth(username, password, &block)
+    request 'HTTP_AUTHORIZATION' => 'Basic ' + ["#{username}:#{password}"].pack("m*"), &block
+  end
+
+  def request(headers = {})
+    yield @request.get('/', headers)
+  end
+
+  def assert_basic_auth_challenge(response)
+    response.should.be.a.client_error
+    response.status.should.equal 401
+    response.should.include 'WWW-Authenticate'
+    response.headers['WWW-Authenticate'].should =~ /Basic realm="#{Regexp.escape(realm)}"/
+    response.body.should.be.empty
+  end
+
+  should 'challenge correctly when no credentials are specified' do
+    request do |response|
+      assert_basic_auth_challenge response
+    end
+  end
+
+  should 'rechallenge if incorrect credentials are specified' do
+    request_with_basic_auth 'joe', 'password' do |response|
+      assert_basic_auth_challenge response
+    end
+  end
+
+  should 'return application output if correct credentials are specified' do
+    request_with_basic_auth 'Boss', 'password' do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Boss'
+    end
+  end
+
+  should 'return 400 Bad Request if different auth scheme used' do
+    request 'HTTP_AUTHORIZATION' => 'Digest params' do |response|
+      response.should.be.a.client_error
+      response.status.should.equal 400
+      response.should.not.include 'WWW-Authenticate'
+    end
+  end
+
+  should 'return 400 Bad Request for a malformed authorization header' do
+    request 'HTTP_AUTHORIZATION' => '' do |response|
+      response.should.be.a.client_error
+      response.status.should.equal 400
+      response.should.not.include 'WWW-Authenticate'
+    end
+  end
+
+  it 'takes realm as optional constructor arg' do
+    app = Rack::Auth::Basic.new(unprotected_app, realm) { true }
+    realm.should == app.realm
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_auth_digest.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_auth_digest.rb
new file mode 100644
index 0000000..040be2e
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_auth_digest.rb
@@ -0,0 +1,259 @@
+require 'rack/auth/digest/md5'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Auth::Digest::MD5 do
+  def realm
+    'WallysWorld'
+  end
+
+  def unprotected_app
+    Rack::Lint.new lambda { |env|
+      friend = Rack::Utils.parse_query(env["QUERY_STRING"])["friend"]
+      [ 200, {'Content-Type' => 'text/plain'}, ["Hi #{env['REMOTE_USER']}#{friend ? " and #{friend}" : ''}"] ]
+    }
+  end
+
+  def protected_app
+    Rack::Auth::Digest::MD5.new(unprotected_app, :realm => realm, :opaque => 'this-should-be-secret') do |username|
+      { 'Alice' => 'correct-password' }[username]
+    end
+  end
+
+  def protected_app_with_hashed_passwords
+    app = Rack::Auth::Digest::MD5.new(unprotected_app) do |username|
+      username == 'Alice' ? Digest::MD5.hexdigest("Alice:#{realm}:correct-password") : nil
+    end
+    app.realm = realm
+    app.opaque = 'this-should-be-secret'
+    app.passwords_hashed = true
+    app
+  end
+
+  def partially_protected_app
+    Rack::URLMap.new({
+      '/' => unprotected_app,
+      '/protected' => protected_app
+    })
+  end
+
+  def protected_app_with_method_override
+    Rack::MethodOverride.new(protected_app)
+  end
+
+  before do
+    @request = Rack::MockRequest.new(protected_app)
+  end
+
+  def request(method, path, headers = {}, &block)
+    response = @request.request(method, path, headers)
+    block.call(response) if block
+    return response
+  end
+
+  class MockDigestRequest
+    def initialize(params)
+      @params = params
+    end
+    def method_missing(sym)
+      if @params.has_key? k = sym.to_s
+        return @params[k]
+      end
+      super
+    end
+    def method
+      @params['method']
+    end
+    def response(password)
+      Rack::Auth::Digest::MD5.new(nil).send :digest, self, password
+    end
+  end
+
+  def request_with_digest_auth(method, path, username, password, options = {}, &block)
+    request_options = {}
+    request_options[:input] = options.delete(:input) if options.include? :input
+
+    response = request(method, path, request_options)
+
+    return response unless response.status == 401
+
+    if wait = options.delete(:wait)
+      sleep wait
+    end
+
+    challenge = response['WWW-Authenticate'].split(' ', 2).last
+
+    params = Rack::Auth::Digest::Params.parse(challenge)
+
+    params['username'] = username
+    params['nc'] = '00000001'
+    params['cnonce'] = 'nonsensenonce'
+    params['uri'] = path
+
+    params['method'] = method
+
+    params.update options
+
+    params['response'] = MockDigestRequest.new(params).response(password)
+
+    request(method, path, request_options.merge('HTTP_AUTHORIZATION' => "Digest #{params}"), &block)
+  end
+
+  def assert_digest_auth_challenge(response)
+    response.should.be.a.client_error
+    response.status.should.equal 401
+    response.should.include 'WWW-Authenticate'
+    response.headers['WWW-Authenticate'].should =~ /^Digest /
+    response.body.should.be.empty
+  end
+
+  def assert_bad_request(response)
+    response.should.be.a.client_error
+    response.status.should.equal 400
+    response.should.not.include 'WWW-Authenticate'
+  end
+
+  should 'challenge when no credentials are specified' do
+    request 'GET', '/' do |response|
+      assert_digest_auth_challenge response
+    end
+  end
+
+  should 'return application output if correct credentials given' do
+    request_with_digest_auth 'GET', '/', 'Alice', 'correct-password' do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice'
+    end
+  end
+
+  should 'return application output if correct credentials given (hashed passwords)' do
+    @request = Rack::MockRequest.new(protected_app_with_hashed_passwords)
+
+    request_with_digest_auth 'GET', '/', 'Alice', 'correct-password' do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice'
+    end
+  end
+
+  should 'rechallenge if incorrect username given' do
+    request_with_digest_auth 'GET', '/', 'Bob', 'correct-password' do |response|
+      assert_digest_auth_challenge response
+    end
+  end
+
+  should 'rechallenge if incorrect password given' do
+    request_with_digest_auth 'GET', '/', 'Alice', 'wrong-password' do |response|
+      assert_digest_auth_challenge response
+    end
+  end
+
+  should 'rechallenge if incorrect user and blank password given' do
+    request_with_digest_auth 'GET', '/', 'Bob', '' do |response|
+      assert_digest_auth_challenge response
+    end
+  end
+
+  should 'not rechallenge if nonce is not stale' do
+    begin
+      Rack::Auth::Digest::Nonce.time_limit = 10
+
+      request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', :wait => 1 do |response|
+        response.status.should.equal 200
+        response.body.to_s.should.equal 'Hi Alice'
+        response.headers['WWW-Authenticate'].should.not =~ /\bstale=true\b/
+      end
+    ensure
+      Rack::Auth::Digest::Nonce.time_limit = nil
+    end
+  end
+
+  should 'rechallenge with stale parameter if nonce is stale' do
+    begin
+      Rack::Auth::Digest::Nonce.time_limit = 1
+
+      request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', :wait => 2 do |response|
+        assert_digest_auth_challenge response
+        response.headers['WWW-Authenticate'].should =~ /\bstale=true\b/
+      end
+    ensure
+      Rack::Auth::Digest::Nonce.time_limit = nil
+    end
+  end
+
+  should 'return 400 Bad Request if incorrect qop given' do
+    request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', 'qop' => 'auth-int' do |response|
+      assert_bad_request response
+    end
+  end
+
+  should 'return 400 Bad Request if incorrect uri given' do
+    request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', 'uri' => '/foo' do |response|
+      assert_bad_request response
+    end
+  end
+
+  should 'return 400 Bad Request if different auth scheme used' do
+    request 'GET', '/', 'HTTP_AUTHORIZATION' => 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==' do |response|
+      assert_bad_request response
+    end
+  end
+
+  should 'not require credentials for unprotected path' do
+    @request = Rack::MockRequest.new(partially_protected_app)
+    request 'GET', '/' do |response|
+      response.should.be.ok
+    end
+  end
+
+  should 'challenge when no credentials are specified for protected path' do
+    @request = Rack::MockRequest.new(partially_protected_app)
+    request 'GET', '/protected' do |response|
+      assert_digest_auth_challenge response
+    end
+  end
+
+  should 'return application output if correct credentials given for protected path' do
+    @request = Rack::MockRequest.new(partially_protected_app)
+    request_with_digest_auth 'GET', '/protected', 'Alice', 'correct-password' do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice'
+    end
+  end
+
+  should 'return application output when used with a query string and path as uri' do
+    @request = Rack::MockRequest.new(partially_protected_app)
+    request_with_digest_auth 'GET', '/protected?friend=Mike', 'Alice', 'correct-password' do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice and Mike'
+    end
+  end
+
+  should 'return application output when used with a query string and fullpath as uri' do
+    @request = Rack::MockRequest.new(partially_protected_app)
+    qs_uri = '/protected?friend=Mike'
+    request_with_digest_auth 'GET', qs_uri, 'Alice', 'correct-password', 'uri' => qs_uri do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice and Mike'
+    end
+  end
+
+  should 'return application output if correct credentials given for POST' do
+    request_with_digest_auth 'POST', '/', 'Alice', 'correct-password' do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice'
+    end
+  end
+
+  should 'return application output if correct credentials given for PUT (using method override of POST)' do
+    @request = Rack::MockRequest.new(protected_app_with_method_override)
+    request_with_digest_auth 'POST', '/', 'Alice', 'correct-password', :input => "_method=put" do |response|
+      response.status.should.equal 200
+      response.body.to_s.should.equal 'Hi Alice'
+    end
+  end
+
+  it 'takes realm as optional constructor arg' do
+    app = Rack::Auth::Digest::MD5.new(unprotected_app, realm) { true }
+    realm.should == app.realm
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_body_proxy.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_body_proxy.rb
new file mode 100644
index 0000000..c65e10d
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_body_proxy.rb
@@ -0,0 +1,69 @@
+require 'rack/body_proxy'
+require 'stringio'
+
+describe Rack::BodyProxy do
+  should 'call each on the wrapped body' do
+    called = false
+    proxy  = Rack::BodyProxy.new(['foo']) { }
+    proxy.each do |str|
+      called = true
+      str.should.equal 'foo'
+    end
+    called.should.equal true
+  end
+
+  should 'call close on the wrapped body' do
+    body  = StringIO.new
+    proxy = Rack::BodyProxy.new(body) { }
+    proxy.close
+    body.should.be.closed
+  end
+
+  should 'only call close on the wrapped body if it responds to close' do
+    body  = []
+    proxy = Rack::BodyProxy.new(body) { }
+    proc { proxy.close }.should.not.raise
+  end
+
+  should 'call the passed block on close' do
+    called = false
+    proxy  = Rack::BodyProxy.new([]) { called = true }
+    called.should.equal false
+    proxy.close
+    called.should.equal true
+  end
+
+  should 'call the passed block on close even if there is an exception' do
+    object = Object.new
+    def object.close() raise "No!" end
+    called = false
+
+    begin
+      proxy  = Rack::BodyProxy.new(object) { called = true }
+      called.should.equal false
+      proxy.close
+    rescue RuntimeError => e
+    end
+
+    raise "Expected exception to have been raised" unless e
+    called.should.equal true
+  end
+
+  should 'not close more than one time' do
+    count = 0
+    proxy = Rack::BodyProxy.new([]) { count += 1; raise "Block invoked more than 1 time!" if count > 1 }
+    2.times { proxy.close }
+    count.should.equal 1
+  end
+
+  should 'be closed when the callback is triggered' do
+    closed = false
+    proxy = Rack::BodyProxy.new([]) { closed = proxy.closed? }
+    proxy.close
+    closed.should.equal true
+  end
+
+  should 'provide an #each method' do
+    Rack::BodyProxy.method_defined?(:each).should.equal true
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_builder.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_builder.rb
new file mode 100644
index 0000000..a2fd568
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_builder.rb
@@ -0,0 +1,214 @@
+require 'rack/builder'
+require 'rack/lint'
+require 'rack/mock'
+require 'rack/showexceptions'
+require 'rack/urlmap'
+
+class NothingMiddleware
+  def initialize(app)
+    @app = app
+  end
+  def call(env)
+    @@env = env
+    response = @app.call(env)
+    response
+  end
+  def self.env
+    @@env
+  end
+end
+
+describe Rack::Builder do
+  def builder(&block)
+    Rack::Lint.new Rack::Builder.new(&block)
+  end
+  
+  def builder_to_app(&block)
+    Rack::Lint.new Rack::Builder.new(&block).to_app
+  end
+  
+  it "supports mapping" do
+    app = builder_to_app do
+      map '/' do |outer_env|
+        run lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, ['root']] }
+      end
+      map '/sub' do
+        run lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, ['sub']] }
+      end
+    end
+    Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'root'
+    Rack::MockRequest.new(app).get("/sub").body.to_s.should.equal 'sub'
+  end
+
+  it "doesn't dupe env even when mapping" do
+    app = builder_to_app do
+      use NothingMiddleware
+      map '/' do |outer_env|
+        run lambda { |inner_env|
+          inner_env['new_key'] = 'new_value'
+          [200, {"Content-Type" => "text/plain"}, ['root']]
+        }
+      end
+    end
+    Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'root'
+    NothingMiddleware.env['new_key'].should.equal 'new_value'
+  end
+
+  it "chains apps by default" do
+    app = builder_to_app do
+      use Rack::ShowExceptions
+      run lambda { |env| raise "bzzzt" }
+    end
+
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+  end
+
+  it "has implicit #to_app" do
+    app = builder do
+      use Rack::ShowExceptions
+      run lambda { |env| raise "bzzzt" }
+    end
+
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+  end
+
+  it "supports blocks on use" do
+    app = builder do
+      use Rack::ShowExceptions
+      use Rack::Auth::Basic do |username, password|
+        'secret' == password
+      end
+
+      run lambda { |env| [200, {"Content-Type" => "text/plain"}, ['Hi Boss']] }
+    end
+
+    response = Rack::MockRequest.new(app).get("/")
+    response.should.be.client_error
+    response.status.should.equal 401
+
+    # with auth...
+    response = Rack::MockRequest.new(app).get("/",
+        'HTTP_AUTHORIZATION' => 'Basic ' + ["joe:secret"].pack("m*"))
+    response.status.should.equal 200
+    response.body.to_s.should.equal 'Hi Boss'
+  end
+
+  it "has explicit #to_app" do
+    app = builder do
+      use Rack::ShowExceptions
+      run lambda { |env| raise "bzzzt" }
+    end
+
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+  end
+
+  it "can mix map and run for endpoints" do
+    app = builder do
+      map '/sub' do
+        run lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, ['sub']] }
+      end
+      run lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, ['root']] }
+    end
+
+    Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'root'
+    Rack::MockRequest.new(app).get("/sub").body.to_s.should.equal 'sub'
+  end
+
+  it "accepts middleware-only map blocks" do
+    app = builder do
+      map('/foo') { use Rack::ShowExceptions }
+      run lambda { |env| raise "bzzzt" }
+    end
+
+    proc { Rack::MockRequest.new(app).get("/") }.should.raise(RuntimeError)
+    Rack::MockRequest.new(app).get("/foo").should.be.server_error
+  end
+
+  should "initialize apps once" do
+    app = builder do
+      class AppClass
+        def initialize
+          @called = 0
+        end
+        def call(env)
+          raise "bzzzt"  if @called > 0
+        @called += 1
+          [200, {'Content-Type' => 'text/plain'}, ['OK']]
+        end
+      end
+
+      use Rack::ShowExceptions
+      run AppClass.new
+    end
+
+    Rack::MockRequest.new(app).get("/").status.should.equal 200
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+  end
+
+  it "allows use after run" do
+    app = builder do
+      run lambda { |env| raise "bzzzt" }
+      use Rack::ShowExceptions
+    end
+
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+    Rack::MockRequest.new(app).get("/").should.be.server_error
+  end
+
+  it 'complains about a missing run' do
+    proc do
+      Rack::Lint.new Rack::Builder.app { use Rack::ShowExceptions }
+    end.should.raise(RuntimeError)
+  end
+
+  describe "parse_file" do
+    def config_file(name)
+      File.join(File.dirname(__FILE__), 'builder', name)
+    end
+
+    it "parses commented options" do
+      app, options = Rack::Builder.parse_file config_file('options.ru')
+      options[:debug].should.be.true
+      Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'OK'
+    end
+
+    it "removes __END__ before evaluating app" do
+      app, options = Rack::Builder.parse_file config_file('end.ru')
+      options = nil # ignored, prevents warning
+      Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'OK'
+    end
+
+    it "supports multi-line comments" do
+      lambda {
+        Rack::Builder.parse_file config_file('comment.ru')
+      }.should.not.raise(SyntaxError)
+    end
+
+    it "requires anything not ending in .ru" do
+      $: << File.dirname(__FILE__)
+      app, * = Rack::Builder.parse_file 'builder/anything'
+      Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'OK'
+      $:.pop
+    end
+
+    it "sets __LINE__ correctly" do
+      app, options = Rack::Builder.parse_file config_file('line.ru')
+      options = nil # ignored, prevents warning
+      Rack::MockRequest.new(app).get("/").body.to_s.should.equal '1'
+    end
+  end
+
+  describe 'new_from_string' do
+    it "builds a rack app from string" do
+      app, = Rack::Builder.new_from_string "run lambda{|env| [200, {'Content-Type' => 'text/plane'}, ['OK']] }"
+      Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'OK'
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_cascade.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_cascade.rb
new file mode 100644
index 0000000..38a18da
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_cascade.rb
@@ -0,0 +1,61 @@
+require 'rack/cascade'
+require 'rack/file'
+require 'rack/lint'
+require 'rack/urlmap'
+require 'rack/mock'
+
+describe Rack::Cascade do
+  def cascade(*args)
+    Rack::Lint.new Rack::Cascade.new(*args)
+  end
+  
+  docroot = File.expand_path(File.dirname(__FILE__))
+  app1 = Rack::File.new(docroot)
+
+  app2 = Rack::URLMap.new("/crash" => lambda { |env| raise "boom" })
+
+  app3 = Rack::URLMap.new("/foo" => lambda { |env|
+                            [200, { "Content-Type" => "text/plain"}, [""]]})
+
+  should "dispatch onward on 404 and 405 by default" do
+    cascade = cascade([app1, app2, app3])
+    Rack::MockRequest.new(cascade).get("/cgi/test").should.be.ok
+    Rack::MockRequest.new(cascade).get("/foo").should.be.ok
+    Rack::MockRequest.new(cascade).get("/toobad").should.be.not_found
+    Rack::MockRequest.new(cascade).get("/cgi/../..").should.be.client_error
+
+    # Put is not allowed by Rack::File so it'll 405.
+    Rack::MockRequest.new(cascade).put("/foo").should.be.ok
+  end
+
+  should "dispatch onward on whatever is passed" do
+    cascade = cascade([app1, app2, app3], [404, 403])
+    Rack::MockRequest.new(cascade).get("/cgi/../bla").should.be.not_found
+  end
+
+  should "return 404 if empty" do
+    Rack::MockRequest.new(cascade([])).get('/').should.be.not_found
+  end
+
+  should "append new app" do
+    cascade = Rack::Cascade.new([], [404, 403])
+    Rack::MockRequest.new(cascade).get('/').should.be.not_found
+    cascade << app2
+    Rack::MockRequest.new(cascade).get('/cgi/test').should.be.not_found
+    Rack::MockRequest.new(cascade).get('/cgi/../bla').should.be.not_found
+    cascade << app1
+    Rack::MockRequest.new(cascade).get('/cgi/test').should.be.ok
+    Rack::MockRequest.new(cascade).get('/cgi/../..').should.be.client_error
+    Rack::MockRequest.new(cascade).get('/foo').should.be.not_found
+    cascade << app3
+    Rack::MockRequest.new(cascade).get('/foo').should.be.ok
+  end
+
+  should "close the body on cascade" do
+    body = StringIO.new
+    closer = lambda { |env| [404, {}, body] }
+    cascade = Rack::Cascade.new([closer, app3], [404])
+    Rack::MockRequest.new(cascade).get("/foo").should.be.ok
+    body.should.be.closed
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_cgi.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_cgi.rb
new file mode 100644
index 0000000..8c90ec8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_cgi.rb
@@ -0,0 +1,102 @@
+begin
+require File.expand_path('../testrequest', __FILE__)
+require 'rack/handler/cgi'
+
+describe Rack::Handler::CGI do
+  extend TestRequest::Helpers
+
+  @host = '127.0.0.1'
+  @port = 9203
+
+  if `which lighttpd` && !$?.success?
+    raise "lighttpd not found"
+  end
+
+  # Keep this first.
+  $pid = fork {
+    ENV['RACK_ENV'] = 'deployment'
+    ENV['RUBYLIB'] = [
+      File.expand_path('../../lib', __FILE__),
+      ENV['RUBYLIB'],
+    ].compact.join(':')
+
+    Dir.chdir(File.expand_path("../cgi", __FILE__)) do
+      exec "lighttpd -D -f lighttpd.conf"
+    end
+  }
+
+  should "respond" do
+    sleep 1
+    GET("/test")
+    response.should.not.be.nil
+  end
+
+  should "be a lighttpd" do
+    GET("/test")
+    status.should.equal 200
+    response["SERVER_SOFTWARE"].should =~ /lighttpd/
+    response["HTTP_VERSION"].should.equal "HTTP/1.1"
+    response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
+    response["SERVER_PORT"].should.equal @port.to_s
+    response["SERVER_NAME"].should.equal @host
+  end
+
+  should "have rack headers" do
+    GET("/test")
+    response["rack.version"].should.equal([1,2])
+    response["rack.multithread"].should.be.false
+    response["rack.multiprocess"].should.be.true
+    response["rack.run_once"].should.be.true
+  end
+
+  should "have CGI headers on GET" do
+    GET("/test")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/"
+    response["PATH_INFO"].should.be.nil
+    response["QUERY_STRING"].should.equal ""
+    response["test.postdata"].should.equal ""
+
+    GET("/test/foo?quux=1")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/"
+    response["PATH_INFO"].should.equal "/foo"
+    response["QUERY_STRING"].should.equal "quux=1"
+  end
+
+  should "have CGI headers on POST" do
+    POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
+    status.should.equal 200
+    response["REQUEST_METHOD"].should.equal "POST"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/"
+    response["QUERY_STRING"].should.equal ""
+    response["HTTP_X_TEST_HEADER"].should.equal "42"
+    response["test.postdata"].should.equal "rack-form-data=23"
+  end
+
+  should "support HTTP auth" do
+    GET("/test", {:user => "ruth", :passwd => "secret"})
+    response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
+  end
+
+  should "set status" do
+    GET("/test?secret")
+    status.should.equal 403
+    response["rack.url_scheme"].should.equal "http"
+  end
+
+  # Keep this last.
+  should "shutdown" do
+    Process.kill 15, $pid
+    Process.wait($pid).should == $pid
+  end
+end
+
+rescue RuntimeError
+  $stderr.puts "Skipping Rack::Handler::CGI tests (lighttpd is required). Install lighttpd and try again."
+rescue NotImplementedError
+  $stderr.puts "Your Ruby implemenation or platform does not support fork. Skipping Rack::Handler::CGI tests."
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_chunked.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_chunked.rb
new file mode 100644
index 0000000..12f2158
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_chunked.rb
@@ -0,0 +1,85 @@
+require 'rack/chunked'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Chunked do
+  def chunked(app)
+    proc do |env|
+      app = Rack::Chunked.new(app)
+      response = Rack::Lint.new(app).call(env)
+      # we want to use body like an array, but it only has #each
+      response[2] = response[2].to_enum.to_a
+      response
+    end
+  end
+
+  before do
+    @env = Rack::MockRequest.
+      env_for('/', 'HTTP_VERSION' => '1.1', 'REQUEST_METHOD' => 'GET')
+  end
+
+  should 'chunk responses with no Content-Length' do
+    app = lambda { |env| [200, {"Content-Type" => "text/plain"}, ['Hello', ' ', 'World!']] }
+    response = Rack::MockResponse.new(*chunked(app).call(@env))
+    response.headers.should.not.include 'Content-Length'
+    response.headers['Transfer-Encoding'].should.equal 'chunked'
+    response.body.should.equal "5\r\nHello\r\n1\r\n \r\n6\r\nWorld!\r\n0\r\n\r\n"
+  end
+
+  should 'chunks empty bodies properly' do
+    app = lambda { |env| [200, {"Content-Type" => "text/plain"}, []] }
+    response = Rack::MockResponse.new(*chunked(app).call(@env))
+    response.headers.should.not.include 'Content-Length'
+    response.headers['Transfer-Encoding'].should.equal 'chunked'
+    response.body.should.equal "0\r\n\r\n"
+  end
+
+  should 'chunks encoded bodies properly' do
+    body = ["\uFFFEHello", " ", "World"].map {|t| t.encode("UTF-16LE") }
+    app  = lambda { |env| [200, {"Content-Type" => "text/plain"}, body] }
+    response = Rack::MockResponse.new(*chunked(app).call(@env))
+    response.headers.should.not.include 'Content-Length'
+    response.headers['Transfer-Encoding'].should.equal 'chunked'
+    response.body.encoding.to_s.should.equal "ASCII-8BIT"
+    response.body.should.equal "c\r\n\xFE\xFFH\x00e\x00l\x00l\x00o\x00\r\n2\r\n \x00\r\na\r\nW\x00o\x00r\x00l\x00d\x00\r\n0\r\n\r\n".force_encoding("BINARY")
+  end if RUBY_VERSION >= "1.9"
+
+  should 'not modify response when Content-Length header present' do
+    app = lambda { |env|
+      [200, {"Content-Type" => "text/plain", 'Content-Length'=>'12'}, ['Hello', ' ', 'World!']]
+    }
+    status, headers, body = chunked(app).call(@env)
+    status.should.equal 200
+    headers.should.not.include 'Transfer-Encoding'
+    headers.should.include 'Content-Length'
+    body.join.should.equal 'Hello World!'
+  end
+
+  should 'not modify response when client is HTTP/1.0' do
+    app = lambda { |env| [200, {"Content-Type" => "text/plain"}, ['Hello', ' ', 'World!']] }
+    @env['HTTP_VERSION'] = 'HTTP/1.0'
+    status, headers, body = chunked(app).call(@env)
+    status.should.equal 200
+    headers.should.not.include 'Transfer-Encoding'
+    body.join.should.equal 'Hello World!'
+  end
+
+  should 'not modify response when Transfer-Encoding header already present' do
+    app = lambda { |env|
+      [200, {"Content-Type" => "text/plain", 'Transfer-Encoding' => 'identity'}, ['Hello', ' ', 'World!']]
+    }
+    status, headers, body = chunked(app).call(@env)
+    status.should.equal 200
+    headers['Transfer-Encoding'].should.equal 'identity'
+    body.join.should.equal 'Hello World!'
+  end
+
+  [100, 204, 205, 304].each do |status_code|
+    should "not modify response when status code is #{status_code}" do
+      app = lambda { |env| [status_code, {}, []] }
+      status, headers, _ = chunked(app).call(@env)
+      status.should.equal status_code
+      headers.should.not.include 'Transfer-Encoding'
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_commonlogger.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_commonlogger.rb
new file mode 100644
index 0000000..d88e19c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_commonlogger.rb
@@ -0,0 +1,57 @@
+require 'rack/commonlogger'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::CommonLogger do
+  obj = 'foobar'
+  length = obj.size
+
+  app = Rack::Lint.new lambda { |env|
+    [200,
+     {"Content-Type" => "text/html", "Content-Length" => length.to_s},
+     [obj]]}
+  app_without_length = Rack::Lint.new lambda { |env|
+    [200,
+     {"Content-Type" => "text/html"},
+     []]}
+  app_with_zero_length = Rack::Lint.new lambda { |env|
+    [200,
+     {"Content-Type" => "text/html", "Content-Length" => "0"},
+     []]}
+
+  should "log to rack.errors by default" do
+    res = Rack::MockRequest.new(Rack::CommonLogger.new(app)).get("/")
+
+    res.errors.should.not.be.empty
+    res.errors.should =~ /"GET \/ " 200 #{length} /
+  end
+
+  should "log to anything with +write+" do
+    log = StringIO.new
+    Rack::MockRequest.new(Rack::CommonLogger.new(app, log)).get("/")
+
+    log.string.should =~ /"GET \/ " 200 #{length} /
+  end
+
+  should "log - content length if header is missing" do
+    res = Rack::MockRequest.new(Rack::CommonLogger.new(app_without_length)).get("/")
+
+    res.errors.should.not.be.empty
+    res.errors.should =~ /"GET \/ " 200 - /
+  end
+
+  should "log - content length if header is zero" do
+    res = Rack::MockRequest.new(Rack::CommonLogger.new(app_with_zero_length)).get("/")
+
+    res.errors.should.not.be.empty
+    res.errors.should =~ /"GET \/ " 200 - /
+  end
+
+  def length
+    123
+  end
+
+  def self.obj
+    "hello world"
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_conditionalget.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_conditionalget.rb
new file mode 100644
index 0000000..8b365eb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_conditionalget.rb
@@ -0,0 +1,102 @@
+require 'time'
+require 'rack/conditionalget'
+require 'rack/mock'
+
+describe Rack::ConditionalGet do
+  def conditional_get(app)
+    Rack::Lint.new Rack::ConditionalGet.new(app)
+  end
+  
+  should "set a 304 status and truncate body when If-Modified-Since hits" do
+    timestamp = Time.now.httpdate
+    app = conditional_get(lambda { |env|
+      [200, {'Last-Modified'=>timestamp}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_MODIFIED_SINCE' => timestamp)
+
+    response.status.should.equal 304
+    response.body.should.be.empty
+  end
+
+  should "set a 304 status and truncate body when If-Modified-Since hits and is higher than current time" do
+    app = conditional_get(lambda { |env|
+      [200, {'Last-Modified'=>(Time.now - 3600).httpdate}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_MODIFIED_SINCE' => Time.now.httpdate)
+
+    response.status.should.equal 304
+    response.body.should.be.empty
+  end
+
+  should "set a 304 status and truncate body when If-None-Match hits" do
+    app = conditional_get(lambda { |env|
+      [200, {'Etag'=>'1234'}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_NONE_MATCH' => '1234')
+
+    response.status.should.equal 304
+    response.body.should.be.empty
+  end
+
+  should "not set a 304 status if If-Modified-Since hits but Etag does not" do
+    timestamp = Time.now.httpdate
+    app = conditional_get(lambda { |env|
+      [200, {'Last-Modified'=>timestamp, 'Etag'=>'1234', 'Content-Type' => 'text/plain'}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_MODIFIED_SINCE' => timestamp, 'HTTP_IF_NONE_MATCH' => '4321')
+
+    response.status.should.equal 200
+    response.body.should.equal 'TEST'
+  end
+
+  should "set a 304 status and truncate body when both If-None-Match and If-Modified-Since hits" do
+    timestamp = Time.now.httpdate
+    app = conditional_get(lambda { |env|
+      [200, {'Last-Modified'=>timestamp, 'Etag'=>'1234'}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_MODIFIED_SINCE' => timestamp, 'HTTP_IF_NONE_MATCH' => '1234')
+
+    response.status.should.equal 304
+    response.body.should.be.empty
+  end
+
+  should "not affect non-GET/HEAD requests" do
+    app = conditional_get(lambda { |env|
+      [200, {'Etag'=>'1234', 'Content-Type' => 'text/plain'}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      post("/", 'HTTP_IF_NONE_MATCH' => '1234')
+
+    response.status.should.equal 200
+    response.body.should.equal 'TEST'
+  end
+
+  should "not affect non-200 requests" do
+    app = conditional_get(lambda { |env|
+      [302, {'Etag'=>'1234', 'Content-Type' => 'text/plain'}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_NONE_MATCH' => '1234')
+
+    response.status.should.equal 302
+    response.body.should.equal 'TEST'
+  end
+
+  should "not affect requests with malformed HTTP_IF_NONE_MATCH" do
+    bad_timestamp = Time.now.strftime('%Y-%m-%d %H:%M:%S %z')
+    app = conditional_get(lambda { |env|
+      [200,{'Last-Modified'=>(Time.now - 3600).httpdate, 'Content-Type' => 'text/plain'}, ['TEST']] })
+
+    response = Rack::MockRequest.new(app).
+      get("/", 'HTTP_IF_MODIFIED_SINCE' => bad_timestamp)
+
+    response.status.should.equal 200
+    response.body.should.equal 'TEST'
+  end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_config.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_config.rb
new file mode 100644
index 0000000..29bca0a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_config.rb
@@ -0,0 +1,22 @@
+require 'rack/builder'
+require 'rack/config'
+require 'rack/content_length'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Config do
+  should "accept a block that modifies the environment" do
+    app = Rack::Builder.new do
+      use Rack::Lint
+      use Rack::Config do |env|
+        env['greeting'] = 'hello'
+      end
+      run lambda { |env|
+        [200, {'Content-Type' => 'text/plain'}, [env['greeting'] || '']]
+      }
+    end
+
+    response = Rack::MockRequest.new(app).get('/')
+    response.body.should.equal('hello')
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_content_length.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_content_length.rb
new file mode 100644
index 0000000..4b80a0f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_content_length.rb
@@ -0,0 +1,83 @@
+require 'rack/content_length'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::ContentLength do
+  def content_length(app)
+    Rack::Lint.new Rack::ContentLength.new(app)
+  end
+
+  def request
+    Rack::MockRequest.env_for
+  end
+
+  should "set Content-Length on Array bodies if none is set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
+    response = content_length(app).call(request)
+    response[1]['Content-Length'].should.equal '13'
+  end
+
+  should "not set Content-Length on variable length bodies" do
+    body = lambda { "Hello World!" }
+    def body.each ; yield call ; end
+
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
+    response = content_length(app).call(request)
+    response[1]['Content-Length'].should.be.nil
+  end
+
+  should "not change Content-Length if it is already set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Content-Length' => '1'}, "Hello, World!"] }
+    response = content_length(app).call(request)
+    response[1]['Content-Length'].should.equal '1'
+  end
+
+  should "not set Content-Length on 304 responses" do
+    app = lambda { |env| [304, {}, []] }
+    response = content_length(app).call(request)
+    response[1]['Content-Length'].should.equal nil
+  end
+
+  should "not set Content-Length when Transfer-Encoding is chunked" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Transfer-Encoding' => 'chunked'}, []] }
+    response = content_length(app).call(request)
+    response[1]['Content-Length'].should.equal nil
+  end
+
+  # Using "Connection: close" for this is fairly contended. It might be useful
+  # to have some other way to signal this.
+  #
+  # should "not force a Content-Length when Connection:close" do
+  #   app = lambda { |env| [200, {'Connection' => 'close'}, []] }
+  #   response = content_length(app).call({})
+  #   response[1]['Content-Length'].should.equal nil
+  # end
+
+  should "close bodies that need to be closed" do
+    body = Struct.new(:body) do
+      attr_reader :closed
+      def each; body.join; end
+      def close; @closed = true; end
+      def to_ary; end
+    end.new(%w[one two three])
+
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
+    content_length(app).call(request)
+    body.closed.should.equal true
+  end
+
+  should "support single-execute bodies" do
+    body = Struct.new(:body) do
+      def each
+        yield body.shift until body.empty?
+      end
+      def to_ary; end
+    end.new(%w[one two three])
+
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
+    response = content_length(app).call(request)
+    expected = %w[one two three]
+    response[1]['Content-Length'].should.equal expected.join.size.to_s
+    response[2].to_enum.to_a.should.equal expected
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_content_type.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_content_type.rb
new file mode 100644
index 0000000..308611b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_content_type.rb
@@ -0,0 +1,45 @@
+require 'rack/content_type'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::ContentType do
+  def content_type(app, *args)
+    Rack::Lint.new Rack::ContentType.new(app, *args)
+  end
+  
+  def request
+    Rack::MockRequest.env_for
+  end
+  
+  should "set Content-Type to default text/html if none is set" do
+    app = lambda { |env| [200, {}, "Hello, World!"] }
+    headers = content_type(app).call(request)[1]
+    headers['Content-Type'].should.equal 'text/html'
+  end
+
+  should "set Content-Type to chosen default if none is set" do
+    app = lambda { |env| [200, {}, "Hello, World!"] }
+    headers =
+      content_type(app, 'application/octet-stream').call(request)[1]
+    headers['Content-Type'].should.equal 'application/octet-stream'
+  end
+
+  should "not change Content-Type if it is already set" do
+    app = lambda { |env| [200, {'Content-Type' => 'foo/bar'}, "Hello, World!"] }
+    headers = content_type(app).call(request)[1]
+    headers['Content-Type'].should.equal 'foo/bar'
+  end
+
+  should "detect Content-Type case insensitive" do
+    app = lambda { |env| [200, {'CONTENT-Type' => 'foo/bar'}, "Hello, World!"] }
+    headers = content_type(app).call(request)[1]
+    headers.to_a.select { |k,v| k.downcase == "content-type" }.
+      should.equal [["CONTENT-Type","foo/bar"]]
+  end
+
+  should "not set Content-Type on 304 responses" do
+    app = lambda { |env| [304, {}, []] }
+    response = content_type(app, "text/html").call(request)
+    response[1]['Content-Type'].should.equal nil
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_deflater.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_deflater.rb
new file mode 100644
index 0000000..6f5137c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_deflater.rb
@@ -0,0 +1,204 @@
+require 'stringio'
+require 'time'  # for Time#httpdate
+require 'rack/deflater'
+require 'rack/lint'
+require 'rack/mock'
+require 'zlib'
+
+describe Rack::Deflater do
+  def deflater(app)
+    Rack::Lint.new Rack::Deflater.new(app)
+  end
+
+  def build_response(status, body, accept_encoding, headers = {})
+    body = [body]  if body.respond_to? :to_str
+    app = lambda do |env|
+      res = [status, {}, body]
+      res[1]["Content-Type"] = "text/plain" unless res[0] == 304
+      res
+    end
+    request = Rack::MockRequest.env_for("", headers.merge("HTTP_ACCEPT_ENCODING" => accept_encoding))
+    response = deflater(app).call(request)
+
+    return response
+  end
+
+  def inflate(buf)
+    inflater = Zlib::Inflate.new(-Zlib::MAX_WBITS)
+    inflater.inflate(buf) << inflater.finish
+  end
+
+  should "be able to deflate bodies that respond to each" do
+    body = Object.new
+    class << body; def each; yield("foo"); yield("bar"); end; end
+
+    response = build_response(200, body, "deflate")
+
+    response[0].should.equal(200)
+    response[1].should.equal({
+      "Content-Encoding" => "deflate",
+      "Vary" => "Accept-Encoding",
+      "Content-Type" => "text/plain"
+    })
+    buf = ''
+    response[2].each { |part| buf << part }
+    inflate(buf).should.equal("foobar")
+  end
+
+  should "flush deflated chunks to the client as they become ready" do
+    body = Object.new
+    class << body; def each; yield("foo"); yield("bar"); end; end
+
+    response = build_response(200, body, "deflate")
+
+    response[0].should.equal(200)
+    response[1].should.equal({
+      "Content-Encoding" => "deflate",
+      "Vary" => "Accept-Encoding",
+      "Content-Type" => "text/plain"
+    })
+    buf = []
+    inflater = Zlib::Inflate.new(-Zlib::MAX_WBITS)
+    response[2].each { |part| buf << inflater.inflate(part) }
+    buf << inflater.finish
+    buf.delete_if { |part| part.empty? }
+    buf.join.should.equal("foobar")
+  end
+
+  # TODO: This is really just a special case of the above...
+  should "be able to deflate String bodies" do
+    response = build_response(200, "Hello world!", "deflate")
+
+    response[0].should.equal(200)
+    response[1].should.equal({
+      "Content-Encoding" => "deflate",
+      "Vary" => "Accept-Encoding",
+      "Content-Type" => "text/plain"
+    })
+    buf = ''
+    response[2].each { |part| buf << part }
+    inflate(buf).should.equal("Hello world!")
+  end
+
+  should "be able to gzip bodies that respond to each" do
+    body = Object.new
+    class << body; def each; yield("foo"); yield("bar"); end; end
+
+    response = build_response(200, body, "gzip")
+
+    response[0].should.equal(200)
+    response[1].should.equal({
+      "Content-Encoding" => "gzip",
+      "Vary" => "Accept-Encoding",
+      "Content-Type" => "text/plain"
+    })
+
+    buf = ''
+    response[2].each { |part| buf << part }
+    io = StringIO.new(buf)
+    gz = Zlib::GzipReader.new(io)
+    gz.read.should.equal("foobar")
+    gz.close
+  end
+
+  should "flush gzipped chunks to the client as they become ready" do
+    body = Object.new
+    class << body; def each; yield("foo"); yield("bar"); end; end
+
+    response = build_response(200, body, "gzip")
+
+    response[0].should.equal(200)
+    response[1].should.equal({
+      "Content-Encoding" => "gzip",
+      "Vary" => "Accept-Encoding",
+      "Content-Type" => "text/plain"
+    })
+    buf = []
+    inflater = Zlib::Inflate.new(Zlib::MAX_WBITS + 32)
+    response[2].each { |part| buf << inflater.inflate(part) }
+    buf << inflater.finish
+    buf.delete_if { |part| part.empty? }
+    buf.join.should.equal("foobar")
+  end
+
+  should "be able to fallback to no deflation" do
+    response = build_response(200, "Hello world!", "superzip")
+
+    response[0].should.equal(200)
+    response[1].should.equal({ "Vary" => "Accept-Encoding", "Content-Type" => "text/plain" })
+    response[2].to_enum.to_a.should.equal(["Hello world!"])
+  end
+
+  should "be able to skip when there is no response entity body" do
+    response = build_response(304, [], "gzip")
+
+    response[0].should.equal(304)
+    response[1].should.equal({})
+    response[2].to_enum.to_a.should.equal([])
+  end
+
+  should "handle the lack of an acceptable encoding" do
+    response1 = build_response(200, "Hello world!", "identity;q=0", "PATH_INFO" => "/")
+    response1[0].should.equal(406)
+    response1[1].should.equal({"Content-Type" => "text/plain", "Content-Length" => "71"})
+    response1[2].to_enum.to_a.should.equal(["An acceptable encoding for the requested resource / could not be found."])
+
+    response2 = build_response(200, "Hello world!", "identity;q=0", "SCRIPT_NAME" => "/foo", "PATH_INFO" => "/bar")
+    response2[0].should.equal(406)
+    response2[1].should.equal({"Content-Type" => "text/plain", "Content-Length" => "78"})
+    response2[2].to_enum.to_a.should.equal(["An acceptable encoding for the requested resource /foo/bar could not be found."])
+  end
+
+  should "handle gzip response with Last-Modified header" do
+    last_modified = Time.now.httpdate
+
+    app = lambda { |env| [200, { "Content-Type" => "text/plain", "Last-Modified" => last_modified }, ["Hello World!"]] }
+    request = Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => "gzip")
+    response = deflater(app).call(request)
+
+    response[0].should.equal(200)
+    response[1].should.equal({
+      "Content-Encoding" => "gzip",
+      "Vary" => "Accept-Encoding",
+      "Last-Modified" => last_modified,
+      "Content-Type" => "text/plain"
+    })
+
+    buf = ''
+    response[2].each { |part| buf << part }
+    io = StringIO.new(buf)
+    gz = Zlib::GzipReader.new(io)
+    gz.read.should.equal("Hello World!")
+    gz.close
+  end
+
+  should "do nothing when no-transform Cache-Control directive present" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Cache-Control' => 'no-transform'}, ['Hello World!']] }
+    request = Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => "gzip")
+    response = deflater(app).call(request)
+
+    response[0].should.equal(200)
+    response[1].should.not.include "Content-Encoding"
+    response[2].to_enum.to_a.join.should.equal("Hello World!")
+  end
+
+  should "do nothing when Content-Encoding already present" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Content-Encoding' => 'gzip'}, ['Hello World!']] }
+    request = Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => "gzip")
+    response = deflater(app).call(request)
+
+    response[0].should.equal(200)
+    response[2].to_enum.to_a.join.should.equal("Hello World!")
+  end
+
+  should "deflate when Content-Encoding is identity" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Content-Encoding' => 'identity'}, ['Hello World!']] }
+    request = Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => "deflate")
+    response = deflater(app).call(request)
+
+    response[0].should.equal(200)
+    buf = ''
+    response[2].each { |part| buf << part }
+    inflate(buf).should.equal("Hello World!")
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_directory.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_directory.rb
new file mode 100644
index 0000000..d41ef67
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_directory.rb
@@ -0,0 +1,88 @@
+require 'rack/directory'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Directory do
+  DOCROOT = File.expand_path(File.dirname(__FILE__)) unless defined? DOCROOT
+  FILE_CATCH = proc{|env| [200, {'Content-Type'=>'text/plain', "Content-Length" => "7"}, ['passed!']] }
+  app = Rack::Lint.new(Rack::Directory.new(DOCROOT, FILE_CATCH))
+
+  should "serve directory indices" do
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/cgi/")
+
+    res.should.be.ok
+    res.should =~ /<html><head>/
+  end
+
+  should "pass to app if file found" do
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/cgi/test")
+
+    res.should.be.ok
+    res.should =~ /passed!/
+  end
+
+  should "serve uri with URL encoded filenames" do
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/%63%67%69/") # "/cgi/test"
+
+    res.should.be.ok
+    res.should =~ /<html><head>/
+
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/cgi/%74%65%73%74") # "/cgi/test"
+
+    res.should.be.ok
+    res.should =~ /passed!/
+  end
+
+  should "not allow directory traversal" do
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/cgi/../test")
+
+    res.should.be.forbidden
+
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/cgi/%2E%2E/test")
+
+    res.should.be.forbidden
+  end
+
+  should "404 if it can't find the file" do
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).
+      get("/cgi/blubb")
+
+    res.should.be.not_found
+  end
+
+  should "uri escape path parts" do # #265, properly escape file names
+    mr = Rack::MockRequest.new(Rack::Lint.new(app))
+
+    res = mr.get("/cgi/test%2bdirectory")
+
+    res.should.be.ok
+    res.body.should =~ %r[/cgi/test%2Bdirectory/test%2Bfile]
+
+    res = mr.get("/cgi/test%2bdirectory/test%2bfile")
+    res.should.be.ok
+  end
+
+  should "correctly escape script name" do
+    app2 = Rack::Builder.new do
+      map '/script-path' do
+        run app
+      end
+    end
+
+    mr = Rack::MockRequest.new(Rack::Lint.new(app2))
+
+    res = mr.get("/script-path/cgi/test%2bdirectory")
+
+    res.should.be.ok
+    res.body.should =~ %r[/script-path/cgi/test%2Bdirectory/test%2Bfile]
+
+    res = mr.get("/script-path/cgi/test%2bdirectory/test%2bfile")
+    res.should.be.ok
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_etag.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_etag.rb
new file mode 100644
index 0000000..d7f0350
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_etag.rb
@@ -0,0 +1,98 @@
+require 'rack/etag'
+require 'rack/lint'
+require 'rack/mock'
+require 'time'
+
+describe Rack::ETag do
+  def etag(app, *args)
+    Rack::Lint.new Rack::ETag.new(app, *args)
+  end
+  
+  def request
+    Rack::MockRequest.env_for
+  end
+  
+  def sendfile_body
+    res = ['Hello World']
+    def res.to_path ; "/tmp/hello.txt" ; end
+    res
+  end
+
+  should "set ETag if none is set if status is 200" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.equal "\"65a8e27d8879283831b664bd8b7f0ad4\""
+  end
+
+  should "set ETag if none is set if status is 201" do
+    app = lambda { |env| [201, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.equal "\"65a8e27d8879283831b664bd8b7f0ad4\""
+  end
+
+  should "set Cache-Control to 'max-age=0, private, must-revalidate' (default) if none is set" do
+    app = lambda { |env| [201, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
+    response = etag(app).call(request)
+    response[1]['Cache-Control'].should.equal 'max-age=0, private, must-revalidate'
+  end
+
+  should "set Cache-Control to chosen one if none is set" do
+    app = lambda { |env| [201, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
+    response = etag(app, nil, 'public').call(request)
+    response[1]['Cache-Control'].should.equal 'public'
+  end
+
+  should "set a given Cache-Control even if digest could not be calculated" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, []] }
+    response = etag(app, 'no-cache').call(request)
+    response[1]['Cache-Control'].should.equal 'no-cache'
+  end
+
+  should "not set Cache-Control if it is already set" do
+    app = lambda { |env| [201, {'Content-Type' => 'text/plain', 'Cache-Control' => 'public'}, ["Hello, World!"]] }
+    response = etag(app).call(request)
+    response[1]['Cache-Control'].should.equal 'public'
+  end
+
+  should "not set Cache-Control if directive isn't present" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] }
+    response = etag(app, nil, nil).call(request)
+    response[1]['Cache-Control'].should.equal nil
+  end
+
+  should "not change ETag if it is already set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'ETag' => '"abc"'}, ["Hello, World!"]] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.equal "\"abc\""
+  end
+
+  should "not set ETag if body is empty" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Last-Modified' => Time.now.httpdate}, []] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.be.nil
+  end
+
+  should "not set ETag if Last-Modified is set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Last-Modified' => Time.now.httpdate}, ["Hello, World!"]] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.be.nil
+  end
+
+  should "not set ETag if a sendfile_body is given" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, sendfile_body] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.be.nil
+  end
+
+  should "not set ETag if a status is not 200 or 201" do
+    app = lambda { |env| [401, {'Content-Type' => 'text/plain'}, ['Access denied.']] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.be.nil
+  end
+
+  should "not set ETag if no-cache is given" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Cache-Control' => 'no-cache, must-revalidate'}, ['Hello, World!']] }
+    response = etag(app).call(request)
+    response[1]['ETag'].should.be.nil
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_fastcgi.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_fastcgi.rb
new file mode 100644
index 0000000..14594a2
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_fastcgi.rb
@@ -0,0 +1,107 @@
+begin
+require File.expand_path('../testrequest', __FILE__)
+require 'rack/handler/fastcgi'
+
+describe Rack::Handler::FastCGI do
+  extend TestRequest::Helpers
+
+  @host = '127.0.0.1'
+  @port = 9203
+
+  if `which lighttpd` && !$?.success?
+    raise "lighttpd not found"
+  end
+
+  # Keep this first.
+  $pid = fork {
+    ENV['RACK_ENV'] = 'deployment'
+    ENV['RUBYLIB'] = [
+      File.expand_path('../../lib', __FILE__),
+      ENV['RUBYLIB'],
+    ].compact.join(':')
+
+    Dir.chdir(File.expand_path("../cgi", __FILE__)) do
+      exec "lighttpd -D -f lighttpd.conf"
+    end
+  }
+
+  should "respond" do
+    sleep 1
+    GET("/test")
+    response.should.not.be.nil
+  end
+
+  should "respond via rackup server" do
+    GET("/sample_rackup.ru")
+    status.should.equal 200
+  end
+
+  should "be a lighttpd" do
+    GET("/test.fcgi")
+    status.should.equal 200
+    response["SERVER_SOFTWARE"].should =~ /lighttpd/
+    response["HTTP_VERSION"].should.equal "HTTP/1.1"
+    response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
+    response["SERVER_PORT"].should.equal @port.to_s
+    response["SERVER_NAME"].should.equal @host
+  end
+
+  should "have rack headers" do
+    GET("/test.fcgi")
+    response["rack.version"].should.equal [1,2]
+    response["rack.multithread"].should.be.false
+    response["rack.multiprocess"].should.be.true
+    response["rack.run_once"].should.be.false
+  end
+
+  should "have CGI headers on GET" do
+    GET("/test.fcgi")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test.fcgi"
+    response["REQUEST_PATH"].should.equal "/"
+    response["PATH_INFO"].should.equal ""
+    response["QUERY_STRING"].should.equal ""
+    response["test.postdata"].should.equal ""
+
+    GET("/test.fcgi/foo?quux=1")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test.fcgi"
+    response["REQUEST_PATH"].should.equal "/"
+    response["PATH_INFO"].should.equal "/foo"
+    response["QUERY_STRING"].should.equal "quux=1"
+  end
+
+  should "have CGI headers on POST" do
+    POST("/test.fcgi", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
+    status.should.equal 200
+    response["REQUEST_METHOD"].should.equal "POST"
+    response["SCRIPT_NAME"].should.equal "/test.fcgi"
+    response["REQUEST_PATH"].should.equal "/"
+    response["QUERY_STRING"].should.equal ""
+    response["HTTP_X_TEST_HEADER"].should.equal "42"
+    response["test.postdata"].should.equal "rack-form-data=23"
+  end
+
+  should "support HTTP auth" do
+    GET("/test.fcgi", {:user => "ruth", :passwd => "secret"})
+    response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
+  end
+
+  should "set status" do
+    GET("/test.fcgi?secret")
+    status.should.equal 403
+    response["rack.url_scheme"].should.equal "http"
+  end
+
+  # Keep this last.
+  should "shutdown" do
+    Process.kill 15, $pid
+    Process.wait($pid).should.equal $pid
+  end
+end
+
+rescue RuntimeError
+  $stderr.puts "Skipping Rack::Handler::FastCGI tests (lighttpd is required). Install lighttpd and try again."
+rescue LoadError
+  $stderr.puts "Skipping Rack::Handler::FastCGI tests (FCGI is required). `gem install fcgi` and try again."
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_file.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_file.rb
new file mode 100644
index 0000000..c9d7a1b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_file.rb
@@ -0,0 +1,213 @@
+require 'rack/file'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::File do
+  DOCROOT = File.expand_path(File.dirname(__FILE__)) unless defined? DOCROOT
+
+  def file(*args)
+    Rack::Lint.new Rack::File.new(*args)
+  end
+
+  should "serve files" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/cgi/test")
+
+    res.should.be.ok
+    res.should =~ /ruby/
+  end
+
+  should "set Last-Modified header" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/cgi/test")
+
+    path = File.join(DOCROOT, "/cgi/test")
+
+    res.should.be.ok
+    res["Last-Modified"].should.equal File.mtime(path).httpdate
+  end
+
+  should "return 304 if file isn't modified since last serve" do
+    path = File.join(DOCROOT, "/cgi/test")
+    res = Rack::MockRequest.new(file(DOCROOT)).
+      get("/cgi/test", 'HTTP_IF_MODIFIED_SINCE' => File.mtime(path).httpdate)
+
+    res.status.should.equal 304
+    res.body.should.be.empty
+  end
+
+  should "return the file if it's modified since last serve" do
+    path = File.join(DOCROOT, "/cgi/test")
+    res = Rack::MockRequest.new(file(DOCROOT)).
+      get("/cgi/test", 'HTTP_IF_MODIFIED_SINCE' => (File.mtime(path) - 100).httpdate)
+
+    res.should.be.ok
+  end
+
+  should "serve files with URL encoded filenames" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/cgi/%74%65%73%74") # "/cgi/test"
+
+    res.should.be.ok
+    res.should =~ /ruby/
+  end
+
+  should "allow safe directory traversal" do
+    req = Rack::MockRequest.new(file(DOCROOT))
+
+    res = req.get('/cgi/../cgi/test')
+    res.should.be.successful
+
+    res = req.get('.')
+    res.should.be.not_found
+
+    res = req.get("test/..")
+    res.should.be.not_found
+  end
+
+  should "not allow unsafe directory traversal" do
+    req = Rack::MockRequest.new(file(DOCROOT))
+
+    res = req.get("/../README.rdoc")
+    res.should.be.client_error
+
+    res = req.get("../test/spec_file.rb")
+    res.should.be.client_error
+
+    res = req.get("../README.rdoc")
+    res.should.be.client_error
+
+    res.should.be.not_found
+  end
+
+  should "allow files with .. in their name" do
+    req = Rack::MockRequest.new(file(DOCROOT))
+    res = req.get("/cgi/..test")
+    res.should.be.not_found
+
+    res = req.get("/cgi/test..")
+    res.should.be.not_found
+
+    res = req.get("/cgi../test..")
+    res.should.be.not_found
+  end
+
+  should "not allow unsafe directory traversal with encoded periods" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/%2E%2E/README")
+
+    res.should.be.client_error?
+    res.should.be.not_found
+  end
+
+  should "allow safe directory traversal with encoded periods" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/cgi/%2E%2E/cgi/test")
+
+    res.should.be.successful
+  end
+
+  should "404 if it can't find the file" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/cgi/blubb")
+
+    res.should.be.not_found
+  end
+
+  should "detect SystemCallErrors" do
+    res = Rack::MockRequest.new(file(DOCROOT)).get("/cgi")
+
+    res.should.be.not_found
+  end
+
+  should "return bodies that respond to #to_path" do
+    env = Rack::MockRequest.env_for("/cgi/test")
+    status, _, body = Rack::File.new(DOCROOT).call(env)
+
+    path = File.join(DOCROOT, "/cgi/test")
+
+    status.should.equal 200
+    body.should.respond_to :to_path
+    body.to_path.should.equal path
+  end
+
+  should "return correct byte range in body" do
+    env = Rack::MockRequest.env_for("/cgi/test")
+    env["HTTP_RANGE"] = "bytes=22-33"
+    res = Rack::MockResponse.new(*file(DOCROOT).call(env))
+
+    res.status.should.equal 206
+    res["Content-Length"].should.equal "12"
+    res["Content-Range"].should.equal "bytes 22-33/193"
+    res.body.should.equal "-*- ruby -*-"
+  end
+
+  should "return error for unsatisfiable byte range" do
+    env = Rack::MockRequest.env_for("/cgi/test")
+    env["HTTP_RANGE"] = "bytes=1234-5678"
+    res = Rack::MockResponse.new(*file(DOCROOT).call(env))
+
+    res.status.should.equal 416
+    res["Content-Range"].should.equal "bytes */193"
+  end
+
+  should "support custom http headers" do
+    env = Rack::MockRequest.env_for("/cgi/test")
+    status, heads, _ = file(DOCROOT, 'Cache-Control' => 'public, max-age=38',
+     'Access-Control-Allow-Origin' => '*').call(env)
+
+    status.should.equal 200
+    heads['Cache-Control'].should.equal 'public, max-age=38'
+    heads['Access-Control-Allow-Origin'].should.equal '*'
+  end
+
+  should "support not add custom http headers if none are supplied" do
+    env = Rack::MockRequest.env_for("/cgi/test")
+    status, heads, _ = file(DOCROOT).call(env)
+
+    status.should.equal 200
+    heads['Cache-Control'].should.equal nil
+    heads['Access-Control-Allow-Origin'].should.equal nil
+  end
+
+  should "only support GET and HEAD requests" do
+    req = Rack::MockRequest.new(file(DOCROOT))
+
+    forbidden = %w[post put patch delete]
+    forbidden.each do |method|
+
+      res = req.send(method, "/cgi/test")
+      res.should.be.client_error
+      res.should.be.method_not_allowed
+    end
+
+    allowed = %w[get head]
+    allowed.each do |method|
+      res = req.send(method, "/cgi/test")
+      res.should.be.successful
+    end
+  end
+
+  should "set Content-Length correctly for HEAD requests" do
+    req = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT)))
+    res = req.head "/cgi/test"
+    res.should.be.successful
+    res['Content-Length'].should.equal "193"
+  end
+
+  should "default to a mime type of text/plain" do
+    req = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT)))
+    res = req.get "/cgi/test"
+    res.should.be.successful
+    res['Content-Type'].should.equal "text/plain"
+  end
+
+  should "allow the default mime type to be set" do
+    req = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT, nil, 'application/octet-stream')))
+    res = req.get "/cgi/test"
+    res.should.be.successful
+    res['Content-Type'].should.equal "application/octet-stream"
+  end
+
+  should "not set Content-Type if the mime type is not set" do
+    req = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT, nil, nil)))
+    res = req.get "/cgi/test"
+    res.should.be.successful
+    res['Content-Type'].should.equal nil
+  end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_handler.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_handler.rb
new file mode 100644
index 0000000..e8f41fd
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_handler.rb
@@ -0,0 +1,59 @@
+require 'rack/handler'
+
+class Rack::Handler::Lobster; end
+class RockLobster; end
+
+describe Rack::Handler do
+  it "has registered default handlers" do
+    Rack::Handler.get('cgi').should.equal Rack::Handler::CGI
+    Rack::Handler.get('webrick').should.equal Rack::Handler::WEBrick
+
+    begin
+      Rack::Handler.get('fastcgi').should.equal Rack::Handler::FastCGI
+    rescue LoadError
+    end
+
+    begin
+      Rack::Handler.get('mongrel').should.equal Rack::Handler::Mongrel
+    rescue LoadError
+    end
+  end
+
+  should "raise LoadError if handler doesn't exist" do
+    lambda {
+      Rack::Handler.get('boom')
+    }.should.raise(LoadError)
+  end
+
+  should "get unregistered, but already required, handler by name" do
+    Rack::Handler.get('Lobster').should.equal Rack::Handler::Lobster
+  end
+
+  should "register custom handler" do
+    Rack::Handler.register('rock_lobster', 'RockLobster')
+    Rack::Handler.get('rock_lobster').should.equal RockLobster
+  end
+
+  should "not need registration for properly coded handlers even if not already required" do
+    begin
+      $LOAD_PATH.push File.expand_path('../unregistered_handler', __FILE__)
+      Rack::Handler.get('Unregistered').should.equal Rack::Handler::Unregistered
+      lambda {
+        Rack::Handler.get('UnRegistered')
+      }.should.raise LoadError
+      Rack::Handler.get('UnregisteredLongOne').should.equal Rack::Handler::UnregisteredLongOne
+    ensure
+      $LOAD_PATH.delete File.expand_path('../unregistered_handler', __FILE__)
+    end
+  end
+
+  should "allow autoloaded handlers to be registered properly while being loaded" do
+    path = File.expand_path('../registering_handler', __FILE__)
+    begin
+      $LOAD_PATH.push path
+      Rack::Handler.get('registering_myself').should.equal Rack::Handler::RegisteringMyself
+    ensure
+      $LOAD_PATH.delete path
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_head.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_head.rb
new file mode 100644
index 0000000..18f9a76
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_head.rb
@@ -0,0 +1,43 @@
+require 'rack/head'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Head do
+
+  def test_response(headers = {})
+    body = StringIO.new "foo"
+    app = lambda do |env|
+      [200, {"Content-type" => "test/plain", "Content-length" => "3"}, body]
+    end
+    request = Rack::MockRequest.env_for("/", headers)
+    response = Rack::Lint.new(Rack::Head.new(app)).call(request)
+
+    return response, body
+  end
+
+  should "pass GET, POST, PUT, DELETE, OPTIONS, TRACE requests" do
+    %w[GET POST PUT DELETE OPTIONS TRACE].each do |type|
+      resp, _ = test_response("REQUEST_METHOD" => type)
+
+      resp[0].should.equal(200)
+      resp[1].should.equal({"Content-type" => "test/plain", "Content-length" => "3"})
+      resp[2].to_enum.to_a.should.equal(["foo"])
+    end
+  end
+
+  should "remove body from HEAD requests" do
+    resp, _ = test_response("REQUEST_METHOD" => "HEAD")
+
+    resp[0].should.equal(200)
+    resp[1].should.equal({"Content-type" => "test/plain", "Content-length" => "3"})
+    resp[2].to_enum.to_a.should.equal([])
+  end
+
+  should "close the body when it is removed" do
+    resp, body = test_response("REQUEST_METHOD" => "HEAD")
+    resp[0].should.equal(200)
+    resp[1].should.equal({"Content-type" => "test/plain", "Content-length" => "3"})
+    resp[2].to_enum.to_a.should.equal([])
+    body.should.be.closed
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_lint.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_lint.rb
new file mode 100644
index 0000000..fb60b7e
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_lint.rb
@@ -0,0 +1,522 @@
+require 'stringio'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Lint do
+  def env(*args)
+    Rack::MockRequest.env_for("/", *args)
+  end
+
+  should "pass valid request" do
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Content-type" => "test/plain", "Content-length" => "3"}, ["foo"]]
+                     }).call(env({}))
+    }.should.not.raise
+  end
+
+  should "notice fatal errors" do
+    lambda { Rack::Lint.new(nil).call }.should.raise(Rack::Lint::LintError).
+      message.should.match(/No env given/)
+  end
+
+  should "notice environment errors" do
+    lambda { Rack::Lint.new(nil).call 5 }.should.raise(Rack::Lint::LintError).
+      message.should.match(/not a Hash/)
+
+    lambda {
+      e = env
+      e.delete("REQUEST_METHOD")
+      Rack::Lint.new(nil).call(e)
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/missing required key REQUEST_METHOD/)
+
+    lambda {
+      e = env
+      e.delete("SERVER_NAME")
+      Rack::Lint.new(nil).call(e)
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/missing required key SERVER_NAME/)
+
+
+    lambda {
+      Rack::Lint.new(nil).call(env("HTTP_CONTENT_TYPE" => "text/plain"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/contains HTTP_CONTENT_TYPE/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("HTTP_CONTENT_LENGTH" => "42"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/contains HTTP_CONTENT_LENGTH/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("FOO" => Object.new))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/non-string value/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("rack.version" => "0.2"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must be an Array/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("rack.url_scheme" => "gopher"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/url_scheme unknown/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("rack.session" => []))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("session [] must respond to store and []=")
+
+    lambda {
+      Rack::Lint.new(nil).call(env("rack.logger" => []))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("logger [] must respond to info")
+
+    lambda {
+      Rack::Lint.new(nil).call(env("REQUEST_METHOD" => "FUCKUP?"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/REQUEST_METHOD/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("SCRIPT_NAME" => "howdy"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must start with/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("PATH_INFO" => "../foo"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must start with/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("CONTENT_LENGTH" => "xcii"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/Invalid CONTENT_LENGTH/)
+
+    lambda {
+      e = env
+      e.delete("PATH_INFO")
+      e.delete("SCRIPT_NAME")
+      Rack::Lint.new(nil).call(e)
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/One of .* must be set/)
+
+    lambda {
+      Rack::Lint.new(nil).call(env("SCRIPT_NAME" => "/"))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/cannot be .* make it ''/)
+  end
+
+  should "notice input errors" do
+    lambda {
+      Rack::Lint.new(nil).call(env("rack.input" => ""))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/does not respond to #gets/)
+
+    lambda {
+      input = Object.new
+      def input.binmode?
+        false
+      end
+      Rack::Lint.new(nil).call(env("rack.input" => input))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/is not opened in binary mode/)
+
+    lambda {
+      input = Object.new
+      def input.external_encoding
+        result = Object.new
+        def result.name
+          "US-ASCII"
+        end
+        result
+      end
+      Rack::Lint.new(nil).call(env("rack.input" => input))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/does not have ASCII-8BIT as its external encoding/)
+  end
+
+  should "notice error errors" do
+    lambda {
+      Rack::Lint.new(nil).call(env("rack.errors" => ""))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/does not respond to #puts/)
+  end
+
+  should "notice status errors" do
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       ["cc", {}, ""]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must be >=100 seen as integer/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [42, {}, ""]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must be >=100 seen as integer/)
+  end
+
+  should "notice header errors" do
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, Object.new, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("headers object should respond to #each, but doesn't (got Object as headers)")
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {true=>false}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("header key must be a string, was TrueClass")
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Status" => "404"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must not contain Status/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Content-Type:" => "text/plain"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must not contain :/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Content-" => "text/plain"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/must not end/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"..%%quark%%.." => "text/plain"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("invalid header name: ..%%quark%%..")
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Foo" => Object.new}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("a header value must be a String, but the value of 'Foo' is a Object")
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Foo" => [1, 2, 3]}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.equal("a header value must be a String, but the value of 'Foo' is a Array")
+
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Foo-Bar" => "text\000plain"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/invalid header/)
+
+    # line ends (010) should be allowed in header values.
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Foo-Bar" => "one\ntwo\nthree", "Content-Length" => "0", "Content-Type" => "text/plain" }, []]
+                     }).call(env({}))
+    }.should.not.raise(Rack::Lint::LintError)
+
+    # non-Hash header responses should be allowed
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, [%w(Content-Type text/plain), %w(Content-Length 0)], []]
+                     }).call(env({}))
+    }.should.not.raise(TypeError)
+  end
+
+  should "notice content-type errors" do
+    # lambda {
+    #   Rack::Lint.new(lambda { |env|
+    #                    [200, {"Content-length" => "0"}, []]
+    #                  }).call(env({}))
+    # }.should.raise(Rack::Lint::LintError).
+    #   message.should.match(/No Content-Type/)
+
+    [100, 101, 204, 205, 304].each do |status|
+      lambda {
+        Rack::Lint.new(lambda { |env|
+                         [status, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                       }).call(env({}))
+      }.should.raise(Rack::Lint::LintError).
+        message.should.match(/Content-Type header found/)
+    end
+  end
+
+  should "notice content-length errors" do
+    [100, 101, 204, 205, 304].each do |status|
+      lambda {
+        Rack::Lint.new(lambda { |env|
+                         [status, {"Content-length" => "0"}, []]
+                       }).call(env({}))
+      }.should.raise(Rack::Lint::LintError).
+        message.should.match(/Content-Length header found/)
+    end
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Content-type" => "text/plain", "Content-Length" => "1"}, []]
+                     }).call(env({}))[2].each { }
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/Content-Length header was 1, but should be 0/)
+  end
+
+  should "notice body errors" do
+    lambda {
+      body = Rack::Lint.new(lambda { |env|
+                               [200, {"Content-type" => "text/plain","Content-length" => "3"}, [1,2,3]]
+                             }).call(env({}))[2]
+      body.each { |part| }
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/yielded non-string/)
+  end
+
+  should "notice input handling errors" do
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].gets("\r\n")
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/gets called with arguments/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(1, 2, 3)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read called with too many arguments/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read("foo")
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read called with non-integer and non-nil length/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(-1)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read called with a negative length/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(nil, nil)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read called with non-String buffer/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(nil, 1)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read called with non-String buffer/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].rewind(0)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/rewind called with arguments/)
+
+    weirdio = Object.new
+    class << weirdio
+      def gets
+        42
+      end
+
+      def read
+        23
+      end
+
+      def each
+        yield 23
+        yield 42
+      end
+
+      def rewind
+        raise Errno::ESPIPE, "Errno::ESPIPE"
+      end
+    end
+
+    eof_weirdio = Object.new
+    class << eof_weirdio
+      def gets
+        nil
+      end
+
+      def read(*args)
+        nil
+      end
+
+      def each
+      end
+
+      def rewind
+      end
+    end
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].gets
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env("rack.input" => weirdio))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/gets didn't return a String/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].each { |x| }
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env("rack.input" => weirdio))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/each didn't yield a String/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env("rack.input" => weirdio))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read didn't return nil or a String/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env("rack.input" => eof_weirdio))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/read\(nil\) returned nil on EOF/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].rewind
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env("rack.input" => weirdio))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/rewind raised Errno::ESPIPE/)
+
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].close
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/close must not be called/)
+  end
+
+  should "notice error handling errors" do
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.errors"].write(42)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/write not called with a String/)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.errors"].close
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({}))
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/close must not be called/)
+  end
+
+  should "notice HEAD errors" do
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Content-type" => "test/plain", "Content-length" => "3"}, []]
+                     }).call(env({"REQUEST_METHOD" => "HEAD"}))
+    }.should.not.raise
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       [200, {"Content-type" => "test/plain", "Content-length" => "3"}, ["foo"]]
+                     }).call(env({"REQUEST_METHOD" => "HEAD"}))[2].each { }
+    }.should.raise(Rack::Lint::LintError).
+      message.should.match(/body was given for HEAD/)
+  end
+
+  should "pass valid read calls" do
+    hello_str = "hello world"
+    hello_str.force_encoding("ASCII-8BIT") if hello_str.respond_to? :force_encoding
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({"rack.input" => StringIO.new(hello_str)}))
+    }.should.not.raise(Rack::Lint::LintError)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(0)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({"rack.input" => StringIO.new(hello_str)}))
+    }.should.not.raise(Rack::Lint::LintError)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(1)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({"rack.input" => StringIO.new(hello_str)}))
+    }.should.not.raise(Rack::Lint::LintError)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(nil)
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({"rack.input" => StringIO.new(hello_str)}))
+    }.should.not.raise(Rack::Lint::LintError)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(nil, '')
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({"rack.input" => StringIO.new(hello_str)}))
+    }.should.not.raise(Rack::Lint::LintError)
+
+    lambda {
+      Rack::Lint.new(lambda { |env|
+                       env["rack.input"].read(1, '')
+                       [201, {"Content-type" => "text/plain", "Content-length" => "0"}, []]
+                     }).call(env({"rack.input" => StringIO.new(hello_str)}))
+    }.should.not.raise(Rack::Lint::LintError)
+  end
+end
+
+describe "Rack::Lint::InputWrapper" do
+  should "delegate :rewind to underlying IO object" do
+    io = StringIO.new("123")
+    wrapper = Rack::Lint::InputWrapper.new(io)
+    wrapper.read.should.equal "123"
+    wrapper.read.should.equal ""
+    wrapper.rewind
+    wrapper.read.should.equal "123"
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_lobster.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_lobster.rb
new file mode 100644
index 0000000..56a5479
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_lobster.rb
@@ -0,0 +1,58 @@
+require 'rack/lobster'
+require 'rack/lint'
+require 'rack/mock'
+
+module LobsterHelpers
+  def lobster
+    Rack::MockRequest.new Rack::Lint.new(Rack::Lobster.new)
+  end
+
+  def lambda_lobster
+    Rack::MockRequest.new Rack::Lint.new(Rack::Lobster::LambdaLobster)
+  end
+end
+
+describe Rack::Lobster::LambdaLobster do
+  extend LobsterHelpers
+  
+  should "be a single lambda" do
+    Rack::Lobster::LambdaLobster.should.be.kind_of Proc
+  end
+
+  should "look like a lobster" do
+    res = lambda_lobster.get("/")
+    res.should.be.ok
+    res.body.should.include "(,(,,(,,,("
+    res.body.should.include "?flip"
+  end
+
+  should "be flippable" do
+    res = lambda_lobster.get("/?flip")
+    res.should.be.ok
+    res.body.should.include "(,,,(,,(,("
+  end
+end
+
+describe Rack::Lobster do
+  extend LobsterHelpers
+  
+  should "look like a lobster" do
+    res = lobster.get("/")
+    res.should.be.ok
+    res.body.should.include "(,(,,(,,,("
+    res.body.should.include "?flip"
+    res.body.should.include "crash"
+  end
+
+  should "be flippable" do
+    res = lobster.get("/?flip=left")
+    res.should.be.ok
+    res.body.should.include "(,,,(,,(,("
+  end
+
+  should "provide crashing for testing purposes" do
+    lambda {
+      lobster.get("/?flip=crash")
+    }.should.raise
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_lock.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_lock.rb
new file mode 100644
index 0000000..0cbb544
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_lock.rb
@@ -0,0 +1,164 @@
+require 'rack/lint'
+require 'rack/lock'
+require 'rack/mock'
+
+class Lock
+  attr_reader :synchronized
+
+  def initialize
+    @synchronized = false
+  end
+
+  def synchronize
+    @synchronized = true
+    yield
+  end
+
+  def lock
+    @synchronized = true
+  end
+
+  def unlock
+    @synchronized = false
+  end
+end
+
+module LockHelpers
+  def lock_app(app, lock = Lock.new)
+    app = if lock
+      Rack::Lock.new app, lock
+    else
+      Rack::Lock.new app
+    end
+    Rack::Lint.new app
+  end
+end
+
+describe Rack::Lock do
+  extend LockHelpers
+
+  describe 'Proxy' do
+    extend LockHelpers
+
+    should 'delegate each' do
+      env      = Rack::MockRequest.env_for("/")
+      response = Class.new {
+        attr_accessor :close_called
+        def initialize; @close_called = false; end
+        def each; %w{ hi mom }.each { |x| yield x }; end
+      }.new
+
+      app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, response] })
+      response = app.call(env)[2]
+      list = []
+      response.each { |x| list << x }
+      list.should.equal %w{ hi mom }
+    end
+
+    should 'delegate to_path' do
+      lock = Lock.new
+      env  = Rack::MockRequest.env_for("/")
+
+      res = ['Hello World']
+      def res.to_path ; "/tmp/hello.txt" ; end
+
+      app = Rack::Lock.new(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, res] }, lock)
+      body = app.call(env)[2]
+
+      body.should.respond_to :to_path
+      body.to_path.should.equal "/tmp/hello.txt"
+    end
+
+    should 'not delegate to_path if body does not implement it' do
+      env  = Rack::MockRequest.env_for("/")
+
+      res = ['Hello World']
+
+      app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, res] })
+      body = app.call(env)[2]
+
+      body.should.not.respond_to :to_path
+    end
+  end
+
+  should 'call super on close' do
+    env      = Rack::MockRequest.env_for("/")
+    response = Class.new {
+      attr_accessor :close_called
+      def initialize; @close_called = false; end
+      def close; @close_called = true; end
+    }.new
+
+    app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, response] })
+    app.call(env)
+    response.close_called.should.equal false
+    response.close
+    response.close_called.should.equal true
+  end
+
+  should "not unlock until body is closed" do
+    lock     = Lock.new
+    env      = Rack::MockRequest.env_for("/")
+    response = Object.new
+    app      = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, response] }, lock)
+    lock.synchronized.should.equal false
+    response = app.call(env)[2]
+    lock.synchronized.should.equal true
+    response.close
+    lock.synchronized.should.equal false
+  end
+
+  should "return value from app" do
+    env  = Rack::MockRequest.env_for("/")
+    body = [200, {"Content-Type" => "text/plain"}, %w{ hi mom }]
+    app  = lock_app(lambda { |inner_env| body })
+
+    res = app.call(env)
+    res[0].should.equal body[0]
+    res[1].should.equal body[1]
+    res[2].to_enum.to_a.should.equal ["hi", "mom"]
+  end
+
+  should "call synchronize on lock" do
+    lock = Lock.new
+    env = Rack::MockRequest.env_for("/")
+    app = lock_app(lambda { |inner_env| [200, {"Content-Type" => "text/plain"}, %w{ a b c }] }, lock)
+    lock.synchronized.should.equal false
+    app.call(env)
+    lock.synchronized.should.equal true
+  end
+
+  should "unlock if the app raises" do
+    lock = Lock.new
+    env = Rack::MockRequest.env_for("/")
+    app = lock_app(lambda { raise Exception }, lock)
+    lambda { app.call(env) }.should.raise(Exception)
+    lock.synchronized.should.equal false
+  end
+
+  should "unlock if the app throws" do
+    lock = Lock.new
+    env = Rack::MockRequest.env_for("/")
+    app = lock_app(lambda {|_| throw :bacon }, lock)
+    lambda { app.call(env) }.should.throw(:bacon)
+    lock.synchronized.should.equal false
+  end
+
+  should "set multithread flag to false" do
+    app = lock_app(lambda { |env|
+      env['rack.multithread'].should.equal false
+      [200, {"Content-Type" => "text/plain"}, %w{ a b c }]
+    }, false)
+    app.call(Rack::MockRequest.env_for("/"))
+  end
+
+  should "reset original multithread flag when exiting lock" do
+    app = Class.new(Rack::Lock) {
+      def call(env)
+        env['rack.multithread'].should.equal true
+        super
+      end
+    }.new(lambda { |env| [200, {"Content-Type" => "text/plain"}, %w{ a b c }] })
+    Rack::Lint.new(app).call(Rack::MockRequest.env_for("/"))
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_logger.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_logger.rb
new file mode 100644
index 0000000..2ff4408
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_logger.rb
@@ -0,0 +1,23 @@
+require 'stringio'
+require 'rack/lint'
+require 'rack/logger'
+require 'rack/mock'
+
+describe Rack::Logger do
+  app = lambda { |env|
+    log = env['rack.logger']
+    log.debug("Created logger")
+    log.info("Program started")
+    log.warn("Nothing to do!")
+
+    [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]]
+  }
+
+  should "conform to Rack::Lint" do
+    errors = StringIO.new
+    a = Rack::Lint.new(Rack::Logger.new(app))
+    Rack::MockRequest.new(a).get('/', 'rack.errors' => errors)
+    errors.string.should.match(/INFO -- : Program started/)
+    errors.string.should.match(/WARN -- : Nothing to do/)
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_methodoverride.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_methodoverride.rb
new file mode 100644
index 0000000..16f5f28
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_methodoverride.rb
@@ -0,0 +1,75 @@
+require 'stringio'
+require 'rack/methodoverride'
+require 'rack/mock'
+
+describe Rack::MethodOverride do
+  def app
+    Rack::Lint.new(Rack::MethodOverride.new(lambda {|e|
+      [200, {"Content-Type" => "text/plain"}, []]
+    }))
+  end
+  
+  should "not affect GET requests" do
+    env = Rack::MockRequest.env_for("/?_method=delete", :method => "GET")
+    app.call env
+
+    env["REQUEST_METHOD"].should.equal "GET"
+  end
+
+  should "modify REQUEST_METHOD for POST requests when _method parameter is set" do
+    env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=put")
+    app.call env
+
+    env["REQUEST_METHOD"].should.equal "PUT"
+  end
+
+  should "modify REQUEST_METHOD for POST requests when X-HTTP-Method-Override is set" do
+    env = Rack::MockRequest.env_for("/",
+            :method => "POST",
+            "HTTP_X_HTTP_METHOD_OVERRIDE" => "PATCH"
+          )
+    app.call env
+
+    env["REQUEST_METHOD"].should.equal "PATCH"
+  end
+
+  should "not modify REQUEST_METHOD if the method is unknown" do
+    env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=foo")
+    app.call env
+
+    env["REQUEST_METHOD"].should.equal "POST"
+  end
+
+  should "not modify REQUEST_METHOD when _method is nil" do
+    env = Rack::MockRequest.env_for("/", :method => "POST", :input => "foo=bar")
+    app.call env
+
+    env["REQUEST_METHOD"].should.equal "POST"
+  end
+
+  should "store the original REQUEST_METHOD prior to overriding" do
+    env = Rack::MockRequest.env_for("/",
+            :method => "POST",
+            :input  => "_method=options")
+    app.call env
+
+    env["rack.methodoverride.original_method"].should.equal "POST"
+  end
+
+  should "not modify REQUEST_METHOD when given invalid multipart form data" do
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="huge"; filename="huge"\r
+EOF
+    env = Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size.to_s,
+                      :method => "POST", :input => input)
+    begin
+      app.call env
+    rescue EOFError
+    end
+
+    env["REQUEST_METHOD"].should.equal "POST"
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_mime.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_mime.rb
new file mode 100644
index 0000000..231bf35
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_mime.rb
@@ -0,0 +1,51 @@
+require 'rack/mime'
+
+describe Rack::Mime do
+
+  it "should return the fallback mime-type for files with no extension" do
+    fallback = 'image/jpg'
+    Rack::Mime.mime_type(File.extname('no_ext'), fallback).should.equal fallback
+  end
+
+  it "should always return 'application/octet-stream' for unknown file extensions" do
+    unknown_ext = File.extname('unknown_ext.abcdefg')
+    Rack::Mime.mime_type(unknown_ext).should.equal 'application/octet-stream'
+  end
+
+  it "should return the mime-type for a given extension" do
+    # sanity check. it would be infeasible test every single mime-type.
+    Rack::Mime.mime_type(File.extname('image.jpg')).should.equal 'image/jpeg'
+  end
+
+  it "should support null fallbacks" do
+    Rack::Mime.mime_type('.nothing', nil).should.equal nil
+  end
+
+  it "should match exact mimes" do
+    Rack::Mime.match?('text/html', 'text/html').should.equal true
+    Rack::Mime.match?('text/html', 'text/meme').should.equal false
+    Rack::Mime.match?('text', 'text').should.equal true
+    Rack::Mime.match?('text', 'binary').should.equal false
+  end
+
+  it "should match class wildcard mimes" do
+    Rack::Mime.match?('text/html', 'text/*').should.equal true
+    Rack::Mime.match?('text/plain', 'text/*').should.equal true
+    Rack::Mime.match?('application/json', 'text/*').should.equal false
+    Rack::Mime.match?('text/html', 'text').should.equal true
+  end
+
+  it "should match full wildcards" do
+    Rack::Mime.match?('text/html', '*').should.equal true
+    Rack::Mime.match?('text/plain', '*').should.equal true
+    Rack::Mime.match?('text/html', '*/*').should.equal true
+    Rack::Mime.match?('text/plain', '*/*').should.equal true
+  end
+
+  it "should match type wildcard mimes" do
+    Rack::Mime.match?('text/html', '*/html').should.equal true
+    Rack::Mime.match?('text/plain', '*/plain').should.equal true
+  end
+
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_mock.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_mock.rb
new file mode 100644
index 0000000..f49b196
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_mock.rb
@@ -0,0 +1,269 @@
+require 'yaml'
+require 'rack/lint'
+require 'rack/mock'
+require 'stringio'
+
+app = Rack::Lint.new(lambda { |env|
+  req = Rack::Request.new(env)
+
+  env["mock.postdata"] = env["rack.input"].read
+  if req.GET["error"]
+    env["rack.errors"].puts req.GET["error"]
+    env["rack.errors"].flush
+  end
+
+  body = req.head? ? "" : env.to_yaml
+  Rack::Response.new(body,
+                     req.GET["status"] || 200,
+                     "Content-Type" => "text/yaml").finish
+})
+
+describe Rack::MockRequest do
+  should "return a MockResponse" do
+    res = Rack::MockRequest.new(app).get("")
+    res.should.be.kind_of Rack::MockResponse
+  end
+
+  should "be able to only return the environment" do
+    env = Rack::MockRequest.env_for("")
+    env.should.be.kind_of Hash
+    env.should.include "rack.version"
+  end
+
+  should "provide sensible defaults" do
+    res = Rack::MockRequest.new(app).request
+
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+    env["SERVER_NAME"].should.equal "example.org"
+    env["SERVER_PORT"].should.equal "80"
+    env["QUERY_STRING"].should.equal ""
+    env["PATH_INFO"].should.equal "/"
+    env["SCRIPT_NAME"].should.equal ""
+    env["rack.url_scheme"].should.equal "http"
+    env["mock.postdata"].should.be.empty
+  end
+
+  should "allow GET/POST/PUT/DELETE/HEAD" do
+    res = Rack::MockRequest.new(app).get("", :input => "foo")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+
+    res = Rack::MockRequest.new(app).post("", :input => "foo")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "POST"
+
+    res = Rack::MockRequest.new(app).put("", :input => "foo")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "PUT"
+
+    res = Rack::MockRequest.new(app).patch("", :input => "foo")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "PATCH"
+
+    res = Rack::MockRequest.new(app).delete("", :input => "foo")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "DELETE"
+    
+    Rack::MockRequest.env_for("/", :method => "HEAD")["REQUEST_METHOD"].
+      should.equal "HEAD"
+
+    Rack::MockRequest.env_for("/", :method => "OPTIONS")["REQUEST_METHOD"].
+      should.equal "OPTIONS"
+  end
+
+  should "set content length" do
+    env = Rack::MockRequest.env_for("/", :input => "foo")
+    env["CONTENT_LENGTH"].should.equal "3"
+  end
+
+  should "allow posting" do
+    res = Rack::MockRequest.new(app).get("", :input => "foo")
+    env = YAML.load(res.body)
+    env["mock.postdata"].should.equal "foo"
+
+    res = Rack::MockRequest.new(app).post("", :input => StringIO.new("foo"))
+    env = YAML.load(res.body)
+    env["mock.postdata"].should.equal "foo"
+  end
+
+  should "use all parts of an URL" do
+    res = Rack::MockRequest.new(app).
+      get("https://bla.example.org:9292/meh/foo?bar")
+    res.should.be.kind_of Rack::MockResponse
+
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+    env["SERVER_NAME"].should.equal "bla.example.org"
+    env["SERVER_PORT"].should.equal "9292"
+    env["QUERY_STRING"].should.equal "bar"
+    env["PATH_INFO"].should.equal "/meh/foo"
+    env["rack.url_scheme"].should.equal "https"
+  end
+
+  should "set SSL port and HTTP flag on when using https" do
+    res = Rack::MockRequest.new(app).
+      get("https://example.org/foo")
+    res.should.be.kind_of Rack::MockResponse
+
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+    env["SERVER_NAME"].should.equal "example.org"
+    env["SERVER_PORT"].should.equal "443"
+    env["QUERY_STRING"].should.equal ""
+    env["PATH_INFO"].should.equal "/foo"
+    env["rack.url_scheme"].should.equal "https"
+    env["HTTPS"].should.equal "on"
+  end
+
+  should "prepend slash to uri path" do
+    res = Rack::MockRequest.new(app).
+      get("foo")
+    res.should.be.kind_of Rack::MockResponse
+
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+    env["SERVER_NAME"].should.equal "example.org"
+    env["SERVER_PORT"].should.equal "80"
+    env["QUERY_STRING"].should.equal ""
+    env["PATH_INFO"].should.equal "/foo"
+    env["rack.url_scheme"].should.equal "http"
+  end
+
+  should "properly convert method name to an uppercase string" do
+    res = Rack::MockRequest.new(app).request(:get)
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+  end
+
+  should "accept params and build query string for GET requests" do
+    res = Rack::MockRequest.new(app).get("/foo?baz=2", :params => {:foo => {:bar => "1"}})
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+    env["QUERY_STRING"].should.include "baz=2"
+    env["QUERY_STRING"].should.include "foo[bar]=1"
+    env["PATH_INFO"].should.equal "/foo"
+    env["mock.postdata"].should.equal ""
+  end
+
+  should "accept raw input in params for GET requests" do
+    res = Rack::MockRequest.new(app).get("/foo?baz=2", :params => "foo[bar]=1")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "GET"
+    env["QUERY_STRING"].should.include "baz=2"
+    env["QUERY_STRING"].should.include "foo[bar]=1"
+    env["PATH_INFO"].should.equal "/foo"
+    env["mock.postdata"].should.equal ""
+  end
+
+  should "accept params and build url encoded params for POST requests" do
+    res = Rack::MockRequest.new(app).post("/foo", :params => {:foo => {:bar => "1"}})
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "POST"
+    env["QUERY_STRING"].should.equal ""
+    env["PATH_INFO"].should.equal "/foo"
+    env["CONTENT_TYPE"].should.equal "application/x-www-form-urlencoded"
+    env["mock.postdata"].should.equal "foo[bar]=1"
+  end
+
+  should "accept raw input in params for POST requests" do
+    res = Rack::MockRequest.new(app).post("/foo", :params => "foo[bar]=1")
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "POST"
+    env["QUERY_STRING"].should.equal ""
+    env["PATH_INFO"].should.equal "/foo"
+    env["CONTENT_TYPE"].should.equal "application/x-www-form-urlencoded"
+    env["mock.postdata"].should.equal "foo[bar]=1"
+  end
+
+  should "accept params and build multipart encoded params for POST requests" do
+    files = Rack::Multipart::UploadedFile.new(File.join(File.dirname(__FILE__), "multipart", "file1.txt"))
+    res = Rack::MockRequest.new(app).post("/foo", :params => { "submit-name" => "Larry", "files" => files })
+    env = YAML.load(res.body)
+    env["REQUEST_METHOD"].should.equal "POST"
+    env["QUERY_STRING"].should.equal ""
+    env["PATH_INFO"].should.equal "/foo"
+    env["CONTENT_TYPE"].should.equal "multipart/form-data; boundary=AaB03x"
+    # The gsub accounts for differences in YAMLs affect on the data.
+    env["mock.postdata"].gsub("\r", "").length.should.equal 206
+  end
+
+  should "behave valid according to the Rack spec" do
+    lambda {
+      Rack::MockRequest.new(app).
+        get("https://bla.example.org:9292/meh/foo?bar", :lint => true)
+    }.should.not.raise(Rack::Lint::LintError)
+  end
+
+  should "call close on the original body object" do
+    called = false
+    body   = Rack::BodyProxy.new(['hi']) { called = true }
+    capp   = proc { |e| [200, {'Content-Type' => 'text/plain'}, body] }
+    called.should.equal false
+    Rack::MockRequest.new(capp).get('/', :lint => true)
+    called.should.equal true
+  end
+end
+
+describe Rack::MockResponse do
+  should "provide access to the HTTP status" do
+    res = Rack::MockRequest.new(app).get("")
+    res.should.be.successful
+    res.should.be.ok
+
+    res = Rack::MockRequest.new(app).get("/?status=404")
+    res.should.not.be.successful
+    res.should.be.client_error
+    res.should.be.not_found
+
+    res = Rack::MockRequest.new(app).get("/?status=501")
+    res.should.not.be.successful
+    res.should.be.server_error
+
+    res = Rack::MockRequest.new(app).get("/?status=307")
+    res.should.be.redirect
+
+    res = Rack::MockRequest.new(app).get("/?status=201", :lint => true)
+    res.should.be.empty
+  end
+
+  should "provide access to the HTTP headers" do
+    res = Rack::MockRequest.new(app).get("")
+    res.should.include "Content-Type"
+    res.headers["Content-Type"].should.equal "text/yaml"
+    res.original_headers["Content-Type"].should.equal "text/yaml"
+    res["Content-Type"].should.equal "text/yaml"
+    res.content_type.should.equal "text/yaml"
+    res.content_length.should.not.equal 0
+    res.location.should.be.nil
+  end
+
+  should "provide access to the HTTP body" do
+    res = Rack::MockRequest.new(app).get("")
+    res.body.should =~ /rack/
+    res.should =~ /rack/
+    res.should.match(/rack/)
+    res.should.satisfy { |r| r.match(/rack/) }
+  end
+
+  should "provide access to the Rack errors" do
+    res = Rack::MockRequest.new(app).get("/?error=foo", :lint => true)
+    res.should.be.ok
+    res.errors.should.not.be.empty
+    res.errors.should.include "foo"
+  end
+
+  should "allow calling body.close afterwards" do
+    # this is exactly what rack-test does
+    body = StringIO.new("hi")
+    res = Rack::MockResponse.new(200, {}, body)
+    body.close if body.respond_to?(:close)
+    res.body.should == 'hi'
+  end
+
+  should "optionally make Rack errors fatal" do
+    lambda {
+      Rack::MockRequest.new(app).get("/?error=foo", :fatal => true)
+    }.should.raise(Rack::MockRequest::FatalWarning)
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_mongrel.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_mongrel.rb
new file mode 100644
index 0000000..e162cdc
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_mongrel.rb
@@ -0,0 +1,182 @@
+begin
+require 'rack'
+require 'rack/handler/mongrel'
+require File.expand_path('../testrequest', __FILE__)
+require 'timeout'
+
+Thread.abort_on_exception = true
+$tcp_defer_accept_opts = nil
+$tcp_cork_opts = nil
+
+describe Rack::Handler::Mongrel do
+  extend TestRequest::Helpers
+
+  @server = Mongrel::HttpServer.new(@host='127.0.0.1', @port=9201)
+  @server.register('/test',
+                  Rack::Handler::Mongrel.new(Rack::Lint.new(TestRequest.new)))
+  @server.register('/stream',
+                  Rack::Handler::Mongrel.new(Rack::Lint.new(StreamingRequest)))
+  @acc = @server.run
+
+  should "respond" do
+    lambda {
+      GET("/test")
+    }.should.not.raise
+  end
+
+  should "be a Mongrel" do
+    GET("/test")
+    status.should.equal 200
+    response["SERVER_SOFTWARE"].should =~ /Mongrel/
+    response["HTTP_VERSION"].should.equal "HTTP/1.1"
+    response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
+    response["SERVER_PORT"].should.equal "9201"
+    response["SERVER_NAME"].should.equal "127.0.0.1"
+  end
+
+  should "have rack headers" do
+    GET("/test")
+    response["rack.version"].should.equal [1,2]
+    response["rack.multithread"].should.be.true
+    response["rack.multiprocess"].should.be.false
+    response["rack.run_once"].should.be.false
+  end
+
+  should "have CGI headers on GET" do
+    GET("/test")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test"
+    response["PATH_INFO"].should.be.equal ""
+    response["QUERY_STRING"].should.equal ""
+    response["test.postdata"].should.equal ""
+
+    GET("/test/foo?quux=1")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test/foo"
+    response["PATH_INFO"].should.equal "/foo"
+    response["QUERY_STRING"].should.equal "quux=1"
+  end
+
+  should "have CGI headers on POST" do
+    POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
+    status.should.equal 200
+    response["REQUEST_METHOD"].should.equal "POST"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test"
+    response["QUERY_STRING"].should.equal ""
+    response["HTTP_X_TEST_HEADER"].should.equal "42"
+    response["test.postdata"].should.equal "rack-form-data=23"
+  end
+
+  should "support HTTP auth" do
+    GET("/test", {:user => "ruth", :passwd => "secret"})
+    response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
+  end
+
+  should "set status" do
+    GET("/test?secret")
+    status.should.equal 403
+    response["rack.url_scheme"].should.equal "http"
+  end
+
+  should "provide a .run" do
+    block_ran = false
+    Thread.new {
+      Rack::Handler::Mongrel.run(lambda {}, {:Host => '127.0.0.1', :Port => 9211}) { |server|
+        server.should.be.kind_of Mongrel::HttpServer
+        block_ran = true
+      }
+    }
+    sleep 1
+    block_ran.should.be.true
+  end
+
+  should "provide a .run that maps a hash" do
+    block_ran = false
+    Thread.new {
+      map = {'/'=>lambda{},'/foo'=>lambda{}}
+      Rack::Handler::Mongrel.run(map, :map => true, :Host => '127.0.0.1', :Port => 9221) { |server|
+        server.should.be.kind_of Mongrel::HttpServer
+        server.classifier.uris.size.should.equal 2
+        server.classifier.uris.should.not.include '/arf'
+        server.classifier.uris.should.include '/'
+        server.classifier.uris.should.include '/foo'
+        block_ran = true
+      }
+    }
+    sleep 1
+    block_ran.should.be.true
+  end
+
+  should "provide a .run that maps a urlmap" do
+    block_ran = false
+    Thread.new {
+      map = Rack::URLMap.new({'/'=>lambda{},'/bar'=>lambda{}})
+      Rack::Handler::Mongrel.run(map, {:map => true, :Host => '127.0.0.1', :Port => 9231}) { |server|
+        server.should.be.kind_of Mongrel::HttpServer
+        server.classifier.uris.size.should.equal 2
+        server.classifier.uris.should.not.include '/arf'
+        server.classifier.uris.should.include '/'
+        server.classifier.uris.should.include '/bar'
+        block_ran = true
+      }
+    }
+    sleep 1
+    block_ran.should.be.true
+  end
+
+  should "provide a .run that maps a urlmap restricting by host" do
+    block_ran = false
+    Thread.new {
+      map = Rack::URLMap.new({
+        '/' => lambda{},
+        '/foo' => lambda{},
+        '/bar' => lambda{},
+        'http://127.0.0.1/' => lambda{},
+        'http://127.0.0.1/bar' => lambda{},
+        'http://falsehost/arf' => lambda{},
+        'http://falsehost/qux' => lambda{}
+      })
+      opt = {:map => true, :Port => 9241, :Host => '127.0.0.1'}
+      Rack::Handler::Mongrel.run(map, opt) { |server|
+        server.should.be.kind_of Mongrel::HttpServer
+        server.classifier.uris.should.include '/'
+        server.classifier.handler_map['/'].size.should.equal 2
+        server.classifier.uris.should.include '/foo'
+        server.classifier.handler_map['/foo'].size.should.equal 1
+        server.classifier.uris.should.include '/bar'
+        server.classifier.handler_map['/bar'].size.should.equal 2
+        server.classifier.uris.should.not.include '/qux'
+        server.classifier.uris.should.not.include '/arf'
+        server.classifier.uris.size.should.equal 3
+        block_ran = true
+      }
+    }
+    sleep 1
+    block_ran.should.be.true
+  end
+
+  should "stream #each part of the response" do
+    body = ''
+    begin
+      Timeout.timeout(1) do
+        Net::HTTP.start(@host, @port) do |http|
+          get = Net::HTTP::Get.new('/stream')
+          http.request(get) do |response|
+            response.read_body { |part| body << part }
+          end
+        end
+      end
+    rescue Timeout::Error
+    end
+    body.should.not.be.empty
+  end
+
+  @acc.raise Mongrel::StopServer
+end
+
+rescue LoadError
+  warn "Skipping Rack::Handler::Mongrel tests (Mongrel is required). `gem install mongrel` and try again."
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_multipart.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_multipart.rb
new file mode 100644
index 0000000..bd0b07b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_multipart.rb
@@ -0,0 +1,445 @@
+require 'rack/utils'
+require 'rack/mock'
+
+describe Rack::Multipart do
+  def multipart_fixture(name, boundary = "AaB03x")
+    file = multipart_file(name)
+    data = File.open(file, 'rb') { |io| io.read }
+
+    type = "multipart/form-data; boundary=#{boundary}"
+    length = data.respond_to?(:bytesize) ? data.bytesize : data.size
+
+    { "CONTENT_TYPE" => type,
+      "CONTENT_LENGTH" => length.to_s,
+      :input => StringIO.new(data) }
+  end
+
+  def multipart_file(name)
+    File.join(File.dirname(__FILE__), "multipart", name.to_s)
+  end
+
+  should "return nil if content type is not multipart" do
+    env = Rack::MockRequest.env_for("/",
+            "CONTENT_TYPE" => 'application/x-www-form-urlencoded')
+    Rack::Multipart.parse_multipart(env).should.equal nil
+  end
+
+  should "parse multipart content when content type present but filename is not" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:content_type_and_no_filename))
+    params = Rack::Multipart.parse_multipart(env)
+    params["text"].should.equal "contents"
+  end
+
+  should "raise RangeError if the key space is exhausted" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:content_type_and_no_filename))
+
+    old, Rack::Utils.key_space_limit = Rack::Utils.key_space_limit, 1
+    begin
+      lambda { Rack::Multipart.parse_multipart(env) }.should.raise(RangeError)
+    ensure
+      Rack::Utils.key_space_limit = old
+    end
+  end
+
+  should "parse multipart form webkit style" do
+    env = Rack::MockRequest.env_for '/', multipart_fixture(:webkit)
+    env['CONTENT_TYPE'] = "multipart/form-data; boundary=----WebKitFormBoundaryWLHCs9qmcJJoyjKR"
+    params = Rack::Multipart.parse_multipart(env)
+    params['profile']['bio'].should.include 'hello'
+  end
+
+  should "reject insanely long boundaries" do
+    # using a pipe since a tempfile can use up too much space
+    rd, wr = IO.pipe
+
+    # we only call rewind once at start, so make sure it succeeds
+    # and doesn't hit ESPIPE
+    def rd.rewind; end
+    wr.sync = true
+
+    # mock out length to make this pipe look like a Tempfile
+    def rd.length
+      1024 * 1024 * 8
+    end
+
+    # write to a pipe in a background thread, this will write a lot
+    # unless Rack (properly) shuts down the read end
+    thr = Thread.new do
+      begin
+        wr.write("--AaB03x")
+
+        # make the initial boundary a few gigs long
+        longer = "0123456789" * 1024 * 1024
+        (1024 * 1024).times { wr.write(longer) }
+
+        wr.write("\r\n")
+        wr.write('Content-Disposition: form-data; name="a"; filename="a.txt"')
+        wr.write("\r\n")
+        wr.write("Content-Type: text/plain\r\n")
+        wr.write("\r\na")
+        wr.write("--AaB03x--\r\n")
+        wr.close
+      rescue => err # this is EPIPE if Rack shuts us down
+        err
+      end
+    end
+
+    fixture = {
+      "CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
+      "CONTENT_LENGTH" => rd.length.to_s,
+      :input => rd,
+    }
+
+    env = Rack::MockRequest.env_for '/', fixture
+    lambda {
+      Rack::Multipart.parse_multipart(env)
+    }.should.raise(EOFError)
+    rd.close
+
+    err = thr.value
+    err.should.be.instance_of Errno::EPIPE
+    wr.close
+  end
+
+  should "parse multipart upload with text file" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:text))
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["submit-name-with-content"].should.equal "Berry"
+    params["files"][:type].should.equal "text/plain"
+    params["files"][:filename].should.equal "file1.txt"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; filename=\"file1.txt\"\r\n" +
+      "Content-Type: text/plain\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse multipart upload with nested parameters" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:nested))
+    params = Rack::Multipart.parse_multipart(env)
+    params["foo"]["submit-name"].should.equal "Larry"
+    params["foo"]["files"][:type].should.equal "text/plain"
+    params["foo"]["files"][:filename].should.equal "file1.txt"
+    params["foo"]["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"foo[files]\"; filename=\"file1.txt\"\r\n" +
+      "Content-Type: text/plain\r\n"
+    params["foo"]["files"][:name].should.equal "foo[files]"
+    params["foo"]["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse multipart upload with binary file" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:binary))
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["files"][:type].should.equal "image/png"
+    params["files"][:filename].should.equal "rack-logo.png"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; filename=\"rack-logo.png\"\r\n" +
+      "Content-Type: image/png\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.length.should.equal 26473
+  end
+
+  should "parse multipart upload with empty file" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:empty))
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["files"][:type].should.equal "text/plain"
+    params["files"][:filename].should.equal "file1.txt"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; filename=\"file1.txt\"\r\n" +
+      "Content-Type: text/plain\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal ""
+  end
+
+  should "parse multipart upload with filename with semicolons" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:semicolon))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "text/plain"
+    params["files"][:filename].should.equal "fi;le1.txt"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; filename=\"fi;le1.txt\"\r\n" +
+      "Content-Type: text/plain\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "not include file params if no file was selected" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:none))
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["files"].should.equal nil
+    params.keys.should.not.include "files"
+  end
+
+  should "parse multipart/mixed" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:mixed_files))
+    params = Rack::Utils::Multipart.parse_multipart(env)
+    params["foo"].should.equal "bar"
+    params["files"].should.be.instance_of String
+    params["files"].size.should.equal 252
+  end
+
+  should "parse IE multipart upload and clean up filename" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:ie))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "text/plain"
+    params["files"][:filename].should.equal "file1.txt"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; " +
+      'filename="C:\Documents and Settings\Administrator\Desktop\file1.txt"' +
+      "\r\nContent-Type: text/plain\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename and modification param" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_and_modification_param))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "image/jpeg"
+    params["files"][:filename].should.equal "genome.jpeg"
+    params["files"][:head].should.equal "Content-Type: image/jpeg\r\n" +
+      "Content-Disposition: attachment; " +
+      "name=\"files\"; " +
+      "filename=genome.jpeg; " +
+      "modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\";\r\n" +
+      "Content-Description: a complete map of the human genome\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with escaped quotes" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_escaped_quotes))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "application/octet-stream"
+    params["files"][:filename].should.equal "escape \"quotes"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; " +
+      "filename=\"escape \\\"quotes\"\r\n" +
+      "Content-Type: application/octet-stream\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with percent escaped quotes" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_percent_escaped_quotes))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "application/octet-stream"
+    params["files"][:filename].should.equal "escape \"quotes"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; " +
+      "filename=\"escape %22quotes\"\r\n" +
+      "Content-Type: application/octet-stream\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with unescaped quotes" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_unescaped_quotes))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "application/octet-stream"
+    params["files"][:filename].should.equal "escape \"quotes"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; " +
+      "filename=\"escape \"quotes\"\r\n" +
+      "Content-Type: application/octet-stream\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with escaped quotes and modification param" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_escaped_quotes_and_modification_param))
+    params = Rack::Multipart.parse_multipart(env)
+    params["files"][:type].should.equal "image/jpeg"
+    params["files"][:filename].should.equal "\"human\" genome.jpeg"
+    params["files"][:head].should.equal "Content-Type: image/jpeg\r\n" +
+      "Content-Disposition: attachment; " +
+      "name=\"files\"; " +
+      "filename=\"\"human\" genome.jpeg\"; " +
+      "modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\";\r\n" +
+      "Content-Description: a complete map of the human genome\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with unescaped percentage characters" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_unescaped_percentages, "----WebKitFormBoundary2NHc7OhsgU68l3Al"))
+    params = Rack::Multipart.parse_multipart(env)
+    files = params["document"]["attachment"]
+    files[:type].should.equal "image/jpeg"
+    files[:filename].should.equal "100% of a photo.jpeg"
+    files[:head].should.equal <<-MULTIPART
+Content-Disposition: form-data; name="document[attachment]"; filename="100% of a photo.jpeg"\r
+Content-Type: image/jpeg\r
+    MULTIPART
+
+    files[:name].should.equal "document[attachment]"
+    files[:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with unescaped percentage characters that look like partial hex escapes" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_unescaped_percentages2, "----WebKitFormBoundary2NHc7OhsgU68l3Al"))
+    params = Rack::Multipart.parse_multipart(env)
+    files = params["document"]["attachment"]
+    files[:type].should.equal "image/jpeg"
+    files[:filename].should.equal "100%a"
+    files[:head].should.equal <<-MULTIPART
+Content-Disposition: form-data; name="document[attachment]"; filename="100%a"\r
+Content-Type: image/jpeg\r
+    MULTIPART
+
+    files[:name].should.equal "document[attachment]"
+    files[:tempfile].read.should.equal "contents"
+  end
+
+  should "parse filename with unescaped percentage characters that look like partial hex escapes" do
+    env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_unescaped_percentages3, "----WebKitFormBoundary2NHc7OhsgU68l3Al"))
+    params = Rack::Multipart.parse_multipart(env)
+    files = params["document"]["attachment"]
+    files[:type].should.equal "image/jpeg"
+    files[:filename].should.equal "100%"
+    files[:head].should.equal <<-MULTIPART
+Content-Disposition: form-data; name="document[attachment]"; filename="100%"\r
+Content-Type: image/jpeg\r
+    MULTIPART
+
+    files[:name].should.equal "document[attachment]"
+    files[:tempfile].read.should.equal "contents"
+  end
+
+  it "rewinds input after parsing upload" do
+    options = multipart_fixture(:text)
+    input = options[:input]
+    env = Rack::MockRequest.env_for("/", options)
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["files"][:filename].should.equal "file1.txt"
+    input.read.length.should.equal 307
+  end
+
+  it "builds multipart body" do
+    files = Rack::Multipart::UploadedFile.new(multipart_file("file1.txt"))
+    data  = Rack::Multipart.build_multipart("submit-name" => "Larry", "files" => files)
+
+    options = {
+      "CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
+      "CONTENT_LENGTH" => data.length.to_s,
+      :input => StringIO.new(data)
+    }
+    env = Rack::MockRequest.env_for("/", options)
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["files"][:filename].should.equal "file1.txt"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
+  it "builds nested multipart body" do
+    files = Rack::Multipart::UploadedFile.new(multipart_file("file1.txt"))
+    data  = Rack::Multipart.build_multipart("people" => [{"submit-name" => "Larry", "files" => files}])
+
+    options = {
+      "CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
+      "CONTENT_LENGTH" => data.length.to_s,
+      :input => StringIO.new(data)
+    }
+    env = Rack::MockRequest.env_for("/", options)
+    params = Rack::Multipart.parse_multipart(env)
+    params["people"][0]["submit-name"].should.equal "Larry"
+    params["people"][0]["files"][:filename].should.equal "file1.txt"
+    params["people"][0]["files"][:tempfile].read.should.equal "contents"
+  end
+
+  it "can parse fields that end at the end of the buffer" do
+    input = File.read(multipart_file("bad_robots"))
+
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    req.POST['file.path'].should.equal "/var/tmp/uploads/4/0001728414"
+    req.POST['addresses'].should.not.equal nil
+  end
+
+  it "builds complete params with the chunk size of 16384 slicing exactly on boundary" do
+    data = File.open(multipart_file("fail_16384_nofile"), 'rb') { |f| f.read }.gsub(/\n/, "\r\n")
+    options = {
+      "CONTENT_TYPE" => "multipart/form-data; boundary=----WebKitFormBoundaryWsY0GnpbI5U7ztzo",
+      "CONTENT_LENGTH" => data.length.to_s,
+      :input => StringIO.new(data)
+    }
+    env = Rack::MockRequest.env_for("/", options)
+    params = Rack::Multipart.parse_multipart(env)
+
+    params.should.not.equal nil
+    params.keys.should.include "AAAAAAAAAAAAAAAAAAA"
+    params["AAAAAAAAAAAAAAAAAAA"].keys.should.include "PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"
+    params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"].keys.should.include "new"
+    params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"].keys.should.include "-2"
+    params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"]["-2"].keys.should.include "ba_unit_id"
+    params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"]["-2"]["ba_unit_id"].should.equal "1017"
+  end
+
+  should "return nil if no UploadedFiles were used" do
+    data = Rack::Multipart.build_multipart("people" => [{"submit-name" => "Larry", "files" => "contents"}])
+    data.should.equal nil
+  end
+
+  should "raise ArgumentError if params is not a Hash" do
+    lambda { Rack::Multipart.build_multipart("foo=bar") }.
+      should.raise(ArgumentError).
+      message.should.equal "value must be a Hash"
+  end
+
+  it "can parse fields with a content type" do
+    data = <<-EOF
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon\r
+Content-Disposition: form-data; name="description"\r
+Content-Type: text/plain"\r
+\r
+Very very blue\r
+--1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon--\r
+EOF
+    options = {
+      "CONTENT_TYPE" => "multipart/form-data; boundary=1yy3laWhgX31qpiHinh67wJXqKalukEUTvqTzmon",
+      "CONTENT_LENGTH" => data.length.to_s,
+      :input => StringIO.new(data)
+    }
+    env = Rack::MockRequest.env_for("/", options)
+    params = Rack::Utils::Multipart.parse_multipart(env)
+
+    params.should.equal({"description"=>"Very very blue"})
+  end
+
+  should "parse multipart upload with no content-length header" do
+    env = Rack::MockRequest.env_for '/', multipart_fixture(:webkit)
+    env['CONTENT_TYPE'] = "multipart/form-data; boundary=----WebKitFormBoundaryWLHCs9qmcJJoyjKR"
+    env.delete 'CONTENT_LENGTH'
+    params = Rack::Multipart.parse_multipart(env)
+    params['profile']['bio'].should.include 'hello'
+  end
+
+  should "parse very long unquoted multipart file names" do
+    data = <<-EOF
+--AaB03x\r
+Content-Type: text/plain\r
+Content-Disposition: attachment; name=file; filename=#{'long' * 100}\r
+\r
+contents\r
+--AaB03x--\r
+    EOF
+
+    options = {
+      "CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x",
+      "CONTENT_LENGTH" => data.length.to_s,
+      :input => StringIO.new(data)
+    }
+    env = Rack::MockRequest.env_for("/", options)
+    params = Rack::Utils::Multipart.parse_multipart(env)
+
+    params["file"][:filename].should.equal('long' * 100)
+  end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_nulllogger.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_nulllogger.rb
new file mode 100644
index 0000000..88ba521
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_nulllogger.rb
@@ -0,0 +1,20 @@
+require 'rack/lint'
+require 'rack/mock'
+require 'rack/nulllogger'
+
+describe Rack::NullLogger do
+  should "act as a noop logger" do
+    app = lambda { |env|
+      env['rack.logger'].warn "b00m"
+      [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]]
+    }
+
+    logger = Rack::Lint.new(Rack::NullLogger.new(app))
+
+    res = logger.call(Rack::MockRequest.env_for)
+    res[0..1].should.equal [
+      200, {'Content-Type' => 'text/plain'}
+    ]
+    res[2].to_enum.to_a.should.equal ["Hello, World!"]
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_recursive.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_recursive.rb
new file mode 100644
index 0000000..764c44c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_recursive.rb
@@ -0,0 +1,72 @@
+require 'rack/lint'
+require 'rack/recursive'
+require 'rack/mock'
+
+describe Rack::Recursive do
+  @app1 = lambda { |env|
+    res = Rack::Response.new
+    res["X-Path-Info"] = env["PATH_INFO"]
+    res["X-Query-String"] = env["QUERY_STRING"]
+    res.finish do |inner_res|
+      inner_res.write "App1"
+    end
+  }
+
+  @app2 = lambda { |env|
+    Rack::Response.new.finish do |res|
+      res.write "App2"
+      _, _, body = env['rack.recursive.include'].call(env, "/app1")
+      body.each { |b|
+        res.write b
+      }
+    end
+  }
+
+  @app3 = lambda { |env|
+    raise Rack::ForwardRequest.new("/app1")
+  }
+
+  @app4 = lambda { |env|
+    raise Rack::ForwardRequest.new("http://example.org/app1/quux?meh")
+  }
+  
+  def recursive(map)
+    Rack::Lint.new Rack::Recursive.new(Rack::URLMap.new(map))
+  end
+
+  should "allow for subrequests" do
+    res = Rack::MockRequest.new(recursive("/app1" => @app1,
+                                          "/app2" => @app2)).
+      get("/app2")
+
+    res.should.be.ok
+    res.body.should.equal "App2App1"
+  end
+
+  should "raise error on requests not below the app" do
+    app = Rack::URLMap.new("/app1" => @app1,
+                           "/app" => recursive("/1" => @app1,
+                                               "/2" => @app2))
+
+    lambda {
+      Rack::MockRequest.new(app).get("/app/2")
+    }.should.raise(ArgumentError).
+      message.should =~ /can only include below/
+  end
+
+  should "support forwarding" do
+    app = recursive("/app1" => @app1,
+                    "/app3" => @app3,
+                    "/app4" => @app4)
+
+    res = Rack::MockRequest.new(app).get("/app3")
+    res.should.be.ok
+    res.body.should.equal "App1"
+
+    res = Rack::MockRequest.new(app).get("/app4")
+    res.should.be.ok
+    res.body.should.equal "App1"
+    res["X-Path-Info"].should.equal "/quux"
+    res["X-Query-String"].should.equal "meh"
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_request.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_request.rb
new file mode 100644
index 0000000..9649c5d
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_request.rb
@@ -0,0 +1,1078 @@
+require 'stringio'
+require 'cgi'
+require 'rack/request'
+require 'rack/mock'
+
+describe Rack::Request do
+  should "wrap the rack variables" do
+    req = Rack::Request.new(Rack::MockRequest.env_for("http://example.com:8080/"))
+
+    req.body.should.respond_to? :gets
+    req.scheme.should.equal "http"
+    req.request_method.should.equal "GET"
+
+    req.should.be.get
+    req.should.not.be.post
+    req.should.not.be.put
+    req.should.not.be.delete
+    req.should.not.be.head
+    req.should.not.be.patch
+
+    req.script_name.should.equal ""
+    req.path_info.should.equal "/"
+    req.query_string.should.equal ""
+
+    req.host.should.equal "example.com"
+    req.port.should.equal 8080
+
+    req.content_length.should.equal "0"
+    req.content_type.should.be.nil
+  end
+
+  should "figure out the correct host" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "www2.example.org")
+    req.host.should.equal "www2.example.org"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "SERVER_NAME" => "example.org", "SERVER_PORT" => "9292")
+    req.host.should.equal "example.org"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org:9292")
+    req.host.should.equal "example.org"
+
+    env = Rack::MockRequest.env_for("/", "SERVER_ADDR" => "192.168.1.1", "SERVER_PORT" => "9292")
+    env.delete("SERVER_NAME")
+    req = Rack::Request.new(env)
+    req.host.should.equal "192.168.1.1"
+
+    env = Rack::MockRequest.env_for("/")
+    env.delete("SERVER_NAME")
+    req = Rack::Request.new(env)
+    req.host.should.equal ""
+  end
+
+  should "figure out the correct port" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "www2.example.org")
+    req.port.should.equal 80
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "www2.example.org:81")
+    req.port.should.equal 81
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "SERVER_NAME" => "example.org", "SERVER_PORT" => "9292")
+    req.port.should.equal 9292
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org:9292")
+    req.port.should.equal 9292
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org")
+    req.port.should.equal 80
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org", "HTTP_X_FORWARDED_SSL" => "on")
+    req.port.should.equal 443
+
+     req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org", "HTTP_X_FORWARDED_PROTO" => "https")
+    req.port.should.equal 443
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org", "HTTP_X_FORWARDED_PORT" => "9393")
+    req.port.should.equal 9393
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org:9393", "SERVER_PORT" => "80")
+    req.port.should.equal 9393
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org", "SERVER_PORT" => "9393")
+    req.port.should.equal 80
+  end
+
+  should "figure out the correct host with port" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "www2.example.org")
+    req.host_with_port.should.equal "www2.example.org"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81")
+    req.host_with_port.should.equal "localhost:81"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "SERVER_NAME" => "example.org", "SERVER_PORT" => "9292")
+    req.host_with_port.should.equal "example.org:9292"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org:9292")
+    req.host_with_port.should.equal "example.org:9292"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org", "SERVER_PORT" => "9393")
+    req.host_with_port.should.equal "example.org"
+  end
+
+  should "parse the query string" do
+    req = Rack::Request.new(Rack::MockRequest.env_for("/?foo=bar&quux=bla"))
+    req.query_string.should.equal "foo=bar&quux=bla"
+    req.GET.should.equal "foo" => "bar", "quux" => "bla"
+    req.POST.should.be.empty
+    req.params.should.equal "foo" => "bar", "quux" => "bla"
+  end
+
+  should "limit the keys from the GET query string" do
+    env = Rack::MockRequest.env_for("/?foo=bar")
+
+    old, Rack::Utils.key_space_limit = Rack::Utils.key_space_limit, 1
+    begin
+      req = Rack::Request.new(env)
+      lambda { req.GET }.should.raise(RangeError)
+    ensure
+      Rack::Utils.key_space_limit = old
+    end
+  end
+
+  should "limit the key size per nested params hash" do
+    nested_query = Rack::MockRequest.env_for("/?foo[bar][baz][qux]=1")
+    plain_query  = Rack::MockRequest.env_for("/?foo_bar__baz__qux_=1")
+
+    old, Rack::Utils.key_space_limit = Rack::Utils.key_space_limit, 3
+    begin
+      lambda { Rack::Request.new(nested_query).GET }.should.not.raise(RangeError)
+      lambda { Rack::Request.new(plain_query).GET  }.should.raise(RangeError)
+    ensure
+      Rack::Utils.key_space_limit = old
+    end
+  end
+
+  should "not unify GET and POST when calling params" do
+    mr = Rack::MockRequest.env_for("/?foo=quux",
+      "REQUEST_METHOD" => 'POST',
+      :input => "foo=bar&quux=bla"
+    )
+    req = Rack::Request.new mr
+
+    req.params
+
+    req.GET.should.equal "foo" => "quux"
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+    req.params.should.equal req.GET.merge(req.POST)
+  end
+
+  should "raise if rack.input is missing" do
+    req = Rack::Request.new({})
+    lambda { req.POST }.should.raise(RuntimeError)
+  end
+
+  should "parse POST data when method is POST and no Content-Type given" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/?foo=quux",
+        "REQUEST_METHOD" => 'POST',
+        :input => "foo=bar&quux=bla")
+    req.content_type.should.be.nil
+    req.media_type.should.be.nil
+    req.query_string.should.equal "foo=quux"
+    req.GET.should.equal "foo" => "quux"
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+    req.params.should.equal "foo" => "bar", "quux" => "bla"
+  end
+
+  should "limit the keys from the POST form data" do
+    env = Rack::MockRequest.env_for("",
+            "REQUEST_METHOD" => 'POST',
+            :input => "foo=bar&quux=bla")
+
+    old, Rack::Utils.key_space_limit = Rack::Utils.key_space_limit, 1
+    begin
+      req = Rack::Request.new(env)
+      lambda { req.POST }.should.raise(RangeError)
+    ensure
+      Rack::Utils.key_space_limit = old
+    end
+  end
+
+  should "parse POST data with explicit content type regardless of method" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/",
+        "CONTENT_TYPE" => 'application/x-www-form-urlencoded;foo=bar',
+        :input => "foo=bar&quux=bla")
+    req.content_type.should.equal 'application/x-www-form-urlencoded;foo=bar'
+    req.media_type.should.equal 'application/x-www-form-urlencoded'
+    req.media_type_params['foo'].should.equal 'bar'
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+    req.params.should.equal "foo" => "bar", "quux" => "bla"
+  end
+
+  should "not parse POST data when media type is not form-data" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/?foo=quux",
+        "REQUEST_METHOD" => 'POST',
+        "CONTENT_TYPE" => 'text/plain;charset=utf-8',
+        :input => "foo=bar&quux=bla")
+    req.content_type.should.equal 'text/plain;charset=utf-8'
+    req.media_type.should.equal 'text/plain'
+    req.media_type_params['charset'].should.equal 'utf-8'
+    req.POST.should.be.empty
+    req.params.should.equal "foo" => "quux"
+    req.body.read.should.equal "foo=bar&quux=bla"
+  end
+
+  should "parse POST data on PUT when media type is form-data" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/?foo=quux",
+        "REQUEST_METHOD" => 'PUT',
+        "CONTENT_TYPE" => 'application/x-www-form-urlencoded',
+        :input => "foo=bar&quux=bla")
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+    req.body.read.should.equal "foo=bar&quux=bla"
+  end
+
+  should "rewind input after parsing POST data" do
+    input = StringIO.new("foo=bar&quux=bla")
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/",
+        "CONTENT_TYPE" => 'application/x-www-form-urlencoded;foo=bar',
+        :input => input)
+    req.params.should.equal "foo" => "bar", "quux" => "bla"
+    input.read.should.equal "foo=bar&quux=bla"
+  end
+
+  should "clean up Safari's ajax POST body" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/",
+        'REQUEST_METHOD' => 'POST', :input => "foo=bar&quux=bla\0")
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+  end
+
+  should "get value by key from params with #[]" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("?foo=quux")
+    req['foo'].should.equal 'quux'
+    req[:foo].should.equal 'quux'
+  end
+
+  should "set value to key on params with #[]=" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("?foo=duh")
+    req['foo'].should.equal 'duh'
+    req[:foo].should.equal 'duh'
+    req.params.should.equal 'foo' => 'duh'
+
+    req['foo'] = 'bar'
+    req.params.should.equal 'foo' => 'bar'
+    req['foo'].should.equal 'bar'
+    req[:foo].should.equal 'bar'
+
+    req[:foo] = 'jaz'
+    req.params.should.equal 'foo' => 'jaz'
+    req['foo'].should.equal 'jaz'
+    req[:foo].should.equal 'jaz'
+  end
+
+  should "return values for the keys in the order given from values_at" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("?foo=baz&wun=der&bar=ful")
+    req.values_at('foo').should.equal ['baz']
+    req.values_at('foo', 'wun').should.equal ['baz', 'der']
+    req.values_at('bar', 'foo', 'wun').should.equal ['ful', 'baz', 'der']
+  end
+
+  should "extract referrer correctly" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_REFERER" => "/some/path")
+    req.referer.should.equal "/some/path"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/")
+    req.referer.should.equal nil
+  end
+
+  should "extract user agent correctly" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "HTTP_USER_AGENT" => "Mozilla/4.0 (compatible)")
+    req.user_agent.should.equal "Mozilla/4.0 (compatible)"
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/")
+    req.user_agent.should.equal nil
+  end
+
+  should "treat missing content type as nil" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/")
+    req.content_type.should.equal nil
+  end
+
+  should "treat empty content type as nil" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "CONTENT_TYPE" => "")
+    req.content_type.should.equal nil
+  end
+
+  should "return nil media type for empty content type" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/", "CONTENT_TYPE" => "")
+    req.media_type.should.equal nil
+  end
+
+  should "cache, but invalidates the cache" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/?foo=quux",
+        "CONTENT_TYPE" => "application/x-www-form-urlencoded",
+        :input => "foo=bar&quux=bla")
+    req.GET.should.equal "foo" => "quux"
+    req.GET.should.equal "foo" => "quux"
+    req.env["QUERY_STRING"] = "bla=foo"
+    req.GET.should.equal "bla" => "foo"
+    req.GET.should.equal "bla" => "foo"
+
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+    req.POST.should.equal "foo" => "bar", "quux" => "bla"
+    req.env["rack.input"] = StringIO.new("foo=bla&quux=bar")
+    req.POST.should.equal "foo" => "bla", "quux" => "bar"
+    req.POST.should.equal "foo" => "bla", "quux" => "bar"
+  end
+
+  should "figure out if called via XHR" do
+    req = Rack::Request.new(Rack::MockRequest.env_for(""))
+    req.should.not.be.xhr
+
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("", "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest")
+    req.should.be.xhr
+  end
+
+  should "ssl detection" do
+    request = Rack::Request.new(Rack::MockRequest.env_for("/"))
+    request.scheme.should.equal "http"
+    request.should.not.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTPS' => 'on'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'rack.url_scheme' => 'https'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_HOST' => 'www.example.org:8080'))
+    request.scheme.should.equal "http"
+    request.should.not.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_HOST' => 'www.example.org:8443', 'HTTPS' => 'on'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_HOST' => 'www.example.org:8443', 'HTTP_X_FORWARDED_SSL' => 'on'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_X_FORWARDED_SCHEME' => 'https'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_X_FORWARDED_PROTO' => 'https'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+
+    request = Rack::Request.new(Rack::MockRequest.env_for("/", 'HTTP_X_FORWARDED_PROTO' => 'https, http, http'))
+    request.scheme.should.equal "https"
+    request.should.be.ssl?
+  end
+
+  should "parse cookies" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("", "HTTP_COOKIE" => "foo=bar;quux=h&m")
+    req.cookies.should.equal "foo" => "bar", "quux" => "h&m"
+    req.cookies.should.equal "foo" => "bar", "quux" => "h&m"
+    req.env.delete("HTTP_COOKIE")
+    req.cookies.should.equal({})
+  end
+
+  should "always return the same hash object" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("", "HTTP_COOKIE" => "foo=bar;quux=h&m")
+    hash = req.cookies
+    req.env.delete("HTTP_COOKIE")
+    req.cookies.should.equal(hash)
+    req.env["HTTP_COOKIE"] = "zoo=m"
+    req.cookies.should.equal(hash)
+  end
+
+  should "modify the cookies hash in place" do
+    req = Rack::Request.new(Rack::MockRequest.env_for(""))
+    req.cookies.should.equal({})
+    req.cookies['foo'] = 'bar'
+    req.cookies.should.equal 'foo' => 'bar'
+  end
+
+  should "not modify the params hash in place" do
+    e = Rack::MockRequest.env_for("")
+    req1 = Rack::Request.new(e)
+    req1.params.should.equal({})
+    req1.params['foo'] = 'bar'
+    req1.params.should.equal 'foo' => 'bar'
+    req2 = Rack::Request.new(e)
+    req2.params.should.equal({})
+  end
+
+  should "modify params hash if param is in GET" do
+    e = Rack::MockRequest.env_for("?foo=duh")
+    req1 = Rack::Request.new(e)
+    req1.params.should.equal 'foo' => 'duh'
+    req1.update_param 'foo', 'bar'
+    req1.params.should.equal 'foo' => 'bar'
+    req2 = Rack::Request.new(e)
+    req2.params.should.equal 'foo' => 'bar'
+  end
+
+  should "modify params hash if param is in POST" do
+    e = Rack::MockRequest.env_for("", "REQUEST_METHOD" => 'POST', :input => 'foo=duh')
+    req1 = Rack::Request.new(e)
+    req1.params.should.equal 'foo' => 'duh'
+    req1.update_param 'foo', 'bar'
+    req1.params.should.equal 'foo' => 'bar'
+    req2 = Rack::Request.new(e)
+    req2.params.should.equal 'foo' => 'bar'
+  end
+
+  should "modify params hash, even if param didn't exist before" do
+    e = Rack::MockRequest.env_for("")
+    req1 = Rack::Request.new(e)
+    req1.params.should.equal({})
+    req1.update_param 'foo', 'bar'
+    req1.params.should.equal 'foo' => 'bar'
+    req2 = Rack::Request.new(e)
+    req2.params.should.equal 'foo' => 'bar'
+  end
+
+  should "modify params hash by changing only GET" do
+    e = Rack::MockRequest.env_for("?foo=duhget")
+    req = Rack::Request.new(e)
+    req.GET.should.equal 'foo' => 'duhget'
+    req.POST.should.equal({})
+    req.update_param 'foo', 'bar'
+    req.GET.should.equal 'foo' => 'bar'
+    req.POST.should.equal({})
+  end
+
+  should "modify params hash by changing only POST" do
+    e = Rack::MockRequest.env_for("", "REQUEST_METHOD" => 'POST', :input => "foo=duhpost")
+    req = Rack::Request.new(e)
+    req.GET.should.equal({})
+    req.POST.should.equal 'foo' => 'duhpost'
+    req.update_param 'foo', 'bar'
+    req.GET.should.equal({})
+    req.POST.should.equal 'foo' => 'bar'
+  end
+
+  should "modify params hash, even if param is defined in both POST and GET" do
+    e = Rack::MockRequest.env_for("?foo=duhget", "REQUEST_METHOD" => 'POST', :input => "foo=duhpost")
+    req1 = Rack::Request.new(e)
+    req1.GET.should.equal 'foo' => 'duhget'
+    req1.POST.should.equal 'foo' => 'duhpost'
+    req1.params.should.equal 'foo' => 'duhpost'
+    req1.update_param 'foo', 'bar'
+    req1.GET.should.equal 'foo' => 'bar'
+    req1.POST.should.equal 'foo' => 'bar'
+    req1.params.should.equal 'foo' => 'bar'
+    req2 = Rack::Request.new(e)
+    req2.GET.should.equal 'foo' => 'bar'
+    req2.POST.should.equal 'foo' => 'bar'
+    req2.params.should.equal 'foo' => 'bar'
+    req2.params.should.equal 'foo' => 'bar'
+  end
+
+  should "allow deleting from params hash if param is in GET" do
+    e = Rack::MockRequest.env_for("?foo=bar")
+    req1 = Rack::Request.new(e)
+    req1.params.should.equal 'foo' => 'bar'
+    req1.delete_param('foo').should.equal 'bar'
+    req1.params.should.equal({})
+    req2 = Rack::Request.new(e)
+    req2.params.should.equal({})
+  end
+
+  should "allow deleting from params hash if param is in POST" do
+    e = Rack::MockRequest.env_for("", "REQUEST_METHOD" => 'POST', :input => 'foo=bar')
+    req1 = Rack::Request.new(e)
+    req1.params.should.equal 'foo' => 'bar'
+    req1.delete_param('foo').should.equal 'bar'
+    req1.params.should.equal({})
+    req2 = Rack::Request.new(e)
+    req2.params.should.equal({})
+  end
+
+  should "pass through non-uri escaped cookies as-is" do
+    req = Rack::Request.new Rack::MockRequest.env_for("", "HTTP_COOKIE" => "foo=%")
+    req.cookies["foo"].should == "%"
+  end
+
+  should "parse cookies according to RFC 2109" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for('', 'HTTP_COOKIE' => 'foo=bar;foo=car')
+    req.cookies.should.equal 'foo' => 'bar'
+  end
+
+  should 'parse cookies with quotes' do
+    req = Rack::Request.new Rack::MockRequest.env_for('', {
+      'HTTP_COOKIE' => '$Version="1"; Customer="WILE_E_COYOTE"; $Path="/acme"; Part_Number="Rocket_Launcher_0001"; $Path="/acme"'
+    })
+    req.cookies.should.equal({
+      '$Version'    => '"1"',
+      'Customer'    => '"WILE_E_COYOTE"',
+      '$Path'       => '"/acme"',
+      'Part_Number' => '"Rocket_Launcher_0001"',
+    })
+  end
+
+  should "provide setters" do
+    req = Rack::Request.new(e=Rack::MockRequest.env_for(""))
+    req.script_name.should.equal ""
+    req.script_name = "/foo"
+    req.script_name.should.equal "/foo"
+    e["SCRIPT_NAME"].should.equal "/foo"
+
+    req.path_info.should.equal "/"
+    req.path_info = "/foo"
+    req.path_info.should.equal "/foo"
+    e["PATH_INFO"].should.equal "/foo"
+  end
+
+  should "provide the original env" do
+    req = Rack::Request.new(e = Rack::MockRequest.env_for(""))
+    req.env.should == e
+  end
+
+  should "restore the base URL" do
+    Rack::Request.new(Rack::MockRequest.env_for("")).base_url.
+      should.equal "http://example.org"
+    Rack::Request.new(Rack::MockRequest.env_for("", "SCRIPT_NAME" => "/foo")).base_url.
+      should.equal "http://example.org"
+  end
+
+  should "restore the URL" do
+    Rack::Request.new(Rack::MockRequest.env_for("")).url.
+      should.equal "http://example.org/"
+    Rack::Request.new(Rack::MockRequest.env_for("", "SCRIPT_NAME" => "/foo")).url.
+      should.equal "http://example.org/foo/"
+    Rack::Request.new(Rack::MockRequest.env_for("/foo")).url.
+      should.equal "http://example.org/foo"
+    Rack::Request.new(Rack::MockRequest.env_for("?foo")).url.
+      should.equal "http://example.org/?foo"
+    Rack::Request.new(Rack::MockRequest.env_for("http://example.org:8080/")).url.
+      should.equal "http://example.org:8080/"
+    Rack::Request.new(Rack::MockRequest.env_for("https://example.org/")).url.
+      should.equal "https://example.org/"
+    Rack::Request.new(Rack::MockRequest.env_for("coffee://example.org/")).url.
+      should.equal "coffee://example.org/"
+    Rack::Request.new(Rack::MockRequest.env_for("coffee://example.org:443/")).url.
+      should.equal "coffee://example.org:443/"
+    Rack::Request.new(Rack::MockRequest.env_for("https://example.com:8080/foo?foo")).url.
+      should.equal "https://example.com:8080/foo?foo"
+  end
+
+  should "restore the full path" do
+    Rack::Request.new(Rack::MockRequest.env_for("")).fullpath.
+      should.equal "/"
+    Rack::Request.new(Rack::MockRequest.env_for("", "SCRIPT_NAME" => "/foo")).fullpath.
+      should.equal "/foo/"
+    Rack::Request.new(Rack::MockRequest.env_for("/foo")).fullpath.
+      should.equal "/foo"
+    Rack::Request.new(Rack::MockRequest.env_for("?foo")).fullpath.
+      should.equal "/?foo"
+    Rack::Request.new(Rack::MockRequest.env_for("http://example.org:8080/")).fullpath.
+      should.equal "/"
+    Rack::Request.new(Rack::MockRequest.env_for("https://example.org/")).fullpath.
+      should.equal "/"
+
+    Rack::Request.new(Rack::MockRequest.env_for("https://example.com:8080/foo?foo")).fullpath.
+      should.equal "/foo?foo"
+  end
+
+  should "handle multiple media type parameters" do
+    req = Rack::Request.new \
+      Rack::MockRequest.env_for("/",
+        "CONTENT_TYPE" => 'text/plain; foo=BAR,baz=bizzle dizzle;BLING=bam')
+      req.should.not.be.form_data
+      req.media_type_params.should.include 'foo'
+      req.media_type_params['foo'].should.equal 'BAR'
+      req.media_type_params.should.include 'baz'
+      req.media_type_params['baz'].should.equal 'bizzle dizzle'
+      req.media_type_params.should.not.include 'BLING'
+      req.media_type_params.should.include 'bling'
+      req.media_type_params['bling'].should.equal 'bam'
+  end
+
+  should "parse with junk before boundry" do
+    # Adapted from RFC 1867.
+    input = <<EOF
+blah blah\r
+\r
+--AaB03x\r
+content-disposition: form-data; name="reply"\r
+\r
+yes\r
+--AaB03x\r
+content-disposition: form-data; name="fileupload"; filename="dj.jpg"\r
+Content-Type: image/jpeg\r
+Content-Transfer-Encoding: base64\r
+\r
+/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg\r
+--AaB03x--\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    req.POST.should.include "fileupload"
+    req.POST.should.include "reply"
+
+    req.should.be.form_data
+    req.content_length.should.equal input.size
+    req.media_type.should.equal 'multipart/form-data'
+    req.media_type_params.should.include 'boundary'
+    req.media_type_params['boundary'].should.equal 'AaB03x'
+
+    req.POST["reply"].should.equal "yes"
+
+    f = req.POST["fileupload"]
+    f.should.be.kind_of Hash
+    f[:type].should.equal "image/jpeg"
+    f[:filename].should.equal "dj.jpg"
+    f.should.include :tempfile
+    f[:tempfile].size.should.equal 76
+  end
+
+  should "not infinite loop with a malformed HTTP request" do
+    # Adapted from RFC 1867.
+    input = <<EOF
+--AaB03x
+content-disposition: form-data; name="reply"
+
+yes
+--AaB03x
+content-disposition: form-data; name="fileupload"; filename="dj.jpg"
+Content-Type: image/jpeg
+Content-Transfer-Encoding: base64
+
+/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg
+--AaB03x--
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    lambda{req.POST}.should.raise(EOFError)
+  end
+
+
+  should "parse multipart form data" do
+    # Adapted from RFC 1867.
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="reply"\r
+\r
+yes\r
+--AaB03x\r
+content-disposition: form-data; name="fileupload"; filename="dj.jpg"\r
+Content-Type: image/jpeg\r
+Content-Transfer-Encoding: base64\r
+\r
+/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg\r
+--AaB03x--\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    req.POST.should.include "fileupload"
+    req.POST.should.include "reply"
+
+    req.should.be.form_data
+    req.content_length.should.equal input.size
+    req.media_type.should.equal 'multipart/form-data'
+    req.media_type_params.should.include 'boundary'
+    req.media_type_params['boundary'].should.equal 'AaB03x'
+
+    req.POST["reply"].should.equal "yes"
+
+    f = req.POST["fileupload"]
+    f.should.be.kind_of Hash
+    f[:type].should.equal "image/jpeg"
+    f[:filename].should.equal "dj.jpg"
+    f.should.include :tempfile
+    f[:tempfile].size.should.equal 76
+  end
+
+  should "parse big multipart form data" do
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="huge"; filename="huge"\r
+\r
+#{"x"*32768}\r
+--AaB03x\r
+content-disposition: form-data; name="mean"; filename="mean"\r
+\r
+--AaB03xha\r
+--AaB03x--\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    req.POST["huge"][:tempfile].size.should.equal 32768
+    req.POST["mean"][:tempfile].size.should.equal 10
+    req.POST["mean"][:tempfile].read.should.equal "--AaB03xha"
+  end
+
+  should "detect invalid multipart form data" do
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="huge"; filename="huge"\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    lambda { req.POST }.should.raise(EOFError)
+
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="huge"; filename="huge"\r
+\r
+foo\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    lambda { req.POST }.should.raise(EOFError)
+
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="huge"; filename="huge"\r
+\r
+foo\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    lambda { req.POST }.should.raise(EOFError)
+  end
+
+  should "correctly parse the part name from Content-Id header" do
+    input = <<EOF
+--AaB03x\r
+Content-Type: text/xml; charset=utf-8\r
+Content-Id: <soap-start>\r
+Content-Transfer-Encoding: 7bit\r
+\r
+foo\r
+--AaB03x--\r
+EOF
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/related, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => input)
+
+    req.params.keys.should.equal ["<soap-start>"]
+  end
+
+  should "not try to interpret binary as utf8" do
+    if /regexp/.respond_to?(:kcode) # < 1.9
+      begin
+        original_kcode = $KCODE
+        $KCODE='UTF8'
+
+        input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="fileupload"; filename="junk.a"\r
+content-type: application/octet-stream\r
+\r
+#{[0x36,0xCF,0x0A,0xF8].pack('c*')}\r
+--AaB03x--\r
+EOF
+
+        req = Rack::Request.new Rack::MockRequest.env_for("/",
+                          "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                          "CONTENT_LENGTH" => input.size,
+                          :input => input)
+
+        lambda{req.POST}.should.not.raise(EOFError)
+        req.POST["fileupload"][:tempfile].size.should.equal 4
+      ensure
+        $KCODE = original_kcode
+      end
+    else # >= 1.9
+        input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="fileupload"; filename="junk.a"\r
+content-type: application/octet-stream\r
+\r
+#{[0x36,0xCF,0x0A,0xF8].pack('c*')}\r
+--AaB03x--\r
+EOF
+
+      req = Rack::Request.new Rack::MockRequest.env_for("/",
+                        "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                        "CONTENT_LENGTH" => input.size,
+                        :input => input)
+
+      lambda{req.POST}.should.not.raise(EOFError)
+      req.POST["fileupload"][:tempfile].size.should.equal 4
+    end
+  end
+
+  should "work around buggy 1.8.* Tempfile equality" do
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="huge"; filename="huge"\r
+\r
+foo\r
+--AaB03x--
+EOF
+
+    rack_input = Tempfile.new("rackspec")
+    rack_input.write(input)
+    rack_input.rewind
+
+    req = Rack::Request.new Rack::MockRequest.env_for("/",
+                      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+                      "CONTENT_LENGTH" => input.size,
+                      :input => rack_input)
+
+    lambda{ req.POST }.should.not.raise
+    lambda{ req.POST }.should.not.raise("input re-processed!")
+  end
+
+  should "conform to the Rack spec" do
+    app = lambda { |env|
+      content = Rack::Request.new(env).POST["file"].inspect
+      size = content.respond_to?(:bytesize) ? content.bytesize : content.size
+      [200, {"Content-Type" => "text/html", "Content-Length" => size.to_s}, [content]]
+    }
+
+    input = <<EOF
+--AaB03x\r
+content-disposition: form-data; name="reply"\r
+\r
+yes\r
+--AaB03x\r
+content-disposition: form-data; name="fileupload"; filename="dj.jpg"\r
+Content-Type: image/jpeg\r
+Content-Transfer-Encoding: base64\r
+\r
+/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcg\r
+--AaB03x--\r
+EOF
+    input.force_encoding("ASCII-8BIT") if input.respond_to? :force_encoding
+    res = Rack::MockRequest.new(Rack::Lint.new(app)).get "/",
+      "CONTENT_TYPE" => "multipart/form-data, boundary=AaB03x",
+      "CONTENT_LENGTH" => input.size.to_s, "rack.input" => StringIO.new(input)
+
+    res.should.be.ok
+  end
+
+  should "parse Accept-Encoding correctly" do
+    parser = lambda do |x|
+      Rack::Request.new(Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => x)).accept_encoding
+    end
+
+    parser.call(nil).should.equal([])
+
+    parser.call("compress, gzip").should.equal([["compress", 1.0], ["gzip", 1.0]])
+    parser.call("").should.equal([])
+    parser.call("*").should.equal([["*", 1.0]])
+    parser.call("compress;q=0.5, gzip;q=1.0").should.equal([["compress", 0.5], ["gzip", 1.0]])
+    parser.call("gzip;q=1.0, identity; q=0.5, *;q=0").should.equal([["gzip", 1.0], ["identity", 0.5], ["*", 0] ])
+
+    parser.call("gzip ; q=0.9").should.equal([["gzip", 0.9]])
+    parser.call("gzip ; deflate").should.equal([["gzip", 1.0]])
+  end
+
+  ip_app = lambda { |env|
+    request = Rack::Request.new(env)
+    response = Rack::Response.new
+    response.write request.ip
+    response.finish
+  }
+
+  should 'provide ip information' do
+    mock = Rack::MockRequest.new(Rack::Lint.new(ip_app))
+
+    res = mock.get '/', 'REMOTE_ADDR' => '1.2.3.4'
+    res.body.should.equal '1.2.3.4'
+
+    res = mock.get '/', 'REMOTE_ADDR' => 'fe80::202:b3ff:fe1e:8329'
+    res.body.should.equal 'fe80::202:b3ff:fe1e:8329'
+
+    res = mock.get '/', 'REMOTE_ADDR' => '1.2.3.4,3.4.5.6'
+    res.body.should.equal '1.2.3.4'
+  end
+
+  should 'deals with proxies' do
+    mock = Rack::MockRequest.new(Rack::Lint.new(ip_app))
+
+    res = mock.get '/',
+      'REMOTE_ADDR' => '1.2.3.4',
+      'HTTP_X_FORWARDED_FOR' => '3.4.5.6'
+    res.body.should.equal '1.2.3.4'
+
+    res = mock.get '/',
+      'REMOTE_ADDR' => '1.2.3.4',
+      'HTTP_X_FORWARDED_FOR' => 'unknown'
+    res.body.should.equal '1.2.3.4'
+
+    res = mock.get '/',
+      'REMOTE_ADDR' => '127.0.0.1',
+      'HTTP_X_FORWARDED_FOR' => '3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => 'unknown,3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '192.168.0.1,3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '10.0.0.1,3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '10.0.0.1, 10.0.0.1, 3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '127.0.0.1, 3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => 'unknown,192.168.0.1'
+    res.body.should.equal 'unknown'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => 'other,unknown,192.168.0.1'
+    res.body.should.equal 'unknown'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => 'unknown,localhost,192.168.0.1'
+    res.body.should.equal 'unknown'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '9.9.9.9, 3.4.5.6, 10.0.0.1, 172.31.4.4'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '::1,2620:0:1c00:0:812c:9583:754b:ca11'
+    res.body.should.equal '2620:0:1c00:0:812c:9583:754b:ca11'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '2620:0:1c00:0:812c:9583:754b:ca11,::1'
+    res.body.should.equal '2620:0:1c00:0:812c:9583:754b:ca11'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => 'fd5b:982e:9130:247f:0000:0000:0000:0000,2620:0:1c00:0:812c:9583:754b:ca11'
+    res.body.should.equal '2620:0:1c00:0:812c:9583:754b:ca11'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '2620:0:1c00:0:812c:9583:754b:ca11,fd5b:982e:9130:247f:0000:0000:0000:0000'
+    res.body.should.equal '2620:0:1c00:0:812c:9583:754b:ca11'
+
+    res = mock.get '/',
+      'HTTP_X_FORWARDED_FOR' => '1.1.1.1, 127.0.0.1',
+      'HTTP_CLIENT_IP' => '1.1.1.1'
+    res.body.should.equal '1.1.1.1'
+
+    # Spoofing attempt
+    res = mock.get '/',
+      'HTTP_X_FORWARDED_FOR' => '1.1.1.1',
+      'HTTP_CLIENT_IP' => '2.2.2.2'
+    res.body.should.equal '1.1.1.1'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '8.8.8.8, 9.9.9.9'
+    res.body.should.equal '9.9.9.9'
+
+    res = mock.get '/', 'HTTP_X_FORWARDED_FOR' => '8.8.8.8, fe80::202:b3ff:fe1e:8329'
+    res.body.should.equal 'fe80::202:b3ff:fe1e:8329'
+
+    # Unix Sockets
+    res = mock.get '/',
+      'REMOTE_ADDR' => 'unix',
+      'HTTP_X_FORWARDED_FOR' => '3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+
+    res = mock.get '/',
+      'REMOTE_ADDR' => 'unix:/tmp/foo',
+      'HTTP_X_FORWARDED_FOR' => '3.4.5.6'
+    res.body.should.equal '3.4.5.6'
+  end
+
+  should "regard local addresses as proxies" do
+    req = Rack::Request.new(Rack::MockRequest.env_for("/"))
+    req.trusted_proxy?('127.0.0.1').should.equal 0
+    req.trusted_proxy?('10.0.0.1').should.equal 0
+    req.trusted_proxy?('172.16.0.1').should.equal 0
+    req.trusted_proxy?('172.20.0.1').should.equal 0
+    req.trusted_proxy?('172.30.0.1').should.equal 0
+    req.trusted_proxy?('172.31.0.1').should.equal 0
+    req.trusted_proxy?('192.168.0.1').should.equal 0
+    req.trusted_proxy?('::1').should.equal 0
+    req.trusted_proxy?('fd00::').should.equal 0
+    req.trusted_proxy?('localhost').should.equal 0
+    req.trusted_proxy?('unix').should.equal 0
+    req.trusted_proxy?('unix:/tmp/sock').should.equal 0
+
+    req.trusted_proxy?("unix.example.org").should.equal nil
+    req.trusted_proxy?("example.org\n127.0.0.1").should.equal nil
+    req.trusted_proxy?("127.0.0.1\nexample.org").should.equal nil
+    req.trusted_proxy?("11.0.0.1").should.equal nil
+    req.trusted_proxy?("172.15.0.1").should.equal nil
+    req.trusted_proxy?("172.32.0.1").should.equal nil
+    req.trusted_proxy?("2001:470:1f0b:18f8::1").should.equal nil
+  end
+
+  class MyRequest < Rack::Request
+    def params
+      {:foo => "bar"}
+    end
+  end
+
+  should "allow subclass request to be instantiated after parent request" do
+    env = Rack::MockRequest.env_for("/?foo=bar")
+
+    req1 = Rack::Request.new(env)
+    req1.GET.should.equal "foo" => "bar"
+    req1.params.should.equal "foo" => "bar"
+
+    req2 = MyRequest.new(env)
+    req2.GET.should.equal "foo" => "bar"
+    req2.params.should.equal :foo => "bar"
+  end
+
+  should "allow parent request to be instantiated after subclass request" do
+    env = Rack::MockRequest.env_for("/?foo=bar")
+
+    req1 = MyRequest.new(env)
+    req1.GET.should.equal "foo" => "bar"
+    req1.params.should.equal :foo => "bar"
+
+    req2 = Rack::Request.new(env)
+    req2.GET.should.equal "foo" => "bar"
+    req2.params.should.equal "foo" => "bar"
+  end
+
+  (0x20...0x7E).collect { |a|
+    b = a.chr
+    c = CGI.escape(b)
+    should "not strip '#{a}' => '#{c}' => '#{b}' escaped character from parameters when accessed as string" do
+      url = "/?foo=#{c}bar#{c}"
+      env = Rack::MockRequest.env_for(url)
+      req2 = Rack::Request.new(env)
+      req2.GET.should.equal "foo" => "#{b}bar#{b}"
+      req2.params.should.equal "foo" => "#{b}bar#{b}"
+    end
+  }
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_response.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_response.rb
new file mode 100644
index 0000000..7ba1e0e
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_response.rb
@@ -0,0 +1,313 @@
+require 'rack/response'
+require 'stringio'
+
+describe Rack::Response do
+  should "have sensible default values" do
+    response = Rack::Response.new
+    status, header, body = response.finish
+    status.should.equal 200
+    header.should.equal({})
+    body.each { |part|
+      part.should.equal ""
+    }
+
+    response = Rack::Response.new
+    status, header, body = *response
+    status.should.equal 200
+    header.should.equal({})
+    body.each { |part|
+      part.should.equal ""
+    }
+  end
+
+  it "can be written to" do
+    response = Rack::Response.new
+
+    _, _, body = response.finish do
+      response.write "foo"
+      response.write "bar"
+      response.write "baz"
+    end
+
+    parts = []
+    body.each { |part| parts << part }
+
+    parts.should.equal ["foo", "bar", "baz"]
+  end
+
+  it "can set and read headers" do
+    response = Rack::Response.new
+    response["Content-Type"].should.equal nil
+    response["Content-Type"] = "text/plain"
+    response["Content-Type"].should.equal "text/plain"
+  end
+
+  it "can override the initial Content-Type with a different case" do
+    response = Rack::Response.new("", 200, "content-type" => "text/plain")
+    response["Content-Type"].should.equal "text/plain"
+  end
+
+  it "can set cookies" do
+    response = Rack::Response.new
+
+    response.set_cookie "foo", "bar"
+    response["Set-Cookie"].should.equal "foo=bar"
+    response.set_cookie "foo2", "bar2"
+    response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2"].join("\n")
+    response.set_cookie "foo3", "bar3"
+    response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2", "foo3=bar3"].join("\n")
+  end
+
+  it "can set cookies with the same name for multiple domains" do
+    response = Rack::Response.new
+    response.set_cookie "foo", {:value => "bar", :domain => "sample.example.com"}
+    response.set_cookie "foo", {:value => "bar", :domain => ".example.com"}
+    response["Set-Cookie"].should.equal ["foo=bar; domain=sample.example.com", "foo=bar; domain=.example.com"].join("\n")
+  end
+
+  it "formats the Cookie expiration date accordingly to RFC 6265" do
+    response = Rack::Response.new
+
+    response.set_cookie "foo", {:value => "bar", :expires => Time.now+10}
+    response["Set-Cookie"].should.match(
+      /expires=..., \d\d ... \d\d\d\d \d\d:\d\d:\d\d .../)
+  end
+
+  it "can set secure cookies" do
+    response = Rack::Response.new
+    response.set_cookie "foo", {:value => "bar", :secure => true}
+    response["Set-Cookie"].should.equal "foo=bar; secure"
+  end
+
+  it "can set http only cookies" do
+    response = Rack::Response.new
+    response.set_cookie "foo", {:value => "bar", :httponly => true}
+    response["Set-Cookie"].should.equal "foo=bar; HttpOnly"
+  end
+
+  it "can delete cookies" do
+    response = Rack::Response.new
+    response.set_cookie "foo", "bar"
+    response.set_cookie "foo2", "bar2"
+    response.delete_cookie "foo"
+    response["Set-Cookie"].should.equal [
+      "foo2=bar2",
+      "foo=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
+    ].join("\n")
+  end
+
+  it "can delete cookies with the same name from multiple domains" do
+    response = Rack::Response.new
+    response.set_cookie "foo", {:value => "bar", :domain => "sample.example.com"}
+    response.set_cookie "foo", {:value => "bar", :domain => ".example.com"}
+    response["Set-Cookie"].should.equal ["foo=bar; domain=sample.example.com", "foo=bar; domain=.example.com"].join("\n")
+    response.delete_cookie "foo", :domain => ".example.com"
+    response["Set-Cookie"].should.equal ["foo=bar; domain=sample.example.com", "foo=; domain=.example.com; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"].join("\n")
+    response.delete_cookie "foo", :domain => "sample.example.com"
+    response["Set-Cookie"].should.equal ["foo=; domain=.example.com; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000",
+                                         "foo=; domain=sample.example.com; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"].join("\n")
+  end
+
+  it "can delete cookies with the same name with different paths" do
+    response = Rack::Response.new
+    response.set_cookie "foo", {:value => "bar", :path => "/"}
+    response.set_cookie "foo", {:value => "bar", :path => "/path"}
+    response["Set-Cookie"].should.equal ["foo=bar; path=/",
+                                         "foo=bar; path=/path"].join("\n")
+
+    response.delete_cookie "foo", :path => "/path"
+    response["Set-Cookie"].should.equal ["foo=bar; path=/",
+                                         "foo=; path=/path; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"].join("\n")
+  end
+
+  it "can do redirects" do
+    response = Rack::Response.new
+    response.redirect "/foo"
+    status, header, body = response.finish
+    status.should.equal 302
+    header["Location"].should.equal "/foo"
+
+    response = Rack::Response.new
+    response.redirect "/foo", 307
+    status, header, body = response.finish
+
+    status.should.equal 307
+  end
+
+  it "has a useful constructor" do
+    r = Rack::Response.new("foo")
+    status, header, body = r.finish
+    str = ""; body.each { |part| str << part }
+    str.should.equal "foo"
+
+    r = Rack::Response.new(["foo", "bar"])
+    status, header, body = r.finish
+    str = ""; body.each { |part| str << part }
+    str.should.equal "foobar"
+
+    object_with_each = Object.new
+    def object_with_each.each
+      yield "foo"
+      yield "bar"
+    end
+    r = Rack::Response.new(object_with_each)
+    r.write "foo"
+    status, header, body = r.finish
+    str = ""; body.each { |part| str << part }
+    str.should.equal "foobarfoo"
+
+    r = Rack::Response.new([], 500)
+    r.status.should.equal 500
+
+    r = Rack::Response.new([], "200 OK")
+    r.status.should.equal 200
+  end
+
+  it "has a constructor that can take a block" do
+    r = Rack::Response.new { |res|
+      res.status = 404
+      res.write "foo"
+    }
+    status, _, body = r.finish
+    str = ""; body.each { |part| str << part }
+    str.should.equal "foo"
+    status.should.equal 404
+  end
+
+  it "doesn't return invalid responses" do
+    r = Rack::Response.new(["foo", "bar"], 204)
+    _, header, body = r.finish
+    str = ""; body.each { |part| str << part }
+    str.should.be.empty
+    header["Content-Type"].should.equal nil
+    header['Content-Length'].should.equal nil
+
+    lambda {
+      Rack::Response.new(Object.new)
+    }.should.raise(TypeError).
+      message.should =~ /stringable or iterable required/
+  end
+
+  it "knows if it's empty" do
+    r = Rack::Response.new
+    r.should.be.empty
+    r.write "foo"
+    r.should.not.be.empty
+
+    r = Rack::Response.new
+    r.should.be.empty
+    r.finish
+    r.should.be.empty
+
+    r = Rack::Response.new
+    r.should.be.empty
+    r.finish { }
+    r.should.not.be.empty
+  end
+
+  should "provide access to the HTTP status" do
+    res = Rack::Response.new
+    res.status = 200
+    res.should.be.successful
+    res.should.be.ok
+
+    res.status = 400
+    res.should.not.be.successful
+    res.should.be.client_error
+    res.should.be.bad_request
+
+    res.status = 404
+    res.should.not.be.successful
+    res.should.be.client_error
+    res.should.be.not_found
+
+    res.status = 405
+    res.should.not.be.successful
+    res.should.be.client_error
+    res.should.be.method_not_allowed
+
+    res.status = 422
+    res.should.not.be.successful
+    res.should.be.client_error
+    res.should.be.unprocessable
+
+    res.status = 501
+    res.should.not.be.successful
+    res.should.be.server_error
+
+    res.status = 307
+    res.should.be.redirect
+  end
+
+  should "provide access to the HTTP headers" do
+    res = Rack::Response.new
+    res["Content-Type"] = "text/yaml"
+
+    res.should.include "Content-Type"
+    res.headers["Content-Type"].should.equal "text/yaml"
+    res["Content-Type"].should.equal "text/yaml"
+    res.content_type.should.equal "text/yaml"
+    res.content_length.should.be.nil
+    res.location.should.be.nil
+  end
+
+  it "does not add or change Content-Length when #finish()ing" do
+    res = Rack::Response.new
+    res.status = 200
+    res.finish
+    res.headers["Content-Length"].should.be.nil
+
+    res = Rack::Response.new
+    res.status = 200
+    res.headers["Content-Length"] = "10"
+    res.finish
+    res.headers["Content-Length"].should.equal "10"
+  end
+
+  it "updates Content-Length when body appended to using #write" do
+    res = Rack::Response.new
+    res.status = 200
+    res.headers["Content-Length"].should.be.nil
+    res.write "Hi"
+    res.headers["Content-Length"].should.equal "2"
+    res.write " there"
+    res.headers["Content-Length"].should.equal "8"
+  end
+
+  it "calls close on #body" do
+    res = Rack::Response.new
+    res.body = StringIO.new
+    res.close
+    res.body.should.be.closed
+  end
+
+  it "calls close on #body when 204, 205, or 304" do
+    res = Rack::Response.new
+    res.body = StringIO.new
+    res.finish
+    res.body.should.not.be.closed
+
+    res.status = 204
+    _, _, b = res.finish
+    res.body.should.be.closed
+    b.should.not.equal res.body
+
+    res.body = StringIO.new
+    res.status = 205
+    _, _, b = res.finish
+    res.body.should.be.closed
+    b.should.not.equal res.body
+
+    res.body = StringIO.new
+    res.status = 304
+    _, _, b = res.finish
+    res.body.should.be.closed
+    b.should.not.equal res.body
+  end
+
+  it "wraps the body from #to_ary to prevent infinite loops" do
+    res = Rack::Response.new
+    res.finish.last.should.not.respond_to?(:to_ary)
+    lambda { res.finish.last.to_ary }.should.raise(NoMethodError)
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_rewindable_input.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_rewindable_input.rb
new file mode 100644
index 0000000..025d830
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_rewindable_input.rb
@@ -0,0 +1,118 @@
+require 'stringio'
+require 'rack/rewindable_input'
+
+shared "a rewindable IO object" do
+  before do
+    @rio = Rack::RewindableInput.new(@io)
+  end
+
+  should "be able to handle to read()" do
+    @rio.read.should.equal "hello world"
+  end
+
+  should "be able to handle to read(nil)" do
+    @rio.read(nil).should.equal "hello world"
+  end
+
+  should "be able to handle to read(length)" do
+    @rio.read(1).should.equal "h"
+  end
+
+  should "be able to handle to read(length, buffer)" do
+    buffer = ""
+    result = @rio.read(1, buffer)
+    result.should.equal "h"
+    result.object_id.should.equal buffer.object_id
+  end
+
+  should "be able to handle to read(nil, buffer)" do
+    buffer = ""
+    result = @rio.read(nil, buffer)
+    result.should.equal "hello world"
+    result.object_id.should.equal buffer.object_id
+  end
+
+  should "rewind to the beginning when #rewind is called" do
+    @rio.read(1)
+    @rio.rewind
+    @rio.read.should.equal "hello world"
+  end
+
+  should "be able to handle gets" do
+    @rio.gets.should == "hello world"
+  end
+
+  should "be able to handle each" do
+    array = []
+    @rio.each do |data|
+      array << data
+    end
+    array.should.equal(["hello world"])
+  end
+
+  should "not buffer into a Tempfile if no data has been read yet" do
+    @rio.instance_variable_get(:@rewindable_io).should.be.nil
+  end
+
+  should "buffer into a Tempfile when data has been consumed for the first time" do
+    @rio.read(1)
+    tempfile = @rio.instance_variable_get(:@rewindable_io)
+    tempfile.should.not.be.nil
+    @rio.read(1)
+    tempfile2 = @rio.instance_variable_get(:@rewindable_io)
+    tempfile2.path.should == tempfile.path
+  end
+
+  should "close the underlying tempfile upon calling #close" do
+    @rio.read(1)
+    tempfile = @rio.instance_variable_get(:@rewindable_io)
+    @rio.close
+    tempfile.should.be.closed
+  end
+
+  should "be possible to call #close when no data has been buffered yet" do
+    lambda{ @rio.close }.should.not.raise
+  end
+
+  should "be possible to call #close multiple times" do
+    lambda{
+      @rio.close
+      @rio.close
+    }.should.not.raise
+  end
+
+  @rio.close
+  @rio = nil
+end
+
+describe Rack::RewindableInput do
+  describe "given an IO object that is already rewindable" do
+    before do
+      @io = StringIO.new("hello world")
+    end
+
+    behaves_like "a rewindable IO object"
+  end
+
+  describe "given an IO object that is not rewindable" do
+    before do
+      @io = StringIO.new("hello world")
+      @io.instance_eval do
+        undef :rewind
+      end
+    end
+
+    behaves_like "a rewindable IO object"
+  end
+
+  describe "given an IO object whose rewind method raises Errno::ESPIPE" do
+    before do
+      @io = StringIO.new("hello world")
+      def @io.rewind
+        raise Errno::ESPIPE, "You can't rewind this!"
+      end
+    end
+
+    behaves_like "a rewindable IO object"
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_runtime.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_runtime.rb
new file mode 100644
index 0000000..f9897a1
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_runtime.rb
@@ -0,0 +1,49 @@
+require 'rack/lint'
+require 'rack/mock'
+require 'rack/runtime'
+
+describe Rack::Runtime do
+  def runtime_app(app, *args)
+    Rack::Lint.new Rack::Runtime.new(app, *args)
+  end
+  
+  def request
+    Rack::MockRequest.env_for
+  end
+  
+  it "sets X-Runtime is none is set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] }
+    response = runtime_app(app).call(request)
+    response[1]['X-Runtime'].should =~ /[\d\.]+/
+  end
+
+  it "doesn't set the X-Runtime if it is already set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain', "X-Runtime" => "foobar"}, "Hello, World!"] }
+    response = runtime_app(app).call(request)
+    response[1]['X-Runtime'].should == "foobar"
+  end
+
+  should "allow a suffix to be set" do
+    app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] }
+    response = runtime_app(app, "Test").call(request)
+    response[1]['X-Runtime-Test'].should =~ /[\d\.]+/
+  end
+
+  should "allow multiple timers to be set" do
+    app = lambda { |env| sleep 0.1; [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] }
+    runtime = runtime_app(app, "App")
+
+    # wrap many times to guarantee a measurable difference
+    100.times do |i|
+      runtime = Rack::Runtime.new(runtime, i.to_s)
+    end
+    runtime = Rack::Runtime.new(runtime, "All")
+
+    response = runtime.call(request)
+
+    response[1]['X-Runtime-App'].should =~ /[\d\.]+/
+    response[1]['X-Runtime-All'].should =~ /[\d\.]+/
+
+    Float(response[1]['X-Runtime-All']).should > Float(response[1]['X-Runtime-App'])
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_sendfile.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_sendfile.rb
new file mode 100644
index 0000000..7c9acd6
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_sendfile.rb
@@ -0,0 +1,130 @@
+require 'fileutils'
+require 'rack/lint'
+require 'rack/sendfile'
+require 'rack/mock'
+require 'tmpdir'
+
+describe Rack::File do
+  should "respond to #to_path" do
+    Rack::File.new(Dir.pwd).should.respond_to :to_path
+  end
+end
+
+describe Rack::Sendfile do
+  def sendfile_body
+    FileUtils.touch File.join(Dir.tmpdir,  "rack_sendfile")
+    res = ['Hello World']
+    def res.to_path ; File.join(Dir.tmpdir,  "rack_sendfile") ; end
+    res
+  end
+
+  def simple_app(body=sendfile_body)
+    lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
+  end
+
+  def sendfile_app(body, mappings = [])
+    Rack::Lint.new Rack::Sendfile.new(simple_app(body), nil, mappings)
+  end
+
+  def request(headers={}, body=sendfile_body, mappings=[])
+    yield Rack::MockRequest.new(sendfile_app(body, mappings)).get('/', headers)
+  end
+
+  def open_file(path)
+    Class.new(File) do
+      unless method_defined?(:to_path)
+        alias :to_path :path
+      end
+    end.open(path, 'wb+')
+  end
+
+  it "does nothing when no X-Sendfile-Type header present" do
+    request do |response|
+      response.should.be.ok
+      response.body.should.equal 'Hello World'
+      response.headers.should.not.include 'X-Sendfile'
+    end
+  end
+
+  it "sets X-Sendfile response header and discards body" do
+    request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response|
+      response.should.be.ok
+      response.body.should.be.empty
+      response.headers['Content-Length'].should.equal '0'
+      response.headers['X-Sendfile'].should.equal File.join(Dir.tmpdir,  "rack_sendfile")
+    end
+  end
+
+  it "sets X-Lighttpd-Send-File response header and discards body" do
+    request 'HTTP_X_SENDFILE_TYPE' => 'X-Lighttpd-Send-File' do |response|
+      response.should.be.ok
+      response.body.should.be.empty
+      response.headers['Content-Length'].should.equal '0'
+      response.headers['X-Lighttpd-Send-File'].should.equal File.join(Dir.tmpdir,  "rack_sendfile")
+    end
+  end
+
+  it "sets X-Accel-Redirect response header and discards body" do
+    headers = {
+      'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect',
+      'HTTP_X_ACCEL_MAPPING' => "#{Dir.tmpdir}/=/foo/bar/"
+    }
+    request headers do |response|
+      response.should.be.ok
+      response.body.should.be.empty
+      response.headers['Content-Length'].should.equal '0'
+      response.headers['X-Accel-Redirect'].should.equal '/foo/bar/rack_sendfile'
+    end
+  end
+
+  it 'writes to rack.error when no X-Accel-Mapping is specified' do
+    request 'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect' do |response|
+      response.should.be.ok
+      response.body.should.equal 'Hello World'
+      response.headers.should.not.include 'X-Accel-Redirect'
+      response.errors.should.include 'X-Accel-Mapping'
+    end
+  end
+
+  it 'does nothing when body does not respond to #to_path' do
+    request({'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile'}, ['Not a file...']) do |response|
+      response.body.should.equal 'Not a file...'
+      response.headers.should.not.include 'X-Sendfile'
+    end
+  end
+
+  it "sets X-Accel-Redirect response header and discards body when initialized with multiple mappings" do
+    begin
+      dir1 = Dir.mktmpdir
+      dir2 = Dir.mktmpdir
+
+      first_body = open_file(File.join(dir1, 'rack_sendfile'))
+      first_body.puts 'hello world'
+
+      second_body = open_file(File.join(dir2, 'rack_sendfile'))
+      second_body.puts 'goodbye world'
+
+      mappings = [
+        ["#{dir1}/", '/foo/bar/'],
+        ["#{dir2}/", '/wibble/']
+      ]
+
+      request({'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect'}, first_body, mappings) do |response|
+        response.should.be.ok
+        response.body.should.be.empty
+        response.headers['Content-Length'].should.equal '0'
+        response.headers['X-Accel-Redirect'].should.equal '/foo/bar/rack_sendfile'
+      end
+
+      request({'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect'}, second_body, mappings) do |response|
+        response.should.be.ok
+        response.body.should.be.empty
+        response.headers['Content-Length'].should.equal '0'
+        response.headers['X-Accel-Redirect'].should.equal '/wibble/rack_sendfile'
+      end
+    ensure
+      FileUtils.remove_entry_secure dir1
+      FileUtils.remove_entry_secure dir2
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_server.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_server.rb
new file mode 100644
index 0000000..44d4bcb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_server.rb
@@ -0,0 +1,143 @@
+require 'rack'
+require 'rack/server'
+require 'tempfile'
+require 'socket'
+require 'open-uri'
+
+describe Rack::Server do
+
+  def app
+    lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['success']] }
+  end
+
+  def with_stderr
+    old, $stderr = $stderr, StringIO.new
+    yield $stderr
+  ensure
+    $stderr = old
+  end
+
+  it "overrides :config if :app is passed in" do
+    server = Rack::Server.new(:app => "FOO")
+    server.app.should.equal "FOO"
+  end
+
+  should "prefer to use :builder when it is passed in" do
+    server = Rack::Server.new(:builder => "run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['success']] }")
+    server.app.class.should.equal Proc
+    Rack::MockRequest.new(server.app).get("/").body.to_s.should.equal 'success'
+  end
+
+  should "not include Rack::Lint in deployment or none environments" do
+    server = Rack::Server.new(:app => 'foo')
+    server.middleware['deployment'].flatten.should.not.include(Rack::Lint)
+    server.middleware['none'].flatten.should.not.include(Rack::Lint)
+  end
+
+  should "not include Rack::ShowExceptions in deployment or none environments" do
+    server = Rack::Server.new(:app => 'foo')
+    server.middleware['deployment'].flatten.should.not.include(Rack::ShowExceptions)
+    server.middleware['none'].flatten.should.not.include(Rack::ShowExceptions)
+  end
+
+  should "support CGI" do
+    begin
+      o, ENV["REQUEST_METHOD"] = ENV["REQUEST_METHOD"], 'foo'
+      server = Rack::Server.new(:app => 'foo')
+      server.server.name =~ /CGI/
+      Rack::Server.logging_middleware.call(server).should.eql(nil)
+    ensure
+      ENV['REQUEST_METHOD'] = o
+    end
+  end
+
+  should "not force any middleware under the none configuration" do
+    server = Rack::Server.new(:app => 'foo')
+    server.middleware['none'].should.be.empty
+  end
+
+  should "use a full path to the pidfile" do
+    # avoids issues with daemonize chdir
+    opts = Rack::Server.new.send(:parse_options, %w[--pid testing.pid])
+    opts[:pid].should.eql(::File.expand_path('testing.pid'))
+  end
+
+  should "run a server" do
+    pidfile = Tempfile.open('pidfile') { |f| break f }.path
+    FileUtils.rm pidfile
+    server = Rack::Server.new(
+      :app         => app,
+      :environment => 'none',
+      :pid         => pidfile,
+      :Port        => TCPServer.open('127.0.0.1', 0){|s| s.addr[1] },
+      :Host        => '127.0.0.1',
+      :daemonize   => false,
+      :server      => 'webrick'
+    )
+    t = Thread.new { server.start { |s| Thread.current[:server] = s } }
+    t.join(0.01) until t[:server] && t[:server].status != :Stop
+    body = open("http://127.0.0.1:#{server.options[:Port]}/") { |f| f.read }
+    body.should.eql('success')
+
+    Process.kill(:INT, $$)
+    t.join
+    open(pidfile) { |f| f.read.should.eql $$.to_s }
+  end
+
+  should "check pid file presence and running process" do
+    pidfile = Tempfile.open('pidfile') { |f| f.write($$); break f }.path
+    server = Rack::Server.new(:pid => pidfile)
+    server.send(:pidfile_process_status).should.eql :running
+  end
+
+  should "check pid file presence and dead process" do
+    dead_pid = `echo $$`.to_i
+    pidfile = Tempfile.open('pidfile') { |f| f.write(dead_pid); break f }.path
+    server = Rack::Server.new(:pid => pidfile)
+    server.send(:pidfile_process_status).should.eql :dead
+  end
+
+  should "check pid file presence and exited process" do
+    pidfile = Tempfile.open('pidfile') { |f| break f }.path
+    ::File.delete(pidfile)
+    server = Rack::Server.new(:pid => pidfile)
+    server.send(:pidfile_process_status).should.eql :exited
+  end
+
+  should "check pid file presence and not owned process" do
+    pidfile = Tempfile.open('pidfile') { |f| f.write(1); break f }.path
+    server = Rack::Server.new(:pid => pidfile)
+    server.send(:pidfile_process_status).should.eql :not_owned
+  end
+
+  should "not write pid file when it is created after check" do
+    pidfile = Tempfile.open('pidfile') { |f| break f }.path
+    ::File.delete(pidfile)
+    server = Rack::Server.new(:pid => pidfile)
+    ::File.open(pidfile, 'w') { |f| f.write(1) }
+    with_stderr do |err|
+      should.raise(SystemExit) do
+        server.send(:write_pid)
+      end
+      err.rewind
+      output = err.read
+      output.should.match(/already running/)
+      output.should.include? pidfile
+    end
+  end
+
+  should "inform the user about existing pidfiles with running processes" do
+    pidfile = Tempfile.open('pidfile') { |f| f.write(1); break f }.path
+    server = Rack::Server.new(:pid => pidfile)
+    with_stderr do |err|
+      should.raise(SystemExit) do
+        server.start
+      end
+      err.rewind
+      output = err.read
+      output.should.match(/already running/)
+      output.should.include? pidfile
+    end
+  end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_session_abstract_id.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_session_abstract_id.rb
new file mode 100644
index 0000000..911f43b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_session_abstract_id.rb
@@ -0,0 +1,53 @@
+### WARNING: there be hax in this file.
+
+require 'rack/session/abstract/id'
+
+describe Rack::Session::Abstract::ID do
+  id = Rack::Session::Abstract::ID
+
+  def silence_warning
+    o, $VERBOSE = $VERBOSE, nil
+    yield
+  ensure
+    $VERBOSE = o
+  end
+
+  def reload_id
+    $".delete $".find { |part| part =~ %r{session/abstract/id.rb} }
+    silence_warning { require 'rack/session/abstract/id' }
+  end
+
+  should "use securerandom when available" do
+    begin
+      fake = false
+      silence_warning do
+        ::SecureRandom = fake = true unless defined?(SecureRandom)
+      end
+      reload_id
+      id::DEFAULT_OPTIONS[:secure_random].should.eql(fake || SecureRandom)
+    ensure
+      Object.send(:remove_const, :SecureRandom) if fake
+    end
+  end
+
+  should "not use securerandom when unavailable" do
+    begin
+      sr = Object.send(:remove_const, :SecureRandom) if defined?(SecureRandom)
+      reload_id
+      id::DEFAULT_OPTIONS[:secure_random].should.eql false
+    ensure
+      ::SecureRandom = sr if defined?(sr)
+    end
+  end
+
+  should "allow to use another securerandom provider" do
+    secure_random = Class.new do
+      def hex(*args)
+        'fake_hex'
+      end
+    end
+    id = Rack::Session::Abstract::ID.new nil, :secure_random => secure_random.new
+    id.send(:generate_sid).should.eql 'fake_hex'
+  end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_session_cookie.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_session_cookie.rb
new file mode 100644
index 0000000..8256f76
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_session_cookie.rb
@@ -0,0 +1,367 @@
+require 'rack/session/cookie'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::Session::Cookie do
+  incrementor = lambda do |env|
+    env["rack.session"]["counter"] ||= 0
+    env["rack.session"]["counter"] += 1
+    hash = env["rack.session"].dup
+    hash.delete("session_id")
+    Rack::Response.new(hash.inspect).to_a
+  end
+  
+  session_id = lambda do |env|
+    Rack::Response.new(env["rack.session"].to_hash.inspect).to_a
+  end
+
+  session_option = lambda do |opt|
+    lambda do |env|
+      Rack::Response.new(env["rack.session.options"][opt].inspect).to_a
+    end
+  end
+
+  nothing = lambda do |env|
+    Rack::Response.new("Nothing").to_a
+  end
+
+  renewer = lambda do |env|
+    env["rack.session.options"][:renew] = true
+    Rack::Response.new("Nothing").to_a
+  end
+
+  only_session_id = lambda do |env|
+    Rack::Response.new(env["rack.session"]["session_id"].to_s).to_a
+  end
+
+  bigcookie = lambda do |env|
+    env["rack.session"]["cookie"] = "big" * 3000
+    Rack::Response.new(env["rack.session"].inspect).to_a
+  end
+
+  destroy_session = lambda do |env|
+    env["rack.session"].destroy
+    Rack::Response.new("Nothing").to_a
+  end
+
+  def response_for(options={})
+    request_options = options.fetch(:request, {})
+    cookie = if options[:cookie].is_a?(Rack::Response)
+      options[:cookie]["Set-Cookie"]
+    else
+      options[:cookie]
+    end
+    request_options["HTTP_COOKIE"] = cookie || ""
+
+    app_with_cookie = Rack::Session::Cookie.new(*options[:app])
+    app_with_cookie = Rack::Lint.new(app_with_cookie)
+    Rack::MockRequest.new(app_with_cookie).get("/", request_options)
+  end
+
+  before do
+    @warnings = warnings = []
+    Rack::Session::Cookie.class_eval do
+      define_method(:warn) { |m| warnings << m }
+    end
+  end
+
+  after do
+    Rack::Session::Cookie.class_eval { remove_method :warn }
+  end
+
+  describe 'Base64' do
+    it 'uses base64 to encode' do
+      coder = Rack::Session::Cookie::Base64.new
+      str   = 'fuuuuu'
+      coder.encode(str).should.equal [str].pack('m')
+    end
+
+    it 'uses base64 to decode' do
+      coder = Rack::Session::Cookie::Base64.new
+      str   = ['fuuuuu'].pack('m')
+      coder.decode(str).should.equal str.unpack('m').first
+    end
+
+    describe 'Marshal' do
+      it 'marshals and base64 encodes' do
+        coder = Rack::Session::Cookie::Base64::Marshal.new
+        str   = 'fuuuuu'
+        coder.encode(str).should.equal [::Marshal.dump(str)].pack('m')
+      end
+
+      it 'marshals and base64 decodes' do
+        coder = Rack::Session::Cookie::Base64::Marshal.new
+        str   = [::Marshal.dump('fuuuuu')].pack('m')
+        coder.decode(str).should.equal ::Marshal.load(str.unpack('m').first)
+      end
+
+      it 'rescues failures on decode' do
+        coder = Rack::Session::Cookie::Base64::Marshal.new
+        coder.decode('lulz').should.equal nil
+      end
+    end
+
+    describe 'JSON' do
+      it 'marshals and base64 encodes' do
+        coder = Rack::Session::Cookie::Base64::JSON.new
+        obj   = %w[fuuuuu]
+        coder.encode(obj).should.equal [::Rack::Utils::OkJson.encode(obj)].pack('m')
+      end
+
+      it 'marshals and base64 decodes' do
+        coder = Rack::Session::Cookie::Base64::JSON.new
+        str   = [::Rack::Utils::OkJson.encode(%w[fuuuuu])].pack('m')
+        coder.decode(str).should.equal ::Rack::Utils::OkJson.decode(str.unpack('m').first)
+      end
+
+      it 'rescues failures on decode' do
+        coder = Rack::Session::Cookie::Base64::JSON.new
+        coder.decode('lulz').should.equal nil
+      end
+    end
+  end
+
+  it "warns if no secret is given" do
+    cookie = Rack::Session::Cookie.new(incrementor)
+    @warnings.first.should =~ /no secret/i
+    @warnings.clear
+    cookie = Rack::Session::Cookie.new(incrementor, :secret => 'abc')
+    @warnings.should.be.empty?
+  end
+
+  it 'uses a coder' do
+    identity = Class.new {
+      attr_reader :calls
+
+      def initialize
+        @calls = []
+      end
+
+      def encode(str); @calls << :encode; str; end
+      def decode(str); @calls << :decode; str; end
+    }.new
+    response = response_for(:app => [incrementor, { :coder => identity }])
+
+    response["Set-Cookie"].should.include("rack.session=")
+    response.body.should.equal '{"counter"=>1}'
+    identity.calls.should.equal [:decode, :encode]
+  end
+
+  it "creates a new cookie" do
+    response = response_for(:app => incrementor)
+    response["Set-Cookie"].should.include("rack.session=")
+    response.body.should.equal '{"counter"=>1}'
+  end
+
+  it "loads from a cookie" do
+    response = response_for(:app => incrementor)
+
+    response = response_for(:app => incrementor, :cookie => response)
+    response.body.should.equal '{"counter"=>2}'
+
+    response = response_for(:app => incrementor, :cookie => response)
+    response.body.should.equal '{"counter"=>3}'
+  end
+
+  it "renew session id" do
+    response = response_for(:app => incrementor)
+    cookie   = response['Set-Cookie']
+    response = response_for(:app => only_session_id, :cookie => cookie)
+    cookie   = response['Set-Cookie'] if response['Set-Cookie']
+
+    response.body.should.not.equal ""
+    old_session_id = response.body
+
+    response = response_for(:app => renewer, :cookie => cookie)
+    cookie   = response['Set-Cookie'] if response['Set-Cookie']
+    response = response_for(:app => only_session_id, :cookie => cookie)
+
+    response.body.should.not.equal ""
+    response.body.should.not.equal old_session_id
+  end
+
+  it "destroys session" do
+    response = response_for(:app => incrementor)
+    response = response_for(:app => only_session_id, :cookie => response)
+
+    response.body.should.not.equal ""
+    old_session_id = response.body
+
+    response = response_for(:app => destroy_session, :cookie => response)
+    response = response_for(:app => only_session_id, :cookie => response)
+
+    response.body.should.not.equal ""
+    response.body.should.not.equal old_session_id
+  end
+
+  it "survives broken cookies" do
+    response = response_for(
+      :app => incrementor,
+      :cookie => "rack.session=blarghfasel"
+    )
+    response.body.should.equal '{"counter"=>1}'
+
+    response = response_for(
+      :app => [incrementor, { :secret => "test" }],
+      :cookie => "rack.session="
+    )
+    response.body.should.equal '{"counter"=>1}'
+  end
+
+  it "barks on too big cookies" do
+    lambda{
+      response_for(:app => bigcookie, :request => { :fatal => true })
+    }.should.raise(Rack::MockRequest::FatalWarning)
+  end
+
+  it "loads from a cookie with integrity hash" do
+    app = [incrementor, { :secret => "test" }]
+
+    response = response_for(:app => app)
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>2}'
+
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>3}'
+
+    app = [incrementor, { :secret => "other" }]
+
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>1}'
+  end
+
+  it "loads from a cookie wih accept-only integrity hash for graceful key rotation" do
+    response = response_for(:app => [incrementor, { :secret => "test" }])
+
+    app = [incrementor, { :secret => "test2", :old_secret => "test" }]
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>2}'
+
+    app = [incrementor, { :secret => "test3", :old_secret => "test2" }]
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>3}'
+  end
+
+  it "ignores tampered with session cookies" do
+    app = [incrementor, { :secret => "test" }]
+    response = response_for(:app => app)
+    response.body.should.equal '{"counter"=>1}'
+
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>2}'
+
+    _, digest = response["Set-Cookie"].split("--")
+    tampered_with_cookie = "hackerman-was-here" + "--" + digest
+
+    response = response_for(:app => app, :cookie => tampered_with_cookie)
+    response.body.should.equal '{"counter"=>1}'
+  end
+
+  it "supports either of secret or old_secret" do
+    app = [incrementor, { :secret => "test" }]
+    response = response_for(:app => app)
+    response.body.should.equal '{"counter"=>1}'
+
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>2}'
+
+    app = [incrementor, { :old_secret => "test" }]
+    response = response_for(:app => app)
+    response.body.should.equal '{"counter"=>1}'
+
+    response = response_for(:app => app, :cookie => response)
+    response.body.should.equal '{"counter"=>2}'
+  end
+
+  it "can handle Rack::Lint middleware" do
+    response = response_for(:app => incrementor)
+
+    lint = Rack::Lint.new(session_id)
+    response = response_for(:app => lint, :cookie => response)
+    response.body.should.not.be.nil
+  end
+
+  it "can handle middleware that inspects the env" do
+    class TestEnvInspector
+      def initialize(app)
+        @app = app
+      end
+      def call(env)
+        env.inspect
+        @app.call(env)
+      end
+    end
+
+    response = response_for(:app => incrementor)
+
+    inspector = TestEnvInspector.new(session_id)
+    response = response_for(:app => inspector, :cookie => response)
+    response.body.should.not.be.nil
+  end
+
+  it "returns the session id in the session hash" do
+    response = response_for(:app => incrementor)
+    response.body.should.equal '{"counter"=>1}'
+
+    response = response_for(:app => session_id, :cookie => response)
+    response.body.should.match(/"session_id"=>/)
+    response.body.should.match(/"counter"=>1/)
+  end
+
+  it "does not return a cookie if set to secure but not using ssl" do
+    app = [incrementor, { :secure => true }]
+
+    response = response_for(:app => app)
+    response["Set-Cookie"].should.be.nil
+
+    response = response_for(:app => app, :request => { "HTTPS" => "on" })
+    response["Set-Cookie"].should.not.be.nil
+    response["Set-Cookie"].should.match(/secure/)
+  end
+
+  it "does not return a cookie if cookie was not read/written" do
+    response = response_for(:app => nothing)
+    response["Set-Cookie"].should.be.nil
+  end
+
+  it "does not return a cookie if cookie was not written (only read)" do
+    response = response_for(:app => session_id)
+    response["Set-Cookie"].should.be.nil
+  end
+
+  it "returns even if not read/written if :expire_after is set" do
+    app = [nothing, { :expire_after => 3600 }]
+    request = { "rack.session" => { "not" => "empty" }}
+    response = response_for(:app => app, :request => request)
+    response["Set-Cookie"].should.not.be.nil
+  end
+
+  it "returns no cookie if no data was written and no session was created previously, even if :expire_after is set" do
+    app = [nothing, { :expire_after => 3600 }]
+    response = response_for(:app => app)
+    response["Set-Cookie"].should.be.nil
+  end
+
+  it "exposes :secret in env['rack.session.option']" do
+    response = response_for(:app => [session_option[:secret], { :secret => "foo" }])
+    response.body.should == '"foo"'
+  end
+
+  it "exposes :coder in env['rack.session.option']" do
+    response = response_for(:app => session_option[:coder])
+    response.body.should.match(/Base64::Marshal/)
+  end
+
+  it "allows passing in a hash with session data from middleware in front" do
+    request = { 'rack.session' => { :foo => 'bar' }}
+    response = response_for(:app => session_id, :request => request)
+    response.body.should.match(/foo/)
+  end
+
+  it "allows modifying session data with session data from middleware in front" do
+    request = { 'rack.session' => { :foo => 'bar' }}
+    response = response_for(:app => incrementor, :request => request)
+    response.body.should.match(/counter/)
+    response.body.should.match(/foo/)
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_session_memcache.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_session_memcache.rb
new file mode 100644
index 0000000..6e5325b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_session_memcache.rb
@@ -0,0 +1,321 @@
+begin
+  require 'rack/session/memcache'
+  require 'rack/lint'
+  require 'rack/mock'
+  require 'thread'
+
+  describe Rack::Session::Memcache do
+    session_key = Rack::Session::Memcache::DEFAULT_OPTIONS[:key]
+    session_match = /#{session_key}=([0-9a-fA-F]+);/
+    incrementor = lambda do |env|
+      env["rack.session"]["counter"] ||= 0
+      env["rack.session"]["counter"] += 1
+      Rack::Response.new(env["rack.session"].inspect).to_a
+    end
+    drop_session = Rack::Lint.new(proc do |env|
+      env['rack.session.options'][:drop] = true
+      incrementor.call(env)
+    end)
+    renew_session = Rack::Lint.new(proc do |env|
+      env['rack.session.options'][:renew] = true
+      incrementor.call(env)
+    end)
+    defer_session = Rack::Lint.new(proc do |env|
+      env['rack.session.options'][:defer] = true
+      incrementor.call(env)
+    end)
+    skip_session = Rack::Lint.new(proc do |env|
+      env['rack.session.options'][:skip] = true
+      incrementor.call(env)
+    end)
+    incrementor = Rack::Lint.new(incrementor)
+
+    # test memcache connection
+    Rack::Session::Memcache.new(incrementor)
+
+    it "faults on no connection" do
+      lambda{
+        Rack::Session::Memcache.new(incrementor, :memcache_server => 'nosuchserver')
+      }.should.raise
+    end
+
+    it "connects to existing server" do
+      test_pool = MemCache.new(incrementor, :namespace => 'test:rack:session')
+      test_pool.namespace.should.equal 'test:rack:session'
+    end
+
+    it "passes options to MemCache" do
+      pool = Rack::Session::Memcache.new(incrementor, :namespace => 'test:rack:session')
+      pool.pool.namespace.should.equal 'test:rack:session'
+    end
+
+    it "creates a new cookie" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      res = Rack::MockRequest.new(pool).get("/")
+      res["Set-Cookie"].should.include("#{session_key}=")
+      res.body.should.equal '{"counter"=>1}'
+    end
+
+    it "determines session from a cookie" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      req = Rack::MockRequest.new(pool)
+      res = req.get("/")
+      cookie = res["Set-Cookie"]
+      req.get("/", "HTTP_COOKIE" => cookie).
+        body.should.equal '{"counter"=>2}'
+      req.get("/", "HTTP_COOKIE" => cookie).
+        body.should.equal '{"counter"=>3}'
+    end
+
+    it "determines session only from a cookie by default" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      req = Rack::MockRequest.new(pool)
+      res = req.get("/")
+      sid = res["Set-Cookie"][session_match, 1]
+      req.get("/?rack.session=#{sid}").
+        body.should.equal '{"counter"=>1}'
+      req.get("/?rack.session=#{sid}").
+        body.should.equal '{"counter"=>1}'
+    end
+
+    it "determines session from params" do
+      pool = Rack::Session::Memcache.new(incrementor, :cookie_only => false)
+      req = Rack::MockRequest.new(pool)
+      res = req.get("/")
+      sid = res["Set-Cookie"][session_match, 1]
+      req.get("/?rack.session=#{sid}").
+        body.should.equal '{"counter"=>2}'
+      req.get("/?rack.session=#{sid}").
+        body.should.equal '{"counter"=>3}'
+    end
+
+    it "survives nonexistant cookies" do
+      bad_cookie = "rack.session=blarghfasel"
+      pool = Rack::Session::Memcache.new(incrementor)
+      res = Rack::MockRequest.new(pool).
+        get("/", "HTTP_COOKIE" => bad_cookie)
+      res.body.should.equal '{"counter"=>1}'
+      cookie = res["Set-Cookie"][session_match]
+      cookie.should.not.match(/#{bad_cookie}/)
+    end
+
+    it "maintains freshness" do
+      pool = Rack::Session::Memcache.new(incrementor, :expire_after => 3)
+      res = Rack::MockRequest.new(pool).get('/')
+      res.body.should.include '"counter"=>1'
+      cookie = res["Set-Cookie"]
+      res = Rack::MockRequest.new(pool).get('/', "HTTP_COOKIE" => cookie)
+      res["Set-Cookie"].should.equal cookie
+      res.body.should.include '"counter"=>2'
+      puts 'Sleeping to expire session' if $DEBUG
+      sleep 4
+      res = Rack::MockRequest.new(pool).get('/', "HTTP_COOKIE" => cookie)
+      res["Set-Cookie"].should.not.equal cookie
+      res.body.should.include '"counter"=>1'
+    end
+
+    it "does not send the same session id if it did not change" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      req = Rack::MockRequest.new(pool)
+
+      res0 = req.get("/")
+      cookie = res0["Set-Cookie"][session_match]
+      res0.body.should.equal '{"counter"=>1}'
+
+      res1 = req.get("/", "HTTP_COOKIE" => cookie)
+      res1["Set-Cookie"].should.be.nil
+      res1.body.should.equal '{"counter"=>2}'
+
+      res2 = req.get("/", "HTTP_COOKIE" => cookie)
+      res2["Set-Cookie"].should.be.nil
+      res2.body.should.equal '{"counter"=>3}'
+    end
+
+    it "deletes cookies with :drop option" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      req = Rack::MockRequest.new(pool)
+      drop = Rack::Utils::Context.new(pool, drop_session)
+      dreq = Rack::MockRequest.new(drop)
+
+      res1 = req.get("/")
+      session = (cookie = res1["Set-Cookie"])[session_match]
+      res1.body.should.equal '{"counter"=>1}'
+
+      res2 = dreq.get("/", "HTTP_COOKIE" => cookie)
+      res2["Set-Cookie"].should.equal nil
+      res2.body.should.equal '{"counter"=>2}'
+
+      res3 = req.get("/", "HTTP_COOKIE" => cookie)
+      res3["Set-Cookie"][session_match].should.not.equal session
+      res3.body.should.equal '{"counter"=>1}'
+    end
+
+    it "provides new session id with :renew option" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      req = Rack::MockRequest.new(pool)
+      renew = Rack::Utils::Context.new(pool, renew_session)
+      rreq = Rack::MockRequest.new(renew)
+
+      res1 = req.get("/")
+      session = (cookie = res1["Set-Cookie"])[session_match]
+      res1.body.should.equal '{"counter"=>1}'
+
+      res2 = rreq.get("/", "HTTP_COOKIE" => cookie)
+      new_cookie = res2["Set-Cookie"]
+      new_session = new_cookie[session_match]
+      new_session.should.not.equal session
+      res2.body.should.equal '{"counter"=>2}'
+
+      res3 = req.get("/", "HTTP_COOKIE" => new_cookie)
+      res3.body.should.equal '{"counter"=>3}'
+
+      # Old cookie was deleted
+      res4 = req.get("/", "HTTP_COOKIE" => cookie)
+      res4.body.should.equal '{"counter"=>1}'
+    end
+
+    it "omits cookie with :defer option but still updates the state" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      count = Rack::Utils::Context.new(pool, incrementor)
+      defer = Rack::Utils::Context.new(pool, defer_session)
+      dreq = Rack::MockRequest.new(defer)
+      creq = Rack::MockRequest.new(count)
+
+      res0 = dreq.get("/")
+      res0["Set-Cookie"].should.equal nil
+      res0.body.should.equal '{"counter"=>1}'
+
+      res0 = creq.get("/")
+      res1 = dreq.get("/", "HTTP_COOKIE" => res0["Set-Cookie"])
+      res1.body.should.equal '{"counter"=>2}'
+      res2 = dreq.get("/", "HTTP_COOKIE" => res0["Set-Cookie"])
+      res2.body.should.equal '{"counter"=>3}'
+    end
+
+    it "omits cookie and state update with :skip option" do
+      pool = Rack::Session::Memcache.new(incrementor)
+      count = Rack::Utils::Context.new(pool, incrementor)
+      skip = Rack::Utils::Context.new(pool, skip_session)
+      sreq = Rack::MockRequest.new(skip)
+      creq = Rack::MockRequest.new(count)
+
+      res0 = sreq.get("/")
+      res0["Set-Cookie"].should.equal nil
+      res0.body.should.equal '{"counter"=>1}'
+
+      res0 = creq.get("/")
+      res1 = sreq.get("/", "HTTP_COOKIE" => res0["Set-Cookie"])
+      res1.body.should.equal '{"counter"=>2}'
+      res2 = sreq.get("/", "HTTP_COOKIE" => res0["Set-Cookie"])
+      res2.body.should.equal '{"counter"=>2}'
+    end
+
+    it "updates deep hashes correctly" do
+      hash_check = proc do |env|
+        session = env['rack.session']
+        unless session.include? 'test'
+          session.update :a => :b, :c => { :d => :e },
+            :f => { :g => { :h => :i} }, 'test' => true
+        else
+          session[:f][:g][:h] = :j
+        end
+        [200, {}, [session.inspect]]
+      end
+      pool = Rack::Session::Memcache.new(hash_check)
+      req = Rack::MockRequest.new(pool)
+
+      res0 = req.get("/")
+      session_id = (cookie = res0["Set-Cookie"])[session_match, 1]
+      ses0 = pool.pool.get(session_id, true)
+
+      req.get("/", "HTTP_COOKIE" => cookie)
+      ses1 = pool.pool.get(session_id, true)
+
+      ses1.should.not.equal ses0
+    end
+
+    # anyone know how to do this better?
+    it "cleanly merges sessions when multithreaded" do
+      unless $DEBUG
+        1.should.equal 1 # fake assertion to appease the mighty bacon
+        next
+      end
+      warn 'Running multithread test for Session::Memcache'
+      pool = Rack::Session::Memcache.new(incrementor)
+      req = Rack::MockRequest.new(pool)
+
+      res = req.get('/')
+      res.body.should.equal '{"counter"=>1}'
+      cookie = res["Set-Cookie"]
+      session_id = cookie[session_match, 1]
+
+      delta_incrementor = lambda do |env|
+        # emulate disconjoinment of threading
+        env['rack.session'] = env['rack.session'].dup
+        Thread.stop
+        env['rack.session'][(Time.now.usec*rand).to_i] = true
+        incrementor.call(env)
+      end
+      tses = Rack::Utils::Context.new pool, delta_incrementor
+      treq = Rack::MockRequest.new(tses)
+      tnum = rand(7).to_i+5
+      r = Array.new(tnum) do
+        Thread.new(treq) do |run|
+          run.get('/', "HTTP_COOKIE" => cookie, 'rack.multithread' => true)
+        end
+      end.reverse.map{|t| t.run.join.value }
+      r.each do |request|
+        request['Set-Cookie'].should.equal cookie
+        request.body.should.include '"counter"=>2'
+      end
+
+      session = pool.pool.get(session_id)
+      session.size.should.equal tnum+1 # counter
+      session['counter'].should.equal 2 # meeeh
+
+      tnum = rand(7).to_i+5
+      r = Array.new(tnum) do |i|
+        app = Rack::Utils::Context.new pool, time_delta
+        req = Rack::MockRequest.new app
+        Thread.new(req) do |run|
+          run.get('/', "HTTP_COOKIE" => cookie, 'rack.multithread' => true)
+        end
+      end.reverse.map{|t| t.run.join.value }
+      r.each do |request|
+        request['Set-Cookie'].should.equal cookie
+        request.body.should.include '"counter"=>3'
+      end
+
+      session = pool.pool.get(session_id)
+      session.size.should.be tnum+1
+      session['counter'].should.be 3
+
+      drop_counter = proc do |env|
+        env['rack.session'].delete 'counter'
+        env['rack.session']['foo'] = 'bar'
+        [200, {'Content-Type'=>'text/plain'}, env['rack.session'].inspect]
+      end
+      tses = Rack::Utils::Context.new pool, drop_counter
+      treq = Rack::MockRequest.new(tses)
+      tnum = rand(7).to_i+5
+      r = Array.new(tnum) do
+        Thread.new(treq) do |run|
+          run.get('/', "HTTP_COOKIE" => cookie, 'rack.multithread' => true)
+        end
+      end.reverse.map{|t| t.run.join.value }
+      r.each do |request|
+        request['Set-Cookie'].should.equal cookie
+        request.body.should.include '"foo"=>"bar"'
+      end
+
+      session = pool.pool.get(session_id)
+      session.size.should.be r.size+1
+      session['counter'].should.be.nil?
+      session['foo'].should.equal 'bar'
+    end
+  end
+rescue RuntimeError
+  $stderr.puts "Skipping Rack::Session::Memcache tests. Start memcached and try again."
+rescue LoadError
+  $stderr.puts "Skipping Rack::Session::Memcache tests (Memcache is required). `gem install memcache-client` and try again."
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_session_pool.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_session_pool.rb
new file mode 100644
index 0000000..984f55a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_session_pool.rb
@@ -0,0 +1,209 @@
+require 'thread'
+require 'rack/lint'
+require 'rack/mock'
+require 'rack/session/pool'
+
+describe Rack::Session::Pool do
+  session_key = Rack::Session::Pool::DEFAULT_OPTIONS[:key]
+  session_match = /#{session_key}=[0-9a-fA-F]+;/
+
+  incrementor = lambda do |env|
+    env["rack.session"]["counter"] ||= 0
+    env["rack.session"]["counter"] += 1
+    Rack::Response.new(env["rack.session"].inspect).to_a
+  end
+
+  session_id = Rack::Lint.new(lambda do |env|
+    Rack::Response.new(env["rack.session"].inspect).to_a
+  end)
+
+  nothing = Rack::Lint.new(lambda do |env|
+    Rack::Response.new("Nothing").to_a
+  end)
+
+  drop_session = Rack::Lint.new(lambda do |env|
+    env['rack.session.options'][:drop] = true
+    incrementor.call(env)
+  end)
+
+  renew_session = Rack::Lint.new(lambda do |env|
+    env['rack.session.options'][:renew] = true
+    incrementor.call(env)
+  end)
+
+  defer_session = Rack::Lint.new(lambda do |env|
+    env['rack.session.options'][:defer] = true
+    incrementor.call(env)
+  end)
+  
+  incrementor = Rack::Lint.new(incrementor)
+
+  it "creates a new cookie" do
+    pool = Rack::Session::Pool.new(incrementor)
+    res = Rack::MockRequest.new(pool).get("/")
+    res["Set-Cookie"].should.match session_match
+    res.body.should.equal '{"counter"=>1}'
+  end
+
+  it "determines session from a cookie" do
+    pool = Rack::Session::Pool.new(incrementor)
+    req = Rack::MockRequest.new(pool)
+    cookie = req.get("/")["Set-Cookie"]
+    req.get("/", "HTTP_COOKIE" => cookie).
+      body.should.equal '{"counter"=>2}'
+    req.get("/", "HTTP_COOKIE" => cookie).
+      body.should.equal '{"counter"=>3}'
+  end
+
+  it "survives nonexistant cookies" do
+    pool = Rack::Session::Pool.new(incrementor)
+    res = Rack::MockRequest.new(pool).
+      get("/", "HTTP_COOKIE" => "#{session_key}=blarghfasel")
+    res.body.should.equal '{"counter"=>1}'
+  end
+
+  it "does not send the same session id if it did not change" do
+    pool = Rack::Session::Pool.new(incrementor)
+    req = Rack::MockRequest.new(pool)
+
+    res0 = req.get("/")
+    cookie = res0["Set-Cookie"][session_match]
+    res0.body.should.equal '{"counter"=>1}'
+    pool.pool.size.should.equal 1
+
+    res1 = req.get("/", "HTTP_COOKIE" => cookie)
+    res1["Set-Cookie"].should.be.nil
+    res1.body.should.equal '{"counter"=>2}'
+    pool.pool.size.should.equal 1
+
+    res2 = req.get("/", "HTTP_COOKIE" => cookie)
+    res2["Set-Cookie"].should.be.nil
+    res2.body.should.equal '{"counter"=>3}'
+    pool.pool.size.should.equal 1
+  end
+
+  it "deletes cookies with :drop option" do
+    pool = Rack::Session::Pool.new(incrementor)
+    req = Rack::MockRequest.new(pool)
+    drop = Rack::Utils::Context.new(pool, drop_session)
+    dreq = Rack::MockRequest.new(drop)
+
+    res1 = req.get("/")
+    session = (cookie = res1["Set-Cookie"])[session_match]
+    res1.body.should.equal '{"counter"=>1}'
+    pool.pool.size.should.equal 1
+
+    res2 = dreq.get("/", "HTTP_COOKIE" => cookie)
+    res2["Set-Cookie"].should.be.nil
+    res2.body.should.equal '{"counter"=>2}'
+    pool.pool.size.should.equal 0
+
+    res3 = req.get("/", "HTTP_COOKIE" => cookie)
+    res3["Set-Cookie"][session_match].should.not.equal session
+    res3.body.should.equal '{"counter"=>1}'
+    pool.pool.size.should.equal 1
+  end
+
+  it "provides new session id with :renew option" do
+    pool = Rack::Session::Pool.new(incrementor)
+    req = Rack::MockRequest.new(pool)
+    renew = Rack::Utils::Context.new(pool, renew_session)
+    rreq = Rack::MockRequest.new(renew)
+
+    res1 = req.get("/")
+    session = (cookie = res1["Set-Cookie"])[session_match]
+    res1.body.should.equal '{"counter"=>1}'
+    pool.pool.size.should.equal 1
+
+    res2 = rreq.get("/", "HTTP_COOKIE" => cookie)
+    new_cookie = res2["Set-Cookie"]
+    new_session = new_cookie[session_match]
+    new_session.should.not.equal session
+    res2.body.should.equal '{"counter"=>2}'
+    pool.pool.size.should.equal 1
+
+    res3 = req.get("/", "HTTP_COOKIE" => new_cookie)
+    res3.body.should.equal '{"counter"=>3}'
+    pool.pool.size.should.equal 1
+
+    res4 = req.get("/", "HTTP_COOKIE" => cookie)
+    res4.body.should.equal '{"counter"=>1}'
+    pool.pool.size.should.equal 2
+  end
+
+  it "omits cookie with :defer option" do
+    pool = Rack::Session::Pool.new(incrementor)
+    defer = Rack::Utils::Context.new(pool, defer_session)
+    dreq = Rack::MockRequest.new(defer)
+
+    res1 = dreq.get("/")
+    res1["Set-Cookie"].should.equal nil
+    res1.body.should.equal '{"counter"=>1}'
+    pool.pool.size.should.equal 1
+  end
+
+  # anyone know how to do this better?
+  it "should merge sessions when multithreaded" do
+    unless $DEBUG
+      1.should.equal 1
+      next
+    end
+
+    warn 'Running multithread tests for Session::Pool'
+    pool = Rack::Session::Pool.new(incrementor)
+    req = Rack::MockRequest.new(pool)
+
+    res = req.get('/')
+    res.body.should.equal '{"counter"=>1}'
+    cookie = res["Set-Cookie"]
+    sess_id = cookie[/#{pool.key}=([^,;]+)/,1]
+
+    delta_incrementor = lambda do |env|
+      # emulate disconjoinment of threading
+      env['rack.session'] = env['rack.session'].dup
+      Thread.stop
+      env['rack.session'][(Time.now.usec*rand).to_i] = true
+      incrementor.call(env)
+    end
+    tses = Rack::Utils::Context.new pool, delta_incrementor
+    treq = Rack::MockRequest.new(tses)
+    tnum = rand(7).to_i+5
+    r = Array.new(tnum) do
+      Thread.new(treq) do |run|
+        run.get('/', "HTTP_COOKIE" => cookie, 'rack.multithread' => true)
+      end
+    end.reverse.map{|t| t.run.join.value }
+    r.each do |resp|
+      resp['Set-Cookie'].should.equal cookie
+      resp.body.should.include '"counter"=>2'
+    end
+
+    session = pool.pool[sess_id]
+    session.size.should.equal tnum+1 # counter
+    session['counter'].should.equal 2 # meeeh
+  end
+
+  it "does not return a cookie if cookie was not read/written" do
+    app = Rack::Session::Pool.new(nothing)
+    res = Rack::MockRequest.new(app).get("/")
+    res["Set-Cookie"].should.be.nil
+  end
+
+  it "does not return a cookie if cookie was not written (only read)" do
+    app = Rack::Session::Pool.new(session_id)
+    res = Rack::MockRequest.new(app).get("/")
+    res["Set-Cookie"].should.be.nil
+  end
+
+  it "returns even if not read/written if :expire_after is set" do
+    app = Rack::Session::Pool.new(nothing, :expire_after => 3600)
+    res = Rack::MockRequest.new(app).get("/", 'rack.session' => {'not' => 'empty'})
+    res["Set-Cookie"].should.not.be.nil
+  end
+
+  it "returns no cookie if no data was written and no session was created previously, even if :expire_after is set" do
+    app = Rack::Session::Pool.new(nothing, :expire_after => 3600)
+    res = Rack::MockRequest.new(app).get("/")
+    res["Set-Cookie"].should.be.nil
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_showexceptions.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_showexceptions.rb
new file mode 100644
index 0000000..bdd5ce5
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_showexceptions.rb
@@ -0,0 +1,92 @@
+require 'rack/showexceptions'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::ShowExceptions do
+  def show_exceptions(app)
+    Rack::Lint.new Rack::ShowExceptions.new(app)
+  end
+  
+  it "catches exceptions" do
+    res = nil
+
+    req = Rack::MockRequest.new(
+      show_exceptions(
+        lambda{|env| raise RuntimeError }
+    ))
+
+    lambda{
+      res = req.get("/")
+    }.should.not.raise
+
+    res.should.be.a.server_error
+    res.status.should.equal 500
+
+    res.should =~ /RuntimeError/
+    res.should =~ /ShowExceptions/
+  end
+
+  it "responds with plain text on AJAX requests accepting anything but HTML" do
+    res = nil
+
+    req = Rack::MockRequest.new(
+      show_exceptions(
+        lambda{|env| raise RuntimeError, "It was never supposed to work" }
+    ))
+
+    lambda{
+      res = req.get("/", "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest")
+    }.should.not.raise
+
+    res.should.be.a.server_error
+    res.status.should.equal 500
+
+    res.content_type.should.equal "text/plain"
+
+    res.body.should.include "RuntimeError: It was never supposed to work\n"
+    res.body.should.include __FILE__
+  end
+
+  it "responds with HTML on AJAX requests accepting HTML" do
+    res = nil
+
+    req = Rack::MockRequest.new(
+      show_exceptions(
+        lambda{|env| raise RuntimeError, "It was never supposed to work" }
+    ))
+
+    lambda{
+      res = req.get("/", "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest", "HTTP_ACCEPT" => "text/html")
+    }.should.not.raise
+
+    res.should.be.a.server_error
+    res.status.should.equal 500
+
+    res.content_type.should.equal "text/html"
+
+    res.body.should.include "RuntimeError"
+    res.body.should.include "It was never supposed to work"
+    res.body.should.include Rack::Utils.escape_html(__FILE__)
+  end
+
+  it "handles exceptions without a backtrace" do
+    res = nil
+
+    req = Rack::MockRequest.new(
+      show_exceptions(
+        lambda{|env| raise RuntimeError, "", [] }
+      )
+    )
+
+    lambda{
+      res = req.get("/")
+    }.should.not.raise
+
+    res.should.be.a.server_error
+    res.status.should.equal 500
+
+    res.should =~ /RuntimeError/
+    res.should =~ /ShowExceptions/
+    res.should =~ /unknown location/
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_showstatus.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_showstatus.rb
new file mode 100644
index 0000000..6f8e6fe
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_showstatus.rb
@@ -0,0 +1,84 @@
+require 'rack/showstatus'
+require 'rack/lint'
+require 'rack/mock'
+
+describe Rack::ShowStatus do
+  def show_status(app)
+    Rack::Lint.new Rack::ShowStatus.new(app)
+  end
+  
+  should "provide a default status message" do
+    req = Rack::MockRequest.new(
+      show_status(lambda{|env|
+        [404, {"Content-Type" => "text/plain", "Content-Length" => "0"}, []]
+    }))
+
+    res = req.get("/", :lint => true)
+    res.should.be.not_found
+    res.should.be.not.empty
+
+    res["Content-Type"].should.equal("text/html")
+    res.should =~ /404/
+    res.should =~ /Not Found/
+  end
+
+  should "let the app provide additional information" do
+    req = Rack::MockRequest.new(
+      show_status(
+        lambda{|env|
+          env["rack.showstatus.detail"] = "gone too meta."
+          [404, {"Content-Type" => "text/plain", "Content-Length" => "0"}, []]
+    }))
+
+    res = req.get("/", :lint => true)
+    res.should.be.not_found
+    res.should.be.not.empty
+
+    res["Content-Type"].should.equal("text/html")
+    res.should =~ /404/
+    res.should =~ /Not Found/
+    res.should =~ /too meta/
+  end
+
+  should "not replace existing messages" do
+    req = Rack::MockRequest.new(
+      show_status(
+        lambda{|env|
+          [404, {"Content-Type" => "text/plain", "Content-Length" => "4"}, ["foo!"]]
+    }))
+
+    res = req.get("/", :lint => true)
+    res.should.be.not_found
+
+    res.body.should == "foo!"
+  end
+
+  should "pass on original headers" do
+    headers = {"WWW-Authenticate" => "Basic blah"}
+
+    req = Rack::MockRequest.new(
+      show_status(lambda{|env| [401, headers, []] }))
+    res = req.get("/", :lint => true)
+
+    res["WWW-Authenticate"].should.equal("Basic blah")
+  end
+
+  should "replace existing messages if there is detail" do
+    req = Rack::MockRequest.new(
+      show_status(
+        lambda{|env|
+          env["rack.showstatus.detail"] = "gone too meta."
+          [404, {"Content-Type" => "text/plain", "Content-Length" => "4"}, ["foo!"]]
+    }))
+
+    res = req.get("/", :lint => true)
+    res.should.be.not_found
+    res.should.be.not.empty
+
+    res["Content-Type"].should.equal("text/html")
+    res["Content-Length"].should.not.equal("4")
+    res.should =~ /404/
+    res.should =~ /too meta/
+    res.body.should.not =~ /foo/
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_static.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_static.rb
new file mode 100644
index 0000000..fed1df2
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_static.rb
@@ -0,0 +1,145 @@
+require 'rack/static'
+require 'rack/lint'
+require 'rack/mock'
+
+class DummyApp
+  def call(env)
+    [200, {"Content-Type" => "text/plain"}, ["Hello World"]]
+  end
+end
+
+describe Rack::Static do
+  def static(app, *args)
+    Rack::Lint.new Rack::Static.new(app, *args)
+  end
+
+  root = File.expand_path(File.dirname(__FILE__))
+
+  OPTIONS = {:urls => ["/cgi"], :root => root}
+  STATIC_OPTIONS = {:urls => [""], :root => "#{root}/static", :index => 'index.html'}
+  HASH_OPTIONS = {:urls => {"/cgi/sekret" => 'cgi/test'}, :root => root}
+
+  @request = Rack::MockRequest.new(static(DummyApp.new, OPTIONS))
+  @static_request = Rack::MockRequest.new(static(DummyApp.new, STATIC_OPTIONS))
+  @hash_request = Rack::MockRequest.new(static(DummyApp.new, HASH_OPTIONS))
+
+  it "serves files" do
+    res = @request.get("/cgi/test")
+    res.should.be.ok
+    res.body.should =~ /ruby/
+  end
+
+  it "404s if url root is known but it can't find the file" do
+    res = @request.get("/cgi/foo")
+    res.should.be.not_found
+  end
+
+  it "calls down the chain if url root is not known" do
+    res = @request.get("/something/else")
+    res.should.be.ok
+    res.body.should == "Hello World"
+  end
+
+  it "calls index file when requesting root in the given folder" do
+    res = @static_request.get("/")
+    res.should.be.ok
+    res.body.should =~ /index!/
+
+    res = @static_request.get("/other/")
+    res.should.be.not_found
+
+    res = @static_request.get("/another/")
+    res.should.be.ok
+    res.body.should =~ /another index!/
+  end
+
+  it "doesn't call index file if :index option was omitted" do
+    res = @request.get("/")
+    res.body.should == "Hello World"
+  end
+
+  it "serves hidden files" do
+    res = @hash_request.get("/cgi/sekret")
+    res.should.be.ok
+    res.body.should =~ /ruby/
+  end
+
+  it "calls down the chain if the URI is not specified" do
+    res = @hash_request.get("/something/else")
+    res.should.be.ok
+    res.body.should == "Hello World"
+  end
+
+  it "supports serving fixed cache-control (legacy option)" do
+    opts = OPTIONS.merge(:cache_control => 'public')
+    request = Rack::MockRequest.new(static(DummyApp.new, opts))
+    res = request.get("/cgi/test")
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public'
+  end
+
+  HEADER_OPTIONS = {:urls => ["/cgi"], :root => root, :header_rules => [
+    [:all, {'Cache-Control' => 'public, max-age=100'}],
+    [:fonts, {'Cache-Control' => 'public, max-age=200'}],
+    [%w(png jpg), {'Cache-Control' => 'public, max-age=300'}],
+    ['/cgi/assets/folder/', {'Cache-Control' => 'public, max-age=400'}],
+    ['cgi/assets/javascripts', {'Cache-Control' => 'public, max-age=500'}],
+    [/\.(css|erb)\z/, {'Cache-Control' => 'public, max-age=600'}]
+  ]}
+  @header_request = Rack::MockRequest.new(static(DummyApp.new, HEADER_OPTIONS))
+
+  it "supports header rule :all" do
+    # Headers for all files via :all shortcut
+    res = @header_request.get('/cgi/assets/index.html')
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=100'
+  end
+
+  it "supports header rule :fonts" do
+    # Headers for web fonts via :fonts shortcut
+    res = @header_request.get('/cgi/assets/fonts/font.eot')
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=200'
+  end
+
+  it "supports file extension header rules provided as an Array" do
+    # Headers for file extensions via array
+    res = @header_request.get('/cgi/assets/images/image.png')
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=300'
+  end
+
+  it "supports folder rules provided as a String" do
+    # Headers for files in folder via string
+    res = @header_request.get('/cgi/assets/folder/test.js')
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=400'
+  end
+
+  it "supports folder header rules provided as a String not starting with a slash" do
+    res = @header_request.get('/cgi/assets/javascripts/app.js')
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=500'
+  end
+
+  it "supports flexible header rules provided as Regexp" do
+    # Flexible Headers via Regexp
+    res = @header_request.get('/cgi/assets/stylesheets/app.css')
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=600'
+  end
+
+  it "prioritizes header rules over fixed cache-control setting (legacy option)" do
+    opts = OPTIONS.merge(
+      :cache_control => 'public, max-age=24',
+      :header_rules => [
+        [:all, {'Cache-Control' => 'public, max-age=42'}]
+      ])
+
+    request = Rack::MockRequest.new(static(DummyApp.new, opts))
+    res = request.get("/cgi/test")
+    res.should.be.ok
+    res.headers['Cache-Control'].should == 'public, max-age=42'
+  end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_thin.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_thin.rb
new file mode 100644
index 0000000..15a1ab5
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_thin.rb
@@ -0,0 +1,91 @@
+begin
+require 'rack/handler/thin'
+require File.expand_path('../testrequest', __FILE__)
+require 'timeout'
+
+describe Rack::Handler::Thin do
+  extend TestRequest::Helpers
+
+  @app = Rack::Lint.new(TestRequest.new)
+  @server = nil
+  Thin::Logging.silent = true
+
+  @thread = Thread.new do
+    Rack::Handler::Thin.run(@app, :Host => @host='127.0.0.1', :Port => @port=9204, :tag => "tag") do |server|
+      @server = server
+    end
+  end
+
+  Thread.pass until @server && @server.running?
+
+  should "respond" do
+    GET("/")
+    response.should.not.be.nil
+  end
+
+  should "be a Thin" do
+    GET("/")
+    status.should.equal 200
+    response["SERVER_SOFTWARE"].should =~ /thin/
+    response["HTTP_VERSION"].should.equal "HTTP/1.1"
+    response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
+    response["SERVER_PORT"].should.equal "9204"
+    response["SERVER_NAME"].should.equal "127.0.0.1"
+  end
+
+  should "have rack headers" do
+    GET("/")
+    response["rack.version"].should.equal [1,0]
+    response["rack.multithread"].should.equal false
+    response["rack.multiprocess"].should.equal false
+    response["rack.run_once"].should.equal false
+  end
+
+  should "have CGI headers on GET" do
+    GET("/")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["REQUEST_PATH"].should.equal "/"
+    response["PATH_INFO"].should.be.equal "/"
+    response["QUERY_STRING"].should.equal ""
+    response["test.postdata"].should.equal ""
+
+    GET("/test/foo?quux=1")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["REQUEST_PATH"].should.equal "/test/foo"
+    response["PATH_INFO"].should.equal "/test/foo"
+    response["QUERY_STRING"].should.equal "quux=1"
+  end
+
+  should "have CGI headers on POST" do
+    POST("/", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
+    status.should.equal 200
+    response["REQUEST_METHOD"].should.equal "POST"
+    response["REQUEST_PATH"].should.equal "/"
+    response["QUERY_STRING"].should.equal ""
+    response["HTTP_X_TEST_HEADER"].should.equal "42"
+    response["test.postdata"].should.equal "rack-form-data=23"
+  end
+
+  should "support HTTP auth" do
+    GET("/test", {:user => "ruth", :passwd => "secret"})
+    response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
+  end
+
+  should "set status" do
+    GET("/test?secret")
+    status.should.equal 403
+    response["rack.url_scheme"].should.equal "http"
+  end
+
+  should "set tag for server" do
+    @server.tag.should.equal 'tag'
+  end
+
+  @server.stop!
+  @thread.kill
+
+end
+
+rescue LoadError
+  $stderr.puts "Skipping Rack::Handler::Thin tests (Thin is required). `gem install thin` and try again."
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_urlmap.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_urlmap.rb
new file mode 100644
index 0000000..316c725
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_urlmap.rb
@@ -0,0 +1,213 @@
+require 'rack/urlmap'
+require 'rack/mock'
+
+describe Rack::URLMap do
+  it "dispatches paths correctly" do
+    app = lambda { |env|
+      [200, {
+        'X-ScriptName' => env['SCRIPT_NAME'],
+        'X-PathInfo' => env['PATH_INFO'],
+        'Content-Type' => 'text/plain'
+      }, [""]]
+    }
+    map = Rack::Lint.new(Rack::URLMap.new({
+      'http://foo.org/bar' => app,
+      '/foo' => app,
+      '/foo/bar' => app
+    }))
+
+    res = Rack::MockRequest.new(map).get("/")
+    res.should.be.not_found
+
+    res = Rack::MockRequest.new(map).get("/qux")
+    res.should.be.not_found
+
+    res = Rack::MockRequest.new(map).get("/foo")
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/foo"
+    res["X-PathInfo"].should.equal ""
+
+    res = Rack::MockRequest.new(map).get("/foo/")
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/foo"
+    res["X-PathInfo"].should.equal "/"
+
+    res = Rack::MockRequest.new(map).get("/foo/bar")
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/foo/bar"
+    res["X-PathInfo"].should.equal ""
+
+    res = Rack::MockRequest.new(map).get("/foo/bar/")
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/foo/bar"
+    res["X-PathInfo"].should.equal "/"
+
+    res = Rack::MockRequest.new(map).get("/foo///bar//quux")
+    res.status.should.equal 200
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/foo/bar"
+    res["X-PathInfo"].should.equal "//quux"
+
+    res = Rack::MockRequest.new(map).get("/foo/quux", "SCRIPT_NAME" => "/bleh")
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/bleh/foo"
+    res["X-PathInfo"].should.equal "/quux"
+
+    res = Rack::MockRequest.new(map).get("/bar", 'HTTP_HOST' => 'foo.org')
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/bar"
+    res["X-PathInfo"].should.be.empty
+
+    res = Rack::MockRequest.new(map).get("/bar/", 'HTTP_HOST' => 'foo.org')
+    res.should.be.ok
+    res["X-ScriptName"].should.equal "/bar"
+    res["X-PathInfo"].should.equal '/'
+  end
+
+
+  it "dispatches hosts correctly" do
+    map = Rack::Lint.new(Rack::URLMap.new("http://foo.org/" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "foo.org",
+                                "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
+                              }, [""]]},
+                           "http://subdomain.foo.org/" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "subdomain.foo.org",
+                                "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
+                              }, [""]]},
+                           "http://bar.org/" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "bar.org",
+                                "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
+                              }, [""]]},
+                           "/" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "default.org",
+                                "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
+                              }, [""]]}
+                           ))
+
+    res = Rack::MockRequest.new(map).get("/")
+    res.should.be.ok
+    res["X-Position"].should.equal "default.org"
+
+    res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "bar.org")
+    res.should.be.ok
+    res["X-Position"].should.equal "bar.org"
+
+    res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "foo.org")
+    res.should.be.ok
+    res["X-Position"].should.equal "foo.org"
+
+    res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "subdomain.foo.org", "SERVER_NAME" => "foo.org")
+    res.should.be.ok
+    res["X-Position"].should.equal "subdomain.foo.org"
+
+    res = Rack::MockRequest.new(map).get("http://foo.org/")
+    res.should.be.ok
+    res["X-Position"].should.equal "foo.org"
+
+    res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "example.org")
+    res.should.be.ok
+    res["X-Position"].should.equal "default.org"
+
+    res = Rack::MockRequest.new(map).get("/",
+                                         "HTTP_HOST" => "example.org:9292",
+                                         "SERVER_PORT" => "9292")
+    res.should.be.ok
+    res["X-Position"].should.equal "default.org"
+  end
+
+  should "be nestable" do
+    map = Rack::Lint.new(Rack::URLMap.new("/foo" =>
+      Rack::URLMap.new("/bar" =>
+        Rack::URLMap.new("/quux" =>  lambda { |env|
+                           [200,
+                            { "Content-Type" => "text/plain",
+                              "X-Position" => "/foo/bar/quux",
+                              "X-PathInfo" => env["PATH_INFO"],
+                              "X-ScriptName" => env["SCRIPT_NAME"],
+                            }, [""]]}
+                         ))))
+
+    res = Rack::MockRequest.new(map).get("/foo/bar")
+    res.should.be.not_found
+
+    res = Rack::MockRequest.new(map).get("/foo/bar/quux")
+    res.should.be.ok
+    res["X-Position"].should.equal "/foo/bar/quux"
+    res["X-PathInfo"].should.equal ""
+    res["X-ScriptName"].should.equal "/foo/bar/quux"
+  end
+
+  should "route root apps correctly" do
+    map = Rack::Lint.new(Rack::URLMap.new("/" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "root",
+                                "X-PathInfo" => env["PATH_INFO"],
+                                "X-ScriptName" => env["SCRIPT_NAME"]
+                              }, [""]]},
+                           "/foo" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "foo",
+                                "X-PathInfo" => env["PATH_INFO"],
+                                "X-ScriptName" => env["SCRIPT_NAME"]
+                              }, [""]]}
+                           ))
+
+    res = Rack::MockRequest.new(map).get("/foo/bar")
+    res.should.be.ok
+    res["X-Position"].should.equal "foo"
+    res["X-PathInfo"].should.equal "/bar"
+    res["X-ScriptName"].should.equal "/foo"
+
+    res = Rack::MockRequest.new(map).get("/foo")
+    res.should.be.ok
+    res["X-Position"].should.equal "foo"
+    res["X-PathInfo"].should.equal ""
+    res["X-ScriptName"].should.equal "/foo"
+
+    res = Rack::MockRequest.new(map).get("/bar")
+    res.should.be.ok
+    res["X-Position"].should.equal "root"
+    res["X-PathInfo"].should.equal "/bar"
+    res["X-ScriptName"].should.equal ""
+
+    res = Rack::MockRequest.new(map).get("")
+    res.should.be.ok
+    res["X-Position"].should.equal "root"
+    res["X-PathInfo"].should.equal "/"
+    res["X-ScriptName"].should.equal ""
+  end
+
+  should "not squeeze slashes" do
+    map = Rack::Lint.new(Rack::URLMap.new("/" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "root",
+                                "X-PathInfo" => env["PATH_INFO"],
+                                "X-ScriptName" => env["SCRIPT_NAME"]
+                              }, [""]]},
+                           "/foo" => lambda { |env|
+                             [200,
+                              { "Content-Type" => "text/plain",
+                                "X-Position" => "foo",
+                                "X-PathInfo" => env["PATH_INFO"],
+                                "X-ScriptName" => env["SCRIPT_NAME"]
+                              }, [""]]}
+                           ))
+
+    res = Rack::MockRequest.new(map).get("/http://example.org/bar")
+    res.should.be.ok
+    res["X-Position"].should.equal "root"
+    res["X-PathInfo"].should.equal "/http://example.org/bar"
+    res["X-ScriptName"].should.equal ""
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_utils.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_utils.rb
new file mode 100644
index 0000000..622b8ff
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_utils.rb
@@ -0,0 +1,573 @@
+# -*- encoding: utf-8 -*-
+require 'rack/utils'
+require 'rack/mock'
+require 'timeout'
+
+describe Rack::Utils do
+
+  # A helper method which checks
+  # if certain query parameters 
+  # are equal.
+  def equal_query_to(query)
+    parts = query.split('&')
+    lambda{|other| (parts & other.split('&')) == parts }
+  end
+
+  def kcodeu
+    one8 = RUBY_VERSION.to_f < 1.9
+    default_kcode, $KCODE = $KCODE, 'U' if one8
+    yield
+  ensure
+    $KCODE = default_kcode if one8
+  end
+
+  should "round trip binary data" do
+    r = [218, 0].pack 'CC'
+    if defined?(::Encoding)
+      z = Rack::Utils.unescape(Rack::Utils.escape(r), Encoding::BINARY)
+    else
+      z = Rack::Utils.unescape(Rack::Utils.escape(r))
+    end
+    r.should.equal z
+  end
+
+  should "escape correctly" do
+    Rack::Utils.escape("fo<o>bar").should.equal "fo%3Co%3Ebar"
+    Rack::Utils.escape("a space").should.equal "a+space"
+    Rack::Utils.escape("q1!2\"'w$5&7/z8)?\\").
+      should.equal "q1%212%22%27w%245%267%2Fz8%29%3F%5C"
+  end
+
+  should "escape correctly for multibyte characters" do
+    matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsumoto
+    matz_name.force_encoding("UTF-8") if matz_name.respond_to? :force_encoding
+    Rack::Utils.escape(matz_name).should.equal '%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8'
+    matz_name_sep = "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsu moto
+    matz_name_sep.force_encoding("UTF-8") if matz_name_sep.respond_to? :force_encoding
+    Rack::Utils.escape(matz_name_sep).should.equal '%E3%81%BE%E3%81%A4+%E3%82%82%E3%81%A8'
+  end
+
+  if RUBY_VERSION[/^\d+\.\d+/] == '1.8'
+    should "escape correctly for multibyte characters if $KCODE is set to 'U'" do
+      kcodeu do
+        matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsumoto
+        matz_name.force_encoding("UTF-8") if matz_name.respond_to? :force_encoding
+        Rack::Utils.escape(matz_name).should.equal '%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8'
+        matz_name_sep = "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsu moto
+        matz_name_sep.force_encoding("UTF-8") if matz_name_sep.respond_to? :force_encoding
+        Rack::Utils.escape(matz_name_sep).should.equal '%E3%81%BE%E3%81%A4+%E3%82%82%E3%81%A8'
+      end
+    end
+
+    should "unescape multibyte characters correctly if $KCODE is set to 'U'" do
+      kcodeu do
+        Rack::Utils.unescape('%E3%81%BE%E3%81%A4+%E3%82%82%E3%81%A8').should.equal(
+          "\xE3\x81\xBE\xE3\x81\xA4 \xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0])
+      end
+    end
+  end
+
+  should "escape objects that responds to to_s" do
+    kcodeu do
+      Rack::Utils.escape(:id).should.equal "id"
+    end
+  end
+
+  if "".respond_to?(:encode)
+    should "escape non-UTF8 strings" do
+      Rack::Utils.escape("ø".encode("ISO-8859-1")).should.equal "%F8"
+    end
+  end
+  
+  should "not hang on escaping long strings that end in % (http://redmine.ruby-lang.org/issues/5149)" do
+    lambda {
+      timeout(1) do
+        lambda {
+          URI.decode_www_form_component "A string that causes catastrophic backtracking as it gets longer %"
+        }.should.raise(ArgumentError)
+      end
+    }.should.not.raise(Timeout::Error)
+  end
+
+  should "escape path spaces with %20" do
+    Rack::Utils.escape_path("foo bar").should.equal  "foo%20bar"
+  end
+
+  should "unescape correctly" do
+    Rack::Utils.unescape("fo%3Co%3Ebar").should.equal "fo<o>bar"
+    Rack::Utils.unescape("a+space").should.equal "a space"
+    Rack::Utils.unescape("a%20space").should.equal "a space"
+    Rack::Utils.unescape("q1%212%22%27w%245%267%2Fz8%29%3F%5C").
+      should.equal "q1!2\"'w$5&7/z8)?\\"
+  end
+
+  should "parse query strings correctly" do
+    Rack::Utils.parse_query("foo=bar").
+      should.equal "foo" => "bar"
+    Rack::Utils.parse_query("foo=\"bar\"").
+      should.equal "foo" => "\"bar\""
+    Rack::Utils.parse_query("foo=bar&foo=quux").
+      should.equal "foo" => ["bar", "quux"]
+    Rack::Utils.parse_query("foo=1&bar=2").
+      should.equal "foo" => "1", "bar" => "2"
+    Rack::Utils.parse_query("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F").
+      should.equal "my weird field" => "q1!2\"'w$5&7/z8)?"
+    Rack::Utils.parse_query("foo%3Dbaz=bar").should.equal "foo=baz" => "bar"
+    Rack::Utils.parse_query("=").should.equal "" => ""
+    Rack::Utils.parse_query("=value").should.equal "" => "value"
+    Rack::Utils.parse_query("key=").should.equal "key" => ""
+    Rack::Utils.parse_query("&key&").should.equal "key" => nil
+    Rack::Utils.parse_query(";key;", ";,").should.equal "key" => nil
+    Rack::Utils.parse_query(",key,", ";,").should.equal "key" => nil
+    Rack::Utils.parse_query(";foo=bar,;", ";,").should.equal "foo" => "bar"
+    Rack::Utils.parse_query(",foo=bar;,", ";,").should.equal "foo" => "bar"
+  end
+
+  should "parse nested query strings correctly" do
+    Rack::Utils.parse_nested_query("foo").
+      should.equal "foo" => nil
+    Rack::Utils.parse_nested_query("foo=").
+      should.equal "foo" => ""
+    Rack::Utils.parse_nested_query("foo=bar").
+      should.equal "foo" => "bar"
+    Rack::Utils.parse_nested_query("foo=\"bar\"").
+      should.equal "foo" => "\"bar\""
+
+    Rack::Utils.parse_nested_query("foo=bar&foo=quux").
+      should.equal "foo" => "quux"
+    Rack::Utils.parse_nested_query("foo&foo=").
+      should.equal "foo" => ""
+    Rack::Utils.parse_nested_query("foo=1&bar=2").
+      should.equal "foo" => "1", "bar" => "2"
+    Rack::Utils.parse_nested_query("&foo=1&&bar=2").
+      should.equal "foo" => "1", "bar" => "2"
+    Rack::Utils.parse_nested_query("foo&bar=").
+      should.equal "foo" => nil, "bar" => ""
+    Rack::Utils.parse_nested_query("foo=bar&baz=").
+      should.equal "foo" => "bar", "baz" => ""
+    Rack::Utils.parse_nested_query("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F").
+      should.equal "my weird field" => "q1!2\"'w$5&7/z8)?"
+
+    Rack::Utils.parse_nested_query("a=b&pid%3D1234=1023").
+      should.equal "pid=1234" => "1023", "a" => "b"
+
+    Rack::Utils.parse_nested_query("foo[]").
+      should.equal "foo" => [nil]
+    Rack::Utils.parse_nested_query("foo[]=").
+      should.equal "foo" => [""]
+    Rack::Utils.parse_nested_query("foo[]=bar").
+      should.equal "foo" => ["bar"]
+
+    Rack::Utils.parse_nested_query("foo[]=1&foo[]=2").
+      should.equal "foo" => ["1", "2"]
+    Rack::Utils.parse_nested_query("foo=bar&baz[]=1&baz[]=2&baz[]=3").
+      should.equal "foo" => "bar", "baz" => ["1", "2", "3"]
+    Rack::Utils.parse_nested_query("foo[]=bar&baz[]=1&baz[]=2&baz[]=3").
+      should.equal "foo" => ["bar"], "baz" => ["1", "2", "3"]
+
+    Rack::Utils.parse_nested_query("x[y][z]=1").
+      should.equal "x" => {"y" => {"z" => "1"}}
+    Rack::Utils.parse_nested_query("x[y][z][]=1").
+      should.equal "x" => {"y" => {"z" => ["1"]}}
+    Rack::Utils.parse_nested_query("x[y][z]=1&x[y][z]=2").
+      should.equal "x" => {"y" => {"z" => "2"}}
+    Rack::Utils.parse_nested_query("x[y][z][]=1&x[y][z][]=2").
+      should.equal "x" => {"y" => {"z" => ["1", "2"]}}
+
+    Rack::Utils.parse_nested_query("x[y][][z]=1").
+      should.equal "x" => {"y" => [{"z" => "1"}]}
+    Rack::Utils.parse_nested_query("x[y][][z][]=1").
+      should.equal "x" => {"y" => [{"z" => ["1"]}]}
+    Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][w]=2").
+      should.equal "x" => {"y" => [{"z" => "1", "w" => "2"}]}
+
+    Rack::Utils.parse_nested_query("x[y][][v][w]=1").
+      should.equal "x" => {"y" => [{"v" => {"w" => "1"}}]}
+    Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][v][w]=2").
+      should.equal "x" => {"y" => [{"z" => "1", "v" => {"w" => "2"}}]}
+
+    Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][z]=2").
+      should.equal "x" => {"y" => [{"z" => "1"}, {"z" => "2"}]}
+    Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][w]=a&x[y][][z]=2&x[y][][w]=3").
+      should.equal "x" => {"y" => [{"z" => "1", "w" => "a"}, {"z" => "2", "w" => "3"}]}
+
+    lambda { Rack::Utils.parse_nested_query("x[y]=1&x[y]z=2") }.
+      should.raise(TypeError).
+      message.should.equal "expected Hash (got String) for param `y'"
+
+    lambda { Rack::Utils.parse_nested_query("x[y]=1&x[]=1") }.
+      should.raise(TypeError).
+      message.should.match(/expected Array \(got [^)]*\) for param `x'/)
+
+    lambda { Rack::Utils.parse_nested_query("x[y]=1&x[y][][w]=2") }.
+      should.raise(TypeError).
+      message.should.equal "expected Array (got String) for param `y'"
+  end
+
+  should "build query strings correctly" do
+    Rack::Utils.build_query("foo" => "bar").should.be equal_query_to("foo=bar")
+    Rack::Utils.build_query("foo" => ["bar", "quux"]).
+      should.be equal_query_to("foo=bar&foo=quux")
+    Rack::Utils.build_query("foo" => "1", "bar" => "2").
+      should.be equal_query_to("foo=1&bar=2")
+    Rack::Utils.build_query("my weird field" => "q1!2\"'w$5&7/z8)?").
+      should.be equal_query_to("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F")
+  end
+
+  should "build nested query strings correctly" do
+    Rack::Utils.build_nested_query("foo" => nil).should.equal "foo"
+    Rack::Utils.build_nested_query("foo" => "").should.equal "foo="
+    Rack::Utils.build_nested_query("foo" => "bar").should.equal "foo=bar"
+
+    Rack::Utils.build_nested_query("foo" => "1", "bar" => "2").
+      should.be equal_query_to("foo=1&bar=2")
+    Rack::Utils.build_nested_query("my weird field" => "q1!2\"'w$5&7/z8)?").
+      should.be equal_query_to("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F")
+
+    Rack::Utils.build_nested_query("foo" => [nil]).
+      should.equal "foo[]"
+    Rack::Utils.build_nested_query("foo" => [""]).
+      should.equal "foo[]="
+    Rack::Utils.build_nested_query("foo" => ["bar"]).
+      should.equal "foo[]=bar"
+
+    # The ordering of the output query string is unpredictable with 1.8's
+    # unordered hash. Test that build_nested_query performs the inverse
+    # function of parse_nested_query.
+    [{"foo" => nil, "bar" => ""},
+      {"foo" => "bar", "baz" => ""},
+      {"foo" => ["1", "2"]},
+      {"foo" => "bar", "baz" => ["1", "2", "3"]},
+      {"foo" => ["bar"], "baz" => ["1", "2", "3"]},
+      {"foo" => ["1", "2"]},
+      {"foo" => "bar", "baz" => ["1", "2", "3"]},
+      {"x" => {"y" => {"z" => "1"}}},
+      {"x" => {"y" => {"z" => ["1"]}}},
+      {"x" => {"y" => {"z" => ["1", "2"]}}},
+      {"x" => {"y" => [{"z" => "1"}]}},
+      {"x" => {"y" => [{"z" => ["1"]}]}},
+      {"x" => {"y" => [{"z" => "1", "w" => "2"}]}},
+      {"x" => {"y" => [{"v" => {"w" => "1"}}]}},
+      {"x" => {"y" => [{"z" => "1", "v" => {"w" => "2"}}]}},
+      {"x" => {"y" => [{"z" => "1"}, {"z" => "2"}]}},
+      {"x" => {"y" => [{"z" => "1", "w" => "a"}, {"z" => "2", "w" => "3"}]}}
+    ].each { |params|
+      qs = Rack::Utils.build_nested_query(params)
+      Rack::Utils.parse_nested_query(qs).should.equal params
+    }
+
+    lambda { Rack::Utils.build_nested_query("foo=bar") }.
+      should.raise(ArgumentError).
+      message.should.equal "value must be a Hash"
+  end
+
+  should "parse query strings that have a non-existent value" do
+    key = "post/2011/08/27/Deux-%22rat%C3%A9s%22-de-l-Universit"
+    Rack::Utils.parse_query(key).should.equal Rack::Utils.unescape(key) => nil
+  end
+
+  should "build query strings without = with non-existent values" do
+    key = "post/2011/08/27/Deux-%22rat%C3%A9s%22-de-l-Universit"
+    key = Rack::Utils.unescape(key)
+    Rack::Utils.build_query(key => nil).should.equal Rack::Utils.escape(key)
+  end
+
+  should "parse q-values" do
+    # XXX handle accept-extension
+    Rack::Utils.q_values("foo;q=0.5,bar,baz;q=0.9").should.equal [
+      [ 'foo', 0.5 ],
+      [ 'bar', 1.0 ],
+      [ 'baz', 0.9 ]
+    ]
+  end
+
+  should "select best quality match" do
+    Rack::Utils.best_q_match("text/html", %w[text/html]).should.equal "text/html"
+
+    # More specific matches are preferred
+    Rack::Utils.best_q_match("text/*;q=0.5,text/html;q=1.0", %w[text/html]).should.equal "text/html"
+
+    # Higher quality matches are preferred
+    Rack::Utils.best_q_match("text/*;q=0.5,text/plain;q=1.0", %w[text/plain text/html]).should.equal "text/plain"
+
+    # All else equal, the available mimes are preferred in order
+    Rack::Utils.best_q_match("text/*", %w[text/html text/plain]).should.equal "text/html"
+    Rack::Utils.best_q_match("text/plain,text/html", %w[text/html text/plain]).should.equal "text/html"
+  end
+
+  should "escape html entities [&><'\"/]" do
+    Rack::Utils.escape_html("foo").should.equal "foo"
+    Rack::Utils.escape_html("f&o").should.equal "f&o"
+    Rack::Utils.escape_html("f<o").should.equal "f<o"
+    Rack::Utils.escape_html("f>o").should.equal "f>o"
+    Rack::Utils.escape_html("f'o").should.equal "f&#x27;o"
+    Rack::Utils.escape_html('f"o').should.equal "f"o"
+    Rack::Utils.escape_html("f/o").should.equal "f&#x2F;o"
+    Rack::Utils.escape_html("<foo></foo>").should.equal "<foo><&#x2F;foo>"
+  end
+
+  should "escape html entities even on MRI when it's bugged" do
+    test_escape = lambda do
+      kcodeu do
+        Rack::Utils.escape_html("\300<").should.equal "\300<"
+      end
+    end
+
+    if RUBY_VERSION.to_f < 1.9
+      test_escape.call
+    else
+      test_escape.should.raise(ArgumentError)
+    end
+  end
+
+  if "".respond_to?(:encode)
+    should "escape html entities in unicode strings" do
+      # the following will cause warnings if the regex is poorly encoded:
+      Rack::Utils.escape_html("☃").should.equal "☃"
+    end
+  end
+
+  should "figure out which encodings are acceptable" do
+    helper = lambda do |a, b|
+      Rack::Request.new(Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => a))
+      Rack::Utils.select_best_encoding(a, b)
+    end
+
+    helper.call(%w(), [["x", 1]]).should.equal(nil)
+    helper.call(%w(identity), [["identity", 0.0]]).should.equal(nil)
+    helper.call(%w(identity), [["*", 0.0]]).should.equal(nil)
+
+    helper.call(%w(identity), [["compress", 1.0], ["gzip", 1.0]]).should.equal("identity")
+
+    helper.call(%w(compress gzip identity), [["compress", 1.0], ["gzip", 1.0]]).should.equal("compress")
+    helper.call(%w(compress gzip identity), [["compress", 0.5], ["gzip", 1.0]]).should.equal("gzip")
+
+    helper.call(%w(foo bar identity), []).should.equal("identity")
+    helper.call(%w(foo bar identity), [["*", 1.0]]).should.equal("foo")
+    helper.call(%w(foo bar identity), [["*", 1.0], ["foo", 0.9]]).should.equal("bar")
+
+    helper.call(%w(foo bar identity), [["foo", 0], ["bar", 0]]).should.equal("identity")
+    helper.call(%w(foo bar baz identity), [["*", 0], ["identity", 0.1]]).should.equal("identity")
+  end
+
+  should "return the bytesize of String" do
+    Rack::Utils.bytesize("FOO\xE2\x82\xAC").should.equal 6
+  end
+
+  should "should perform constant time string comparison" do
+    Rack::Utils.secure_compare('a', 'a').should.equal true
+    Rack::Utils.secure_compare('a', 'b').should.equal false
+  end
+
+  should "return status code for integer" do
+    Rack::Utils.status_code(200).should.equal 200
+  end
+
+  should "return status code for string" do
+    Rack::Utils.status_code("200").should.equal 200
+  end
+
+  should "return status code for symbol" do
+    Rack::Utils.status_code(:ok).should.equal 200
+  end
+
+  should "return rfc2822 format from rfc2822 helper" do
+    Rack::Utils.rfc2822(Time.at(0).gmtime).should == "Thu, 01 Jan 1970 00:00:00 -0000"
+  end
+
+  should "return rfc2109 format from rfc2109 helper" do
+    Rack::Utils.rfc2109(Time.at(0).gmtime).should == "Thu, 01-Jan-1970 00:00:00 GMT"
+  end
+end
+
+describe Rack::Utils, "byte_range" do
+  should "ignore missing or syntactically invalid byte ranges" do
+    Rack::Utils.byte_ranges({},500).should.equal nil
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "foobar"},500).should.equal nil
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "furlongs=123-456"},500).should.equal nil
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes="},500).should.equal nil
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=-"},500).should.equal nil
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=123,456"},500).should.equal nil
+    # A range of non-positive length is syntactically invalid and ignored:
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=456-123"},500).should.equal nil
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=456-455"},500).should.equal nil
+  end
+
+  should "parse simple byte ranges" do
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=123-456"},500).should.equal [(123..456)]
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=123-"},500).should.equal [(123..499)]
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=-100"},500).should.equal [(400..499)]
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=0-0"},500).should.equal [(0..0)]
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=499-499"},500).should.equal [(499..499)]
+  end
+
+  should "parse several byte ranges" do
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=500-600,601-999"},1000).should.equal [(500..600),(601..999)]
+  end
+
+  should "truncate byte ranges" do
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=123-999"},500).should.equal [(123..499)]
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=600-999"},500).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=-999"},500).should.equal [(0..499)]
+  end
+
+  should "ignore unsatisfiable byte ranges" do
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=500-501"},500).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=500-"},500).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=999-"},500).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=-0"},500).should.equal []
+  end
+
+  should "handle byte ranges of empty files" do
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=123-456"},0).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=0-"},0).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=-100"},0).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=0-0"},0).should.equal []
+    Rack::Utils.byte_ranges({"HTTP_RANGE" => "bytes=-0"},0).should.equal []
+  end
+end
+
+describe Rack::Utils::HeaderHash do
+  should "retain header case" do
+    h = Rack::Utils::HeaderHash.new("Content-MD5" => "d5ff4e2a0 ...")
+    h['ETag'] = 'Boo!'
+    h.to_hash.should.equal "Content-MD5" => "d5ff4e2a0 ...", "ETag" => 'Boo!'
+  end
+
+  should "check existence of keys case insensitively" do
+    h = Rack::Utils::HeaderHash.new("Content-MD5" => "d5ff4e2a0 ...")
+    h.should.include 'content-md5'
+    h.should.not.include 'ETag'
+  end
+
+  should "merge case-insensitively" do
+    h = Rack::Utils::HeaderHash.new("ETag" => 'HELLO', "content-length" => '123')
+    merged = h.merge("Etag" => 'WORLD', 'Content-Length' => '321', "Foo" => 'BAR')
+    merged.should.equal "Etag"=>'WORLD', "Content-Length"=>'321', "Foo"=>'BAR'
+  end
+
+  should "overwrite case insensitively and assume the new key's case" do
+    h = Rack::Utils::HeaderHash.new("Foo-Bar" => "baz")
+    h["foo-bar"] = "bizzle"
+    h["FOO-BAR"].should.equal "bizzle"
+    h.length.should.equal 1
+    h.to_hash.should.equal "foo-bar" => "bizzle"
+  end
+
+  should "be converted to real Hash" do
+    h = Rack::Utils::HeaderHash.new("foo" => "bar")
+    h.to_hash.should.be.instance_of Hash
+  end
+
+  should "convert Array values to Strings when converting to Hash" do
+    h = Rack::Utils::HeaderHash.new("foo" => ["bar", "baz"])
+    h.to_hash.should.equal({ "foo" => "bar\nbaz" })
+  end
+
+  should "replace hashes correctly" do
+    h = Rack::Utils::HeaderHash.new("Foo-Bar" => "baz")
+    j = {"foo" => "bar"}
+    h.replace(j)
+    h["foo"].should.equal "bar"
+  end
+
+  should "be able to delete the given key case-sensitively" do
+    h = Rack::Utils::HeaderHash.new("foo" => "bar")
+    h.delete("foo")
+    h["foo"].should.be.nil
+    h["FOO"].should.be.nil
+  end
+
+  should "be able to delete the given key case-insensitively" do
+    h = Rack::Utils::HeaderHash.new("foo" => "bar")
+    h.delete("FOO")
+    h["foo"].should.be.nil
+    h["FOO"].should.be.nil
+  end
+
+  should "return the deleted value when #delete is called on an existing key" do
+    h = Rack::Utils::HeaderHash.new("foo" => "bar")
+    h.delete("Foo").should.equal("bar")
+  end
+
+  should "return nil when #delete is called on a non-existant key" do
+    h = Rack::Utils::HeaderHash.new("foo" => "bar")
+    h.delete("Hello").should.be.nil
+  end
+
+  should "avoid unnecessary object creation if possible" do
+    a = Rack::Utils::HeaderHash.new("foo" => "bar")
+    b = Rack::Utils::HeaderHash.new(a)
+    b.object_id.should.equal(a.object_id)
+    b.should.equal(a)
+  end
+
+  should "convert Array values to Strings when responding to #each" do
+    h = Rack::Utils::HeaderHash.new("foo" => ["bar", "baz"])
+    h.each do |k,v|
+      k.should.equal("foo")
+      v.should.equal("bar\nbaz")
+    end
+  end
+
+  should "not create headers out of thin air" do
+    h = Rack::Utils::HeaderHash.new
+    h['foo']
+    h['foo'].should.be.nil
+    h.should.not.include 'foo'
+  end
+end
+
+describe Rack::Utils::Context do
+  class ContextTest
+    attr_reader :app
+    def initialize app; @app=app; end
+    def call env; context env; end
+    def context env, app=@app; app.call(env); end
+  end
+  test_target1 = proc{|e| e.to_s+' world' }
+  test_target2 = proc{|e| e.to_i+2 }
+  test_target3 = proc{|e| nil }
+  test_target4 = proc{|e| [200,{'Content-Type'=>'text/plain', 'Content-Length'=>'0'},['']] }
+  test_app = ContextTest.new test_target4
+
+  should "set context correctly" do
+    test_app.app.should.equal test_target4
+    c1 = Rack::Utils::Context.new(test_app, test_target1)
+    c1.for.should.equal test_app
+    c1.app.should.equal test_target1
+    c2 = Rack::Utils::Context.new(test_app, test_target2)
+    c2.for.should.equal test_app
+    c2.app.should.equal test_target2
+  end
+
+  should "alter app on recontexting" do
+    c1 = Rack::Utils::Context.new(test_app, test_target1)
+    c2 = c1.recontext(test_target2)
+    c2.for.should.equal test_app
+    c2.app.should.equal test_target2
+    c3 = c2.recontext(test_target3)
+    c3.for.should.equal test_app
+    c3.app.should.equal test_target3
+  end
+
+  should "run different apps" do
+    c1 = Rack::Utils::Context.new test_app, test_target1
+    c2 = c1.recontext test_target2
+    c3 = c2.recontext test_target3
+    c4 = c3.recontext test_target4
+    a4 = Rack::Lint.new c4
+    a5 = Rack::Lint.new test_app
+    r1 = c1.call('hello')
+    r1.should.equal 'hello world'
+    r2 = c2.call(2)
+    r2.should.equal 4
+    r3 = c3.call(:misc_symbol)
+    r3.should.be.nil
+    r4 = Rack::MockRequest.new(a4).get('/')
+    r4.status.should.equal 200
+    r5 = Rack::MockRequest.new(a5).get('/')
+    r5.status.should.equal 200
+    r4.body.should.equal r5.body
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_webrick.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_webrick.rb
new file mode 100644
index 0000000..5d64772
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/spec_webrick.rb
@@ -0,0 +1,143 @@
+require 'rack/mock'
+require File.expand_path('../testrequest', __FILE__)
+
+Thread.abort_on_exception = true
+
+describe Rack::Handler::WEBrick do
+  extend TestRequest::Helpers
+
+  @server = WEBrick::HTTPServer.new(:Host => @host='127.0.0.1',
+                                    :Port => @port=9202,
+                                    :Logger => WEBrick::Log.new(nil, WEBrick::BasicLog::WARN),
+                                    :AccessLog => [])
+  @server.mount "/test", Rack::Handler::WEBrick,
+    Rack::Lint.new(TestRequest.new)
+  Thread.new { @server.start }
+  trap(:INT) { @server.shutdown }
+
+  should "respond" do
+    lambda {
+      GET("/test")
+    }.should.not.raise
+  end
+
+  should "be a WEBrick" do
+    GET("/test")
+    status.should.equal 200
+    response["SERVER_SOFTWARE"].should =~ /WEBrick/
+    response["HTTP_VERSION"].should.equal "HTTP/1.1"
+    response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
+    response["SERVER_PORT"].should.equal "9202"
+    response["SERVER_NAME"].should.equal "127.0.0.1"
+  end
+
+  should "have rack headers" do
+    GET("/test")
+    response["rack.version"].should.equal [1,2]
+    response["rack.multithread"].should.be.true
+    response["rack.multiprocess"].should.be.false
+    response["rack.run_once"].should.be.false
+  end
+
+  should "have CGI headers on GET" do
+    GET("/test")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test"
+    response["PATH_INFO"].should.be.equal ""
+    response["QUERY_STRING"].should.equal ""
+    response["test.postdata"].should.equal ""
+
+    GET("/test/foo?quux=1")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test/foo"
+    response["PATH_INFO"].should.equal "/foo"
+    response["QUERY_STRING"].should.equal "quux=1"
+
+    GET("/test/foo%25encoding?quux=1")
+    response["REQUEST_METHOD"].should.equal "GET"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test/foo%25encoding"
+    response["PATH_INFO"].should.equal "/foo%25encoding"
+    response["QUERY_STRING"].should.equal "quux=1"
+  end
+
+  should "have CGI headers on POST" do
+    POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
+    status.should.equal 200
+    response["REQUEST_METHOD"].should.equal "POST"
+    response["SCRIPT_NAME"].should.equal "/test"
+    response["REQUEST_PATH"].should.equal "/test"
+    response["PATH_INFO"].should.equal ""
+    response["QUERY_STRING"].should.equal ""
+    response["HTTP_X_TEST_HEADER"].should.equal "42"
+    response["test.postdata"].should.equal "rack-form-data=23"
+  end
+
+  should "support HTTP auth" do
+    GET("/test", {:user => "ruth", :passwd => "secret"})
+    response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
+  end
+
+  should "set status" do
+    GET("/test?secret")
+    status.should.equal 403
+    response["rack.url_scheme"].should.equal "http"
+  end
+
+  should "correctly set cookies" do
+    @server.mount "/cookie-test", Rack::Handler::WEBrick,
+    Rack::Lint.new(lambda { |req|
+                     res = Rack::Response.new
+                     res.set_cookie "one", "1"
+                     res.set_cookie "two", "2"
+                     res.finish
+                   })
+
+    Net::HTTP.start(@host, @port) { |http|
+      res = http.get("/cookie-test")
+      res.code.to_i.should.equal 200
+      res.get_fields("set-cookie").should.equal ["one=1", "two=2"]
+    }
+  end
+
+  should "provide a .run" do
+    block_ran = false
+    catch(:done) {
+      Rack::Handler::WEBrick.run(lambda {},
+                                 {
+                                   :Host => '127.0.0.1',
+                                   :Port => 9210,
+                                   :Logger => WEBrick::Log.new(nil, WEBrick::BasicLog::WARN),
+                                   :AccessLog => []}) { |server|
+        block_ran = true
+        server.should.be.kind_of WEBrick::HTTPServer
+        @s = server
+        throw :done
+      }
+    }
+    block_ran.should.be.true
+    @s.shutdown
+  end
+
+  should "return repeated headers" do
+    @server.mount "/headers", Rack::Handler::WEBrick,
+    Rack::Lint.new(lambda { |req|
+        [
+          401,
+          { "Content-Type" => "text/plain",
+            "WWW-Authenticate" => "Bar realm=X\nBaz realm=Y" },
+          [""]
+        ]
+      })
+
+    Net::HTTP.start(@host, @port) { |http|
+      res = http.get("/headers")
+      res.code.to_i.should.equal 401
+      res["www-authenticate"].should.equal "Bar realm=X, Baz realm=Y"
+    }
+  end
+
+  @server.shutdown
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/static/another/index.html b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/static/another/index.html
new file mode 100644
index 0000000..d93e6fc
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/static/another/index.html
@@ -0,0 +1 @@
+another index!
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/static/index.html b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/static/index.html
new file mode 100644
index 0000000..fc2d9ad
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/static/index.html
@@ -0,0 +1 @@
+index!
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/testrequest.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/testrequest.rb
new file mode 100644
index 0000000..c5e339a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/testrequest.rb
@@ -0,0 +1,78 @@
+require 'yaml'
+require 'net/http'
+require 'rack/lint'
+
+class TestRequest
+  NOSERIALIZE = [Method, Proc, Rack::Lint::InputWrapper]
+
+  def call(env)
+    status = env["QUERY_STRING"] =~ /secret/ ? 403 : 200
+    env["test.postdata"] = env["rack.input"].read
+    minienv = env.dup
+    # This may in the future want to replace with a dummy value instead.
+    minienv.delete_if { |k,v| NOSERIALIZE.any? { |c| v.kind_of?(c) } }
+    body = minienv.to_yaml
+    size = body.respond_to?(:bytesize) ? body.bytesize : body.size
+    [status, {"Content-Type" => "text/yaml", "Content-Length" => size.to_s}, [body]]
+  end
+
+  module Helpers
+    attr_reader :status, :response
+
+    ROOT = File.expand_path(File.dirname(__FILE__) + "/..")
+    ENV["RUBYOPT"] = "-I#{ROOT}/lib -rubygems"
+
+    def root
+      ROOT
+    end
+
+    def rackup
+      "#{ROOT}/bin/rackup"
+    end
+
+    def GET(path, header={})
+      Net::HTTP.start(@host, @port) { |http|
+        user = header.delete(:user)
+        passwd = header.delete(:passwd)
+
+        get = Net::HTTP::Get.new(path, header)
+        get.basic_auth user, passwd  if user && passwd
+        http.request(get) { |response|
+          @status = response.code.to_i
+          begin
+            @response = YAML.load(response.body)
+          rescue TypeError, ArgumentError
+            @response = nil
+          end
+        }
+      }
+    end
+
+    def POST(path, formdata={}, header={})
+      Net::HTTP.start(@host, @port) { |http|
+        user = header.delete(:user)
+        passwd = header.delete(:passwd)
+
+        post = Net::HTTP::Post.new(path, header)
+        post.form_data = formdata
+        post.basic_auth user, passwd  if user && passwd
+        http.request(post) { |response|
+          @status = response.code.to_i
+          @response = YAML.load(response.body)
+        }
+      }
+    end
+  end
+end
+
+class StreamingRequest
+  def self.call(env)
+    [200, {"Content-Type" => "text/plain"}, new]
+  end
+
+  def each
+    yield "hello there!\n"
+    sleep 5
+    yield "that is all.\n"
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/unregistered_handler/rack/handler/unregistered.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/unregistered_handler/rack/handler/unregistered.rb
new file mode 100644
index 0000000..6dd9436
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/unregistered_handler/rack/handler/unregistered.rb
@@ -0,0 +1,7 @@
+module Rack
+  module Handler
+    # this class doesn't do anything, we're just seeing if we get it.
+    class Unregistered
+    end
+  end
+end
\ No newline at end of file
diff --git a/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/unregistered_handler/rack/handler/unregistered_long_one.rb b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/unregistered_handler/rack/handler/unregistered_long_one.rb
new file mode 100644
index 0000000..1920685
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/rack-1.5.2/test/unregistered_handler/rack/handler/unregistered_long_one.rb
@@ -0,0 +1,7 @@
+module Rack
+  module Handler
+    # this class doesn't do anything, we're just seeing if we get it.
+    class UnregisteredLongOne
+    end
+  end
+end
\ No newline at end of file
diff --git a/vendor/rdtool-0.6.38/COPYING.txt b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/COPYING.txt
similarity index 100%
rename from vendor/rdtool-0.6.38/COPYING.txt
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/COPYING.txt
diff --git a/vendor/rdtool-0.6.38/Gemfile b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/Gemfile
similarity index 100%
rename from vendor/rdtool-0.6.38/Gemfile
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/Gemfile
diff --git a/vendor/rdtool-0.6.38/HISTORY b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/HISTORY
similarity index 100%
rename from vendor/rdtool-0.6.38/HISTORY
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/HISTORY
diff --git a/vendor/rdtool-0.6.38/LGPL-2.1 b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/LGPL-2.1
similarity index 100%
rename from vendor/rdtool-0.6.38/LGPL-2.1
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/LGPL-2.1
diff --git a/vendor/rdtool-0.6.38/LICENSE.txt b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/LICENSE.txt
similarity index 100%
rename from vendor/rdtool-0.6.38/LICENSE.txt
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/LICENSE.txt
diff --git a/vendor/rdtool-0.6.38/README.html b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/README.html
similarity index 100%
rename from vendor/rdtool-0.6.38/README.html
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/README.html
diff --git a/vendor/rdtool-0.6.38/README.ja.html b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/README.ja.html
similarity index 100%
rename from vendor/rdtool-0.6.38/README.ja.html
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/README.ja.html
diff --git a/vendor/rdtool-0.6.38/README.rd b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/README.rd
similarity index 100%
rename from vendor/rdtool-0.6.38/README.rd
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/README.rd
diff --git a/vendor/rdtool-0.6.38/README.rd.ja b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/README.rd.ja
similarity index 100%
rename from vendor/rdtool-0.6.38/README.rd.ja
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/README.rd.ja
diff --git a/vendor/rdtool-0.6.38/Rakefile b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/Rakefile
similarity index 100%
rename from vendor/rdtool-0.6.38/Rakefile
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/Rakefile
diff --git a/vendor/rdtool-0.6.38/TODO b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/TODO
similarity index 100%
rename from vendor/rdtool-0.6.38/TODO
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/TODO
diff --git a/vendor/rdtool-0.6.38/bin/rd2 b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/bin/rd2
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/bin/rd2
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/bin/rd2
diff --git a/vendor/rdtool-0.6.38/bin/rdswap.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/bin/rdswap.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/bin/rdswap.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/bin/rdswap.rb
diff --git a/vendor/rdtool-0.6.38/doc/rd-draft.html b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/doc/rd-draft.html
similarity index 100%
rename from vendor/rdtool-0.6.38/doc/rd-draft.html
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/doc/rd-draft.html
diff --git a/vendor/rdtool-0.6.38/doc/rd-draft.ja.html b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/doc/rd-draft.ja.html
similarity index 100%
rename from vendor/rdtool-0.6.38/doc/rd-draft.ja.html
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/doc/rd-draft.ja.html
diff --git a/vendor/rdtool-0.6.38/doc/rd-draft.rd b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/doc/rd-draft.rd
similarity index 100%
rename from vendor/rdtool-0.6.38/doc/rd-draft.rd
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/doc/rd-draft.rd
diff --git a/vendor/rdtool-0.6.38/doc/rd-draft.rd.ja b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/doc/rd-draft.rd.ja
similarity index 100%
rename from vendor/rdtool-0.6.38/doc/rd-draft.rd.ja
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/doc/rd-draft.rd.ja
diff --git a/vendor/rdtool-0.6.38/lib/rd/block-element.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/block-element.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/block-element.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/block-element.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/complex-list-item.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/complex-list-item.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/complex-list-item.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/complex-list-item.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/desclist.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/desclist.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/desclist.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/desclist.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/document-struct.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/document-struct.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/document-struct.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/document-struct.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/dot.rd2rc b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/dot.rd2rc
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/dot.rd2rc
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/dot.rd2rc
diff --git a/vendor/rdtool-0.6.38/lib/rd/element.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/element.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/element.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/element.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/filter.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/filter.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/filter.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/filter.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/head-filter.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/head-filter.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/head-filter.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/head-filter.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/inline-element.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/inline-element.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/inline-element.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/inline-element.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/labeled-element.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/labeled-element.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/labeled-element.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/labeled-element.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/list.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/list.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/list.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/list.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/loose-struct.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/loose-struct.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/loose-struct.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/loose-struct.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/methodlist.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/methodlist.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/methodlist.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/methodlist.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/output-format-visitor.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/output-format-visitor.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/output-format-visitor.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/output-format-visitor.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/package.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/package.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/package.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/package.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/parser-util.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/parser-util.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/parser-util.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/parser-util.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/post-install b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/post-install
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/post-install
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/post-install
diff --git a/vendor/rdtool-0.6.38/lib/rd/pre-setup.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/pre-setup.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/pre-setup.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/pre-setup.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rbl-file.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rbl-file.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rbl-file.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rbl-file.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rbl-suite.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rbl-suite.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rbl-suite.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rbl-suite.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd-struct.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd-struct.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rd-struct.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd-struct.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2html-ext-lib.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2html-ext-opt.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2html-lib.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2html-lib.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rd2html-lib.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2html-lib.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2html-opt.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2html-opt.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rd2html-opt.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2html-opt.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2man-lib.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2man-lib.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rd2man-lib.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2man-lib.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2rdo-lib.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rd2rmi-lib.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rdblockparser.ry b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rdblockparser.ry
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rdblockparser.ry
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rdblockparser.ry
diff --git a/vendor/rdtool-0.6.38/lib/rd/rdblockparser.tab.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rdblockparser.tab.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rdblockparser.tab.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rdblockparser.tab.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rdfmt.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rdfmt.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rdfmt.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rdfmt.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rdinlineparser.ry b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rdinlineparser.ry
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rdinlineparser.ry
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rdinlineparser.ry
diff --git a/vendor/rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rdinlineparser.tab.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/rdvisitor.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rdvisitor.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/rdvisitor.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/rdvisitor.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/reference-resolver.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/reference-resolver.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/reference-resolver.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/reference-resolver.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/search-file.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/search-file.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/search-file.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/search-file.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/tree.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/tree.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/tree.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/tree.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/version.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/version.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/version.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/version.rb
diff --git a/vendor/rdtool-0.6.38/lib/rd/visitor.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/visitor.rb
similarity index 100%
rename from vendor/rdtool-0.6.38/lib/rd/visitor.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/lib/rd/visitor.rb
diff --git a/vendor/rdtool-0.6.38/rdtool.gemspec b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/rdtool.gemspec
similarity index 100%
rename from vendor/rdtool-0.6.38/rdtool.gemspec
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/rdtool.gemspec
diff --git a/vendor/rdtool-0.6.38/setup.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/setup.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/setup.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/setup.rb
diff --git a/vendor/rdtool-0.6.38/test/data/includee1.html b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/includee1.html
similarity index 100%
rename from vendor/rdtool-0.6.38/test/data/includee1.html
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/includee1.html
diff --git a/vendor/rdtool-0.6.38/test/data/includee2.html b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/includee2.html
similarity index 100%
rename from vendor/rdtool-0.6.38/test/data/includee2.html
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/includee2.html
diff --git a/vendor/rdtool-0.6.38/test/data/includee3.nothtml b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/includee3.nothtml
similarity index 100%
rename from vendor/rdtool-0.6.38/test/data/includee3.nothtml
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/includee3.nothtml
diff --git a/public/javascripts/.gitkeep b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/includee4.xhtml
similarity index 100%
rename from public/javascripts/.gitkeep
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/includee4.xhtml
diff --git a/vendor/rdtool-0.6.38/test/data/label.rbl b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/label.rbl
similarity index 100%
rename from vendor/rdtool-0.6.38/test/data/label.rbl
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/label.rbl
diff --git a/vendor/rdtool-0.6.38/test/data/label2.rbl b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/label2.rbl
similarity index 100%
rename from vendor/rdtool-0.6.38/test/data/label2.rbl
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/label2.rbl
diff --git a/vendor/rdtool-0.6.38/test/data/sub/includee2.html b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/sub/includee2.html
similarity index 100%
rename from vendor/rdtool-0.6.38/test/data/sub/includee2.html
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/sub/includee2.html
diff --git a/public/stylesheets/.gitkeep b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/sub/includee4.html
similarity index 100%
rename from public/stylesheets/.gitkeep
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/data/sub/includee4.html
diff --git a/vendor/rdtool-0.6.38/test/dummy-observer.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/dummy-observer.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/dummy-observer.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/dummy-observer.rb
diff --git a/vendor/rdtool-0.6.38/test/dummy.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/dummy.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/dummy.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/dummy.rb
diff --git a/vendor/rdtool-0.6.38/test/temp-dir.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/temp-dir.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/temp-dir.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/temp-dir.rb
diff --git a/vendor/rdtool-0.6.38/test/test-block-parser.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-block-parser.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-block-parser.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-block-parser.rb
diff --git a/vendor/rdtool-0.6.38/test/test-desclist-item.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-desclist-item.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-desclist-item.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-desclist-item.rb
diff --git a/vendor/rdtool-0.6.38/test/test-document-element.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-document-element.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-document-element.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-document-element.rb
diff --git a/vendor/rdtool-0.6.38/test/test-document-struct.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-document-struct.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-document-struct.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-document-struct.rb
diff --git a/vendor/rdtool-0.6.38/test/test-element.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-element.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-element.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-element.rb
diff --git a/vendor/rdtool-0.6.38/test/test-headline.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-headline.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-headline.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-headline.rb
diff --git a/vendor/rdtool-0.6.38/test/test-inline-parser.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-inline-parser.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-inline-parser.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-inline-parser.rb
diff --git a/vendor/rdtool-0.6.38/test/test-list-item.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-list-item.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-list-item.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-list-item.rb
diff --git a/vendor/rdtool-0.6.38/test/test-list.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-list.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-list.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-list.rb
diff --git a/vendor/rdtool-0.6.38/test/test-methodlist-item.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-methodlist-item.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-methodlist-item.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-methodlist-item.rb
diff --git a/vendor/rdtool-0.6.38/test/test-nonterminal-element.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-nonterminal-element.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-nonterminal-element.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-nonterminal-element.rb
diff --git a/vendor/rdtool-0.6.38/test/test-nonterminal-inline.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-nonterminal-inline.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-nonterminal-inline.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-nonterminal-inline.rb
diff --git a/vendor/rdtool-0.6.38/test/test-output-format-visitor.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-output-format-visitor.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-output-format-visitor.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-output-format-visitor.rb
diff --git a/vendor/rdtool-0.6.38/test/test-parser-util.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-parser-util.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-parser-util.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-parser-util.rb
diff --git a/vendor/rdtool-0.6.38/test/test-rbl-file.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-rbl-file.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-rbl-file.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-rbl-file.rb
diff --git a/vendor/rdtool-0.6.38/test/test-rbl-suite.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-rbl-suite.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-rbl-suite.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-rbl-suite.rb
diff --git a/vendor/rdtool-0.6.38/test/test-rd2html-lib.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-rd2html-lib.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-rd2html-lib.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-rd2html-lib.rb
diff --git a/vendor/rdtool-0.6.38/test/test-rdtree.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-rdtree.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-rdtree.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-rdtree.rb
diff --git a/vendor/rdtool-0.6.38/test/test-rdvisitor.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-rdvisitor.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-rdvisitor.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-rdvisitor.rb
diff --git a/vendor/rdtool-0.6.38/test/test-reference-resolver.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-reference-resolver.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-reference-resolver.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-reference-resolver.rb
diff --git a/vendor/rdtool-0.6.38/test/test-reference.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-reference.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-reference.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-reference.rb
diff --git a/vendor/rdtool-0.6.38/test/test-search-file.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-search-file.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-search-file.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-search-file.rb
diff --git a/vendor/rdtool-0.6.38/test/test-terminal-inline.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-terminal-inline.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-terminal-inline.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-terminal-inline.rb
diff --git a/vendor/rdtool-0.6.38/test/test-textblock.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-textblock.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-textblock.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-textblock.rb
diff --git a/vendor/rdtool-0.6.38/test/test-tree.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-tree.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-tree.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-tree.rb
diff --git a/vendor/rdtool-0.6.38/test/test-version.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-version.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-version.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-version.rb
diff --git a/vendor/rdtool-0.6.38/test/test-visitor.rb b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-visitor.rb
old mode 100644
new mode 100755
similarity index 100%
rename from vendor/rdtool-0.6.38/test/test-visitor.rb
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/test/test-visitor.rb
diff --git a/vendor/rdtool-0.6.38/utils/rd-mode.el b/.bundle/ruby/2.0.0/gems/rdtool-0.6.38/utils/rd-mode.el
similarity index 100%
rename from vendor/rdtool-0.6.38/utils/rd-mode.el
rename to .bundle/ruby/2.0.0/gems/rdtool-0.6.38/utils/rd-mode.el
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/LICENSE b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/LICENSE
new file mode 100644
index 0000000..7476999
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/LICENSE
@@ -0,0 +1,21 @@
+Copyright (c) 2011 Sam Stephenson
+Copyright (c) 2011 Joshua Peek
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/README.md b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/README.md
new file mode 100644
index 0000000..55ac933
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/README.md
@@ -0,0 +1,507 @@
+# Sprockets: Rack-based asset packaging
+
+Sprockets is a Ruby library for compiling and serving web assets.
+It features declarative dependency management for JavaScript and CSS
+assets, as well as a powerful preprocessor pipeline that allows you to
+write assets in languages like CoffeeScript, Sass, SCSS and LESS.
+
+# Installation #
+
+Install Sprockets from RubyGems:
+
+    $ gem install sprockets
+
+Or include it in your project's `Gemfile` with Bundler:
+
+    gem 'sprockets', '~> 2.0'
+
+# Understanding the Sprockets Environment #
+
+You'll need an instance of the `Sprockets::Environment` class to
+access and serve assets from your application. Under Rails 3.1 and
+later, `YourApp::Application.assets` is a preconfigured
+`Sprockets::Environment` instance. For Rack-based applications, create
+an instance in `config.ru`.
+
+The Sprockets `Environment` has methods for retrieving and serving
+assets, manipulating the load path, and registering processors. It is
+also a Rack application that can be mounted at a URL to serve assets
+over HTTP.
+
+## The Load Path ##
+
+The *load path* is an ordered list of directories that Sprockets uses
+to search for assets.
+
+In the simplest case, a Sprockets environment's load path will consist
+of a single directory containing your application's asset source
+files. When mounted, the environment will serve assets from this
+directory as if they were static files in your public root.
+
+The power of the load path is that it lets you organize your source
+files into multiple directories -- even directories that live outside
+your application -- and combine those directories into a single
+virtual filesystem. That means you can easily bundle JavaScript, CSS
+and images into a Ruby library and import them into your application.
+
+### Manipulating the Load Path ###
+
+To add a directory to your environment's load path, use the
+`append_path` and `prepend_path` methods. Directories at the beginning
+of the load path have precedence over subsequent directories.
+
+    environment = Sprockets::Environment.new
+    environment.append_path 'app/assets/javascripts'
+    environment.append_path 'lib/assets/javascripts'
+    environment.append_path 'vendor/assets/jquery'
+
+In general, you should append to the path by default and reserve
+prepending for cases where you need to override existing assets.
+
+## Accessing Assets ##
+
+Once you've set up your environment's load path, you can mount the
+environment as a Rack server and request assets via HTTP. You can also
+access assets programmatically from within your application.
+
+### Logical Paths ###
+
+Assets in Sprockets are always referenced by their *logical path*.
+
+The logical path is the path of the asset source file relative to its
+containing directory in the load path. For example, if your load path
+contains the directory `app/assets/javascripts`:
+
+<table>
+  <tr>
+    <th>Asset source file</th>
+    <th>Logical path</th>
+  </tr>
+  <tr>
+    <td>app/assets/javascripts/application.js</td>
+    <td>application.js</td>
+  </tr>
+  <tr>
+    <td>app/assets/javascripts/models/project.js</td>
+    <td>models/project.js</td>
+  </tr>
+</table>
+
+In this way, all directories in the load path are merged to create a
+virtual filesystem whose entries are logical paths.
+
+### Serving Assets Over HTTP ###
+
+When you mount an environment, all of its assets are accessible as
+logical paths underneath the *mount point*. For example, if you mount
+your environment at `/assets` and request the URL
+`/assets/application.js`, Sprockets will search your load path for the
+file named `application.js` and serve it.
+
+Under Rails 3.1 and later, your Sprockets environment is automatically
+mounted at `/assets`. If you are using Sprockets with a Rack
+application, you will need to mount the environment yourself. A good
+way to do this is with the `map` method in `config.ru`:
+
+    require 'sprockets'
+    map '/assets' do
+      environment = Sprockets::Environment.new
+      environment.append_path 'app/assets/javascripts'
+      environment.append_path 'app/assets/stylesheets'
+      run environment
+    end
+
+    map '/' do
+      run YourRackApp
+    end
+
+### Accessing Assets Programmatically ###
+
+You can use the `find_asset` method (aliased as `[]`) to retrieve an
+asset from a Sprockets environment. Pass it a logical path and you'll
+get a `Sprockets::BundledAsset` instance back:
+
+    environment['application.js']
+    # => #<Sprockets::BundledAsset ...>
+
+Call `to_s` on the resulting asset to access its contents, `length` to
+get its length in bytes, `mtime` to query its last-modified time, and
+`pathname` to get its full path on the filesystem.
+
+# Using Engines #
+
+Asset source files can be written in another language, like SCSS or
+CoffeeScript, and automatically compiled to CSS or JavaScript by
+Sprockets. Compilers for these languages are called *engines*.
+
+Engines are specified by additional extensions on the asset source
+filename. For example, a CSS file written in SCSS might have the name
+`layout.css.scss`, while a JavaScript file written in CoffeeScript
+might have the name `dialog.js.coffee`.
+
+## Styling with Sass and SCSS ##
+
+[Sass](http://sass-lang.com/) is a language that compiles to CSS and
+adds features like nested rules, variables, mixins and selector
+inheritance.
+
+If the `sass` gem is available to your application, you can use Sass
+to write CSS assets in Sprockets.
+
+Sprockets supports both Sass syntaxes. For the original
+whitespace-sensitive syntax, use the extension `.css.sass`. For the
+new SCSS syntax, use the extension `.css.scss`.
+
+## Styling with LESS ##
+
+[LESS](http://lesscss.org/) extends CSS with dynamic behavior such as
+variables, mixins, operations and functions.
+
+If the `less` gem is available to your application, you can use LESS
+to write CSS assets in Sprockets. Note that the LESS compiler is
+written in JavaScript and the `less` gem (on MRI) uses `therubyracer`
+which embeds the V8 JavaScript runtime in Ruby, while on JRuby you're
+going to need `therubyrhino` gem installed.
+
+To write CSS assets with LESS, use the extension `.css.less`.
+
+## Scripting with CoffeeScript ##
+
+[CoffeeScript](http://jashkenas.github.com/coffee-script/) is a
+language that compiles to the "good parts" of JavaScript, featuring a
+cleaner syntax with array comprehensions, classes, and function
+binding.
+
+If the `coffee-script` gem is available to your application, you can
+use CoffeeScript to write JavaScript assets in Sprockets. Note that
+the CoffeeScript compiler is written in JavaScript, and you will need
+an [ExecJS](https://github.com/sstephenson/execjs)-supported runtime
+on your system to invoke it.
+
+To write JavaScript assets with CoffeeScript, use the extension
+`.js.coffee`.
+
+## JavaScript Templating with EJS and Eco ##
+
+Sprockets supports *JavaScript templates* for client-side rendering of
+strings or markup. JavaScript templates have the special format
+extension `.jst` and are compiled to JavaScript functions.
+
+When loaded, a JavaScript template function can be accessed by its
+logical path as a property on the global `JST` object. Invoke a
+template function to render the template as a string. The resulting
+string can then be inserted into the DOM.
+
+    <!-- templates/hello.jst.ejs -->
+    <div>Hello, <span><%= name %></span>!</div>
+
+    // application.js
+    //= require templates/hello
+    $("#hello").html(JST["templates/hello"]({ name: "Sam" }));
+
+Sprockets supports two JavaScript template languages:
+[EJS](https://github.com/sstephenson/ruby-ejs), for embedded
+JavaScript, and [Eco](https://github.com/sstephenson/ruby-eco), for
+embedded CoffeeScript. Both languages use the familiar `<% … %>`
+syntax for embedding logic in templates.
+
+If the `ejs` gem is available to your application, you can use EJS
+templates in Sprockets. EJS templates have the extension `.jst.ejs`.
+
+If the `eco` gem is available to your application, you can use [Eco
+templates](https://github.com/sstephenson/eco) in Sprockets. Eco
+templates have the extension `.jst.eco`. Note that the `eco` gem
+depends on the CoffeeScript compiler, so the same caveats apply as
+outlined above for the CoffeeScript engine.
+
+## Invoking Ruby with ERB ##
+
+Sprockets provides an ERB engine for preprocessing assets using
+embedded Ruby code. Append `.erb` to a CSS or JavaScript asset's
+filename to enable the ERB engine.
+
+**Note**: Sprockets processes multiple engine extensions in order from
+  right to left, so you can use multiple engines with a single
+  asset. For example, to have a CoffeeScript asset that is first
+  preprocessed with ERB, use the extension `.js.coffee.erb`.
+
+Ruby code embedded in an asset is evaluated in the context of a
+`Sprockets::Context` instance for the given asset. Common uses for ERB
+include:
+
+- embedding another asset as a Base64-encoded `data:` URI with the
+  `asset_data_uri` helper
+- inserting the URL to another asset, such as with the `asset_path`
+  helper provided by the Sprockets Rails plugin
+- embedding other application resources, such as a localized string
+  database, in a JavaScript asset via JSON
+- embedding version constants loaded from another file
+
+See the [Helper Methods](#FIXME) section for more information about
+interacting with `Sprockets::Context` instances via ERB.
+
+### String Interpolation Syntax ###
+
+If you need access to Ruby from an asset but cannot use ERB's `<% …
+%>` syntax, Sprockets also supports Ruby string interpolation syntax
+(`#{ … }`) with the `.str` engine extension.
+
+# Managing and Bundling Dependencies #
+
+You can create *asset bundles* -- ordered concatenations of asset
+source files -- by specifying dependencies in a special comment syntax
+at the top of each source file.
+
+Sprockets reads these comments, called *directives*, and processes
+them to recursively build a dependency graph. When you request an
+asset with dependencies, the dependencies will be included in order at
+the top of the file.
+
+## The Directive Processor ##
+
+Sprockets runs the *directive processor* on each CSS and JavaScript
+source file. The directive processor scans for comment lines beginning
+with `=` in comment blocks at the top of the file.
+
+    //= require jquery
+    //= require jquery-ui
+    //= require backbone
+    //= require_tree .
+
+The first word immediately following `=` specifies the directive
+name. Any words following the directive name are treated as
+arguments. Arguments may be placed in single or double quotes if they
+contain spaces, similar to commands in the Unix shell.
+
+**Note**: Non-directive comment lines will be preserved in the final
+  asset, but directive comments are stripped after
+  processing. Sprockets will not look for directives in comment blocks
+  that occur after the first line of code.
+
+### Supported Comment Types ###
+
+The directive processor understands comment blocks in three formats:
+
+    /* Multi-line comment blocks (CSS, SCSS, JavaScript)
+     *= require foo
+     */
+
+    // Single-line comment blocks (SCSS, JavaScript)
+    //= require foo
+
+    # Single-line comment blocks (CoffeeScript)
+    #= require foo
+
+## Sprockets Directives ##
+
+You can use the following directives to declare dependencies in asset
+source files.
+
+For directives that take a *path* argument, you may specify either a
+logical path or a relative path. Relative paths begin with `./` and
+reference files relative to the location of the current file.
+
+### The `require` Directive ###
+
+`require` *path* inserts the contents of the asset source file
+specified by *path*. If the file is required multiple times, it will
+appear in the bundle only once.
+
+### The `include` Directive ###
+
+`include` *path* works like `require`, but inserts the contents of the
+specified source file even if it has already been included or
+required.
+
+### The `require_directory` Directive ###
+
+`require_directory` *path* requires all source files of the same
+format in the directory specified by *path*. Files are required in
+alphabetical order.
+
+### The `require_tree` Directive ###
+
+`require_tree` *path* works like `require_directory`, but operates
+recursively to require all files in all subdirectories of the
+directory specified by *path*.
+
+### The `require_self` Directive ###
+
+`require_self` tells Sprockets to insert the body of the current
+source file before any subsequent `require` or `include` directives.
+
+### The `depend_on` Directive ###
+
+`depend_on` *path* declares a dependency on the given *path* without
+including it in the bundle. This is useful when you need to expire an
+asset's cache in response to a change in another file.
+
+### The `stub` Directive ###
+
+`stub` *path* allows dependency to be excluded from the asset bundle.
+The *path* must be a valid asset and may or may not already be part
+of the bundle. Once stubbed, it is blacklisted and can't be brought
+back by any other `require`.
+
+# Development #
+
+## Contributing ##
+
+The Sprockets source code is [hosted on
+GitHub](https://github.com/sstephenson/sprockets). You can check out a
+copy of the latest code using Git:
+
+    $ git clone https://github.com/sstephenson/sprockets.git
+
+If you've found a bug or have a question, please open an issue on the
+[Sprockets issue
+tracker](https://github.com/sstephenson/sprockets/issues). Or, clone
+the Sprockets repository, write a failing test case, fix the bug and
+submit a pull request.
+
+## Version History ##
+
+**2.10.0** (May 24, 2013)
+
+* Support for `bower.json`
+
+**2.9.3** (April 20, 2013)
+
+* Fixed sass caching bug
+
+**2.9.2** (April 8, 2013)
+
+* Improve file freshness check performance
+* Directive processor encoding fixes
+
+**2.9.1** (April 6, 2013)
+
+* Support for Uglifier 2.x
+
+**2.9.0** (February 25, 2013)
+
+* Write out gzipped variants of bundled assets.
+
+**2.8.2** (December 10, 2012)
+
+* Fixed top level Sass constant references
+* Fixed manifest logger when environment is disabled
+
+**2.8.1** (October 31, 2012)
+
+* Fixed Sass importer bug
+
+**2.8.0** (October 16, 2012)
+
+* Allow manifest location to be seperated from output directory
+* Pass logical path and absolute path to each_logical_path iterator
+
+**2.7.0** (October 10, 2012)
+
+* Added --css-compressor and --js-compressor command line flags
+* Added css/js compressor shorthand
+* Change default manifest.json filename to be a randomized manifest-16HEXBYTES.json
+* Allow nil environment to be passed to manifest
+* Allow manifest instance to be set on rake task
+
+**2.6.0** (September 19, 2012)
+
+* Added bower component.json require support
+
+**2.5.0** (September 4, 2012)
+
+* Fixed Ruby 2.0 RegExp warning
+* Provide stubbed implementation of context *_path helpers
+* Add SassCompressor
+
+**2.4.5** (July 10, 2012)
+
+* Tweaked some logger levels
+
+**2.4.4** (July 2, 2012)
+
+* Canonicalize logical path extensions
+* Check absolute paths passed to depend_on
+
+**2.4.3** (May 16, 2012)
+
+* Exposed :sprockets in sass options
+* Include dependency paths in asset mtime
+
+**2.4.2** (May 7, 2012)
+
+* Fixed MultiJson feature detect
+
+**2.4.1** (April 26, 2012)
+
+* Fixed MultiJson API change
+* Fixed gzip mtime
+
+**2.4.0** (March 27, 2012)
+
+* Added global path registry
+* Added global processor registry
+
+**2.3.2** (March 26, 2012)
+
+* Fix Context#logical_path with dots
+
+**2.3.1** (February 11, 2012)
+
+* Added bytesize to manifest
+* Added Asset#bytesize alias
+* Security: Check path for forbidden access after unescaping
+
+**2.3.0** (January 16, 2012)
+
+* Added special Sass importer that automatically tracks any `@import`ed files.
+
+**2.2.0** (January 10, 2012)
+
+* Added `sprockets` command line utility.
+* Added rake/sprocketstask.
+* Added json manifest log of compiled assets.
+* Added `stub` directive that allows you to exclude files from the bundle.
+* Added per environment external encoding (Environment#default_external_encoding). Defaults to UTF-8. Fixes issues where LANG is not set correctly and Rubys default external is set to ASCII.
+
+**2.1.2** (November 20, 2011)
+
+* Disabled If-Modified-Since server checks. Fixes some browser caching issues when serving the asset body only. If-None-Match caching is sufficent.
+
+**2.1.1** (November 18, 2011)
+
+* Fix windows absolute path check bug.
+
+**2.1.0** (November 11, 2011)
+
+* Directive comment lines are now turned into empty lines instead of removed. This way line numbers in
+  CoffeeScript syntax errors are correct.
+* Performance and caching bug fixes.
+
+**2.0.3** (October 17, 2011)
+
+* Detect format extensions from right to left.
+* Make JST namespace configurable.
+
+**2.0.2** (October 4, 2011)
+
+* Fixed loading stale cache from bundler gems.
+
+**2.0.1** (September 30, 2011)
+
+* Fixed bug with fingerprinting file names with multiple dots.
+* Decode URIs as default internal.
+* Fix symlinked asset directories.
+
+**2.0.0** (August 29, 2011)
+
+* Initial public release.
+
+# License #
+
+Copyright © 2011 Sam Stephenson <<sstephenson at gmail.com>>
+
+Copyright © 2011 Joshua Peek <<josh at joshpeek.com>>
+
+Sprockets is distributed under an MIT-style license. See LICENSE for
+details.
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/bin/sprockets b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/bin/sprockets
new file mode 100755
index 0000000..a3fb651
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/bin/sprockets
@@ -0,0 +1,88 @@
+#!/usr/bin/env ruby
+
+require 'sprockets'
+require 'optparse'
+require 'shellwords'
+
+unless ARGV.delete("--noenv")
+  if File.exist?(path = "./.sprocketsrc")
+    rcflags = Shellwords.split(File.read(path))
+    ARGV.unshift(*rcflags)
+  end
+end
+
+filenames = []
+environment = Sprockets::Environment.new(Dir.pwd)
+manifest = nil
+
+(ENV['SPROCKETS_PATH'] || "").split(File::PATH_SEPARATOR).each do |path|
+  environment.append_path path
+end
+
+OptionParser.new do |opts|
+  opts.summary_width = 28
+  opts.banner = "Usage: sprockets [options] filename [filename ...]"
+
+  def opts.show_usage
+    puts self
+    exit 1
+  end
+
+  opts.on("-r", "--require LIBRARY", "Require the LIBRARY before doing anything") do |lib|
+    require lib
+  end
+
+  opts.on("-I DIRECTORY", "--include=DIRECTORY", "Adds the directory to the Sprockets load path") do |directory|
+    environment.append_path directory
+  end
+
+  opts.on("-o DIRECTORY", "--output=DIRECTORY", "Copy provided assets into DIRECTORY") do |directory|
+    manifest = Sprockets::Manifest.new(environment, directory)
+  end
+
+  opts.on("--css-compressor=COMPRESSOR", "Use CSS compressor") do |compressor|
+    environment.css_compressor = compressor.to_sym
+  end
+
+  opts.on("--js-compressor=COMPRESSOR", "Use JavaScript compressor") do |compressor|
+    environment.js_compressor = compressor.to_sym
+  end
+
+  opts.on("--noenv", "Disables .sprocketsrc file") do
+  end
+
+  opts.on_tail("-h", "--help", "Shows this help message") do
+    opts.show_usage
+  end
+
+  opts.on_tail("-v", "--version", "Shows version") do
+    puts Sprockets::VERSION
+    exit
+  end
+
+  opts.show_usage if ARGV.empty?
+
+  begin
+    opts.order(ARGV) do |filename|
+      filenames << File.expand_path(filename)
+    end
+  rescue OptionParser::ParseError => e
+    opts.warn e.message
+    opts.show_usage
+  end
+end
+
+if environment.paths.empty?
+  warn "No load paths given"
+  warn "Usage: sprockets -Ijavascripts/ filename"
+  exit 1
+end
+
+if manifest
+  manifest.compile(filenames)
+elsif filenames.length == 1
+  puts environment.find_asset(filenames.first).to_s
+else
+  warn "Only one file can be compiled to stdout at a time"
+  exit 1
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/rake/sprocketstask.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/rake/sprocketstask.rb
new file mode 100644
index 0000000..7fb9c91
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/rake/sprocketstask.rb
@@ -0,0 +1,151 @@
+require 'rake'
+require 'rake/tasklib'
+
+require 'sprockets'
+require 'logger'
+
+module Rake
+  # Simple Sprockets compilation Rake task macro.
+  #
+  #   Rake::SprocketsTask.new do |t|
+  #     t.environment = Sprockets::Environment.new
+  #     t.output      = "./public/assets"
+  #     t.assets      = %w( application.js application.css )
+  #   end
+  #
+  class SprocketsTask < Rake::TaskLib
+    # Name of the task. Defaults to "assets".
+    #
+    # The name will also be used to suffix the clean and clobber
+    # tasks, "clean_assets" and "clobber_assets".
+    attr_accessor :name
+
+    # `Environment` instance used for finding assets.
+    #
+    # You'll most likely want to reassign `environment` to your own.
+    #
+    #   Rake::SprocketsTask.new do |t|
+    #     t.environment = Foo::Assets
+    #   end
+    #
+    def environment
+      if !@environment.is_a?(Sprockets::Base) && @environment.respond_to?(:call)
+        @environment = @environment.call
+      else
+        @environment
+      end
+    end
+    attr_writer :environment
+
+    # Returns cached indexed environment
+    def index
+      @index ||= environment.index if environment
+    end
+
+    # `Manifest` instance used for already compiled assets.
+    #
+    # Will be created by default if an environment and output
+    # directory are given
+    def manifest
+      if !@manifest.is_a?(Sprockets::Manifest) && @manifest.respond_to?(:call)
+        @manifest = @manifest.call
+      else
+        @manifest
+      end
+    end
+    attr_writer :manifest
+
+    # Directory to write compiled assets too. As well as the manifest file.
+    #
+    #   t.output = "./public/assets"
+    #
+    attr_accessor :output
+
+    # Array of asset logical paths to compile.
+    #
+    #   t.assets = %w( application.js jquery.js application.css )
+    #
+    attr_accessor :assets
+
+    # Number of old assets to keep.
+    attr_accessor :keep
+
+    # Logger to use during rake tasks. Defaults to using stderr.
+    #
+    #   t.logger = Logger.new($stdout)
+    #
+    attr_accessor :logger
+
+    # Returns logger level Integer.
+    def log_level
+      @logger.level
+    end
+
+    # Set logger level with constant or symbol.
+    #
+    #   t.log_level = Logger::INFO
+    #   t.log_level = :debug
+    #
+    def log_level=(level)
+      if level.is_a?(Integer)
+        @logger.level = level
+      else
+        @logger.level = Logger.const_get(level.to_s.upcase)
+      end
+    end
+
+    def initialize(name = :assets)
+      @name         = name
+      @environment  = lambda { Sprockets::Environment.new(Dir.pwd) }
+      @manifest     = lambda { Sprockets::Manifest.new(index, output) }
+      @logger       = Logger.new($stderr)
+      @logger.level = Logger::INFO
+      @keep         = 2
+
+      yield self if block_given?
+
+      define
+    end
+
+    # Define tasks
+    def define
+      desc name == :assets ? "Compile assets" : "Compile #{name} assets"
+      task name do
+        with_logger do
+          manifest.compile(assets)
+        end
+      end
+
+      desc name == :assets ? "Remove all assets" : "Remove all #{name} assets"
+      task "clobber_#{name}" do
+        with_logger do
+          manifest.clobber
+        end
+      end
+
+      task :clobber => ["clobber_#{name}"]
+
+      desc name == :assets ? "Clean old assets" : "Clean old #{name} assets"
+      task "clean_#{name}" do
+        with_logger do
+          manifest.clean(keep)
+        end
+      end
+
+      task :clean => ["clean_#{name}"]
+    end
+
+    private
+      # Sub out environment logger with our rake task logger that
+      # writes to stderr.
+      def with_logger
+        if env = manifest.environment
+          old_logger = env.logger
+          env.logger = @logger
+        end
+        yield
+      ensure
+        env.logger = old_logger if env
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets.rb
new file mode 100644
index 0000000..fa05242
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets.rb
@@ -0,0 +1,108 @@
+require 'sprockets/version'
+
+module Sprockets
+  # Environment
+  autoload :Base,                    "sprockets/base"
+  autoload :Environment,             "sprockets/environment"
+  autoload :Index,                   "sprockets/index"
+  autoload :Manifest,                "sprockets/manifest"
+
+  # Assets
+  autoload :Asset,                   "sprockets/asset"
+  autoload :BundledAsset,            "sprockets/bundled_asset"
+  autoload :ProcessedAsset,          "sprockets/processed_asset"
+  autoload :StaticAsset,             "sprockets/static_asset"
+
+  # Processing
+  autoload :Context,                 "sprockets/context"
+  autoload :EcoTemplate,             "sprockets/eco_template"
+  autoload :EjsTemplate,             "sprockets/ejs_template"
+  autoload :JstProcessor,            "sprockets/jst_processor"
+  autoload :Processor,               "sprockets/processor"
+  autoload :SassCacheStore,          "sprockets/sass_cache_store"
+  autoload :SassFunctions,           "sprockets/sass_functions"
+  autoload :SassImporter,            "sprockets/sass_importer"
+  autoload :SassTemplate,            "sprockets/sass_template"
+  autoload :ScssTemplate,            "sprockets/scss_template"
+
+  # Internal utilities
+  autoload :ArgumentError,           "sprockets/errors"
+  autoload :AssetAttributes,         "sprockets/asset_attributes"
+  autoload :CircularDependencyError, "sprockets/errors"
+  autoload :ContentTypeMismatch,     "sprockets/errors"
+  autoload :EngineError,             "sprockets/errors"
+  autoload :Error,                   "sprockets/errors"
+  autoload :FileNotFound,            "sprockets/errors"
+  autoload :Utils,                   "sprockets/utils"
+
+  module Cache
+    autoload :FileStore, "sprockets/cache/file_store"
+  end
+
+  # Extend Sprockets module to provide global registry
+  require 'hike'
+  require 'sprockets/engines'
+  require 'sprockets/mime'
+  require 'sprockets/processing'
+  require 'sprockets/compressing'
+  require 'sprockets/paths'
+  extend Engines, Mime, Processing, Compressing, Paths
+
+  @trail             = Hike::Trail.new(File.expand_path('..', __FILE__))
+  @mime_types        = {}
+  @engines           = {}
+  @preprocessors     = Hash.new { |h, k| h[k] = [] }
+  @postprocessors    = Hash.new { |h, k| h[k] = [] }
+  @bundle_processors = Hash.new { |h, k| h[k] = [] }
+  @compressors       = Hash.new { |h, k| h[k] = {} }
+
+  register_mime_type 'text/css', '.css'
+  register_mime_type 'application/javascript', '.js'
+
+  require 'sprockets/directive_processor'
+  register_preprocessor 'text/css',               DirectiveProcessor
+  register_preprocessor 'application/javascript', DirectiveProcessor
+
+  require 'sprockets/safety_colons'
+  register_postprocessor 'application/javascript', SafetyColons
+
+  require 'sprockets/charset_normalizer'
+  register_bundle_processor 'text/css', CharsetNormalizer
+
+  require 'sprockets/sass_compressor'
+  register_compressor 'text/css', :sass, SassCompressor
+  register_compressor 'text/css', :scss, SassCompressor
+
+  require 'sprockets/yui_compressor'
+  register_compressor 'text/css', :yui, YUICompressor
+
+  require 'sprockets/closure_compressor'
+  register_compressor 'application/javascript', :closure, ClosureCompressor
+
+  require 'sprockets/uglifier_compressor'
+  register_compressor 'application/javascript', :uglifier, UglifierCompressor
+  register_compressor 'application/javascript', :uglify, UglifierCompressor
+
+  require 'sprockets/yui_compressor'
+  register_compressor 'application/javascript', :yui, YUICompressor
+
+  # Cherry pick the default Tilt engines that make sense for
+  # Sprockets. We don't need ones that only generate html like HAML.
+
+  # Mmm, CoffeeScript
+  register_engine '.coffee', Tilt::CoffeeScriptTemplate
+
+  # JST engines
+  register_engine '.jst',    JstProcessor
+  register_engine '.eco',    EcoTemplate
+  register_engine '.ejs',    EjsTemplate
+
+  # CSS engines
+  register_engine '.less',   Tilt::LessTemplate
+  register_engine '.sass',   SassTemplate
+  register_engine '.scss',   ScssTemplate
+
+  # Other
+  register_engine '.erb',    Tilt::ERBTemplate
+  register_engine '.str',    Tilt::StringTemplate
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/asset.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/asset.rb
new file mode 100644
index 0000000..cabf717
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/asset.rb
@@ -0,0 +1,267 @@
+require 'time'
+require 'set'
+
+module Sprockets
+  # `Asset` is the base class for `BundledAsset` and `StaticAsset`.
+  class Asset
+    # Internal initializer to load `Asset` from serialized `Hash`.
+    def self.from_hash(environment, hash)
+      return unless hash.is_a?(Hash)
+
+      klass = case hash['class']
+        when 'BundledAsset'
+          BundledAsset
+        when 'ProcessedAsset'
+          ProcessedAsset
+        when 'StaticAsset'
+          StaticAsset
+        else
+          nil
+        end
+
+      if klass
+        asset = klass.allocate
+        asset.init_with(environment, hash)
+        asset
+      end
+    rescue UnserializeError
+      nil
+    end
+
+    attr_reader :logical_path, :pathname
+    attr_reader :content_type, :mtime, :length, :digest
+    alias_method :bytesize, :length
+
+    def initialize(environment, logical_path, pathname)
+      raise ArgumentError, "Asset logical path has no extension: #{logical_path}" if File.extname(logical_path) == ""
+
+      @root         = environment.root
+      @logical_path = logical_path.to_s
+      @pathname     = Pathname.new(pathname)
+      @content_type = environment.content_type_of(pathname)
+      # drop precision to 1 second, same pattern followed elsewhere
+      @mtime        = Time.at(environment.stat(pathname).mtime.to_i)
+      @length       = environment.stat(pathname).size
+      @digest       = environment.file_digest(pathname).hexdigest
+    end
+
+    # Initialize `Asset` from serialized `Hash`.
+    def init_with(environment, coder)
+      @root = environment.root
+
+      @logical_path = coder['logical_path']
+      @content_type = coder['content_type']
+      @digest       = coder['digest']
+
+      if pathname = coder['pathname']
+        # Expand `$root` placeholder and wrapper string in a `Pathname`
+        @pathname = Pathname.new(expand_root_path(pathname))
+      end
+
+      if mtime = coder['mtime']
+        @mtime = Time.at(mtime)
+      end
+
+      if length = coder['length']
+        # Convert length to an `Integer`
+        @length = Integer(length)
+      end
+    end
+
+    # Copy serialized attributes to the coder object
+    def encode_with(coder)
+      coder['class']        = self.class.name.sub(/Sprockets::/, '')
+      coder['logical_path'] = logical_path
+      coder['pathname']     = relativize_root_path(pathname).to_s
+      coder['content_type'] = content_type
+      coder['mtime']        = mtime.to_i
+      coder['length']       = length
+      coder['digest']       = digest
+    end
+
+    # Return logical path with digest spliced in.
+    #
+    #   "foo/bar-37b51d194a7513e45b56f6524f2d51f2.js"
+    #
+    def digest_path
+      logical_path.sub(/\.(\w+)$/) { |ext| "-#{digest}#{ext}" }
+    end
+
+    # Return an `Array` of `Asset` files that are declared dependencies.
+    def dependencies
+      []
+    end
+
+    # Expand asset into an `Array` of parts.
+    #
+    # Appending all of an assets body parts together should give you
+    # the asset's contents as a whole.
+    #
+    # This allows you to link to individual files for debugging
+    # purposes.
+    def to_a
+      [self]
+    end
+
+    # `body` is aliased to source by default if it can't have any dependencies.
+    def body
+      source
+    end
+
+    # Return `String` of concatenated source.
+    def to_s
+      source
+    end
+
+    # Add enumerator to allow `Asset` instances to be used as Rack
+    # compatible body objects.
+    def each
+      yield to_s
+    end
+
+    # Checks if Asset is fresh by comparing the actual mtime and
+    # digest to the inmemory model.
+    #
+    # Used to test if cached models need to be rebuilt.
+    def fresh?(environment)
+      # Check current mtime and digest
+      dependency_fresh?(environment, self)
+    end
+
+    # Checks if Asset is stale by comparing the actual mtime and
+    # digest to the inmemory model.
+    #
+    # Subclass must override `fresh?` or `stale?`.
+    def stale?(environment)
+      !fresh?(environment)
+    end
+
+    # Save asset to disk.
+    def write_to(filename, options = {})
+      # Gzip contents if filename has '.gz'
+      options[:compress] ||= File.extname(filename) == '.gz'
+
+      FileUtils.mkdir_p File.dirname(filename)
+
+      File.open("#{filename}+", 'wb') do |f|
+        if options[:compress]
+          # Run contents through `Zlib`
+          gz = Zlib::GzipWriter.new(f, Zlib::BEST_COMPRESSION)
+          gz.mtime = mtime.to_i
+          gz.write to_s
+          gz.close
+        else
+          # Write out as is
+          f.write to_s
+        end
+      end
+
+      # Atomic write
+      FileUtils.mv("#{filename}+", filename)
+
+      # Set mtime correctly
+      File.utime(mtime, mtime, filename)
+
+      nil
+    ensure
+      # Ensure tmp file gets cleaned up
+      FileUtils.rm("#{filename}+") if File.exist?("#{filename}+")
+    end
+
+    # Pretty inspect
+    def inspect
+      "#<#{self.class}:0x#{object_id.to_s(16)} " +
+        "pathname=#{pathname.to_s.inspect}, " +
+        "mtime=#{mtime.inspect}, " +
+        "digest=#{digest.inspect}" +
+        ">"
+    end
+
+    def hash
+      digest.hash
+    end
+
+    # Assets are equal if they share the same path, mtime and digest.
+    def eql?(other)
+      other.class == self.class &&
+        other.logical_path == self.logical_path &&
+        other.mtime.to_i == self.mtime.to_i &&
+        other.digest == self.digest
+    end
+    alias_method :==, :eql?
+
+    protected
+      # Internal: String paths that are marked as dependencies after processing.
+      #
+      # Default to an empty `Array`.
+      def dependency_paths
+        @dependency_paths ||= []
+      end
+
+      # Internal: `ProccessedAsset`s that are required after processing.
+      #
+      # Default to an empty `Array`.
+      def required_assets
+        @required_assets ||= []
+      end
+
+      # Get pathname with its root stripped.
+      def relative_pathname
+        @relative_pathname ||= Pathname.new(relativize_root_path(pathname))
+      end
+
+      # Replace `$root` placeholder with actual environment root.
+      def expand_root_path(path)
+        path.to_s.sub(/^\$root/, @root)
+      end
+
+      # Replace actual environment root with `$root` placeholder.
+      def relativize_root_path(path)
+        path.to_s.sub(/^#{Regexp.escape(@root)}/, '$root')
+      end
+
+      # Check if dependency is fresh.
+      #
+      # `dep` is a `Hash` with `path`, `mtime` and `hexdigest` keys.
+      #
+      # A `Hash` is used rather than other `Asset` object because we
+      # want to test non-asset files and directories.
+      def dependency_fresh?(environment, dep)
+        path, mtime, hexdigest = dep.pathname.to_s, dep.mtime, dep.digest
+
+        stat = environment.stat(path)
+
+        # If path no longer exists, its definitely stale.
+        if stat.nil?
+          return false
+        end
+
+        # Compare dependency mtime to the actual mtime. If the
+        # dependency mtime is newer than the actual mtime, the file
+        # hasn't changed since we created this `Asset` instance.
+        #
+        # However, if the mtime is newer it doesn't mean the asset is
+        # stale. Many deployment environments may recopy or recheckout
+        # assets on each deploy. In this case the mtime would be the
+        # time of deploy rather than modified time.
+        #
+        # Note: to_i is used in eql? and write_to we assume fidelity of 1 second
+        #  if people save files more frequently than 1 second sprockets may
+        #  not pick it up, by design
+        if mtime.to_i >= stat.mtime.to_i
+          return true
+        end
+
+        digest = environment.file_digest(path)
+
+        # If the mtime is newer, do a full digest comparsion. Return
+        # fresh if the digests match.
+        if hexdigest == digest.hexdigest
+          return true
+        end
+
+        # Otherwise, its stale.
+        false
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/asset_attributes.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/asset_attributes.rb
new file mode 100644
index 0000000..cf705ec
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/asset_attributes.rb
@@ -0,0 +1,133 @@
+require 'pathname'
+
+module Sprockets
+  # `AssetAttributes` is a wrapper similar to `Pathname` that provides
+  # some helper accessors.
+  #
+  # These methods should be considered internalish.
+  class AssetAttributes
+    attr_reader :environment, :pathname
+
+    def initialize(environment, path)
+      @environment = environment
+      @pathname = path.is_a?(Pathname) ? path : Pathname.new(path.to_s)
+    end
+
+    # Returns paths search the load path for.
+    def search_paths
+      paths = [pathname.to_s]
+
+      path_without_extensions = extensions.inject(pathname) { |p, ext| p.sub(ext, '') }
+
+      # optimization: bower.json can only be nested one level deep
+      if !path_without_extensions.to_s.index('/')
+        paths << path_without_extensions.join("bower.json").to_s
+        # DEPRECATED bower configuration file
+        paths << path_without_extensions.join("component.json").to_s
+      end
+
+      if pathname.basename(extensions.join).to_s != 'index'
+        paths << path_without_extensions.join("index#{extensions.join}").to_s
+      end
+
+      paths
+    end
+
+    # Reverse guess logical path for fully expanded path.
+    #
+    # This has some known issues. For an example if a file is
+    # shaddowed in the path, but is required relatively, its logical
+    # path will be incorrect.
+    def logical_path
+      if root_path = environment.paths.detect { |path| pathname.to_s[path] }
+        path = pathname.to_s.sub("#{root_path}/", '')
+        path = pathname.relative_path_from(Pathname.new(root_path)).to_s
+        path = engine_extensions.inject(path) { |p, ext| p.sub(ext, '') }
+        path = "#{path}#{engine_format_extension}" unless format_extension
+        path
+      else
+        raise FileOutsidePaths, "#{pathname} isn't in paths: #{environment.paths.join(', ')}"
+      end
+    end
+
+    # Returns `Array` of extension `String`s.
+    #
+    #     "foo.js.coffee"
+    #     # => [".js", ".coffee"]
+    #
+    def extensions
+      @extensions ||= @pathname.basename.to_s.scan(/\.[^.]+/)
+    end
+
+    # Returns the format extension.
+    #
+    #     "foo.js.coffee"
+    #     # => ".js"
+    #
+    def format_extension
+      extensions.reverse.detect { |ext|
+        @environment.mime_types(ext) && !@environment.engines(ext)
+      }
+    end
+
+    # Returns an `Array` of engine extensions.
+    #
+    #     "foo.js.coffee.erb"
+    #     # => [".coffee", ".erb"]
+    #
+    def engine_extensions
+      exts = extensions
+
+      if offset = extensions.index(format_extension)
+        exts = extensions[offset+1..-1]
+      end
+
+      exts.select { |ext| @environment.engines(ext) }
+    end
+
+    # Returns engine classes.
+    def engines
+      engine_extensions.map { |ext| @environment.engines(ext) }
+    end
+
+    # Returns all processors to run on the path.
+    def processors
+      environment.preprocessors(content_type) +
+        engines.reverse +
+        environment.postprocessors(content_type)
+    end
+
+    # Returns the content type for the pathname. Falls back to `application/octet-stream`.
+    def content_type
+      @content_type ||= begin
+        if format_extension.nil?
+          engine_content_type || 'application/octet-stream'
+        else
+          @environment.mime_types(format_extension) ||
+            engine_content_type ||
+            'application/octet-stream'
+        end
+      end
+    end
+
+    private
+      # Returns implicit engine content type.
+      #
+      # `.coffee` files carry an implicit `application/javascript`
+      # content type.
+      def engine_content_type
+        engines.reverse.each do |engine|
+          if engine.respond_to?(:default_mime_type) && engine.default_mime_type
+            return engine.default_mime_type
+          end
+        end
+        nil
+      end
+
+      def engine_format_extension
+        if content_type = engine_content_type
+          environment.extension_for_mime_type(content_type)
+        end
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/base.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/base.rb
new file mode 100644
index 0000000..8b94b5f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/base.rb
@@ -0,0 +1,447 @@
+require 'sprockets/asset_attributes'
+require 'sprockets/bundled_asset'
+require 'sprockets/caching'
+require 'sprockets/errors'
+require 'sprockets/processed_asset'
+require 'sprockets/server'
+require 'sprockets/static_asset'
+require 'multi_json'
+require 'pathname'
+
+module Sprockets
+  # `Base` class for `Environment` and `Index`.
+  class Base
+    include Caching, Paths, Mime, Processing, Compressing, Engines, Server
+
+    # Returns a `Digest` implementation class.
+    #
+    # Defaults to `Digest::MD5`.
+    attr_reader :digest_class
+
+    # Assign a `Digest` implementation class. This maybe any Ruby
+    # `Digest::` implementation such as `Digest::MD5` or
+    # `Digest::SHA1`.
+    #
+    #     environment.digest_class = Digest::SHA1
+    #
+    def digest_class=(klass)
+      expire_index!
+      @digest_class = klass
+    end
+
+    # The `Environment#version` is a custom value used for manually
+    # expiring all asset caches.
+    #
+    # Sprockets is able to track most file and directory changes and
+    # will take care of expiring the cache for you. However, its
+    # impossible to know when any custom helpers change that you mix
+    # into the `Context`.
+    #
+    # It would be wise to increment this value anytime you make a
+    # configuration change to the `Environment` object.
+    attr_reader :version
+
+    # Assign an environment version.
+    #
+    #     environment.version = '2.0'
+    #
+    def version=(version)
+      expire_index!
+      @version = version
+    end
+
+    # Returns a `Digest` instance for the `Environment`.
+    #
+    # This value serves two purposes. If two `Environment`s have the
+    # same digest value they can be treated as equal. This is more
+    # useful for comparing environment states between processes rather
+    # than in the same. Two equal `Environment`s can share the same
+    # cached assets.
+    #
+    # The value also provides a seed digest for all `Asset`
+    # digests. Any change in the environment digest will affect all of
+    # its assets.
+    def digest
+      # Compute the initial digest using the implementation class. The
+      # Sprockets release version and custom environment version are
+      # mixed in. So any new releases will affect all your assets.
+      @digest ||= digest_class.new.update(VERSION).update(version.to_s)
+
+      # Returned a dupped copy so the caller can safely mutate it with `.update`
+      @digest.dup
+    end
+
+    # Get and set `Logger` instance.
+    attr_accessor :logger
+
+    # Get `Context` class.
+    #
+    # This class maybe mutated and mixed in with custom helpers.
+    #
+    #     environment.context_class.instance_eval do
+    #       include MyHelpers
+    #       def asset_url; end
+    #     end
+    #
+    attr_reader :context_class
+
+    # Get persistent cache store
+    attr_reader :cache
+
+    # Set persistent cache store
+    #
+    # The cache store must implement a pair of getters and
+    # setters. Either `get(key)`/`set(key, value)`,
+    # `[key]`/`[key]=value`, `read(key)`/`write(key, value)`.
+    def cache=(cache)
+      expire_index!
+      @cache = cache
+    end
+
+    def prepend_path(path)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def append_path(path)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def clear_paths
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    # Finds the expanded real path for a given logical path by
+    # searching the environment's paths.
+    #
+    #     resolve("application.js")
+    #     # => "/path/to/app/javascripts/application.js.coffee"
+    #
+    # A `FileNotFound` exception is raised if the file does not exist.
+    def resolve(logical_path, options = {})
+      # If a block is given, preform an iterable search
+      if block_given?
+        args = attributes_for(logical_path).search_paths + [options]
+        @trail.find(*args) do |path|
+          pathname = Pathname.new(path)
+          if %w( bower.json component.json ).include?(pathname.basename.to_s)
+            bower = json_decode(pathname.read)
+            case bower['main']
+            when String
+              yield pathname.dirname.join(bower['main'])
+            when Array
+              extname = File.extname(logical_path)
+              bower['main'].each do |fn|
+                if extname == "" || extname == File.extname(fn)
+                  yield pathname.dirname.join(fn)
+                end
+              end
+            end
+          else
+            yield pathname
+          end
+        end
+      else
+        resolve(logical_path, options) do |pathname|
+          return pathname
+        end
+        raise FileNotFound, "couldn't find file '#{logical_path}'"
+      end
+    end
+
+    # Register a new mime type.
+    def register_mime_type(mime_type, ext)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      @trail.append_extension(ext)
+      super
+    end
+
+    # Registers a new Engine `klass` for `ext`.
+    def register_engine(ext, klass)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      add_engine_to_trail(ext, klass)
+      super
+    end
+
+    def register_preprocessor(mime_type, klass, &block)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def unregister_preprocessor(mime_type, klass)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def register_postprocessor(mime_type, klass, &block)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def unregister_postprocessor(mime_type, klass)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def register_bundle_processor(mime_type, klass, &block)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    def unregister_bundle_processor(mime_type, klass)
+      # Overrides the global behavior to expire the index
+      expire_index!
+      super
+    end
+
+    # Return an `Index`. Must be implemented by the subclass.
+    def index
+      raise NotImplementedError
+    end
+
+    if defined? Encoding.default_external
+      # Define `default_external_encoding` accessor on 1.9.
+      # Defaults to UTF-8.
+      attr_accessor :default_external_encoding
+    end
+
+    # Works like `Dir.entries`.
+    #
+    # Subclasses may cache this method.
+    def entries(pathname)
+      @trail.entries(pathname)
+    end
+
+    # Works like `File.stat`.
+    #
+    # Subclasses may cache this method.
+    def stat(path)
+      @trail.stat(path)
+    end
+
+    # Read and compute digest of filename.
+    #
+    # Subclasses may cache this method.
+    def file_digest(path)
+      if stat = self.stat(path)
+        # If its a file, digest the contents
+        if stat.file?
+          digest.file(path.to_s)
+
+        # If its a directive, digest the list of filenames
+        elsif stat.directory?
+          contents = self.entries(path).join(',')
+          digest.update(contents)
+        end
+      end
+    end
+
+    # Internal. Return a `AssetAttributes` for `path`.
+    def attributes_for(path)
+      AssetAttributes.new(self, path)
+    end
+
+    # Internal. Return content type of `path`.
+    def content_type_of(path)
+      attributes_for(path).content_type
+    end
+
+    # Find asset by logical path or expanded path.
+    def find_asset(path, options = {})
+      logical_path = path
+      pathname     = Pathname.new(path)
+
+      if pathname.absolute?
+        return unless stat(pathname)
+        logical_path = attributes_for(pathname).logical_path
+      else
+        begin
+          pathname = resolve(logical_path)
+
+          # If logical path is missing a mime type extension, append
+          # the absolute path extname so it has one.
+          #
+          # Ensures some consistency between finding "foo/bar" vs
+          # "foo/bar.js".
+          if File.extname(logical_path) == ""
+            expanded_logical_path = attributes_for(pathname).logical_path
+            logical_path += File.extname(expanded_logical_path)
+          end
+        rescue FileNotFound
+          return nil
+        end
+      end
+
+      build_asset(logical_path, pathname, options)
+    end
+
+    # Preferred `find_asset` shorthand.
+    #
+    #     environment['application.js']
+    #
+    def [](*args)
+      find_asset(*args)
+    end
+
+    def each_entry(root, &block)
+      return to_enum(__method__, root) unless block_given?
+      root = Pathname.new(root) unless root.is_a?(Pathname)
+
+      paths = []
+      entries(root).sort.each do |filename|
+        path = root.join(filename)
+        paths << path
+
+        if stat(path).directory?
+          each_entry(path) do |subpath|
+            paths << subpath
+          end
+        end
+      end
+
+      paths.sort_by(&:to_s).each(&block)
+
+      nil
+    end
+
+    def each_file
+      return to_enum(__method__) unless block_given?
+      paths.each do |root|
+        each_entry(root) do |path|
+          if !stat(path).directory?
+            yield path
+          end
+        end
+      end
+      nil
+    end
+
+    def each_logical_path(*args, &block)
+      return to_enum(__method__, *args) unless block_given?
+      filters = args.flatten
+      files = {}
+      each_file do |filename|
+        if logical_path = logical_path_for_filename(filename, filters)
+          unless files[logical_path]
+            if block.arity == 2
+              yield logical_path, filename.to_s
+            else
+              yield logical_path
+            end
+          end
+
+          files[logical_path] = true
+        end
+      end
+      nil
+    end
+
+    # Pretty inspect
+    def inspect
+      "#<#{self.class}:0x#{object_id.to_s(16)} " +
+        "root=#{root.to_s.inspect}, " +
+        "paths=#{paths.inspect}, " +
+        "digest=#{digest.to_s.inspect}" +
+        ">"
+    end
+
+    protected
+      # Clear index after mutating state. Must be implemented by the subclass.
+      def expire_index!
+        raise NotImplementedError
+      end
+
+      def build_asset(logical_path, pathname, options)
+        pathname = Pathname.new(pathname)
+
+        # If there are any processors to run on the pathname, use
+        # `BundledAsset`. Otherwise use `StaticAsset` and treat is as binary.
+        if attributes_for(pathname).processors.any?
+          if options[:bundle] == false
+            circular_call_protection(pathname.to_s) do
+              ProcessedAsset.new(index, logical_path, pathname)
+            end
+          else
+            BundledAsset.new(index, logical_path, pathname)
+          end
+        else
+          StaticAsset.new(index, logical_path, pathname)
+        end
+      end
+
+      def cache_key_for(path, options)
+        "#{path}:#{options[:bundle] ? '1' : '0'}"
+      end
+
+      def circular_call_protection(path)
+        reset = Thread.current[:sprockets_circular_calls].nil?
+        calls = Thread.current[:sprockets_circular_calls] ||= Set.new
+        if calls.include?(path)
+          raise CircularDependencyError, "#{path} has already been required"
+        end
+        calls << path
+        yield
+      ensure
+        Thread.current[:sprockets_circular_calls] = nil if reset
+      end
+
+      def logical_path_for_filename(filename, filters)
+        logical_path = attributes_for(filename).logical_path.to_s
+
+        if matches_filter(filters, logical_path, filename)
+          return logical_path
+        end
+
+        # If filename is an index file, retest with alias
+        if File.basename(logical_path)[/[^\.]+/, 0] == 'index'
+          path = logical_path.sub(/\/index\./, '.')
+          if matches_filter(filters, path, filename)
+            return path
+          end
+        end
+
+        nil
+      end
+
+      def matches_filter(filters, logical_path, filename)
+        return true if filters.empty?
+
+        filters.any? do |filter|
+          if filter.is_a?(Regexp)
+            filter.match(logical_path)
+          elsif filter.respond_to?(:call)
+            if filter.arity == 1
+              filter.call(logical_path)
+            else
+              filter.call(logical_path, filename.to_s)
+            end
+          else
+            File.fnmatch(filter.to_s, logical_path)
+          end
+        end
+      end
+
+      # Feature detect newer MultiJson API
+      if MultiJson.respond_to?(:dump)
+        def json_decode(obj)
+          MultiJson.load(obj)
+        end
+      else
+        def json_decode(obj)
+          MultiJson.decode(obj)
+        end
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/bundled_asset.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/bundled_asset.rb
new file mode 100644
index 0000000..1b2e810
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/bundled_asset.rb
@@ -0,0 +1,78 @@
+require 'sprockets/asset'
+require 'sprockets/errors'
+require 'fileutils'
+require 'set'
+require 'zlib'
+
+module Sprockets
+  # `BundledAsset`s are used for files that need to be processed and
+  # concatenated with other assets. Use for `.js` and `.css` files.
+  class BundledAsset < Asset
+    attr_reader :source
+
+    def initialize(environment, logical_path, pathname)
+      super(environment, logical_path, pathname)
+
+      @processed_asset  = environment.find_asset(pathname, :bundle => false)
+      @required_assets  = @processed_asset.required_assets
+      @dependency_paths = @processed_asset.dependency_paths
+
+      # Explode Asset into parts and gather the dependency bodies
+      @source = to_a.map { |dependency| dependency.to_s }.join
+
+      # Run bundle processors on concatenated source
+      context = environment.context_class.new(environment, logical_path, pathname)
+      @source = context.evaluate(pathname, :data => @source,
+                  :processors => environment.bundle_processors(content_type))
+
+      @mtime  = (to_a + @dependency_paths).map(&:mtime).max
+      @length = Rack::Utils.bytesize(source)
+      @digest = environment.digest.update(source).hexdigest
+    end
+
+    # Initialize `BundledAsset` from serialized `Hash`.
+    def init_with(environment, coder)
+      super
+
+      @processed_asset = environment.find_asset(pathname, :bundle => false)
+      @required_assets = @processed_asset.required_assets
+
+      if @processed_asset.dependency_digest != coder['required_assets_digest']
+        raise UnserializeError, "processed asset belongs to a stale environment"
+      end
+
+      @source = coder['source']
+    end
+
+    # Serialize custom attributes in `BundledAsset`.
+    def encode_with(coder)
+      super
+
+      coder['source'] = source
+      coder['required_assets_digest'] = @processed_asset.dependency_digest
+    end
+
+    # Get asset's own processed contents. Excludes any of its required
+    # dependencies but does run any processors or engines on the
+    # original file.
+    def body
+      @processed_asset.source
+    end
+
+    # Return an `Array` of `Asset` files that are declared dependencies.
+    def dependencies
+      to_a.reject { |a| a.eql?(@processed_asset) }
+    end
+
+    # Expand asset into an `Array` of parts.
+    def to_a
+      required_assets
+    end
+
+    # Checks if Asset is stale by comparing the actual mtime and
+    # digest to the inmemory model.
+    def fresh?(environment)
+      @processed_asset.fresh?(environment)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/cache/file_store.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/cache/file_store.rb
new file mode 100644
index 0000000..bcb4694
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/cache/file_store.rb
@@ -0,0 +1,32 @@
+require 'digest/md5'
+require 'fileutils'
+require 'pathname'
+
+module Sprockets
+  module Cache
+    # A simple file system cache store.
+    #
+    #     environment.cache = Sprockets::Cache::FileStore.new("/tmp")
+    #
+    class FileStore
+      def initialize(root)
+        @root = Pathname.new(root)
+      end
+
+      # Lookup value in cache
+      def [](key)
+        pathname = @root.join(key)
+        pathname.exist? ? pathname.open('rb') { |f| Marshal.load(f) } : nil
+      end
+
+      # Save value to cache
+      def []=(key, value)
+        # Ensure directory exists
+        FileUtils.mkdir_p @root.join(key).dirname
+
+        @root.join(key).open('w') { |f| Marshal.dump(value, f)}
+        value
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/caching.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/caching.rb
new file mode 100644
index 0000000..7ca020d
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/caching.rb
@@ -0,0 +1,96 @@
+module Sprockets
+  # `Caching` is an internal mixin whose public methods are exposed on
+  # the `Environment` and `Index` classes.
+  module Caching
+    # Low level cache getter for `key`. Checks a number of supported
+    # cache interfaces.
+    def cache_get(key)
+      # `Cache#get(key)` for Memcache
+      if cache.respond_to?(:get)
+        cache.get(key)
+
+      # `Cache#[key]` so `Hash` can be used
+      elsif cache.respond_to?(:[])
+        cache[key]
+
+      # `Cache#read(key)` for `ActiveSupport::Cache` support
+      elsif cache.respond_to?(:read)
+        cache.read(key)
+
+      else
+        nil
+      end
+    end
+
+    # Low level cache setter for `key`. Checks a number of supported
+    # cache interfaces.
+    def cache_set(key, value)
+      # `Cache#set(key, value)` for Memcache
+      if cache.respond_to?(:set)
+        cache.set(key, value)
+
+      # `Cache#[key]=value` so `Hash` can be used
+      elsif cache.respond_to?(:[]=)
+        cache[key] = value
+
+      # `Cache#write(key, value)` for `ActiveSupport::Cache` support
+      elsif cache.respond_to?(:write)
+        cache.write(key, value)
+      end
+
+      value
+    end
+
+    protected
+      # Cache helper method. Takes a `path` argument which maybe a
+      # logical path or fully expanded path. The `&block` is passed
+      # for finding and building the asset if its not in cache.
+      def cache_asset(path)
+        # If `cache` is not set, return fast
+        if cache.nil?
+          yield
+
+        # Check cache for `path`
+        elsif (asset = Asset.from_hash(self, cache_get_hash(path.to_s))) && asset.fresh?(self)
+          asset
+
+         # Otherwise yield block that slowly finds and builds the asset
+        elsif asset = yield
+          hash = {}
+          asset.encode_with(hash)
+
+          # Save the asset to its path
+          cache_set_hash(path.to_s, hash)
+
+          # Since path maybe a logical or full pathname, save the
+          # asset its its full path too
+          if path.to_s != asset.pathname.to_s
+            cache_set_hash(asset.pathname.to_s, hash)
+          end
+
+          asset
+        end
+      end
+
+    private
+      # Strips `Environment#root` from key to make the key work
+      # consisently across different servers. The key is also hashed
+      # so it does not exceed 250 characters.
+      def expand_cache_key(key)
+        File.join('sprockets', digest_class.hexdigest(key.sub(root, '')))
+      end
+
+      def cache_get_hash(key)
+        hash = cache_get(expand_cache_key(key))
+        if hash.is_a?(Hash) && digest.hexdigest == hash['_version']
+          hash
+        end
+      end
+
+      def cache_set_hash(key, hash)
+        hash['_version'] = digest.hexdigest
+        cache_set(expand_cache_key(key), hash)
+        hash
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/charset_normalizer.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/charset_normalizer.rb
new file mode 100644
index 0000000..daa4e38
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/charset_normalizer.rb
@@ -0,0 +1,41 @@
+require 'tilt'
+
+module Sprockets
+  # Some browsers have issues with stylesheets that contain multiple
+  # `@charset` definitions. The issue surfaces while using Sass since
+  # it inserts a `@charset` at the top of each file. Then Sprockets
+  # concatenates them together.
+  #
+  # The `CharsetNormalizer` processor strips out multiple `@charset`
+  # definitions.
+  #
+  # The current implementation is naive. It picks the first `@charset`
+  # it sees and strips the others. This works for most people because
+  # the other definitions are usually `UTF-8`. A more sophisticated
+  # approach would be to re-encode stylesheets with mixed encodings.
+  #
+  # This behavior can be disabled with:
+  #
+  #     environment.unregister_bundle_processor 'text/css', Sprockets::CharsetNormalizer
+  #
+  class CharsetNormalizer < Tilt::Template
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      charset = nil
+
+      # Find and strip out any `@charset` definitions
+      filtered_data = data.gsub(/^@charset "([^"]+)";$/) {
+        charset ||= $1; ""
+      }
+
+      if charset
+        # If there was a charset, move it to the top
+        "@charset \"#{charset}\";#{filtered_data}"
+      else
+        data
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/closure_compressor.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/closure_compressor.rb
new file mode 100644
index 0000000..567ca16
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/closure_compressor.rb
@@ -0,0 +1,22 @@
+require 'tilt'
+
+module Sprockets
+  class ClosureCompressor < Tilt::Template
+    self.default_mime_type = 'application/javascript'
+
+    def self.engine_initialized?
+      defined?(::Closure::Compiler)
+    end
+
+    def initialize_engine
+      require_template_library 'closure-compiler'
+    end
+
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      Closure::Compiler.new.compile(data)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/compressing.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/compressing.rb
new file mode 100644
index 0000000..6634125
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/compressing.rb
@@ -0,0 +1,73 @@
+module Sprockets
+  # `Compressing` is an internal mixin whose public methods are exposed on
+  # the `Environment` and `Index` classes.
+  module Compressing
+    def compressors
+      deep_copy_hash(@compressors)
+    end
+
+    def register_compressor(mime_type, sym, klass)
+      @compressors[mime_type][sym] = klass
+    end
+
+    # Return CSS compressor or nil if none is set
+    def css_compressor
+      @css_compressor if defined? @css_compressor
+    end
+
+    # Assign a compressor to run on `text/css` assets.
+    #
+    # The compressor object must respond to `compress`.
+    def css_compressor=(compressor)
+      unregister_bundle_processor 'text/css', css_compressor if css_compressor
+      @css_compressor = nil
+      return unless compressor
+
+      if compressor.is_a?(Symbol)
+        compressor = compressors['text/css'][compressor] || raise(Error, "unknown compressor: #{compressor}")
+      end
+
+      if compressor.respond_to?(:compress)
+        klass = Class.new(Processor) do
+          @name = "css_compressor"
+          @processor = proc { |context, data| compressor.compress(data) }
+        end
+        @css_compressor = :css_compressor
+      else
+        @css_compressor = klass = compressor
+      end
+
+      register_bundle_processor 'text/css', klass
+    end
+
+    # Return JS compressor or nil if none is set
+    def js_compressor
+      @js_compressor if defined? @js_compressor
+    end
+
+    # Assign a compressor to run on `application/javascript` assets.
+    #
+    # The compressor object must respond to `compress`.
+    def js_compressor=(compressor)
+      unregister_bundle_processor 'application/javascript', js_compressor if js_compressor
+      @js_compressor = nil
+      return unless compressor
+
+      if compressor.is_a?(Symbol)
+        compressor = compressors['application/javascript'][compressor] || raise(Error, "unknown compressor: #{compressor}")
+      end
+
+      if compressor.respond_to?(:compress)
+        klass = Class.new(Processor) do
+          @name = "js_compressor"
+          @processor = proc { |context, data| compressor.compress(data) }
+        end
+        @js_compressor = :js_compressor
+      else
+        @js_compressor = klass = compressor
+      end
+
+      register_bundle_processor 'application/javascript', klass
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/context.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/context.rb
new file mode 100644
index 0000000..9b13406
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/context.rb
@@ -0,0 +1,289 @@
+require 'base64'
+require 'rack/utils'
+require 'sprockets/errors'
+require 'sprockets/utils'
+require 'pathname'
+require 'set'
+
+module Sprockets
+  # `Context` provides helper methods to all `Tilt` processors. They
+  # are typically accessed by ERB templates. You can mix in custom
+  # helpers by injecting them into `Environment#context_class`. Do not
+  # mix them into `Context` directly.
+  #
+  #     environment.context_class.class_eval do
+  #       include MyHelper
+  #       def asset_url; end
+  #     end
+  #
+  #     <%= asset_url "foo.png" %>
+  #
+  # The `Context` also collects dependencies declared by
+  # assets. See `DirectiveProcessor` for an example of this.
+  class Context
+    attr_reader :environment, :pathname
+    attr_reader :_required_paths, :_stubbed_assets
+    attr_reader :_dependency_paths, :_dependency_assets
+    attr_writer :__LINE__
+
+    def initialize(environment, logical_path, pathname)
+      @environment  = environment
+      @logical_path = logical_path
+      @pathname     = pathname
+      @__LINE__     = nil
+
+      @_required_paths    = []
+      @_stubbed_assets    = Set.new
+      @_dependency_paths  = Set.new
+      @_dependency_assets = Set.new([pathname.to_s])
+    end
+
+    # Returns the environment path that contains the file.
+    #
+    # If `app/javascripts` and `app/stylesheets` are in your path, and
+    # current file is `app/javascripts/foo/bar.js`, `root_path` would
+    # return `app/javascripts`.
+    def root_path
+      environment.paths.detect { |path| pathname.to_s[path] }
+    end
+
+    # Returns logical path without any file extensions.
+    #
+    #     'app/javascripts/application.js'
+    #     # => 'application'
+    #
+    def logical_path
+      @logical_path.chomp(File.extname(@logical_path))
+    end
+
+    # Returns content type of file
+    #
+    #     'application/javascript'
+    #     'text/css'
+    #
+    def content_type
+      environment.content_type_of(pathname)
+    end
+
+    # Given a logical path, `resolve` will find and return the fully
+    # expanded path. Relative paths will also be resolved. An optional
+    # `:content_type` restriction can be supplied to restrict the
+    # search.
+    #
+    #     resolve("foo.js")
+    #     # => "/path/to/app/javascripts/foo.js"
+    #
+    #     resolve("./bar.js")
+    #     # => "/path/to/app/javascripts/bar.js"
+    #
+    def resolve(path, options = {}, &block)
+      pathname   = Pathname.new(path)
+      attributes = environment.attributes_for(pathname)
+
+      if pathname.absolute?
+        if environment.stat(pathname)
+          pathname
+        else
+          raise FileNotFound, "couldn't find file '#{pathname}'"
+        end
+
+      elsif content_type = options[:content_type]
+        content_type = self.content_type if content_type == :self
+
+        if attributes.format_extension
+          if content_type != attributes.content_type
+            raise ContentTypeMismatch, "#{path} is " +
+              "'#{attributes.content_type}', not '#{content_type}'"
+          end
+        end
+
+        resolve(path) do |candidate|
+          if self.content_type == environment.content_type_of(candidate)
+            return candidate
+          end
+        end
+
+        raise FileNotFound, "couldn't find file '#{path}'"
+      else
+        environment.resolve(path, {:base_path => self.pathname.dirname}.merge(options), &block)
+      end
+    end
+
+    # `depend_on` allows you to state a dependency on a file without
+    # including it.
+    #
+    # This is used for caching purposes. Any changes made to
+    # the dependency file with invalidate the cache of the
+    # source file.
+    def depend_on(path)
+      @_dependency_paths << resolve(path).to_s
+      nil
+    end
+
+    # `depend_on_asset` allows you to state an asset dependency
+    # without including it.
+    #
+    # This is used for caching purposes. Any changes that would
+    # invalidate the dependency asset will invalidate the source
+    # file. Unlike `depend_on`, this will include recursively include
+    # the target asset's dependencies.
+    def depend_on_asset(path)
+      filename = resolve(path).to_s
+      @_dependency_assets << filename
+      nil
+    end
+
+    # `require_asset` declares `path` as a dependency of the file. The
+    # dependency will be inserted before the file and will only be
+    # included once.
+    #
+    # If ERB processing is enabled, you can use it to dynamically
+    # require assets.
+    #
+    #     <%= require_asset "#{framework}.js" %>
+    #
+    def require_asset(path)
+      pathname = resolve(path, :content_type => :self)
+      depend_on_asset(pathname)
+      @_required_paths << pathname.to_s
+      nil
+    end
+
+    # `stub_asset` blacklists `path` from being included in the bundle.
+    # `path` must be an asset which may or may not already be included
+    # in the bundle.
+    def stub_asset(path)
+      @_stubbed_assets << resolve(path, :content_type => :self).to_s
+      nil
+    end
+
+    # Tests if target path is able to be safely required into the
+    # current concatenation.
+    def asset_requirable?(path)
+      pathname = resolve(path)
+      content_type = environment.content_type_of(pathname)
+      stat = environment.stat(path)
+      return false unless stat && stat.file?
+      self.content_type.nil? || self.content_type == content_type
+    end
+
+    # Reads `path` and runs processors on the file.
+    #
+    # This allows you to capture the result of an asset and include it
+    # directly in another.
+    #
+    #     <%= evaluate "bar.js" %>
+    #
+    def evaluate(path, options = {})
+      pathname   = resolve(path)
+      attributes = environment.attributes_for(pathname)
+      processors = options[:processors] || attributes.processors
+
+      if options[:data]
+        result = options[:data]
+      else
+        if environment.respond_to?(:default_external_encoding)
+          mime_type = environment.mime_types(pathname.extname)
+          encoding  = environment.encoding_for_mime_type(mime_type)
+          result    = Sprockets::Utils.read_unicode(pathname, encoding)
+        else
+          result = Sprockets::Utils.read_unicode(pathname)
+        end
+      end
+
+      processors.each do |processor|
+        begin
+          template = processor.new(pathname.to_s) { result }
+          result = template.render(self, {})
+        rescue Exception => e
+          annotate_exception! e
+          raise
+        end
+      end
+
+      result
+    end
+
+    # Returns a Base64-encoded `data:` URI with the contents of the
+    # asset at the specified path, and marks that path as a dependency
+    # of the current file.
+    #
+    # Use `asset_data_uri` from ERB with CSS or JavaScript assets:
+    #
+    #     #logo { background: url(<%= asset_data_uri 'logo.png' %>) }
+    #
+    #     $('<img>').attr('src', '<%= asset_data_uri 'avatar.jpg' %>')
+    #
+    def asset_data_uri(path)
+      depend_on_asset(path)
+      asset  = environment.find_asset(path)
+      base64 = Base64.encode64(asset.to_s).gsub(/\s+/, "")
+      "data:#{asset.content_type};base64,#{Rack::Utils.escape(base64)}"
+    end
+
+    # Expands logical path to full url to asset.
+    #
+    # NOTE: This helper is currently not implemented and should be
+    # customized by the application. Though, in the future, some
+    # basics implemention may be provided with different methods that
+    # are required to be overridden.
+    def asset_path(path, options = {})
+      message = <<-EOS
+Custom asset_path helper is not implemented
+
+Extend your environment context with a custom method.
+
+    environment.context_class.class_eval do
+      def asset_path(path, options = {})
+      end
+    end
+      EOS
+      raise NotImplementedError, message
+    end
+
+    # Expand logical image asset path.
+    def image_path(path)
+      asset_path(path, :type => :image)
+    end
+
+    # Expand logical video asset path.
+    def video_path(path)
+      asset_path(path, :type => :video)
+    end
+
+    # Expand logical audio asset path.
+    def audio_path(path)
+      asset_path(path, :type => :audio)
+    end
+
+    # Expand logical font asset path.
+    def font_path(path)
+      asset_path(path, :type => :font)
+    end
+
+    # Expand logical javascript asset path.
+    def javascript_path(path)
+      asset_path(path, :type => :javascript)
+    end
+
+    # Expand logical stylesheet asset path.
+    def stylesheet_path(path)
+      asset_path(path, :type => :stylesheet)
+    end
+
+    private
+      # Annotates exception backtrace with the original template that
+      # the exception was raised in.
+      def annotate_exception!(exception)
+        location = pathname.to_s
+        location << ":#{@__LINE__}" if @__LINE__
+
+        exception.extend(Sprockets::EngineError)
+        exception.sprockets_annotation = "  (in #{location})"
+      end
+
+      def logger
+        environment.logger
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/directive_processor.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/directive_processor.rb
new file mode 100644
index 0000000..5d29f32
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/directive_processor.rb
@@ -0,0 +1,408 @@
+require 'pathname'
+require 'shellwords'
+require 'tilt'
+require 'yaml'
+
+module Sprockets
+  # The `DirectiveProcessor` is responsible for parsing and evaluating
+  # directive comments in a source file.
+  #
+  # A directive comment starts with a comment prefix, followed by an "=",
+  # then the directive name, then any arguments.
+  #
+  #     // JavaScript
+  #     //= require "foo"
+  #
+  #     # CoffeeScript
+  #     #= require "bar"
+  #
+  #     /* CSS
+  #      *= require "baz"
+  #      */
+  #
+  # The Processor is implemented as a `Tilt::Template` and is loosely
+  # coupled to Sprockets. This makes it possible to disable or modify
+  # the processor to do whatever you'd like. You could add your own
+  # custom directives or invent your own directive syntax.
+  #
+  # `Environment#processors` includes `DirectiveProcessor` by default.
+  #
+  # To remove the processor entirely:
+  #
+  #     env.unregister_processor('text/css', Sprockets::DirectiveProcessor)
+  #     env.unregister_processor('application/javascript', Sprockets::DirectiveProcessor)
+  #
+  # Then inject your own preprocessor:
+  #
+  #     env.register_processor('text/css', MyProcessor)
+  #
+  class DirectiveProcessor < Tilt::Template
+    # Directives will only be picked up if they are in the header
+    # of the source file. C style (/* */), JavaScript (//), and
+    # Ruby (#) comments are supported.
+    #
+    # Directives in comments after the first non-whitespace line
+    # of code will not be processed.
+    #
+    HEADER_PATTERN = /
+      \A (
+        (?m:\s*) (
+          (\/\* (?m:.*?) \*\/) |
+          (\#\#\# (?m:.*?) \#\#\#) |
+          (\/\/ .* \n?)+ |
+          (\# .* \n?)+
+        )
+      )+
+    /x
+
+    # Directives are denoted by a `=` followed by the name, then
+    # argument list.
+    #
+    # A few different styles are allowed:
+    #
+    #     // =require foo
+    #     //= require foo
+    #     //= require "foo"
+    #
+    DIRECTIVE_PATTERN = /
+      ^ \W* = \s* (\w+.*?) (\*\/)? $
+    /x
+
+    attr_reader :pathname
+    attr_reader :header, :body
+
+    def prepare
+      @pathname = Pathname.new(file)
+
+      @header = data[HEADER_PATTERN, 0] || ""
+      @body   = $' || data
+      # Ensure body ends in a new line
+      @body  += "\n" if @body != "" && @body !~ /\n\Z/m
+
+      @included_pathnames = []
+      @compat             = false
+    end
+
+    # Implemented for Tilt#render.
+    #
+    # `context` is a `Context` instance with methods that allow you to
+    # access the environment and append to the bundle. See `Context`
+    # for the complete API.
+    def evaluate(context, locals, &block)
+      @context = context
+
+      @result = ""
+      @result.force_encoding(body.encoding) if body.respond_to?(:encoding)
+
+      @has_written_body = false
+
+      process_directives
+      process_source
+
+      @result
+    end
+
+    # Returns the header String with any directives stripped.
+    def processed_header
+      lineno = 0
+      @processed_header ||= header.lines.map { |line|
+        lineno += 1
+        # Replace directive line with a clean break
+        directives.assoc(lineno) ? "\n" : line
+      }.join.chomp
+    end
+
+    # Returns the source String with any directives stripped.
+    def processed_source
+      @processed_source ||= processed_header + body
+    end
+
+    # Returns an Array of directive structures. Each structure
+    # is an Array with the line number as the first element, the
+    # directive name as the second element, followed by any
+    # arguments.
+    #
+    #     [[1, "require", "foo"], [2, "require", "bar"]]
+    #
+    def directives
+      @directives ||= header.lines.each_with_index.map { |line, index|
+        if directive = line[DIRECTIVE_PATTERN, 1]
+          name, *args = Shellwords.shellwords(directive)
+          if respond_to?("process_#{name}_directive", true)
+            [index + 1, name, *args]
+          end
+        end
+      }.compact
+    end
+
+    protected
+      attr_reader :included_pathnames
+      attr_reader :context
+
+      # Gathers comment directives in the source and processes them.
+      # Any directive method matching `process_*_directive` will
+      # automatically be available. This makes it easy to extend the
+      # processor.
+      #
+      # To implement a custom directive called `require_glob`, subclass
+      # `Sprockets::DirectiveProcessor`, then add a method called
+      # `process_require_glob_directive`.
+      #
+      #     class DirectiveProcessor < Sprockets::DirectiveProcessor
+      #       def process_require_glob_directive
+      #         Dir["#{pathname.dirname}/#{glob}"].sort.each do |filename|
+      #           require(filename)
+      #         end
+      #       end
+      #     end
+      #
+      # Replace the current processor on the environment with your own:
+      #
+      #     env.unregister_processor('text/css', Sprockets::DirectiveProcessor)
+      #     env.register_processor('text/css', DirectiveProcessor)
+      #
+      def process_directives
+        directives.each do |line_number, name, *args|
+          context.__LINE__ = line_number
+          send("process_#{name}_directive", *args)
+          context.__LINE__ = nil
+        end
+      end
+
+      def process_source
+        unless @has_written_body || processed_header.empty?
+          @result << processed_header << "\n"
+        end
+
+        included_pathnames.each do |pathname|
+          @result << context.evaluate(pathname)
+        end
+
+        unless @has_written_body
+          @result << body
+        end
+
+        if compat? && constants.any?
+          @result.gsub!(/<%=(.*?)%>/) { constants[$1.strip] }
+        end
+      end
+
+      # The `require` directive functions similar to Ruby's own `require`.
+      # It provides a way to declare a dependency on a file in your path
+      # and ensures its only loaded once before the source file.
+      #
+      # `require` works with files in the environment path:
+      #
+      #     //= require "foo.js"
+      #
+      # Extensions are optional. If your source file is ".js", it
+      # assumes you are requiring another ".js".
+      #
+      #     //= require "foo"
+      #
+      # Relative paths work too. Use a leading `./` to denote a relative
+      # path:
+      #
+      #     //= require "./bar"
+      #
+      def process_require_directive(path)
+        if @compat
+          if path =~ /<([^>]+)>/
+            path = $1
+          else
+            path = "./#{path}" unless relative?(path)
+          end
+        end
+
+        context.require_asset(path)
+      end
+
+      # `require_self` causes the body of the current file to be
+      # inserted before any subsequent `require` or `include`
+      # directives. Useful in CSS files, where it's common for the
+      # index file to contain global styles that need to be defined
+      # before other dependencies are loaded.
+      #
+      #     /*= require "reset"
+      #      *= require_self
+      #      *= require_tree .
+      #      */
+      #
+      def process_require_self_directive
+        if @has_written_body
+          raise ArgumentError, "require_self can only be called once per source file"
+        end
+
+        context.require_asset(pathname)
+        process_source
+        included_pathnames.clear
+        @has_written_body = true
+      end
+
+      # The `include` directive works similar to `require` but
+      # inserts the contents of the dependency even if it already
+      # has been required.
+      #
+      #     //= include "header"
+      #
+      def process_include_directive(path)
+        pathname = context.resolve(path)
+        context.depend_on_asset(pathname)
+        included_pathnames << pathname
+      end
+
+      # `require_directory` requires all the files inside a single
+      # directory. It's similar to `path/*` since it does not follow
+      # nested directories.
+      #
+      #     //= require_directory "./javascripts"
+      #
+      def process_require_directory_directive(path = ".")
+        if relative?(path)
+          root = pathname.dirname.join(path).expand_path
+
+          unless (stats = stat(root)) && stats.directory?
+            raise ArgumentError, "require_directory argument must be a directory"
+          end
+
+          context.depend_on(root)
+
+          entries(root).each do |pathname|
+            pathname = root.join(pathname)
+            if pathname.to_s == self.file
+              next
+            elsif context.asset_requirable?(pathname)
+              context.require_asset(pathname)
+            end
+          end
+        else
+          # The path must be relative and start with a `./`.
+          raise ArgumentError, "require_directory argument must be a relative path"
+        end
+      end
+
+      # `require_tree` requires all the nested files in a directory.
+      # Its glob equivalent is `path/**/*`.
+      #
+      #     //= require_tree "./public"
+      #
+      def process_require_tree_directive(path = ".")
+        if relative?(path)
+          root = pathname.dirname.join(path).expand_path
+
+          unless (stats = stat(root)) && stats.directory?
+            raise ArgumentError, "require_tree argument must be a directory"
+          end
+
+          context.depend_on(root)
+
+          each_entry(root) do |pathname|
+            if pathname.to_s == self.file
+              next
+            elsif stat(pathname).directory?
+              context.depend_on(pathname)
+            elsif context.asset_requirable?(pathname)
+              context.require_asset(pathname)
+            end
+          end
+        else
+          # The path must be relative and start with a `./`.
+          raise ArgumentError, "require_tree argument must be a relative path"
+        end
+      end
+
+      # Allows you to state a dependency on a file without
+      # including it.
+      #
+      # This is used for caching purposes. Any changes made to
+      # the dependency file will invalidate the cache of the
+      # source file.
+      #
+      # This is useful if you are using ERB and File.read to pull
+      # in contents from another file.
+      #
+      #     //= depend_on "foo.png"
+      #
+      def process_depend_on_directive(path)
+        context.depend_on(path)
+      end
+
+      # Allows you to state a dependency on an asset without including
+      # it.
+      #
+      # This is used for caching purposes. Any changes that would
+      # invalid the asset dependency will invalidate the cache our the
+      # source file.
+      #
+      # Unlike `depend_on`, the path must be a requirable asset.
+      #
+      #     //= depend_on_asset "bar.js"
+      #
+      def process_depend_on_asset_directive(path)
+        context.depend_on_asset(path)
+      end
+
+      # Allows dependency to be excluded from the asset bundle.
+      #
+      # The `path` must be a valid asset and may or may not already
+      # be part of the bundle. Once stubbed, it is blacklisted and
+      # can't be brought back by any other `require`.
+      #
+      #     //= stub "jquery"
+      #
+      def process_stub_directive(path)
+        context.stub_asset(path)
+      end
+
+      # Enable Sprockets 1.x compat mode.
+      #
+      # Makes it possible to use the same JavaScript source
+      # file in both Sprockets 1 and 2.
+      #
+      #     //= compat
+      #
+      def process_compat_directive
+        @compat = true
+      end
+
+      # Checks if Sprockets 1.x compat mode enabled
+      def compat?
+        @compat
+      end
+
+      # Sprockets 1.x allowed for constant interpolation if a
+      # constants.yml was present. This is only available if
+      # compat mode is on.
+      def constants
+        if compat?
+          pathname = Pathname.new(context.root_path).join("constants.yml")
+          stat(pathname) ? YAML.load_file(pathname) : {}
+        else
+          {}
+        end
+      end
+
+      # `provide` is stubbed out for Sprockets 1.x compat.
+      # Mutating the path when an asset is being built is
+      # not permitted.
+      def process_provide_directive(path)
+      end
+
+    private
+      def relative?(path)
+        path =~ /^\.($|\.?\/)/
+      end
+
+      def stat(path)
+        context.environment.stat(path)
+      end
+
+      def entries(path)
+        context.environment.entries(path)
+      end
+
+      def each_entry(root, &block)
+        context.environment.each_entry(root, &block)
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/eco_template.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/eco_template.rb
new file mode 100644
index 0000000..da003cc
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/eco_template.rb
@@ -0,0 +1,38 @@
+require 'tilt'
+
+module Sprockets
+  # Tilt engine class for the Eco compiler. Depends on the `eco` gem.
+  #
+  # For more infomation see:
+  #
+  #   https://github.com/sstephenson/ruby-eco
+  #   https://github.com/sstephenson/eco
+  #
+  class EcoTemplate < Tilt::Template
+    # Check to see if Eco is loaded
+    def self.engine_initialized?
+      defined? ::Eco
+    end
+
+    # Autoload eco library. If the library isn't loaded, Tilt will produce
+    # a thread safetly warning. If you intend to use `.eco` files, you
+    # should explicitly require it.
+    def initialize_engine
+      require_template_library 'eco'
+    end
+
+    def prepare
+    end
+
+    # Compile template data with Eco compiler.
+    #
+    # Returns a JS function definition String. The result should be
+    # assigned to a JS variable.
+    #
+    #     # => "function(...) {...}"
+    #
+    def evaluate(scope, locals, &block)
+      Eco.compile(data)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/ejs_template.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/ejs_template.rb
new file mode 100644
index 0000000..65ddaa6
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/ejs_template.rb
@@ -0,0 +1,37 @@
+require 'tilt'
+
+module Sprockets
+  # Tilt engine class for the EJS compiler. Depends on the `ejs` gem.
+  #
+  # For more infomation see:
+  #
+  #   https://github.com/sstephenson/ruby-ejs
+  #
+  class EjsTemplate < Tilt::Template
+    # Check to see if EJS is loaded
+    def self.engine_initialized?
+      defined? ::EJS
+    end
+
+    # Autoload ejs library. If the library isn't loaded, Tilt will produce
+    # a thread safetly warning. If you intend to use `.ejs` files, you
+    # should explicitly require it.
+    def initialize_engine
+      require_template_library 'ejs'
+    end
+
+    def prepare
+    end
+
+    # Compile template data with EJS compiler.
+    #
+    # Returns a JS function definition String. The result should be
+    # assigned to a JS variable.
+    #
+    #     # => "function(obj){...}"
+    #
+    def evaluate(scope, locals, &block)
+      EJS.compile(data)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/engines.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/engines.rb
new file mode 100644
index 0000000..6a5b28f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/engines.rb
@@ -0,0 +1,74 @@
+require 'sprockets/eco_template'
+require 'sprockets/ejs_template'
+require 'sprockets/jst_processor'
+require 'sprockets/utils'
+require 'tilt'
+
+module Sprockets
+  # `Engines` provides a global and `Environment` instance registry.
+  #
+  # An engine is a type of processor that is bound to an filename
+  # extension. `application.js.coffee` indicates that the
+  # `CoffeeScriptTemplate` engine will be ran on the file.
+  #
+  # Extensions can be stacked and will be evaulated from right to
+  # left. `application.js.coffee.erb` will first run `ERBTemplate`
+  # then `CoffeeScriptTemplate`.
+  #
+  # All `Engine`s must follow the `Tilt::Template` interface. It is
+  # recommended to subclass `Tilt::Template`.
+  #
+  # Its recommended that you register engine changes on your local
+  # `Environment` instance.
+  #
+  #     environment.register_engine '.foo', FooProcessor
+  #
+  # The global registry is exposed for plugins to register themselves.
+  #
+  #     Sprockets.register_engine '.sass', SassTemplate
+  #
+  module Engines
+    # Returns a `Hash` of `Engine`s registered on the `Environment`.
+    # If an `ext` argument is supplied, the `Engine` associated with
+    # that extension will be returned.
+    #
+    #     environment.engines
+    #     # => {".coffee" => CoffeeScriptTemplate, ".sass" => SassTemplate, ...}
+    #
+    #     environment.engines('.coffee')
+    #     # => CoffeeScriptTemplate
+    #
+    def engines(ext = nil)
+      if ext
+        ext = Sprockets::Utils.normalize_extension(ext)
+        @engines[ext]
+      else
+        @engines.dup
+      end
+    end
+
+    # Returns an `Array` of engine extension `String`s.
+    #
+    #     environment.engine_extensions
+    #     # => ['.coffee', '.sass', ...]
+    def engine_extensions
+      @engines.keys
+    end
+
+    # Registers a new Engine `klass` for `ext`. If the `ext` already
+    # has an engine registered, it will be overridden.
+    #
+    #     environment.register_engine '.coffee', CoffeeScriptTemplate
+    #
+    def register_engine(ext, klass)
+      ext = Sprockets::Utils.normalize_extension(ext)
+      @engines[ext] = klass
+    end
+
+    private
+      def deep_copy_hash(hash)
+        initial = Hash.new { |h, k| h[k] = [] }
+        hash.inject(initial) { |h, (k, a)| h[k] = a.dup; h }
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/environment.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/environment.rb
new file mode 100644
index 0000000..874c66a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/environment.rb
@@ -0,0 +1,88 @@
+require 'sprockets/base'
+require 'sprockets/context'
+require 'sprockets/index'
+
+require 'hike'
+require 'logger'
+require 'pathname'
+require 'tilt'
+
+module Sprockets
+  class Environment < Base
+    # `Environment` should initialized with your application's root
+    # directory. This should be the same as your Rails or Rack root.
+    #
+    #     env = Environment.new(Rails.root)
+    #
+    def initialize(root = ".")
+      @trail = Hike::Trail.new(root)
+
+      self.logger = Logger.new($stderr)
+      self.logger.level = Logger::FATAL
+
+      if respond_to?(:default_external_encoding)
+        self.default_external_encoding = Encoding::UTF_8
+      end
+
+      # Create a safe `Context` subclass to mutate
+      @context_class = Class.new(Context)
+
+      # Set MD5 as the default digest
+      require 'digest/md5'
+      @digest_class = ::Digest::MD5
+      @version = ''
+
+      @mime_types        = Sprockets.registered_mime_types
+      @engines           = Sprockets.engines
+      @preprocessors     = Sprockets.preprocessors
+      @postprocessors    = Sprockets.postprocessors
+      @bundle_processors = Sprockets.bundle_processors
+      @compressors       = Sprockets.compressors
+
+      Sprockets.paths.each do |path|
+        append_path(path)
+      end
+
+      @engines.each do |ext, klass|
+        add_engine_to_trail(ext, klass)
+      end
+
+      @mime_types.each do |ext, type|
+        @trail.append_extension(ext)
+      end
+
+      expire_index!
+
+      yield self if block_given?
+    end
+
+    # Returns a cached version of the environment.
+    #
+    # All its file system calls are cached which makes `index` much
+    # faster. This behavior is ideal in production since the file
+    # system only changes between deploys.
+    def index
+      Index.new(self)
+    end
+
+    # Cache `find_asset` calls
+    def find_asset(path, options = {})
+      options[:bundle] = true unless options.key?(:bundle)
+
+      # Ensure inmemory cached assets are still fresh on every lookup
+      if (asset = @assets[cache_key_for(path, options)]) && asset.fresh?(self)
+        asset
+      elsif asset = index.find_asset(path, options)
+        # Cache is pushed upstream by Index#find_asset
+        asset
+      end
+    end
+
+    protected
+      def expire_index!
+        # Clear digest to be recomputed
+        @digest = nil
+        @assets = {}
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/errors.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/errors.rb
new file mode 100644
index 0000000..f7a00c4
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/errors.rb
@@ -0,0 +1,20 @@
+# Define some basic Sprockets error classes
+module Sprockets
+  class Error           < StandardError; end
+  class ArgumentError           < Error; end
+  class CircularDependencyError < Error; end
+  class ContentTypeMismatch     < Error; end
+  class EncodingError           < Error; end
+  class FileNotFound            < Error; end
+  class FileOutsidePaths        < Error; end
+  class NotImplementedError     < Error; end
+  class UnserializeError        < Error; end
+
+  module EngineError
+    attr_accessor :sprockets_annotation
+
+    def message
+      [super, sprockets_annotation].compact.join("\n")
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/index.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/index.rb
new file mode 100644
index 0000000..8aa6ad6
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/index.rb
@@ -0,0 +1,100 @@
+require 'sprockets/base'
+
+module Sprockets
+  # `Index` is a special cached version of `Environment`.
+  #
+  # The expection is that all of its file system methods are cached
+  # for the instances lifetime. This makes `Index` much faster. This
+  # behavior is ideal in production environments where the file system
+  # is immutable.
+  #
+  # `Index` should not be initialized directly. Instead use
+  # `Environment#index`.
+  class Index < Base
+    def initialize(environment)
+      @environment = environment
+
+      if environment.respond_to?(:default_external_encoding)
+        @default_external_encoding = environment.default_external_encoding
+      end
+
+      # Copy environment attributes
+      @logger            = environment.logger
+      @context_class     = environment.context_class
+      @cache             = environment.cache
+      @trail             = environment.trail.index
+      @digest            = environment.digest
+      @digest_class      = environment.digest_class
+      @version           = environment.version
+      @mime_types        = environment.mime_types
+      @engines           = environment.engines
+      @preprocessors     = environment.preprocessors
+      @postprocessors    = environment.postprocessors
+      @bundle_processors = environment.bundle_processors
+      @compressors       = environment.compressors
+
+      # Initialize caches
+      @assets  = {}
+      @digests = {}
+    end
+
+    # No-op return self as index
+    def index
+      self
+    end
+
+    # Cache calls to `file_digest`
+    def file_digest(pathname)
+      key = pathname.to_s
+      if @digests.key?(key)
+        @digests[key]
+      else
+        @digests[key] = super
+      end
+    end
+
+    # Cache `find_asset` calls
+    def find_asset(path, options = {})
+      options[:bundle] = true unless options.key?(:bundle)
+      if asset = @assets[cache_key_for(path, options)]
+        asset
+      elsif asset = super
+        logical_path_cache_key = cache_key_for(path, options)
+        full_path_cache_key    = cache_key_for(asset.pathname, options)
+
+        # Cache on Index
+        @assets[logical_path_cache_key] = @assets[full_path_cache_key] = asset
+
+        # Push cache upstream to Environment
+        @environment.instance_eval do
+          @assets[logical_path_cache_key] = @assets[full_path_cache_key] = asset
+        end
+
+        asset
+      end
+    end
+
+    protected
+      # Index is immutable, any methods that try to clear the cache
+      # should bomb.
+      def expire_index!
+        raise TypeError, "can't modify immutable index"
+      end
+
+      # Cache asset building in memory and in persisted cache.
+      def build_asset(path, pathname, options)
+        # Memory cache
+        key = cache_key_for(pathname, options)
+        if @assets.key?(key)
+          @assets[key]
+        else
+          @assets[key] = begin
+            # Persisted cache
+            cache_asset(key) do
+              super
+            end
+          end
+        end
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/jst_processor.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/jst_processor.rb
new file mode 100644
index 0000000..4d85915
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/jst_processor.rb
@@ -0,0 +1,29 @@
+require 'tilt'
+
+module Sprockets
+  class JstProcessor < Tilt::Template
+    self.default_mime_type = 'application/javascript'
+
+    def self.default_namespace
+      'this.JST'
+    end
+
+    def prepare
+      @namespace = self.class.default_namespace
+    end
+
+    attr_reader :namespace
+
+    def evaluate(scope, locals, &block)
+      <<-JST
+(function() { #{namespace} || (#{namespace} = {}); #{namespace}[#{scope.logical_path.inspect}] = #{indent(data)};
+}).call(this);
+      JST
+    end
+
+    private
+      def indent(string)
+        string.gsub(/$(.)/m, "\\1  ").strip
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/manifest.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/manifest.rb
new file mode 100644
index 0000000..dcc30ba
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/manifest.rb
@@ -0,0 +1,261 @@
+require 'multi_json'
+require 'securerandom'
+require 'time'
+
+module Sprockets
+  # The Manifest logs the contents of assets compiled to a single
+  # directory. It records basic attributes about the asset for fast
+  # lookup without having to compile. A pointer from each logical path
+  # indicates with fingerprinted asset is the current one.
+  #
+  # The JSON is part of the public API and should be considered
+  # stable. This should make it easy to read from other programming
+  # languages and processes that don't have sprockets loaded. See
+  # `#assets` and `#files` for more infomation about the structure.
+  class Manifest
+    attr_reader :environment, :path, :dir
+
+    # Create new Manifest associated with an `environment`. `path` is
+    # a full path to the manifest json file. The file may or may not
+    # already exist. The dirname of the `path` will be used to write
+    # compiled assets to. Otherwise, if the path is a directory, the
+    # filename will default a random "manifest-123.json" file in that
+    # directory.
+    #
+    #   Manifest.new(environment, "./public/assets/manifest.json")
+    #
+    def initialize(*args)
+      if args.first.is_a?(Base) || args.first.nil?
+        @environment = args.shift
+      end
+
+      @dir, @path = args[0], args[1]
+
+      # Expand paths
+      @dir  = File.expand_path(@dir) if @dir
+      @path = File.expand_path(@path) if @path
+
+      # If path is given as the second arg
+      if @dir && File.extname(@dir) != ""
+        @dir, @path = nil, @dir
+      end
+
+      # Default dir to the directory of the path
+      @dir ||= File.dirname(@path) if @path
+
+      # If directory is given w/o path, pick a random manifest.json location
+      if @dir && @path.nil?
+        # Find the first manifest.json in the directory
+        paths = Dir[File.join(@dir, "manifest*.json")]
+        if paths.any?
+          @path = paths.first
+        else
+          @path = File.join(@dir, "manifest-#{SecureRandom.hex(16)}.json")
+        end
+      end
+
+      unless @dir && @path
+        raise ArgumentError, "manifest requires output path"
+      end
+
+      data = nil
+
+      begin
+        if File.exist?(@path)
+          data = json_decode(File.read(@path))
+        end
+      rescue MultiJson::DecodeError => e
+        logger.error "#{@path} is invalid: #{e.class} #{e.message}"
+      end
+
+      @data = data.is_a?(Hash) ? data : {}
+    end
+
+    # Returns internal assets mapping. Keys are logical paths which
+    # map to the latest fingerprinted filename.
+    #
+    #   Logical path (String): Fingerprint path (String)
+    #
+    #   { "application.js" => "application-2e8e9a7c6b0aafa0c9bdeec90ea30213.js",
+    #     "jquery.js"      => "jquery-ae0908555a245f8266f77df5a8edca2e.js" }
+    #
+    def assets
+      @data['assets'] ||= {}
+    end
+
+    # Returns internal file directory listing. Keys are filenames
+    # which map to an attributes array.
+    #
+    #   Fingerprint path (String):
+    #     logical_path: Logical path (String)
+    #     mtime: ISO8601 mtime (String)
+    #     digest: Base64 hex digest (String)
+    #
+    #  { "application-2e8e9a7c6b0aafa0c9bdeec90ea30213.js" =>
+    #      { 'logical_path' => "application.js",
+    #        'mtime' => "2011-12-13T21:47:08-06:00",
+    #        'digest' => "2e8e9a7c6b0aafa0c9bdeec90ea30213" } }
+    #
+    def files
+      @data['files'] ||= {}
+    end
+
+    # Compile and write asset to directory. The asset is written to a
+    # fingerprinted filename like
+    # `application-2e8e9a7c6b0aafa0c9bdeec90ea30213.js`. An entry is
+    # also inserted into the manifest file.
+    #
+    #   compile("application.js")
+    #
+    def compile(*args)
+      unless environment
+        raise Error, "manifest requires environment for compilation"
+      end
+
+      paths = environment.each_logical_path(*args).to_a +
+        args.flatten.select { |fn| Pathname.new(fn).absolute? if fn.is_a?(String)}
+
+      paths.each do |path|
+        if asset = find_asset(path)
+          files[asset.digest_path] = {
+            'logical_path' => asset.logical_path,
+            'mtime'        => asset.mtime.iso8601,
+            'size'         => asset.bytesize,
+            'digest'       => asset.digest
+          }
+          assets[asset.logical_path] = asset.digest_path
+
+          target = File.join(dir, asset.digest_path)
+
+          if File.exist?(target)
+            logger.debug "Skipping #{target}, already exists"
+          else
+            logger.info "Writing #{target}"
+            asset.write_to target
+            asset.write_to "#{target}.gz" if asset.is_a?(BundledAsset)
+          end
+
+          save
+          asset
+        end
+      end
+    end
+
+    # Removes file from directory and from manifest. `filename` must
+    # be the name with any directory path.
+    #
+    #   manifest.remove("application-2e8e9a7c6b0aafa0c9bdeec90ea30213.js")
+    #
+    def remove(filename)
+      path = File.join(dir, filename)
+      gzip = "#{path}.gz"
+      logical_path = files[filename]['logical_path']
+
+      if assets[logical_path] == filename
+        assets.delete(logical_path)
+      end
+
+      files.delete(filename)
+      FileUtils.rm(path) if File.exist?(path)
+      FileUtils.rm(gzip) if File.exist?(gzip)
+
+      save
+
+      logger.info "Removed #{filename}"
+
+      nil
+    end
+
+    # Cleanup old assets in the compile directory. By default it will
+    # keep the latest version plus 2 backups.
+    def clean(keep = 2)
+      self.assets.keys.each do |logical_path|
+        # Get assets sorted by ctime, newest first
+        assets = backups_for(logical_path)
+
+        # Keep the last N backups
+        assets = assets[keep..-1] || []
+
+        # Remove old assets
+        assets.each { |path, _| remove(path) }
+      end
+    end
+
+    # Wipe directive
+    def clobber
+      FileUtils.rm_r(@dir) if File.exist?(@dir)
+      logger.info "Removed #{@dir}"
+      nil
+    end
+
+    protected
+      # Finds all the backup assets for a logical path. The latest
+      # version is always excluded. The return array is sorted by the
+      # assets mtime in descending order (Newest to oldest).
+      def backups_for(logical_path)
+        files.select { |filename, attrs|
+          # Matching logical paths
+          attrs['logical_path'] == logical_path &&
+            # Excluding whatever asset is the current
+            assets[logical_path] != filename
+        }.sort_by { |filename, attrs|
+          # Sort by timestamp
+          Time.parse(attrs['mtime'])
+        }.reverse
+      end
+
+      # Basic wrapper around Environment#find_asset. Logs compile time.
+      def find_asset(logical_path)
+        asset = nil
+        ms = benchmark do
+          asset = environment.find_asset(logical_path)
+        end
+        logger.debug "Compiled #{logical_path}  (#{ms}ms)"
+        asset
+      end
+
+      # Persist manfiest back to FS
+      def save
+        FileUtils.mkdir_p dir
+        File.open(path, 'w') do |f|
+          f.write json_encode(@data)
+        end
+      end
+
+    private
+      # Feature detect newer MultiJson API
+      if MultiJson.respond_to?(:dump)
+        def json_decode(obj)
+          MultiJson.load(obj)
+        end
+
+        def json_encode(obj)
+          MultiJson.dump(obj)
+        end
+      else
+        def json_decode(obj)
+          MultiJson.decode(obj)
+        end
+
+        def json_encode(obj)
+          MultiJson.encode(obj)
+        end
+      end
+
+      def logger
+        if environment
+          environment.logger
+        else
+          logger = Logger.new($stderr)
+          logger.level = Logger::FATAL
+          logger
+        end
+      end
+
+      def benchmark
+        start_time = Time.now.to_f
+        yield
+        ((Time.now.to_f - start_time) * 1000).to_i
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/mime.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/mime.rb
new file mode 100644
index 0000000..d4949bb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/mime.rb
@@ -0,0 +1,49 @@
+require 'rack/mime'
+
+module Sprockets
+  module Mime
+    # Returns a `Hash` of registered mime types registered on the
+    # environment and those part of `Rack::Mime`.
+    #
+    # If an `ext` is given, it will lookup the mime type for that extension.
+    def mime_types(ext = nil)
+      if ext.nil?
+        Rack::Mime::MIME_TYPES.merge(@mime_types)
+      else
+        ext = Sprockets::Utils.normalize_extension(ext)
+        @mime_types[ext] || Rack::Mime::MIME_TYPES[ext]
+      end
+    end
+
+    # Returns a `Hash` of explicitly registered mime types.
+    def registered_mime_types
+      @mime_types.dup
+    end
+
+    if {}.respond_to?(:key)
+      def extension_for_mime_type(type)
+        mime_types.key(type)
+      end
+    else
+      def extension_for_mime_type(type)
+        mime_types.index(type)
+      end
+    end
+
+    # Register a new mime type.
+    def register_mime_type(mime_type, ext)
+      ext = Sprockets::Utils.normalize_extension(ext)
+      @mime_types[ext] = mime_type
+    end
+
+    if defined? Encoding
+      # Returns the correct encoding for a given mime type, while falling
+      # back on the default external encoding, if it exists.
+      def encoding_for_mime_type(type)
+        encoding = Encoding::BINARY if type =~ %r{^(image|audio|video)/}
+        encoding ||= default_external_encoding if respond_to?(:default_external_encoding)
+        encoding
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/paths.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/paths.rb
new file mode 100644
index 0000000..f17b801
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/paths.rb
@@ -0,0 +1,58 @@
+module Sprockets
+  module Paths
+    # Returns `Environment` root.
+    #
+    # All relative paths are expanded with root as its base. To be
+    # useful set this to your applications root directory. (`Rails.root`)
+    def root
+      @trail.root.dup
+    end
+
+    # Returns an `Array` of path `String`s.
+    #
+    # These paths will be used for asset logical path lookups.
+    #
+    # Note that a copy of the `Array` is returned so mutating will
+    # have no affect on the environment. See `append_path`,
+    # `prepend_path`, and `clear_paths`.
+    def paths
+      @trail.paths.dup
+    end
+
+    # Prepend a `path` to the `paths` list.
+    #
+    # Paths at the end of the `Array` have the least priority.
+    def prepend_path(path)
+      @trail.prepend_path(path)
+    end
+
+    # Append a `path` to the `paths` list.
+    #
+    # Paths at the beginning of the `Array` have a higher priority.
+    def append_path(path)
+      @trail.append_path(path)
+    end
+
+    # Clear all paths and start fresh.
+    #
+    # There is no mechanism for reordering paths, so its best to
+    # completely wipe the paths list and reappend them in the order
+    # you want.
+    def clear_paths
+      @trail.paths.dup.each { |path| @trail.remove_path(path) }
+    end
+
+    # Returns an `Array` of extensions.
+    #
+    # These extensions maybe omitted from logical path searches.
+    #
+    #     # => [".js", ".css", ".coffee", ".sass", ...]
+    #
+    def extensions
+      @trail.extensions.dup
+    end
+
+    protected
+      attr_reader :trail
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/processed_asset.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/processed_asset.rb
new file mode 100644
index 0000000..1793675
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/processed_asset.rb
@@ -0,0 +1,152 @@
+require 'sprockets/asset'
+require 'sprockets/utils'
+
+module Sprockets
+  class ProcessedAsset < Asset
+    def initialize(environment, logical_path, pathname)
+      super
+
+      start_time = Time.now.to_f
+
+      context = environment.context_class.new(environment, logical_path, pathname)
+      @source = context.evaluate(pathname)
+      @length = Rack::Utils.bytesize(source)
+      @digest = environment.digest.update(source).hexdigest
+
+      build_required_assets(environment, context)
+      build_dependency_paths(environment, context)
+
+      @dependency_digest = compute_dependency_digest(environment)
+
+      elapsed_time = ((Time.now.to_f - start_time) * 1000).to_i
+      environment.logger.debug "Compiled #{logical_path}  (#{elapsed_time}ms)  (pid #{Process.pid})"
+    end
+
+    # Interal: Used to check equality
+    attr_reader :dependency_digest
+
+    attr_reader :source
+
+    # Initialize `BundledAsset` from serialized `Hash`.
+    def init_with(environment, coder)
+      super
+
+      @source = coder['source']
+      @dependency_digest = coder['dependency_digest']
+
+      @required_assets = coder['required_paths'].map { |p|
+        p = expand_root_path(p)
+
+        unless environment.paths.detect { |path| p[path] }
+          raise UnserializeError, "#{p} isn't in paths"
+        end
+
+        p == pathname.to_s ? self : environment.find_asset(p, :bundle => false)
+      }
+      @dependency_paths = coder['dependency_paths'].map { |h|
+        DependencyFile.new(expand_root_path(h['path']), h['mtime'], h['digest'])
+      }
+    end
+
+    # Serialize custom attributes in `BundledAsset`.
+    def encode_with(coder)
+      super
+
+      coder['source'] = source
+      coder['dependency_digest'] = dependency_digest
+
+      coder['required_paths'] = required_assets.map { |a|
+        relativize_root_path(a.pathname).to_s
+      }
+      coder['dependency_paths'] = dependency_paths.map { |d|
+        { 'path' => relativize_root_path(d.pathname).to_s,
+          'mtime' => d.mtime.iso8601,
+          'digest' => d.digest }
+      }
+    end
+
+    # Checks if Asset is stale by comparing the actual mtime and
+    # digest to the inmemory model.
+    def fresh?(environment)
+      # Check freshness of all declared dependencies
+      @dependency_paths.all? { |dep| dependency_fresh?(environment, dep) }
+    end
+
+    protected
+      class DependencyFile < Struct.new(:pathname, :mtime, :digest)
+        def initialize(pathname, mtime, digest)
+          pathname = Pathname.new(pathname) unless pathname.is_a?(Pathname)
+          mtime    = Time.parse(mtime) if mtime.is_a?(String)
+          super
+        end
+
+        def eql?(other)
+          other.is_a?(DependencyFile) &&
+            pathname.eql?(other.pathname) &&
+            mtime.eql?(other.mtime) &&
+            digest.eql?(other.digest)
+        end
+
+        def hash
+          pathname.to_s.hash
+        end
+      end
+
+    private
+      def build_required_assets(environment, context)
+        @required_assets = resolve_dependencies(environment, context._required_paths + [pathname.to_s]) -
+          resolve_dependencies(environment, context._stubbed_assets.to_a)
+      end
+
+      def resolve_dependencies(environment, paths)
+        assets = []
+        cache  = {}
+
+        paths.each do |path|
+          if path == self.pathname.to_s
+            unless cache[self]
+              cache[self] = true
+              assets << self
+            end
+          elsif asset = environment.find_asset(path, :bundle => false)
+            asset.required_assets.each do |asset_dependency|
+              unless cache[asset_dependency]
+                cache[asset_dependency] = true
+                assets << asset_dependency
+              end
+            end
+          end
+        end
+
+        assets
+      end
+
+      def build_dependency_paths(environment, context)
+        dependency_paths = {}
+
+        context._dependency_paths.each do |path|
+          dep = DependencyFile.new(path, environment.stat(path).mtime, environment.file_digest(path).hexdigest)
+          dependency_paths[dep] = true
+        end
+
+        context._dependency_assets.each do |path|
+          if path == self.pathname.to_s
+            dep = DependencyFile.new(pathname, environment.stat(path).mtime, environment.file_digest(path).hexdigest)
+            dependency_paths[dep] = true
+          elsif asset = environment.find_asset(path, :bundle => false)
+            asset.dependency_paths.each do |d|
+              dependency_paths[d] = true
+            end
+          end
+        end
+
+        @dependency_paths = dependency_paths.keys
+      end
+
+      def compute_dependency_digest(environment)
+        required_assets.inject(environment.digest) { |digest, asset|
+          digest.update asset.digest
+        }.hexdigest
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/processing.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/processing.rb
new file mode 100644
index 0000000..faeb4e9
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/processing.rb
@@ -0,0 +1,206 @@
+require 'sprockets/engines'
+require 'sprockets/mime'
+require 'sprockets/processor'
+require 'sprockets/utils'
+
+module Sprockets
+  # `Processing` is an internal mixin whose public methods are exposed on
+  # the `Environment` and `Index` classes.
+  module Processing
+    # Returns an `Array` of format extension `String`s.
+    #
+    #     format_extensions
+    #     # => ['.js', '.css']
+    #
+    def format_extensions
+      @trail.extensions - @engines.keys
+    end
+
+    # Deprecated alias for `preprocessors`.
+    def processors(*args)
+      preprocessors(*args)
+    end
+
+    # Returns an `Array` of `Processor` classes. If a `mime_type`
+    # argument is supplied, the processors registered under that
+    # extension will be returned.
+    #
+    # Preprocessors are ran before Postprocessors and Engine
+    # processors.
+    #
+    # All `Processor`s must follow the `Tilt::Template` interface. It is
+    # recommended to subclass `Tilt::Template`.
+    def preprocessors(mime_type = nil)
+      if mime_type
+        @preprocessors[mime_type].dup
+      else
+        deep_copy_hash(@preprocessors)
+      end
+    end
+
+    # Returns an `Array` of `Processor` classes. If a `mime_type`
+    # argument is supplied, the processors registered under that
+    # extension will be returned.
+    #
+    # Postprocessors are ran after Preprocessors and Engine processors.
+    #
+    # All `Processor`s must follow the `Tilt::Template` interface. It is
+    # recommended to subclass `Tilt::Template`.
+    def postprocessors(mime_type = nil)
+      if mime_type
+        @postprocessors[mime_type].dup
+      else
+        deep_copy_hash(@postprocessors)
+      end
+    end
+
+    # Deprecated alias for `register_preprocessor`.
+    def register_processor(*args, &block)
+      register_preprocessor(*args, &block)
+    end
+
+    # Registers a new Preprocessor `klass` for `mime_type`.
+    #
+    #     register_preprocessor 'text/css', Sprockets::DirectiveProcessor
+    #
+    # A block can be passed for to create a shorthand processor.
+    #
+    #     register_preprocessor 'text/css', :my_processor do |context, data|
+    #       data.gsub(...)
+    #     end
+    #
+    def register_preprocessor(mime_type, klass, &block)
+      if block_given?
+        name  = klass.to_s
+        klass = Class.new(Processor) do
+          @name      = name
+          @processor = block
+        end
+      end
+
+      @preprocessors[mime_type].push(klass)
+    end
+
+    # Registers a new Postprocessor `klass` for `mime_type`.
+    #
+    #     register_postprocessor 'text/css', Sprockets::CharsetNormalizer
+    #
+    # A block can be passed for to create a shorthand processor.
+    #
+    #     register_postprocessor 'text/css', :my_processor do |context, data|
+    #       data.gsub(...)
+    #     end
+    #
+    def register_postprocessor(mime_type, klass, &block)
+      if block_given?
+        name  = klass.to_s
+        klass = Class.new(Processor) do
+          @name      = name
+          @processor = block
+        end
+      end
+
+      @postprocessors[mime_type].push(klass)
+    end
+
+    # Deprecated alias for `unregister_preprocessor`.
+    def unregister_processor(*args)
+      unregister_preprocessor(*args)
+    end
+
+    # Remove Preprocessor `klass` for `mime_type`.
+    #
+    #     unregister_preprocessor 'text/css', Sprockets::DirectiveProcessor
+    #
+    def unregister_preprocessor(mime_type, klass)
+      if klass.is_a?(String) || klass.is_a?(Symbol)
+        klass = @preprocessors[mime_type].detect { |cls|
+          cls.respond_to?(:name) &&
+            cls.name == "Sprockets::Processor (#{klass})"
+        }
+      end
+
+      @preprocessors[mime_type].delete(klass)
+    end
+
+    # Remove Postprocessor `klass` for `mime_type`.
+    #
+    #     unregister_postprocessor 'text/css', Sprockets::DirectiveProcessor
+    #
+    def unregister_postprocessor(mime_type, klass)
+      if klass.is_a?(String) || klass.is_a?(Symbol)
+        klass = @postprocessors[mime_type].detect { |cls|
+          cls.respond_to?(:name) &&
+            cls.name == "Sprockets::Processor (#{klass})"
+        }
+      end
+
+      @postprocessors[mime_type].delete(klass)
+    end
+
+    # Returns an `Array` of `Processor` classes. If a `mime_type`
+    # argument is supplied, the processors registered under that
+    # extension will be returned.
+    #
+    # Bundle Processors are ran on concatenated assets rather than
+    # individual files.
+    #
+    # All `Processor`s must follow the `Tilt::Template` interface. It is
+    # recommended to subclass `Tilt::Template`.
+    def bundle_processors(mime_type = nil)
+      if mime_type
+        @bundle_processors[mime_type].dup
+      else
+        deep_copy_hash(@bundle_processors)
+      end
+    end
+
+    # Registers a new Bundle Processor `klass` for `mime_type`.
+    #
+    #     register_bundle_processor  'text/css', Sprockets::CharsetNormalizer
+    #
+    # A block can be passed for to create a shorthand processor.
+    #
+    #     register_bundle_processor :my_processor do |context, data|
+    #       data.gsub(...)
+    #     end
+    #
+    def register_bundle_processor(mime_type, klass, &block)
+      if block_given?
+        name  = klass.to_s
+        klass = Class.new(Processor) do
+          @name      = name
+          @processor = block
+        end
+      end
+
+      @bundle_processors[mime_type].push(klass)
+    end
+
+    # Remove Bundle Processor `klass` for `mime_type`.
+    #
+    #     unregister_bundle_processor 'text/css', Sprockets::CharsetNormalizer
+    #
+    def unregister_bundle_processor(mime_type, klass)
+      if klass.is_a?(String) || klass.is_a?(Symbol)
+        klass = @bundle_processors[mime_type].detect { |cls|
+          cls.respond_to?(:name) &&
+            cls.name == "Sprockets::Processor (#{klass})"
+        }
+      end
+
+      @bundle_processors[mime_type].delete(klass)
+    end
+
+    private
+      def add_engine_to_trail(ext, klass)
+        @trail.append_extension(ext.to_s)
+
+        if klass.respond_to?(:default_mime_type) && klass.default_mime_type
+          if format_ext = extension_for_mime_type(klass.default_mime_type)
+            @trail.alias_extension(ext.to_s, format_ext)
+          end
+        end
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/processor.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/processor.rb
new file mode 100644
index 0000000..6da376d
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/processor.rb
@@ -0,0 +1,32 @@
+require 'tilt'
+
+module Sprockets
+  # `Processor` creates an anonymous processor class from a block.
+  #
+  #     register_preprocessor :my_processor do |context, data|
+  #       # ...
+  #     end
+  #
+  class Processor < Tilt::Template
+    # `processor` is a lambda or block
+    def self.processor
+      @processor
+    end
+
+    def self.name
+      "Sprockets::Processor (#{@name})"
+    end
+
+    def self.to_s
+      name
+    end
+
+    def prepare
+    end
+
+    # Call processor block with `context` and `data`.
+    def evaluate(context, locals)
+      self.class.processor.call(context, data)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/safety_colons.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/safety_colons.rb
new file mode 100644
index 0000000..19dcd59
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/safety_colons.rb
@@ -0,0 +1,28 @@
+require 'tilt'
+
+module Sprockets
+  # For JS developers who are colonfobic, concatenating JS files using
+  # the module pattern usually leads to syntax errors.
+  #
+  # The `SafetyColons` processor will insert missing semicolons to the
+  # end of the file.
+  #
+  # This behavior can be disabled with:
+  #
+  #     environment.unregister_postprocessor 'application/javascript', Sprockets::SafetyColons
+  #
+  class SafetyColons < Tilt::Template
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      # If the file is blank or ends in a semicolon, leave it as is
+      if data =~ /\A\s*\Z/m || data =~ /;\s*\Z/m
+        data
+      else
+        # Otherwise, append a semicolon and newline
+        "#{data};\n"
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_cache_store.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_cache_store.rb
new file mode 100644
index 0000000..d969a5c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_cache_store.rb
@@ -0,0 +1,29 @@
+require 'sass'
+
+module Sprockets
+  class SassCacheStore < ::Sass::CacheStores::Base
+    attr_reader :environment
+
+    def initialize(environment)
+      @environment = environment
+    end
+
+    def _store(key, version, sha, contents)
+      environment.cache_set("sass/#{key}", {:version => version, :sha => sha, :contents => contents})
+    end
+
+    def _retrieve(key, version, sha)
+      if obj = environment.cache_get("sass/#{key}")
+        return unless obj[:version] == version
+        return unless obj[:sha] == sha
+        obj[:contents]
+      else
+        nil
+      end
+    end
+
+    def path_to(key)
+      key
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_compressor.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_compressor.rb
new file mode 100644
index 0000000..112d4ee
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_compressor.rb
@@ -0,0 +1,27 @@
+require 'tilt'
+
+module Sprockets
+  class SassCompressor < Tilt::Template
+    self.default_mime_type = 'text/css'
+
+    def self.engine_initialized?
+      defined?(::Sass::Engine)
+    end
+
+    def initialize_engine
+      require_template_library 'sass'
+    end
+
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      ::Sass::Engine.new(data, {
+        :syntax => :scss,
+        :cache => false,
+        :read_cache => false,
+        :style => :compressed
+      }).render
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_functions.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_functions.rb
new file mode 100644
index 0000000..3e0e812
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_functions.rb
@@ -0,0 +1,70 @@
+require 'sass'
+
+module Sprockets
+  module SassFunctions
+    def asset_path(path)
+      Sass::Script::String.new(sprockets_context.asset_path(path.value), :string)
+    end
+
+    def asset_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.asset_path(path.value) + ")")
+    end
+
+    def image_path(path)
+      Sass::Script::String.new(sprockets_context.image_path(path.value), :string)
+    end
+
+    def image_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.image_path(path.value) + ")")
+    end
+
+    def video_path(path)
+      Sass::Script::String.new(sprockets_context.video_path(path.value), :string)
+    end
+
+    def video_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.video_path(path.value) + ")")
+    end
+
+    def audio_path(path)
+      Sass::Script::String.new(sprockets_context.audio_path(path.value), :string)
+    end
+
+    def audio_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.audio_path(path.value) + ")")
+    end
+
+    def font_path(path)
+      Sass::Script::String.new(sprockets_context.font_path(path.value), :string)
+    end
+
+    def font_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.font_path(path.value) + ")")
+    end
+
+    def javascript_path(path)
+      Sass::Script::String.new(sprockets_context.javascript_path(path.value), :string)
+    end
+
+    def javascript_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.javascript_path(path.value) + ")")
+    end
+
+    def stylesheet_path(path)
+      Sass::Script::String.new(sprockets_context.stylesheet_path(path.value), :string)
+    end
+
+    def stylesheet_url(path)
+      Sass::Script::String.new("url(" + sprockets_context.stylesheet_path(path.value) + ")")
+    end
+
+    protected
+      def sprockets_context
+        options[:sprockets][:context]
+      end
+
+      def sprockets_environment
+        options[:sprockets][:environment]
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_importer.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_importer.rb
new file mode 100644
index 0000000..de1a347
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_importer.rb
@@ -0,0 +1,29 @@
+require 'sass'
+
+module Sprockets
+  # This custom importer adds sprockets dependency tracking on to Sass
+  # `@import` statements. This makes the Sprockets and Sass caching
+  # systems work together.
+  class SassImporter < Sass::Importers::Filesystem
+    def initialize(context, root)
+      @context = context
+      super root.to_s
+    end
+
+    def find_relative(*args)
+      engine = super
+      if engine && (filename = engine.options[:filename])
+        @context.depend_on(filename)
+      end
+      engine
+    end
+
+    def find(*args)
+      engine = super
+      if engine && (filename = engine.options[:filename])
+        @context.depend_on(filename)
+      end
+      engine
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_template.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_template.rb
new file mode 100644
index 0000000..5f1ba1a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/sass_template.rb
@@ -0,0 +1,60 @@
+require 'tilt'
+
+module Sprockets
+  # This custom Tilt handler replaces the one built into Tilt. The
+  # main difference is that it uses a custom importer that plays nice
+  # with sprocket's caching system.
+  #
+  # See `SassImporter` for more infomation.
+  class SassTemplate < Tilt::Template
+    self.default_mime_type = 'text/css'
+
+    def self.engine_initialized?
+      defined?(::Sass::Engine) && defined?(::Sass::Script::Functions) &&
+        ::Sass::Script::Functions < Sprockets::SassFunctions
+    end
+
+    def initialize_engine
+      # Double check constant to avoid tilt warning
+      unless defined? ::Sass
+        require_template_library 'sass'
+      end
+
+      # Install custom functions. It'd be great if this didn't need to
+      # be installed globally, but could be passed into Engine as an
+      # option.
+      ::Sass::Script::Functions.send :include, Sprockets::SassFunctions
+    end
+
+    def prepare
+    end
+
+    def syntax
+      :sass
+    end
+
+    def evaluate(context, locals, &block)
+      # Use custom importer that knows about Sprockets Caching
+      cache_store = SassCacheStore.new(context.environment)
+
+      options = {
+        :filename => eval_file,
+        :line => line,
+        :syntax => syntax,
+        :cache_store => cache_store,
+        :importer => SassImporter.new(context, context.pathname),
+        :load_paths => context.environment.paths.map { |path| SassImporter.new(context, path) },
+        :sprockets => {
+          :context => context,
+          :environment => context.environment
+        }
+      }
+
+      ::Sass::Engine.new(data, options).render
+    rescue ::Sass::SyntaxError => e
+      # Annotates exception message with parse line number
+      context.__LINE__ = e.sass_backtrace.first[:line]
+      raise e
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/scss_template.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/scss_template.rb
new file mode 100644
index 0000000..511558c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/scss_template.rb
@@ -0,0 +1,13 @@
+require 'sprockets/sass_template'
+
+module Sprockets
+  # Scss handler to replace Tilt's builtin one. See `SassTemplate` and
+  # `SassImporter` for more infomation.
+  class ScssTemplate < SassTemplate
+    self.default_mime_type = 'text/css'
+
+    def syntax
+      :scss
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/server.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/server.rb
new file mode 100644
index 0000000..e9c2e59
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/server.rb
@@ -0,0 +1,247 @@
+require 'time'
+require 'uri'
+
+module Sprockets
+  # `Server` is a concern mixed into `Environment` and
+  # `Index` that provides a Rack compatible `call`
+  # interface and url generation helpers.
+  module Server
+    # `call` implements the Rack 1.x specification which accepts an
+    # `env` Hash and returns a three item tuple with the status code,
+    # headers, and body.
+    #
+    # Mapping your environment at a url prefix will serve all assets
+    # in the path.
+    #
+    #     map "/assets" do
+    #       run Sprockets::Environment.new
+    #     end
+    #
+    # A request for `"/assets/foo/bar.js"` will search your
+    # environment for `"foo/bar.js"`.
+    def call(env)
+      start_time = Time.now.to_f
+      time_elapsed = lambda { ((Time.now.to_f - start_time) * 1000).to_i }
+
+      msg = "Served asset #{env['PATH_INFO']} -"
+
+      # Mark session as "skipped" so no `Set-Cookie` header is set
+      env['rack.session.options'] ||= {}
+      env['rack.session.options'][:defer] = true
+      env['rack.session.options'][:skip] = true
+
+      # Extract the path from everything after the leading slash
+      path = unescape(env['PATH_INFO'].to_s.sub(/^\//, ''))
+
+      # URLs containing a `".."` are rejected for security reasons.
+      if forbidden_request?(path)
+        return forbidden_response
+      end
+
+      # Strip fingerprint
+      if fingerprint = path_fingerprint(path)
+        path = path.sub("-#{fingerprint}", '')
+      end
+
+      # Look up the asset.
+      asset = find_asset(path, :bundle => !body_only?(env))
+
+      # `find_asset` returns nil if the asset doesn't exist
+      if asset.nil?
+        logger.info "#{msg} 404 Not Found (#{time_elapsed.call}ms)"
+
+        # Return a 404 Not Found
+        not_found_response
+
+      # Check request headers `HTTP_IF_NONE_MATCH` against the asset digest
+      elsif etag_match?(asset, env)
+        logger.info "#{msg} 304 Not Modified (#{time_elapsed.call}ms)"
+
+        # Return a 304 Not Modified
+        not_modified_response(asset, env)
+
+      else
+        logger.info "#{msg} 200 OK (#{time_elapsed.call}ms)"
+
+        # Return a 200 with the asset contents
+        ok_response(asset, env)
+      end
+    rescue Exception => e
+      logger.error "Error compiling asset #{path}:"
+      logger.error "#{e.class.name}: #{e.message}"
+
+      case content_type_of(path)
+      when "application/javascript"
+        # Re-throw JavaScript asset exceptions to the browser
+        logger.info "#{msg} 500 Internal Server Error\n\n"
+        return javascript_exception_response(e)
+      when "text/css"
+        # Display CSS asset exceptions in the browser
+        logger.info "#{msg} 500 Internal Server Error\n\n"
+        return css_exception_response(e)
+      else
+        raise
+      end
+    end
+
+    private
+      def forbidden_request?(path)
+        # Prevent access to files elsewhere on the file system
+        #
+        #     http://example.org/assets/../../../etc/passwd
+        #
+        path.include?("..")
+      end
+
+      # Returns a 403 Forbidden response tuple
+      def forbidden_response
+        [ 403, { "Content-Type" => "text/plain", "Content-Length" => "9" }, [ "Forbidden" ] ]
+      end
+
+      # Returns a 404 Not Found response tuple
+      def not_found_response
+        [ 404, { "Content-Type" => "text/plain", "Content-Length" => "9", "X-Cascade" => "pass" }, [ "Not found" ] ]
+      end
+
+      # Returns a JavaScript response that re-throws a Ruby exception
+      # in the browser
+      def javascript_exception_response(exception)
+        err  = "#{exception.class.name}: #{exception.message}"
+        body = "throw Error(#{err.inspect})"
+        [ 200, { "Content-Type" => "application/javascript", "Content-Length" => Rack::Utils.bytesize(body).to_s }, [ body ] ]
+      end
+
+      # Returns a CSS response that hides all elements on the page and
+      # displays the exception
+      def css_exception_response(exception)
+        message   = "\n#{exception.class.name}: #{exception.message}"
+        backtrace = "\n  #{exception.backtrace.first}"
+
+        body = <<-CSS
+          html {
+            padding: 18px 36px;
+          }
+
+          head {
+            display: block;
+          }
+
+          body {
+            margin: 0;
+            padding: 0;
+          }
+
+          body > * {
+            display: none !important;
+          }
+
+          head:after, body:before, body:after {
+            display: block !important;
+          }
+
+          head:after {
+            font-family: sans-serif;
+            font-size: large;
+            font-weight: bold;
+            content: "Error compiling CSS asset";
+          }
+
+          body:before, body:after {
+            font-family: monospace;
+            white-space: pre-wrap;
+          }
+
+          body:before {
+            font-weight: bold;
+            content: "#{escape_css_content(message)}";
+          }
+
+          body:after {
+            content: "#{escape_css_content(backtrace)}";
+          }
+        CSS
+
+        [ 200, { "Content-Type" => "text/css;charset=utf-8", "Content-Length" => Rack::Utils.bytesize(body).to_s }, [ body ] ]
+      end
+
+      # Escape special characters for use inside a CSS content("...") string
+      def escape_css_content(content)
+        content.
+          gsub('\\', '\\\\005c ').
+          gsub("\n", '\\\\000a ').
+          gsub('"',  '\\\\0022 ').
+          gsub('/',  '\\\\002f ')
+      end
+
+      # Compare the requests `HTTP_IF_NONE_MATCH` against the assets digest
+      def etag_match?(asset, env)
+        env["HTTP_IF_NONE_MATCH"] == etag(asset)
+      end
+
+      # Test if `?body=1` or `body=true` query param is set
+      def body_only?(env)
+        env["QUERY_STRING"].to_s =~ /body=(1|t)/
+      end
+
+      # Returns a 304 Not Modified response tuple
+      def not_modified_response(asset, env)
+        [ 304, {}, [] ]
+      end
+
+      # Returns a 200 OK response tuple
+      def ok_response(asset, env)
+        [ 200, headers(env, asset, asset.length), asset ]
+      end
+
+      def headers(env, asset, length)
+        Hash.new.tap do |headers|
+          # Set content type and length headers
+          headers["Content-Type"]   = asset.content_type
+          headers["Content-Length"] = length.to_s
+
+          # Set caching headers
+          headers["Cache-Control"]  = "public"
+          headers["Last-Modified"]  = asset.mtime.httpdate
+          headers["ETag"]           = etag(asset)
+
+          # If the request url contains a fingerprint, set a long
+          # expires on the response
+          if path_fingerprint(env["PATH_INFO"])
+            headers["Cache-Control"] << ", max-age=31536000"
+
+          # Otherwise set `must-revalidate` since the asset could be modified.
+          else
+            headers["Cache-Control"] << ", must-revalidate"
+          end
+        end
+      end
+
+      # Gets digest fingerprint.
+      #
+      #     "foo-0aa2105d29558f3eb790d411d7d8fb66.js"
+      #     # => "0aa2105d29558f3eb790d411d7d8fb66"
+      #
+      def path_fingerprint(path)
+        path[/-([0-9a-f]{7,40})\.[^.]+$/, 1]
+      end
+
+      # URI.unescape is deprecated on 1.9. We need to use URI::Parser
+      # if its available.
+      if defined? URI::DEFAULT_PARSER
+        def unescape(str)
+          str = URI::DEFAULT_PARSER.unescape(str)
+          str.force_encoding(Encoding.default_internal) if Encoding.default_internal
+          str
+        end
+      else
+        def unescape(str)
+          URI.unescape(str)
+        end
+      end
+
+      # Helper to quote the assets digest for use as an ETag.
+      def etag(asset)
+        %("#{asset.digest}")
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/static_asset.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/static_asset.rb
new file mode 100644
index 0000000..70533bb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/static_asset.rb
@@ -0,0 +1,58 @@
+require 'sprockets/asset'
+require 'fileutils'
+require 'zlib'
+
+module Sprockets
+  # `StaticAsset`s are used for files that are served verbatim without
+  # any processing or concatenation. These are typical images and
+  # other binary files.
+  class StaticAsset < Asset
+    # Returns file contents as its `source`.
+    def source
+      # File is read everytime to avoid memory bloat of large binary files
+      pathname.open('rb') { |f| f.read }
+    end
+
+    # Implemented for Rack SendFile support.
+    def to_path
+      pathname.to_s
+    end
+
+    # Save asset to disk.
+    def write_to(filename, options = {})
+      # Gzip contents if filename has '.gz'
+      options[:compress] ||= File.extname(filename) == '.gz'
+
+      FileUtils.mkdir_p File.dirname(filename)
+
+      if options[:compress]
+        # Open file and run it through `Zlib`
+        pathname.open('rb') do |rd|
+          File.open("#{filename}+", 'wb') do |wr|
+            gz = Zlib::GzipWriter.new(wr, Zlib::BEST_COMPRESSION)
+            gz.mtime = mtime.to_i
+            buf = ""
+            while rd.read(16384, buf)
+              gz.write(buf)
+            end
+            gz.close
+          end
+        end
+      else
+        # If no compression needs to be done, we can just copy it into place.
+        FileUtils.cp(pathname, "#{filename}+")
+      end
+
+      # Atomic write
+      FileUtils.mv("#{filename}+", filename)
+
+      # Set mtime correctly
+      File.utime(mtime, mtime, filename)
+
+      nil
+    ensure
+      # Ensure tmp file gets cleaned up
+      FileUtils.rm("#{filename}+") if File.exist?("#{filename}+")
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/uglifier_compressor.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/uglifier_compressor.rb
new file mode 100644
index 0000000..4d1e56c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/uglifier_compressor.rb
@@ -0,0 +1,29 @@
+require 'tilt'
+
+module Sprockets
+  class UglifierCompressor < Tilt::Template
+    self.default_mime_type = 'application/javascript'
+
+    def self.engine_initialized?
+      defined?(::Uglifier)
+    end
+
+    def initialize_engine
+      require_template_library 'uglifier'
+    end
+
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      # Feature detect Uglifier 2.0 option support
+      if Uglifier::DEFAULTS[:copyright]
+        # Uglifier < 2.x
+        Uglifier.new(:copyright => false).compile(data)
+      else
+        # Uglifier >= 2.x
+        Uglifier.new(:comments => :none).compile(data)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/utils.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/utils.rb
new file mode 100644
index 0000000..409aaf5
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/utils.rb
@@ -0,0 +1,69 @@
+module Sprockets
+  # `Utils`, we didn't know where else to put it!
+  module Utils
+    # If theres encoding support (aka Ruby 1.9)
+    if "".respond_to?(:valid_encoding?)
+      # Define UTF-8 BOM pattern matcher.
+      # Avoid using a Regexp literal because it inheirts the files
+      # encoding and we want to avoid syntax errors in other interpreters.
+      UTF8_BOM_PATTERN = Regexp.new("\\A\uFEFF".encode('utf-8'))
+
+      def self.read_unicode(pathname, external_encoding = Encoding.default_external)
+        pathname.open("r:#{external_encoding}") do |f|
+          f.read.tap do |data|
+            # Eager validate the file's encoding. In most cases we
+            # expect it to be UTF-8 unless `default_external` is set to
+            # something else. An error is usually raised if the file is
+            # saved as UTF-16 when we expected UTF-8.
+            if !data.valid_encoding?
+              raise EncodingError, "#{pathname} has a invalid " +
+                "#{data.encoding} byte sequence"
+
+            # If the file is UTF-8 and theres a BOM, strip it for safe concatenation.
+            elsif data.encoding.name == "UTF-8" && data =~ UTF8_BOM_PATTERN
+              data.sub!(UTF8_BOM_PATTERN, "")
+            end
+          end
+        end
+      end
+
+    else
+      # Define UTF-8 and UTF-16 BOM pattern matchers.
+      # Avoid using a Regexp literal to prevent syntax errors in other interpreters.
+      UTF8_BOM_PATTERN  = Regexp.new("\\A\\xEF\\xBB\\xBF")
+      UTF16_BOM_PATTERN = Regexp.new("\\A(\\xFE\\xFF|\\xFF\\xFE)")
+
+      def self.read_unicode(pathname)
+        pathname.read.tap do |data|
+          # If the file is UTF-8 and theres a BOM, strip it for safe concatenation.
+          if data =~ UTF8_BOM_PATTERN
+            data.sub!(UTF8_BOM_PATTERN, "")
+
+          # If we find a UTF-16 BOM, theres nothing we can do on
+          # 1.8. Only UTF-8 is supported.
+          elsif data =~ UTF16_BOM_PATTERN
+            raise EncodingError, "#{pathname} has a UTF-16 BOM. " +
+              "Resave the file as UTF-8 or upgrade to Ruby 1.9."
+          end
+        end
+      end
+    end
+
+    # Prepends a leading "." to an extension if its missing.
+    #
+    #     normalize_extension("js")
+    #     # => ".js"
+    #
+    #     normalize_extension(".css")
+    #     # => ".css"
+    #
+    def self.normalize_extension(extension)
+      extension = extension.to_s
+      if extension[/^\./]
+        extension
+      else
+        ".#{extension}"
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/version.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/version.rb
new file mode 100644
index 0000000..fc2acb9
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/version.rb
@@ -0,0 +1,3 @@
+module Sprockets
+  VERSION = "2.10.0"
+end
diff --git a/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/yui_compressor.rb b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/yui_compressor.rb
new file mode 100644
index 0000000..c0d6656
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/sprockets-2.10.0/lib/sprockets/yui_compressor.rb
@@ -0,0 +1,27 @@
+require 'tilt'
+
+module Sprockets
+  class YUICompressor < Tilt::Template
+    def self.engine_initialized?
+      defined?(::YUI)
+    end
+
+    def initialize_engine
+      require_template_library 'yui/compressor'
+    end
+
+    def prepare
+    end
+
+    def evaluate(context, locals, &block)
+      case context.content_type
+      when 'application/javascript'
+        YUI::JavaScriptCompressor.new.compress(data)
+      when 'text/css'
+        YUI::CssCompressor.new.compress(data)
+      else
+        data
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/.document b/.bundle/ruby/2.0.0/gems/thor-0.18.1/.document
new file mode 100644
index 0000000..3ce5450
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/.document
@@ -0,0 +1,5 @@
+lib/*.rb
+lib/**/*.rb
+-
+CHANGELOG.rdoc
+LICENSE.md
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/CHANGELOG.md b/.bundle/ruby/2.0.0/gems/thor-0.18.1/CHANGELOG.md
new file mode 100644
index 0000000..38687db
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/CHANGELOG.md
@@ -0,0 +1,139 @@
+## 0.18.1, release 2013-03-30
+* Revert regressions found in 0.18.0
+
+## 0.18.0, release 2013-03-26
+* Remove rake2thor
+* Only display colors if output medium supports colors
+* Pass parent_options to subcommands
+* Fix non-dash-prefixed aliases
+* Make error messages more helpful
+* Rename "task" to "command"
+* Add the method to allow for custom package name
+
+## 0.17.0, release 2013-01-24
+* Add better support for tasks that accept arbitrary additional arguments (e.g. things like `bundle exec`)
+* Add #stop_on_unknown_option!
+* Only strip from stdin.gets if it wasn't ended with EOF
+* Allow "send" as a task name
+* Allow passing options as arguments after "--"
+* Autoload Thor::Group
+
+## 0.16.0, release 2012-08-14
+* Add enum to string arguments
+
+## 0.15.4, release 2012-06-29
+* Fix regression when destination root contains reserved regexp characters
+
+## 0.15.3, release 2012-06-18
+* Support strict_args_position! for backwards compatibility
+* Escape Dir glob characters in paths
+
+## 0.15.2, released 2012-05-07
+* Added print_in_columns
+* Exposed terminal_width as a public API
+
+## 0.15.1, release 2012-05-06
+* Fix Ruby 1.8 truncation bug with unicode chars
+* Fix shell delegate methods to pass their block
+* Don't output trailing spaces when printing the last column in a table
+
+## 0.15, released 2012-04-29
+* Alias method_options to options
+* Refactor say to allow multiple colors
+* Exposed error as a public API
+* Exposed file_collision as a public API
+* Exposed print_wrapped as a public API
+* Exposed set_color as a public API
+* Fix number-formatting bugs in print_table
+* Fix "indent" typo in print_table
+* Fix Errno::EPIPE when piping tasks to `head`
+* More friendly error messages
+
+## 0.14, released 2010-07-25
+* Added CreateLink class and #link_file method
+* Made Thor::Actions#run use system as default method for system calls
+* Allow use of private methods from superclass as tasks
+* Added mute(&block) method which allows to run block without any output
+* Removed config[:pretend]
+* Enabled underscores for command line switches
+* Added Thor::Base.basename which is used by both Thor.banner and Thor::Group.banner
+* Deprecated invoke() without arguments
+* Added :only and :except to check_unknown_options
+
+## 0.13, released 2010-02-03
+* Added :lazy_default which is only triggered if a switch is given
+* Added Thor::Shell::HTML
+* Added subcommands
+* Decoupled Thor::Group and Thor, so it's easier to vendor
+* Added check_unknown_options! in case you want error messages to be raised in valid switches
+* run(command) should return the results of command
+
+## 0.12, released 2010-01-02
+* Methods generated by attr_* are automatically not marked as tasks
+* inject_into_file does not add the same content twice, unless :force is set
+* Removed rr in favor to rspec mock framework
+* Improved output for thor -T
+* [#7] Do not force white color on status
+* [#8] Yield a block with the filename on directory
+
+## 0.11, released 2009-07-01
+* Added a rake compatibility layer. It allows you to use spec and rdoc tasks on
+  Thor classes.
+* BACKWARDS INCOMPATIBLE: aliases are not generated automatically anymore
+  since it may cause wrong behavior in the invocation system.
+* thor help now show information about any class/task. All those calls are
+  possible:
+
+      thor help describe
+      thor help describe:amazing
+  Or even with default namespaces:
+
+      thor help :spec
+* Thor::Runner now invokes the default task if none is supplied:
+
+      thor describe # invokes the default task, usually help
+* Thor::Runner now works with mappings:
+
+      thor describe -h
+* Added some documentation and code refactoring.
+
+## 0.9.8, released 2008-10-20
+* Fixed some tiny issues that were introduced lately.
+
+## 0.9.7, released 2008-10-13
+* Setting global method options on the initialize method works as expected:
+  All other tasks will accept these global options in addition to their own.
+* Added 'group' notion to Thor task sets (class Thor); by default all tasks
+  are in the 'standard' group. Running 'thor -T' will only show the standard
+  tasks - adding --all will show all tasks. You can also filter on a specific
+  group using the --group option: thor -T --group advanced
+
+## 0.9.6, released 2008-09-13
+* Generic improvements
+
+## 0.9.5, released 2008-08-27
+* Improve Windows compatibility
+* Update (incorrect) README and task.thor sample file
+* Options hash is now frozen (once returned)
+* Allow magic predicates on options object. For instance: `options.force?`
+* Add support for :numeric type
+* BACKWARDS INCOMPATIBLE: Refactor Thor::Options. You cannot access shorthand forms in options hash anymore (for instance, options[:f])
+* Allow specifying optional args with default values: method_options(:user => "mislav")
+* Don't write options for nil or false values. This allows, for example, turning color off when running specs.
+* Exit with the status of the spec command to help CI stuff out some.
+
+## 0.9.4, released 2008-08-13
+* Try to add Windows compatibility.
+* BACKWARDS INCOMPATIBLE: options hash is now accessed as a property in your class and is not passed as last argument anymore
+* Allow options at the beginning of the argument list as well as the end.
+* Make options available with symbol keys in addition to string keys.
+* Allow true to be passed to Thor#method_options to denote a boolean option.
+* If loading a thor file fails, don't give up, just print a warning and keep going.
+* Make sure that we re-raise errors if they happened further down the pipe than we care about.
+* Only delete the old file on updating when the installation of the new one is a success
+* Make it Ruby 1.8.5 compatible.
+* Don't raise an error if a boolean switch is defined multiple times.
+* Thor::Options now doesn't parse through things that look like options but aren't.
+* Add URI detection to install task, and make sure we don't append ".thor" to URIs
+* Add rake2thor to the gem binfiles.
+* Make sure local Thorfiles override system-wide ones.
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/LICENSE.md b/.bundle/ruby/2.0.0/gems/thor-0.18.1/LICENSE.md
new file mode 100644
index 0000000..ef80540
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/LICENSE.md
@@ -0,0 +1,20 @@
+Copyright (c) 2008 Yehuda Katz, Eric Hodel, et al.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/README.md b/.bundle/ruby/2.0.0/gems/thor-0.18.1/README.md
new file mode 100644
index 0000000..1ad690a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/README.md
@@ -0,0 +1,35 @@
+[![Gem Version](https://badge.fury.io/rb/thor.png)](https://rubygems.org/gems/thor)
+[![Build Status](https://secure.travis-ci.org/wycats/thor.png?branch=master)](http://travis-ci.org/wycats/thor)
+[![Dependency Status](https://gemnasium.com/wycats/thor.png?travis)](https://gemnasium.com/wycats/thor)
+[![Code Climate](https://codeclimate.com/github/wycats/thor.png)](https://codeclimate.com/github/wycats/thor)
+[![Coverage Status](https://coveralls.io/repos/wycats/thor/badge.png?branch=master)](https://coveralls.io/r/wycats/thor)
+
+Thor
+====
+
+Description
+-----------
+Thor is a simple and efficient tool for building self-documenting command line
+utilities.  It removes the pain of parsing command line options, writing
+"USAGE:" banners, and can also be used as an alternative to the [Rake][rake]
+build tool.  The syntax is Rake-like, so it should be familiar to most Rake
+users.
+
+[rake]: https://github.com/jimweirich/rake
+
+Installation
+------------
+    gem install thor
+
+Usage and documentation
+-----------------------
+Please see the [wiki][] for basic usage and other documentation on using Thor. You can also checkout the [official homepage][homepage].
+
+[wiki]: https://github.com/wycats/thor/wiki
+[homepage]: http://whatisthor.com/
+
+License
+-------
+Released under the MIT License.  See the [LICENSE][] file for further details.
+
+[license]: LICENSE.md
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/Thorfile b/.bundle/ruby/2.0.0/gems/thor-0.18.1/Thorfile
new file mode 100644
index 0000000..9f62810
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/Thorfile
@@ -0,0 +1,30 @@
+# encoding: utf-8
+$:.unshift File.expand_path("../lib", __FILE__)
+
+require 'bundler'
+require 'thor/rake_compat'
+
+class Default < Thor
+  include Thor::RakeCompat
+  Bundler::GemHelper.install_tasks
+
+  desc "build", "Build thor-#{Thor::VERSION}.gem into the pkg directory"
+  def build
+    Rake::Task["build"].execute
+  end
+
+  desc "install", "Build and install thor-#{Thor::VERSION}.gem into system gems"
+  def install
+    Rake::Task["install"].execute
+  end
+
+  desc "release", "Create tag v#{Thor::VERSION} and build and push thor-#{Thor::VERSION}.gem to Rubygems"
+  def release
+    Rake::Task["release"].execute
+  end
+
+  desc "spec", "Run RSpec code examples"
+  def spec
+    exec "rspec --color --format=documentation spec"
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/bin/thor b/.bundle/ruby/2.0.0/gems/thor-0.18.1/bin/thor
new file mode 100755
index 0000000..16323b1
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/bin/thor
@@ -0,0 +1,6 @@
+#!/usr/bin/env ruby
+# -*- mode: ruby -*-
+
+require 'thor/runner'
+$thor_runner = true
+Thor::Runner.start
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor.rb
new file mode 100644
index 0000000..d7a7461
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor.rb
@@ -0,0 +1,473 @@
+require 'set'
+require 'thor/base'
+
+class Thor
+  class << self
+    # Allows for custom "Command" package naming.
+    #
+    # === Parameters
+    # name<String>
+    # options<Hash>
+    #
+    def package_name(name, options={})
+      @package_name = name.nil? || name == '' ? nil : name
+    end
+
+    # Sets the default command when thor is executed without an explicit command to be called.
+    #
+    # ==== Parameters
+    # meth<Symbol>:: name of the default command
+    #
+    def default_command(meth=nil)
+      @default_command = case meth
+      when :none
+        'help'
+      when nil
+        @default_command || from_superclass(:default_command, 'help')
+      else
+        meth.to_s
+      end
+    end
+    alias default_task default_command
+
+    # Registers another Thor subclass as a command.
+    #
+    # ==== Parameters
+    # klass<Class>:: Thor subclass to register
+    # command<String>:: Subcommand name to use
+    # usage<String>:: Short usage for the subcommand
+    # description<String>:: Description for the subcommand
+    def register(klass, subcommand_name, usage, description, options={})
+      if klass <= Thor::Group
+        desc usage, description, options
+        define_method(subcommand_name) { |*args| invoke(klass, args) }
+      else
+        desc usage, description, options
+        subcommand subcommand_name, klass
+      end
+    end
+
+    # Defines the usage and the description of the next command.
+    #
+    # ==== Parameters
+    # usage<String>
+    # description<String>
+    # options<String>
+    #
+    def desc(usage, description, options={})
+      if options[:for]
+        command = find_and_refresh_command(options[:for])
+        command.usage = usage             if usage
+        command.description = description if description
+      else
+        @usage, @desc, @hide = usage, description, options[:hide] || false
+      end
+    end
+
+    # Defines the long description of the next command.
+    #
+    # ==== Parameters
+    # long description<String>
+    #
+    def long_desc(long_description, options={})
+      if options[:for]
+        command = find_and_refresh_command(options[:for])
+        command.long_description = long_description if long_description
+      else
+        @long_desc = long_description
+      end
+    end
+
+    # Maps an input to a command. If you define:
+    #
+    #   map "-T" => "list"
+    #
+    # Running:
+    #
+    #   thor -T
+    #
+    # Will invoke the list command.
+    #
+    # ==== Parameters
+    # Hash[String|Array => Symbol]:: Maps the string or the strings in the array to the given command.
+    #
+    def map(mappings=nil)
+      @map ||= from_superclass(:map, {})
+
+      if mappings
+        mappings.each do |key, value|
+          if key.respond_to?(:each)
+            key.each {|subkey| @map[subkey] = value}
+          else
+            @map[key] = value
+          end
+        end
+      end
+
+      @map
+    end
+
+    # Declares the options for the next command to be declared.
+    #
+    # ==== Parameters
+    # Hash[Symbol => Object]:: The hash key is the name of the option and the value
+    # is the type of the option. Can be :string, :array, :hash, :boolean, :numeric
+    # or :required (string). If you give a value, the type of the value is used.
+    #
+    def method_options(options=nil)
+      @method_options ||= {}
+      build_options(options, @method_options) if options
+      @method_options
+    end
+
+    alias options method_options
+
+    # Adds an option to the set of method options. If :for is given as option,
+    # it allows you to change the options from a previous defined command.
+    #
+    #   def previous_command
+    #     # magic
+    #   end
+    #
+    #   method_option :foo => :bar, :for => :previous_command
+    #
+    #   def next_command
+    #     # magic
+    #   end
+    #
+    # ==== Parameters
+    # name<Symbol>:: The name of the argument.
+    # options<Hash>:: Described below.
+    #
+    # ==== Options
+    # :desc     - Description for the argument.
+    # :required - If the argument is required or not.
+    # :default  - Default value for this argument. It cannot be required and have default values.
+    # :aliases  - Aliases for this option.
+    # :type     - The type of the argument, can be :string, :hash, :array, :numeric or :boolean.
+    # :banner   - String to show on usage notes.
+    # :hide     - If you want to hide this option from the help.
+    #
+    def method_option(name, options={})
+      scope = if options[:for]
+        find_and_refresh_command(options[:for]).options
+      else
+        method_options
+      end
+
+      build_option(name, options, scope)
+    end
+    alias option method_option
+
+    # Prints help information for the given command.
+    #
+    # ==== Parameters
+    # shell<Thor::Shell>
+    # command_name<String>
+    #
+    def command_help(shell, command_name)
+      meth = normalize_command_name(command_name)
+      command = all_commands[meth]
+      handle_no_command_error(meth) unless command
+
+      shell.say "Usage:"
+      shell.say "  #{banner(command)}"
+      shell.say
+      class_options_help(shell, nil => command.options.map { |_, o| o })
+      if command.long_description
+        shell.say "Description:"
+        shell.print_wrapped(command.long_description, :indent => 2)
+      else
+        shell.say command.description
+      end
+    end
+    alias task_help command_help
+
+    # Prints help information for this class.
+    #
+    # ==== Parameters
+    # shell<Thor::Shell>
+    #
+    def help(shell, subcommand = false)
+      list = printable_commands(true, subcommand)
+      Thor::Util.thor_classes_in(self).each do |klass|
+        list += klass.printable_commands(false)
+      end
+      list.sort!{ |a,b| a[0] <=> b[0] }
+
+      if @package_name
+        shell.say "#{@package_name} commands:"
+      else
+        shell.say "Commands:"
+      end
+
+      shell.print_table(list, :indent => 2, :truncate => true)
+      shell.say
+      class_options_help(shell)
+    end
+
+    # Returns commands ready to be printed.
+    def printable_commands(all = true, subcommand = false)
+      (all ? all_commands : commands).map do |_, command|
+        next if command.hidden?
+        item = []
+        item << banner(command, false, subcommand)
+        item << (command.description ? "# #{command.description.gsub(/\s+/m,' ')}" : "")
+        item
+      end.compact
+    end
+    alias printable_tasks printable_commands
+
+    def subcommands
+      @subcommands ||= from_superclass(:subcommands, [])
+    end
+    alias subtasks subcommands
+
+    def subcommand(subcommand, subcommand_class)
+      self.subcommands << subcommand.to_s
+      subcommand_class.subcommand_help subcommand
+
+      define_method(subcommand) do |*args|
+        args, opts = Thor::Arguments.split(args)
+        invoke subcommand_class, args, opts, :invoked_via_subcommand => true, :class_options => options
+      end
+    end
+    alias subtask subcommand
+
+    # Extend check unknown options to accept a hash of conditions.
+    #
+    # === Parameters
+    # options<Hash>: A hash containing :only and/or :except keys
+    def check_unknown_options!(options={})
+      @check_unknown_options ||= Hash.new
+      options.each do |key, value|
+        if value
+          @check_unknown_options[key] = Array(value)
+        else
+          @check_unknown_options.delete(key)
+        end
+      end
+      @check_unknown_options
+    end
+
+    # Overwrite check_unknown_options? to take subcommands and options into account.
+    def check_unknown_options?(config) #:nodoc:
+      options = check_unknown_options
+      return false unless options
+
+      command = config[:current_command]
+      return true unless command
+
+      name = command.name
+
+      if subcommands.include?(name)
+        false
+      elsif options[:except]
+        !options[:except].include?(name.to_sym)
+      elsif options[:only]
+        options[:only].include?(name.to_sym)
+      else
+        true
+      end
+    end
+
+    # Stop parsing of options as soon as an unknown option or a regular
+    # argument is encountered.  All remaining arguments are passed to the command.
+    # This is useful if you have a command that can receive arbitrary additional
+    # options, and where those additional options should not be handled by
+    # Thor.
+    #
+    # ==== Example
+    #
+    # To better understand how this is useful, let's consider a command that calls
+    # an external command.  A user may want to pass arbitrary options and
+    # arguments to that command.  The command itself also accepts some options,
+    # which should be handled by Thor.
+    #
+    #   class_option "verbose",  :type => :boolean
+    #   stop_on_unknown_option! :exec
+    #   check_unknown_options!  :except => :exec
+    #
+    #   desc "exec", "Run a shell command"
+    #   def exec(*args)
+    #     puts "diagnostic output" if options[:verbose]
+    #     Kernel.exec(*args)
+    #   end
+    #
+    # Here +exec+ can be called with +--verbose+ to get diagnostic output,
+    # e.g.:
+    #
+    #   $ thor exec --verbose echo foo
+    #   diagnostic output
+    #   foo
+    #
+    # But if +--verbose+ is given after +echo+, it is passed to +echo+ instead:
+    #
+    #   $ thor exec echo --verbose foo
+    #   --verbose foo
+    #
+    # ==== Parameters
+    # Symbol ...:: A list of commands that should be affected.
+    def stop_on_unknown_option!(*command_names)
+      @stop_on_unknown_option ||= Set.new
+      @stop_on_unknown_option.merge(command_names)
+    end
+
+    def stop_on_unknown_option?(command) #:nodoc:
+      !!@stop_on_unknown_option && @stop_on_unknown_option.include?(command.name.to_sym)
+    end
+
+  protected
+
+    # The method responsible for dispatching given the args.
+    def dispatch(meth, given_args, given_opts, config) #:nodoc:
+      # There is an edge case when dispatching from a subcommand.
+      # A problem occurs invoking the default command. This case occurs
+      # when arguments are passed and a default command is defined, and
+      # the first given_args does not match the default command.
+      # Thor use "help" by default so we skip that case.
+      # Note the call to retrieve_command_name. It's called with
+      # given_args.dup since that method calls args.shift. Then lookup
+      # the command normally. If the first item in given_args is not
+      # a command then use the default command. The given_args will be
+      # intact later since dup was used.
+      if config[:invoked_via_subcommand] && given_args.size >= 1 && default_command != "help" && given_args.first != default_command
+        meth ||= retrieve_command_name(given_args.dup)
+        command = all_commands[normalize_command_name(meth)]
+        command ||= all_commands[normalize_command_name(default_command)]
+      else
+        meth ||= retrieve_command_name(given_args)
+        command = all_commands[normalize_command_name(meth)]
+      end
+
+      if command
+        args, opts = Thor::Options.split(given_args)
+        if stop_on_unknown_option?(command) && !args.empty?
+          # given_args starts with a non-option, so we treat everything as
+          # ordinary arguments
+          args.concat opts
+          opts.clear
+        end
+      else
+        args, opts = given_args, nil
+        command = Thor::DynamicCommand.new(meth)
+      end
+
+      opts = given_opts || opts || []
+      config.merge!(:current_command => command, :command_options => command.options)
+
+      instance = new(args, opts, config)
+      yield instance if block_given?
+      args = instance.args
+      trailing = args[Range.new(arguments.size, -1)]
+      instance.invoke_command(command, trailing || [])
+    end
+
+    # The banner for this class. You can customize it if you are invoking the
+    # thor class by another ways which is not the Thor::Runner. It receives
+    # the command that is going to be invoked and a boolean which indicates if
+    # the namespace should be displayed as arguments.
+    #
+    def banner(command, namespace = nil, subcommand = false)
+      "#{basename} #{command.formatted_usage(self, $thor_runner, subcommand)}"
+    end
+
+    def baseclass #:nodoc:
+      Thor
+    end
+
+    def create_command(meth) #:nodoc:
+      if @usage && @desc
+        base_class = @hide ? Thor::HiddenCommand : Thor::Command
+        commands[meth] = base_class.new(meth, @desc, @long_desc, @usage, method_options)
+        @usage, @desc, @long_desc, @method_options, @hide = nil
+        true
+      elsif self.all_commands[meth] || meth == "method_missing"
+        true
+      else
+        puts "[WARNING] Attempted to create command #{meth.inspect} without usage or description. " <<
+             "Call desc if you want this method to be available as command or declare it inside a " <<
+             "no_commands{} block. Invoked from #{caller[1].inspect}."
+        false
+      end
+    end
+    alias create_task create_command
+
+    def initialize_added #:nodoc:
+      class_options.merge!(method_options)
+      @method_options = nil
+    end
+
+    # Retrieve the command name from given args.
+    def retrieve_command_name(args) #:nodoc:
+      meth = args.first.to_s unless args.empty?
+      if meth && (map[meth] || meth !~ /^\-/)
+        args.shift
+      else
+        nil
+      end
+    end
+    alias retrieve_task_name retrieve_command_name
+
+    # receives a (possibly nil) command name and returns a name that is in
+    # the commands hash. In addition to normalizing aliases, this logic
+    # will determine if a shortened command is an unambiguous substring of
+    # a command or alias.
+    #
+    # +normalize_command_name+ also converts names like +animal-prison+
+    # into +animal_prison+.
+    def normalize_command_name(meth) #:nodoc:
+      return default_command.to_s.gsub('-', '_') unless meth
+
+      possibilities = find_command_possibilities(meth)
+      if possibilities.size > 1
+        raise ArgumentError, "Ambiguous command #{meth} matches [#{possibilities.join(', ')}]"
+      elsif possibilities.size < 1
+        meth = meth || default_command
+      elsif map[meth]
+        meth = map[meth]
+      else
+        meth = possibilities.first
+      end
+
+      meth.to_s.gsub('-','_') # treat foo-bar as foo_bar
+    end
+    alias normalize_task_name normalize_command_name
+
+    # this is the logic that takes the command name passed in by the user
+    # and determines whether it is an unambiguous substrings of a command or
+    # alias name.
+    def find_command_possibilities(meth)
+      len = meth.to_s.length
+      possibilities = all_commands.merge(map).keys.select { |n| meth == n[0, len] }.sort
+      unique_possibilities = possibilities.map { |k| map[k] || k }.uniq
+
+      if possibilities.include?(meth)
+        [meth]
+      elsif unique_possibilities.size == 1
+        unique_possibilities
+      else
+        possibilities
+      end
+    end
+    alias find_task_possibilities find_command_possibilities
+
+    def subcommand_help(cmd)
+      desc "help [COMMAND]", "Describe subcommands or one specific subcommand"
+      class_eval <<-RUBY
+        def help(command = nil, subcommand = true); super; end
+      RUBY
+    end
+    alias subtask_help subcommand_help
+
+  end
+
+  include Thor::Base
+
+  map HELP_MAPPINGS => :help
+
+  desc "help [COMMAND]", "Describe available commands or one specific command"
+  def help(command = nil, subcommand = false)
+    command ? self.class.command_help(shell, command) : self.class.help(shell, subcommand)
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions.rb
new file mode 100644
index 0000000..d55b77b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions.rb
@@ -0,0 +1,318 @@
+require 'fileutils'
+require 'uri'
+require 'thor/core_ext/io_binary_read'
+require 'thor/actions/create_file'
+require 'thor/actions/create_link'
+require 'thor/actions/directory'
+require 'thor/actions/empty_directory'
+require 'thor/actions/file_manipulation'
+require 'thor/actions/inject_into_file'
+
+class Thor
+  module Actions
+    attr_accessor :behavior
+
+    def self.included(base) #:nodoc:
+      base.extend ClassMethods
+    end
+
+    module ClassMethods
+      # Hold source paths for one Thor instance. source_paths_for_search is the
+      # method responsible to gather source_paths from this current class,
+      # inherited paths and the source root.
+      #
+      def source_paths
+        @_source_paths ||= []
+      end
+
+      # Stores and return the source root for this class
+      def source_root(path=nil)
+        @_source_root = path if path
+        @_source_root
+      end
+
+      # Returns the source paths in the following order:
+      #
+      #   1) This class source paths
+      #   2) Source root
+      #   3) Parents source paths
+      #
+      def source_paths_for_search
+        paths = []
+        paths += self.source_paths
+        paths << self.source_root if self.source_root
+        paths += from_superclass(:source_paths, [])
+        paths
+      end
+
+      # Add runtime options that help actions execution.
+      #
+      def add_runtime_options!
+        class_option :force, :type => :boolean, :aliases => "-f", :group => :runtime,
+                             :desc => "Overwrite files that already exist"
+
+        class_option :pretend, :type => :boolean, :aliases => "-p", :group => :runtime,
+                               :desc => "Run but do not make any changes"
+
+        class_option :quiet, :type => :boolean, :aliases => "-q", :group => :runtime,
+                             :desc => "Suppress status output"
+
+        class_option :skip, :type => :boolean, :aliases => "-s", :group => :runtime,
+                            :desc => "Skip files that already exist"
+      end
+    end
+
+    # Extends initializer to add more configuration options.
+    #
+    # ==== Configuration
+    # behavior<Symbol>:: The actions default behavior. Can be :invoke or :revoke.
+    #                    It also accepts :force, :skip and :pretend to set the behavior
+    #                    and the respective option.
+    #
+    # destination_root<String>:: The root directory needed for some actions.
+    #
+    def initialize(args=[], options={}, config={})
+      self.behavior = case config[:behavior].to_s
+      when "force", "skip"
+        _cleanup_options_and_set(options, config[:behavior])
+        :invoke
+      when "revoke"
+        :revoke
+      else
+        :invoke
+      end
+
+      super
+      self.destination_root = config[:destination_root]
+    end
+
+    # Wraps an action object and call it accordingly to the thor class behavior.
+    #
+    def action(instance) #:nodoc:
+      if behavior == :revoke
+        instance.revoke!
+      else
+        instance.invoke!
+      end
+    end
+
+    # Returns the root for this thor class (also aliased as destination root).
+    #
+    def destination_root
+      @destination_stack.last
+    end
+
+    # Sets the root for this thor class. Relatives path are added to the
+    # directory where the script was invoked and expanded.
+    #
+    def destination_root=(root)
+      @destination_stack ||= []
+      @destination_stack[0] = File.expand_path(root || '')
+    end
+
+    # Returns the given path relative to the absolute root (ie, root where
+    # the script started).
+    #
+    def relative_to_original_destination_root(path, remove_dot=true)
+      path = path.dup
+      if path.gsub!(@destination_stack[0], '.')
+        remove_dot ? (path[2..-1] || '') : path
+      else
+        path
+      end
+    end
+
+    # Holds source paths in instance so they can be manipulated.
+    #
+    def source_paths
+      @source_paths ||= self.class.source_paths_for_search
+    end
+
+    # Receives a file or directory and search for it in the source paths.
+    #
+    def find_in_source_paths(file)
+      relative_root = relative_to_original_destination_root(destination_root, false)
+
+      source_paths.each do |source|
+        source_file = File.expand_path(file, File.join(source, relative_root))
+        return source_file if File.exists?(source_file)
+      end
+
+      message = "Could not find #{file.inspect} in any of your source paths. "
+
+      unless self.class.source_root
+        message << "Please invoke #{self.class.name}.source_root(PATH) with the PATH containing your templates. "
+      end
+
+      if source_paths.empty?
+        message << "Currently you have no source paths."
+      else
+        message << "Your current source paths are: \n#{source_paths.join("\n")}"
+      end
+
+      raise Error, message
+    end
+
+    # Do something in the root or on a provided subfolder. If a relative path
+    # is given it's referenced from the current root. The full path is yielded
+    # to the block you provide. The path is set back to the previous path when
+    # the method exits.
+    #
+    # ==== Parameters
+    # dir<String>:: the directory to move to.
+    # config<Hash>:: give :verbose => true to log and use padding.
+    #
+    def inside(dir='', config={}, &block)
+      verbose = config.fetch(:verbose, false)
+      pretend = options[:pretend]
+
+      say_status :inside, dir, verbose
+      shell.padding += 1 if verbose
+      @destination_stack.push File.expand_path(dir, destination_root)
+
+      # If the directory doesnt exist and we're not pretending
+      if !File.exist?(destination_root) && !pretend
+        FileUtils.mkdir_p(destination_root)
+      end
+
+      if pretend
+        # In pretend mode, just yield down to the block
+        block.arity == 1 ? yield(destination_root) : yield
+      else
+        FileUtils.cd(destination_root) { block.arity == 1 ? yield(destination_root) : yield }
+      end
+
+      @destination_stack.pop
+      shell.padding -= 1 if verbose
+    end
+
+    # Goes to the root and execute the given block.
+    #
+    def in_root
+      inside(@destination_stack.first) { yield }
+    end
+
+    # Loads an external file and execute it in the instance binding.
+    #
+    # ==== Parameters
+    # path<String>:: The path to the file to execute. Can be a web address or
+    #                a relative path from the source root.
+    #
+    # ==== Examples
+    #
+    #   apply "http://gist.github.com/103208"
+    #
+    #   apply "recipes/jquery.rb"
+    #
+    def apply(path, config={})
+      verbose = config.fetch(:verbose, true)
+      is_uri  = path =~ /^https?\:\/\//
+      path    = find_in_source_paths(path) unless is_uri
+
+      say_status :apply, path, verbose
+      shell.padding += 1 if verbose
+
+      if is_uri
+        contents = open(path, "Accept" => "application/x-thor-template") {|io| io.read }
+      else
+        contents = open(path) {|io| io.read }
+      end
+
+      instance_eval(contents, path)
+      shell.padding -= 1 if verbose
+    end
+
+    # Executes a command returning the contents of the command.
+    #
+    # ==== Parameters
+    # command<String>:: the command to be executed.
+    # config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output. Specify :with
+    #                to append an executable to command executation.
+    #
+    # ==== Example
+    #
+    #   inside('vendor') do
+    #     run('ln -s ~/edge rails')
+    #   end
+    #
+    def run(command, config={})
+      return unless behavior == :invoke
+
+      destination = relative_to_original_destination_root(destination_root, false)
+      desc = "#{command} from #{destination.inspect}"
+
+      if config[:with]
+        desc = "#{File.basename(config[:with].to_s)} #{desc}"
+        command = "#{config[:with]} #{command}"
+      end
+
+      say_status :run, desc, config.fetch(:verbose, true)
+
+      unless options[:pretend]
+        config[:capture] ? `#{command}` : system("#{command}")
+      end
+    end
+
+    # Executes a ruby script (taking into account WIN32 platform quirks).
+    #
+    # ==== Parameters
+    # command<String>:: the command to be executed.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    def run_ruby_script(command, config={})
+      return unless behavior == :invoke
+      run command, config.merge(:with => Thor::Util.ruby_command)
+    end
+
+    # Run a thor command. A hash of options can be given and it's converted to
+    # switches.
+    #
+    # ==== Parameters
+    # command<String>:: the command to be invoked
+    # args<Array>:: arguments to the command
+    # config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output.
+    #                Other options are given as parameter to Thor.
+    #
+    #
+    # ==== Examples
+    #
+    #   thor :install, "http://gist.github.com/103208"
+    #   #=> thor install http://gist.github.com/103208
+    #
+    #   thor :list, :all => true, :substring => 'rails'
+    #   #=> thor list --all --substring=rails
+    #
+    def thor(command, *args)
+      config  = args.last.is_a?(Hash) ? args.pop : {}
+      verbose = config.key?(:verbose) ? config.delete(:verbose) : true
+      pretend = config.key?(:pretend) ? config.delete(:pretend) : false
+      capture = config.key?(:capture) ? config.delete(:capture) : false
+
+      args.unshift(command)
+      args.push Thor::Options.to_switches(config)
+      command = args.join(' ').strip
+
+      run command, :with => :thor, :verbose => verbose, :pretend => pretend, :capture => capture
+    end
+
+    protected
+
+      # Allow current root to be shared between invocations.
+      #
+      def _shared_configuration #:nodoc:
+        super.merge!(:destination_root => self.destination_root)
+      end
+
+      def _cleanup_options_and_set(options, key) #:nodoc:
+        case options
+        when Array
+          %w(--force -f --skip -s).each { |i| options.delete(i) }
+          options << "--#{key}"
+        when Hash
+          [:force, :skip, "force", "skip"].each { |i| options.delete(i) }
+          options.merge!(key => true)
+        end
+      end
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/create_file.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/create_file.rb
new file mode 100644
index 0000000..ed5973a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/create_file.rb
@@ -0,0 +1,105 @@
+require 'thor/actions/empty_directory'
+
+class Thor
+  module Actions
+
+    # Create a new file relative to the destination root with the given data,
+    # which is the return value of a block or a data string.
+    #
+    # ==== Parameters
+    # destination<String>:: the relative path to the destination root.
+    # data<String|NilClass>:: the data to append to the file.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   create_file "lib/fun_party.rb" do
+    #     hostname = ask("What is the virtual hostname I should use?")
+    #     "vhost.name = #{hostname}"
+    #   end
+    #
+    #   create_file "config/apache.conf", "your apache config"
+    #
+    def create_file(destination, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      data = args.first
+      action CreateFile.new(self, destination, block || data.to_s, config)
+    end
+    alias :add_file :create_file
+
+    # CreateFile is a subset of Template, which instead of rendering a file with
+    # ERB, it gets the content from the user.
+    #
+    class CreateFile < EmptyDirectory #:nodoc:
+      attr_reader :data
+
+      def initialize(base, destination, data, config={})
+        @data = data
+        super(base, destination, config)
+      end
+
+      # Checks if the content of the file at the destination is identical to the rendered result.
+      #
+      # ==== Returns
+      # Boolean:: true if it is identical, false otherwise.
+      #
+      def identical?
+        exists? && File.binread(destination) == render
+      end
+
+      # Holds the content to be added to the file.
+      #
+      def render
+        @render ||= if data.is_a?(Proc)
+          data.call
+        else
+          data
+        end
+      end
+
+      def invoke!
+        invoke_with_conflict_check do
+          FileUtils.mkdir_p(File.dirname(destination))
+          File.open(destination, 'wb') { |f| f.write render }
+        end
+        given_destination
+      end
+
+      protected
+
+        # Now on conflict we check if the file is identical or not.
+        #
+        def on_conflict_behavior(&block)
+          if identical?
+            say_status :identical, :blue
+          else
+            options = base.options.merge(config)
+            force_or_skip_or_conflict(options[:force], options[:skip], &block)
+          end
+        end
+
+        # If force is true, run the action, otherwise check if it's not being
+        # skipped. If both are false, show the file_collision menu, if the menu
+        # returns true, force it, otherwise skip.
+        #
+        def force_or_skip_or_conflict(force, skip, &block)
+          if force
+            say_status :force, :yellow
+            block.call unless pretend?
+          elsif skip
+            say_status :skip, :yellow
+          else
+            say_status :conflict, :red
+            force_or_skip_or_conflict(force_on_collision?, true, &block)
+          end
+        end
+
+        # Shows the file collision menu to the user and gets the result.
+        #
+        def force_on_collision?
+          base.shell.file_collision(destination){ render }
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/create_link.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/create_link.rb
new file mode 100644
index 0000000..fba3915
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/create_link.rb
@@ -0,0 +1,60 @@
+require 'thor/actions/create_file'
+
+class Thor
+  module Actions
+
+    # Create a new file relative to the destination root from the given source.
+    #
+    # ==== Parameters
+    # destination<String>:: the relative path to the destination root.
+    # source<String|NilClass>:: the relative path to the source root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #   :: give :symbolic => false for hard link.
+    #
+    # ==== Examples
+    #
+    #   create_link "config/apache.conf", "/etc/apache.conf"
+    #
+    def create_link(destination, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      source = args.first
+      action CreateLink.new(self, destination, source, config)
+    end
+    alias :add_link :create_link
+
+    # CreateLink is a subset of CreateFile, which instead of taking a block of
+    # data, just takes a source string from the user.
+    #
+    class CreateLink < CreateFile #:nodoc:
+      attr_reader :data
+
+      # Checks if the content of the file at the destination is identical to the rendered result.
+      #
+      # ==== Returns
+      # Boolean:: true if it is identical, false otherwise.
+      #
+      def identical?
+        exists? && File.identical?(render, destination)
+      end
+
+      def invoke!
+        invoke_with_conflict_check do
+          FileUtils.mkdir_p(File.dirname(destination))
+          # Create a symlink by default
+          config[:symbolic] = true if config[:symbolic].nil?
+          File.unlink(destination) if exists?
+          if config[:symbolic]
+            File.symlink(render, destination)
+          else
+            File.link(render, destination)
+          end
+        end
+        given_destination
+      end
+
+      def exists?
+        super || File.symlink?(destination)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/directory.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/directory.rb
new file mode 100644
index 0000000..7f8fd97
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/directory.rb
@@ -0,0 +1,119 @@
+require 'thor/actions/empty_directory'
+
+class Thor
+  module Actions
+    # Copies recursively the files from source directory to root directory.
+    # If any of the files finishes with .tt, it's considered to be a template
+    # and is placed in the destination without the extension .tt. If any
+    # empty directory is found, it's copied and all .empty_directory files are
+    # ignored. If any file name is wrapped within % signs, the text within
+    # the % signs will be executed as a method and replaced with the returned
+    # value. Let's suppose a doc directory with the following files:
+    #
+    #   doc/
+    #     components/.empty_directory
+    #     README
+    #     rdoc.rb.tt
+    #     %app_name%.rb
+    #
+    # When invoked as:
+    #
+    #   directory "doc"
+    #
+    # It will create a doc directory in the destination with the following
+    # files (assuming that the `app_name` method returns the value "blog"):
+    #
+    #   doc/
+    #     components/
+    #     README
+    #     rdoc.rb
+    #     blog.rb
+    #
+    # <b>Encoded path note:</b> Since Thor internals use Object#respond_to? to check if it can
+    # expand %something%, this `something` should be a public method in the class calling
+    # #directory. If a method is private, Thor stack raises PrivateMethodEncodedError.
+    #
+    # ==== Parameters
+    # source<String>:: the relative path to the source root.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #                If :recursive => false, does not look for paths recursively.
+    #                If :mode => :preserve, preserve the file mode from the source.
+    #                If :exclude_pattern => /regexp/, prevents copying files that match that regexp.
+    #
+    # ==== Examples
+    #
+    #   directory "doc"
+    #   directory "doc", "docs", :recursive => false
+    #
+    def directory(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first || source
+      action Directory.new(self, source, destination || source, config, &block)
+    end
+
+    class Directory < EmptyDirectory #:nodoc:
+      attr_reader :source
+
+      def initialize(base, source, destination=nil, config={}, &block)
+        @source = File.expand_path(base.find_in_source_paths(source.to_s))
+        @block  = block
+        super(base, destination, { :recursive => true }.merge(config))
+      end
+
+      def invoke!
+        base.empty_directory given_destination, config
+        execute!
+      end
+
+      def revoke!
+        execute!
+      end
+
+      protected
+
+        def execute!
+          lookup = Util.escape_globs(source)
+          lookup = config[:recursive] ? File.join(lookup, '**') : lookup
+          lookup = file_level_lookup(lookup)
+
+          files(lookup).sort.each do |file_source|
+            next if File.directory?(file_source)
+            next if config[:exclude_pattern] && file_source.match(config[:exclude_pattern])
+            file_destination = File.join(given_destination, file_source.gsub(source, '.'))
+            file_destination.gsub!('/./', '/')
+
+            case file_source
+            when /\.empty_directory$/
+              dirname = File.dirname(file_destination).gsub(/\/\.$/, '')
+              next if dirname == given_destination
+              base.empty_directory(dirname, config)
+            when /\.tt$/
+              destination = base.template(file_source, file_destination[0..-4], config, &@block)
+            else
+              destination = base.copy_file(file_source, file_destination, config, &@block)
+            end
+          end
+        end
+
+        if RUBY_VERSION < '2.0'
+          def file_level_lookup(previous_lookup)
+            File.join(previous_lookup, '{*,.[a-z]*}')
+          end
+
+          def files(lookup)
+            Dir[lookup]
+          end
+        else
+          def file_level_lookup(previous_lookup)
+            File.join(previous_lookup, '*')
+          end
+
+          def files(lookup)
+            Dir.glob(lookup, File::FNM_DOTMATCH)
+          end
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/empty_directory.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/empty_directory.rb
new file mode 100644
index 0000000..d9970ab
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/empty_directory.rb
@@ -0,0 +1,137 @@
+class Thor
+  module Actions
+
+    # Creates an empty directory.
+    #
+    # ==== Parameters
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   empty_directory "doc"
+    #
+    def empty_directory(destination, config={})
+      action EmptyDirectory.new(self, destination, config)
+    end
+
+    # Class which holds create directory logic. This is the base class for
+    # other actions like create_file and directory.
+    #
+    # This implementation is based in Templater actions, created by Jonas Nicklas
+    # and Michael S. Klishin under MIT LICENSE.
+    #
+    class EmptyDirectory #:nodoc:
+      attr_reader :base, :destination, :given_destination, :relative_destination, :config
+
+      # Initializes given the source and destination.
+      #
+      # ==== Parameters
+      # base<Thor::Base>:: A Thor::Base instance
+      # source<String>:: Relative path to the source of this file
+      # destination<String>:: Relative path to the destination of this file
+      # config<Hash>:: give :verbose => false to not log the status.
+      #
+      def initialize(base, destination, config={})
+        @base, @config   = base, { :verbose => true }.merge(config)
+        self.destination = destination
+      end
+
+      # Checks if the destination file already exists.
+      #
+      # ==== Returns
+      # Boolean:: true if the file exists, false otherwise.
+      #
+      def exists?
+        ::File.exists?(destination)
+      end
+
+      def invoke!
+        invoke_with_conflict_check do
+          ::FileUtils.mkdir_p(destination)
+        end
+      end
+
+      def revoke!
+        say_status :remove, :red
+        ::FileUtils.rm_rf(destination) if !pretend? && exists?
+        given_destination
+      end
+
+      protected
+
+        # Shortcut for pretend.
+        #
+        def pretend?
+          base.options[:pretend]
+        end
+
+        # Sets the absolute destination value from a relative destination value.
+        # It also stores the given and relative destination. Let's suppose our
+        # script is being executed on "dest", it sets the destination root to
+        # "dest". The destination, given_destination and relative_destination
+        # are related in the following way:
+        #
+        #   inside "bar" do
+        #     empty_directory "baz"
+        #   end
+        #
+        #   destination          #=> dest/bar/baz
+        #   relative_destination #=> bar/baz
+        #   given_destination    #=> baz
+        #
+        def destination=(destination)
+          if destination
+            @given_destination = convert_encoded_instructions(destination.to_s)
+            @destination = ::File.expand_path(@given_destination, base.destination_root)
+            @relative_destination = base.relative_to_original_destination_root(@destination)
+          end
+        end
+
+        # Filenames in the encoded form are converted. If you have a file:
+        #
+        #   %file_name%.rb
+        #
+        # It calls #file_name from the base and replaces %-string with the
+        # return value (should be String) of #file_name:
+        #
+        #   user.rb
+        #
+        # The method referenced can be either public or private.
+        #
+        def convert_encoded_instructions(filename)
+          filename.gsub(/%(.*?)%/) do |initial_string|
+            method = $1.strip
+            base.respond_to?(method, true) ? base.send(method) : initial_string
+          end
+        end
+
+        # Receives a hash of options and just execute the block if some
+        # conditions are met.
+        #
+        def invoke_with_conflict_check(&block)
+          if exists?
+            on_conflict_behavior(&block)
+          else
+            say_status :create, :green
+            block.call unless pretend?
+          end
+
+          destination
+        end
+
+        # What to do when the destination file already exists.
+        #
+        def on_conflict_behavior(&block)
+          say_status :exist, :blue
+        end
+
+        # Shortcut to say_status shell method.
+        #
+        def say_status(status, color)
+          base.shell.say_status status, relative_destination, color if config[:verbose]
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/file_manipulation.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/file_manipulation.rb
new file mode 100644
index 0000000..a652244
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/file_manipulation.rb
@@ -0,0 +1,314 @@
+require 'erb'
+require 'open-uri'
+
+class Thor
+  module Actions
+
+    # Copies the file from the relative source to the relative destination. If
+    # the destination is not given it's assumed to be equal to the source.
+    #
+    # ==== Parameters
+    # source<String>:: the relative path to the source root.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status, and
+    #                :mode => :preserve, to preserve the file mode from the source.
+
+    #
+    # ==== Examples
+    #
+    #   copy_file "README", "doc/README"
+    #
+    #   copy_file "doc/README"
+    #
+    def copy_file(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first || source
+      source = File.expand_path(find_in_source_paths(source.to_s))
+
+      create_file destination, nil, config do
+        content = File.binread(source)
+        content = block.call(content) if block
+        content
+      end
+      if config[:mode] == :preserve
+        mode = File.stat(source).mode
+        chmod(destination, mode, config)
+      end
+    end
+
+    # Links the file from the relative source to the relative destination. If
+    # the destination is not given it's assumed to be equal to the source.
+    #
+    # ==== Parameters
+    # source<String>:: the relative path to the source root.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   link_file "README", "doc/README"
+    #
+    #   link_file "doc/README"
+    #
+    def link_file(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first || source
+      source = File.expand_path(find_in_source_paths(source.to_s))
+
+      create_link destination, source, config
+    end
+
+    # Gets the content at the given address and places it at the given relative
+    # destination. If a block is given instead of destination, the content of
+    # the url is yielded and used as location.
+    #
+    # ==== Parameters
+    # source<String>:: the address of the given content.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   get "http://gist.github.com/103208", "doc/README"
+    #
+    #   get "http://gist.github.com/103208" do |content|
+    #     content.split("\n").first
+    #   end
+    #
+    def get(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first
+
+      source = File.expand_path(find_in_source_paths(source.to_s)) unless source =~ /^https?\:\/\//
+      render = open(source) {|input| input.binmode.read }
+
+      destination ||= if block_given?
+        block.arity == 1 ? block.call(render) : block.call
+      else
+        File.basename(source)
+      end
+
+      create_file destination, render, config
+    end
+
+    # Gets an ERB template at the relative source, executes it and makes a copy
+    # at the relative destination. If the destination is not given it's assumed
+    # to be equal to the source removing .tt from the filename.
+    #
+    # ==== Parameters
+    # source<String>:: the relative path to the source root.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   template "README", "doc/README"
+    #
+    #   template "doc/README"
+    #
+    def template(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first || source.sub(/\.tt$/, '')
+
+      source  = File.expand_path(find_in_source_paths(source.to_s))
+      context = instance_eval('binding')
+
+      create_file destination, nil, config do
+        content = ERB.new(::File.binread(source), nil, '-', '@output_buffer').result(context)
+        content = block.call(content) if block
+        content
+      end
+    end
+
+    # Changes the mode of the given file or directory.
+    #
+    # ==== Parameters
+    # mode<Integer>:: the file mode
+    # path<String>:: the name of the file to change mode
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   chmod "script/server", 0755
+    #
+    def chmod(path, mode, config={})
+      return unless behavior == :invoke
+      path = File.expand_path(path, destination_root)
+      say_status :chmod, relative_to_original_destination_root(path), config.fetch(:verbose, true)
+      FileUtils.chmod_R(mode, path) unless options[:pretend]
+    end
+
+    # Prepend text to a file. Since it depends on insert_into_file, it's reversible.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # data<String>:: the data to prepend to the file, can be also given as a block.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   prepend_to_file 'config/environments/test.rb', 'config.gem "rspec"'
+    #
+    #   prepend_to_file 'config/environments/test.rb' do
+    #     'config.gem "rspec"'
+    #   end
+    #
+    def prepend_to_file(path, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      config.merge!(:after => /\A/)
+      insert_into_file(path, *(args << config), &block)
+    end
+    alias_method :prepend_file, :prepend_to_file
+
+    # Append text to a file. Since it depends on insert_into_file, it's reversible.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # data<String>:: the data to append to the file, can be also given as a block.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   append_to_file 'config/environments/test.rb', 'config.gem "rspec"'
+    #
+    #   append_to_file 'config/environments/test.rb' do
+    #     'config.gem "rspec"'
+    #   end
+    #
+    def append_to_file(path, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      config.merge!(:before => /\z/)
+      insert_into_file(path, *(args << config), &block)
+    end
+    alias_method :append_file, :append_to_file
+
+    # Injects text right after the class definition. Since it depends on
+    # insert_into_file, it's reversible.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # klass<String|Class>:: the class to be manipulated
+    # data<String>:: the data to append to the class, can be also given as a block.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   inject_into_class "app/controllers/application_controller.rb", ApplicationController, "  filter_parameter :password\n"
+    #
+    #   inject_into_class "app/controllers/application_controller.rb", ApplicationController do
+    #     "  filter_parameter :password\n"
+    #   end
+    #
+    def inject_into_class(path, klass, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      config.merge!(:after => /class #{klass}\n|class #{klass} .*\n/)
+      insert_into_file(path, *(args << config), &block)
+    end
+
+    # Run a regular expression replacement on a file.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # flag<Regexp|String>:: the regexp or string to be replaced
+    # replacement<String>:: the replacement, can be also given as a block
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   gsub_file 'app/controllers/application_controller.rb', /#\s*(filter_parameter_logging :password)/, '\1'
+    #
+    #   gsub_file 'README', /rake/, :green do |match|
+    #     match << " no more. Use thor!"
+    #   end
+    #
+    def gsub_file(path, flag, *args, &block)
+      return unless behavior == :invoke
+      config = args.last.is_a?(Hash) ? args.pop : {}
+
+      path = File.expand_path(path, destination_root)
+      say_status :gsub, relative_to_original_destination_root(path), config.fetch(:verbose, true)
+
+      unless options[:pretend]
+        content = File.binread(path)
+        content.gsub!(flag, *args, &block)
+        File.open(path, 'wb') { |file| file.write(content) }
+      end
+    end
+
+    # Uncomment all lines matching a given regex.  It will leave the space
+    # which existed before the comment hash in tact but will remove any spacing
+    # between the comment hash and the beginning of the line.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # flag<Regexp|String>:: the regexp or string used to decide which lines to uncomment
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   uncomment_lines 'config/initializers/session_store.rb', /active_record/
+    #
+    def uncomment_lines(path, flag, *args)
+      flag = flag.respond_to?(:source) ? flag.source : flag
+
+      gsub_file(path, /^(\s*)#[[:blank:]]*(.*#{flag})/, '\1\2', *args)
+    end
+
+    # Comment all lines matching a given regex.  It will leave the space
+    # which existed before the beginning of the line in tact and will insert
+    # a single space after the comment hash.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # flag<Regexp|String>:: the regexp or string used to decide which lines to comment
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   comment_lines 'config/initializers/session_store.rb', /cookie_store/
+    #
+    def comment_lines(path, flag, *args)
+      flag = flag.respond_to?(:source) ? flag.source : flag
+
+      gsub_file(path, /^(\s*)([^#|\n]*#{flag})/, '\1# \2', *args)
+    end
+
+    # Removes a file at the given location.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   remove_file 'README'
+    #   remove_file 'app/controllers/application_controller.rb'
+    #
+    def remove_file(path, config={})
+      return unless behavior == :invoke
+      path  = File.expand_path(path, destination_root)
+
+      say_status :remove, relative_to_original_destination_root(path), config.fetch(:verbose, true)
+      ::FileUtils.rm_rf(path) if !options[:pretend] && File.exists?(path)
+    end
+    alias :remove_dir :remove_file
+
+  private
+    attr_accessor :output_buffer
+    def concat(string)
+      @output_buffer.concat(string)
+    end
+
+    def capture(*args, &block)
+      with_output_buffer { block.call(*args) }
+    end
+
+    def with_output_buffer(buf = '') #:nodoc:
+      self.output_buffer, old_buffer = buf, output_buffer
+      yield
+      output_buffer
+    ensure
+      self.output_buffer = old_buffer
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/inject_into_file.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/inject_into_file.rb
new file mode 100644
index 0000000..c48cfab
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/actions/inject_into_file.rb
@@ -0,0 +1,109 @@
+require 'thor/actions/empty_directory'
+
+class Thor
+  module Actions
+
+    # Injects the given content into a file. Different from gsub_file, this
+    # method is reversible.
+    #
+    # ==== Parameters
+    # destination<String>:: Relative path to the destination root
+    # data<String>:: Data to add to the file. Can be given as a block.
+    # config<Hash>:: give :verbose => false to not log the status and the flag
+    #                for injection (:after or :before) or :force => true for
+    #                insert two or more times the same content.
+    #
+    # ==== Examples
+    #
+    #   insert_into_file "config/environment.rb", "config.gem :thor", :after => "Rails::Initializer.run do |config|\n"
+    #
+    #   insert_into_file "config/environment.rb", :after => "Rails::Initializer.run do |config|\n" do
+    #     gems = ask "Which gems would you like to add?"
+    #     gems.split(" ").map{ |gem| "  config.gem :#{gem}" }.join("\n")
+    #   end
+    #
+    def insert_into_file(destination, *args, &block)
+      if block_given?
+        data, config = block, args.shift
+      else
+        data, config = args.shift, args.shift
+      end
+      action InjectIntoFile.new(self, destination, data, config)
+    end
+    alias_method :inject_into_file, :insert_into_file
+
+    class InjectIntoFile < EmptyDirectory #:nodoc:
+      attr_reader :replacement, :flag, :behavior
+
+      def initialize(base, destination, data, config)
+        super(base, destination, { :verbose => true }.merge(config))
+
+        @behavior, @flag = if @config.key?(:after)
+          [:after, @config.delete(:after)]
+        else
+          [:before, @config.delete(:before)]
+        end
+
+        @replacement = data.is_a?(Proc) ? data.call : data
+        @flag = Regexp.escape(@flag) unless @flag.is_a?(Regexp)
+      end
+
+      def invoke!
+        say_status :invoke
+
+        content = if @behavior == :after
+          '\0' + replacement
+        else
+          replacement + '\0'
+        end
+
+        replace!(/#{flag}/, content, config[:force])
+      end
+
+      def revoke!
+        say_status :revoke
+
+        regexp = if @behavior == :after
+          content = '\1\2'
+          /(#{flag})(.*)(#{Regexp.escape(replacement)})/m
+        else
+          content = '\2\3'
+          /(#{Regexp.escape(replacement)})(.*)(#{flag})/m
+        end
+
+        replace!(regexp, content, true)
+      end
+
+      protected
+
+        def say_status(behavior)
+          status = if behavior == :invoke
+            if flag == /\A/
+               :prepend
+            elsif flag == /\z/
+              :append
+            else
+              :insert
+            end
+          else
+            :subtract
+          end
+
+          super(status, config[:verbose])
+        end
+
+        # Adds the content to the file.
+        #
+        def replace!(regexp, string, force)
+          unless base.options[:pretend]
+            content = File.binread(destination)
+            if force || !content.include?(replacement)
+              content.gsub!(regexp, string)
+              File.open(destination, 'wb') { |file| file.write(content) }
+            end
+          end
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/base.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/base.rb
new file mode 100644
index 0000000..4b5d5bd
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/base.rb
@@ -0,0 +1,652 @@
+require 'thor/command'
+require 'thor/core_ext/hash_with_indifferent_access'
+require 'thor/core_ext/ordered_hash'
+require 'thor/error'
+require 'thor/invocation'
+require 'thor/parser'
+require 'thor/shell'
+require 'thor/util'
+
+class Thor
+  autoload :Actions,    'thor/actions'
+  autoload :RakeCompat, 'thor/rake_compat'
+  autoload :Group,      'thor/group'
+
+  # Shortcuts for help.
+  HELP_MAPPINGS       = %w(-h -? --help -D)
+
+  # Thor methods that should not be overwritten by the user.
+  THOR_RESERVED_WORDS = %w(invoke shell options behavior root destination_root relative_root
+                           action add_file create_file in_root inside run run_ruby_script)
+
+  module Base
+    attr_accessor :options, :parent_options, :args
+
+    # It receives arguments in an Array and two hashes, one for options and
+    # other for configuration.
+    #
+    # Notice that it does not check if all required arguments were supplied.
+    # It should be done by the parser.
+    #
+    # ==== Parameters
+    # args<Array[Object]>:: An array of objects. The objects are applied to their
+    #                       respective accessors declared with <tt>argument</tt>.
+    #
+    # options<Hash>:: An options hash that will be available as self.options.
+    #                 The hash given is converted to a hash with indifferent
+    #                 access, magic predicates (options.skip?) and then frozen.
+    #
+    # config<Hash>:: Configuration for this Thor class.
+    #
+    def initialize(args=[], options={}, config={})
+      parse_options = self.class.class_options
+
+      # The start method splits inbound arguments at the first argument
+      # that looks like an option (starts with - or --). It then calls
+      # new, passing in the two halves of the arguments Array as the
+      # first two parameters.
+
+      if options.is_a?(Array)
+        command_options = config.delete(:command_options) # hook for start
+        parse_options = parse_options.merge(command_options) if command_options
+        array_options, hash_options = options, {}
+      else
+        # Handle the case where the class was explicitly instantiated
+        # with pre-parsed options.
+        array_options, hash_options = [], options
+      end
+
+      # Let Thor::Options parse the options first, so it can remove
+      # declared options from the array. This will leave us with
+      # a list of arguments that weren't declared.
+      stop_on_unknown = self.class.stop_on_unknown_option? config[:current_command]
+      opts = Thor::Options.new(parse_options, hash_options, stop_on_unknown)
+      self.options = opts.parse(array_options)
+      self.options = config[:class_options].merge(self.options) if config[:class_options]
+
+      # If unknown options are disallowed, make sure that none of the
+      # remaining arguments looks like an option.
+      opts.check_unknown! if self.class.check_unknown_options?(config)
+
+      # Add the remaining arguments from the options parser to the
+      # arguments passed in to initialize. Then remove any positional
+      # arguments declared using #argument (this is primarily used
+      # by Thor::Group). Tis will leave us with the remaining
+      # positional arguments.
+      to_parse  = args
+      to_parse += opts.remaining unless self.class.strict_args_position?(config)
+
+      thor_args = Thor::Arguments.new(self.class.arguments)
+      thor_args.parse(to_parse).each { |k,v| __send__("#{k}=", v) }
+      @args = thor_args.remaining
+    end
+
+    class << self
+      def included(base) #:nodoc:
+        base.send :extend,  ClassMethods
+        base.send :include, Invocation
+        base.send :include, Shell
+      end
+
+      # Returns the classes that inherits from Thor or Thor::Group.
+      #
+      # ==== Returns
+      # Array[Class]
+      #
+      def subclasses
+        @subclasses ||= []
+      end
+
+      # Returns the files where the subclasses are kept.
+      #
+      # ==== Returns
+      # Hash[path<String> => Class]
+      #
+      def subclass_files
+        @subclass_files ||= Hash.new{ |h,k| h[k] = [] }
+      end
+
+      # Whenever a class inherits from Thor or Thor::Group, we should track the
+      # class and the file on Thor::Base. This is the method responsable for it.
+      #
+      def register_klass_file(klass) #:nodoc:
+        file = caller[1].match(/(.*):\d+/)[1]
+        Thor::Base.subclasses << klass unless Thor::Base.subclasses.include?(klass)
+
+        file_subclasses = Thor::Base.subclass_files[File.expand_path(file)]
+        file_subclasses << klass unless file_subclasses.include?(klass)
+      end
+    end
+
+    module ClassMethods
+      def attr_reader(*) #:nodoc:
+        no_commands { super }
+      end
+
+      def attr_writer(*) #:nodoc:
+        no_commands { super }
+      end
+
+      def attr_accessor(*) #:nodoc:
+        no_commands { super }
+      end
+
+      # If you want to raise an error for unknown options, call check_unknown_options!
+      # This is disabled by default to allow dynamic invocations.
+      def check_unknown_options!
+        @check_unknown_options = true
+      end
+
+      def check_unknown_options #:nodoc:
+        @check_unknown_options ||= from_superclass(:check_unknown_options, false)
+      end
+
+      def check_unknown_options?(config) #:nodoc:
+        !!check_unknown_options
+      end
+
+      # If true, option parsing is suspended as soon as an unknown option or a
+      # regular argument is encountered.  All remaining arguments are passed to
+      # the command as regular arguments.
+      def stop_on_unknown_option?(command_name) #:nodoc:
+        false
+      end
+
+      # If you want only strict string args (useful when cascading thor classes),
+      # call strict_args_position! This is disabled by default to allow dynamic
+      # invocations.
+      def strict_args_position!
+        @strict_args_position = true
+      end
+
+      def strict_args_position #:nodoc:
+        @strict_args_position ||= from_superclass(:strict_args_position, false)
+      end
+
+      def strict_args_position?(config) #:nodoc:
+        !!strict_args_position
+      end
+
+      # Adds an argument to the class and creates an attr_accessor for it.
+      #
+      # Arguments are different from options in several aspects. The first one
+      # is how they are parsed from the command line, arguments are retrieved
+      # from position:
+      #
+      #   thor command NAME
+      #
+      # Instead of:
+      #
+      #   thor command --name=NAME
+      #
+      # Besides, arguments are used inside your code as an accessor (self.argument),
+      # while options are all kept in a hash (self.options).
+      #
+      # Finally, arguments cannot have type :default or :boolean but can be
+      # optional (supplying :optional => :true or :required => false), although
+      # you cannot have a required argument after a non-required argument. If you
+      # try it, an error is raised.
+      #
+      # ==== Parameters
+      # name<Symbol>:: The name of the argument.
+      # options<Hash>:: Described below.
+      #
+      # ==== Options
+      # :desc     - Description for the argument.
+      # :required - If the argument is required or not.
+      # :optional - If the argument is optional or not.
+      # :type     - The type of the argument, can be :string, :hash, :array, :numeric.
+      # :default  - Default value for this argument. It cannot be required and have default values.
+      # :banner   - String to show on usage notes.
+      #
+      # ==== Errors
+      # ArgumentError:: Raised if you supply a required argument after a non required one.
+      #
+      def argument(name, options={})
+        is_thor_reserved_word?(name, :argument)
+        no_commands { attr_accessor name }
+
+        required = if options.key?(:optional)
+          !options[:optional]
+        elsif options.key?(:required)
+          options[:required]
+        else
+          options[:default].nil?
+        end
+
+        remove_argument name
+
+        arguments.each do |argument|
+          next if argument.required?
+          raise ArgumentError, "You cannot have #{name.to_s.inspect} as required argument after " <<
+                               "the non-required argument #{argument.human_name.inspect}."
+        end if required
+
+        options[:required] = required
+
+        arguments << Thor::Argument.new(name, options)
+      end
+
+      # Returns this class arguments, looking up in the ancestors chain.
+      #
+      # ==== Returns
+      # Array[Thor::Argument]
+      #
+      def arguments
+        @arguments ||= from_superclass(:arguments, [])
+      end
+
+      # Adds a bunch of options to the set of class options.
+      #
+      #   class_options :foo => false, :bar => :required, :baz => :string
+      #
+      # If you prefer more detailed declaration, check class_option.
+      #
+      # ==== Parameters
+      # Hash[Symbol => Object]
+      #
+      def class_options(options=nil)
+        @class_options ||= from_superclass(:class_options, {})
+        build_options(options, @class_options) if options
+        @class_options
+      end
+
+      # Adds an option to the set of class options
+      #
+      # ==== Parameters
+      # name<Symbol>:: The name of the argument.
+      # options<Hash>:: Described below.
+      #
+      # ==== Options
+      # :desc::     -- Description for the argument.
+      # :required:: -- If the argument is required or not.
+      # :default::  -- Default value for this argument.
+      # :group::    -- The group for this options. Use by class options to output options in different levels.
+      # :aliases::  -- Aliases for this option. <b>Note:</b> Thor follows a convention of one-dash-one-letter options. Thus aliases like "-something" wouldn't be parsed; use either "\--something" or "-s" instead.
+      # :type::     -- The type of the argument, can be :string, :hash, :array, :numeric or :boolean.
+      # :banner::   -- String to show on usage notes.
+      # :hide::     -- If you want to hide this option from the help.
+      #
+      def class_option(name, options={})
+        build_option(name, options, class_options)
+      end
+
+      # Removes a previous defined argument. If :undefine is given, undefine
+      # accessors as well.
+      #
+      # ==== Parameters
+      # names<Array>:: Arguments to be removed
+      #
+      # ==== Examples
+      #
+      #   remove_argument :foo
+      #   remove_argument :foo, :bar, :baz, :undefine => true
+      #
+      def remove_argument(*names)
+        options = names.last.is_a?(Hash) ? names.pop : {}
+
+        names.each do |name|
+          arguments.delete_if { |a| a.name == name.to_s }
+          undef_method name, "#{name}=" if options[:undefine]
+        end
+      end
+
+      # Removes a previous defined class option.
+      #
+      # ==== Parameters
+      # names<Array>:: Class options to be removed
+      #
+      # ==== Examples
+      #
+      #   remove_class_option :foo
+      #   remove_class_option :foo, :bar, :baz
+      #
+      def remove_class_option(*names)
+        names.each do |name|
+          class_options.delete(name)
+        end
+      end
+
+      # Defines the group. This is used when thor list is invoked so you can specify
+      # that only commands from a pre-defined group will be shown. Defaults to standard.
+      #
+      # ==== Parameters
+      # name<String|Symbol>
+      #
+      def group(name=nil)
+        @group = case name
+        when nil
+          @group || from_superclass(:group, 'standard')
+        else
+          name.to_s
+        end
+      end
+
+      # Returns the commands for this Thor class.
+      #
+      # ==== Returns
+      # OrderedHash:: An ordered hash with commands names as keys and Thor::Command
+      #               objects as values.
+      #
+      def commands
+        @commands ||= Thor::CoreExt::OrderedHash.new
+      end
+      alias tasks commands
+
+      # Returns the commands for this Thor class and all subclasses.
+      #
+      # ==== Returns
+      # OrderedHash:: An ordered hash with commands names as keys and Thor::Command
+      #               objects as values.
+      #
+      def all_commands
+        @all_commands ||= from_superclass(:all_commands, Thor::CoreExt::OrderedHash.new)
+        @all_commands.merge(commands)
+      end
+      alias all_tasks all_commands
+
+      # Removes a given command from this Thor class. This is usually done if you
+      # are inheriting from another class and don't want it to be available
+      # anymore.
+      #
+      # By default it only remove the mapping to the command. But you can supply
+      # :undefine => true to undefine the method from the class as well.
+      #
+      # ==== Parameters
+      # name<Symbol|String>:: The name of the command to be removed
+      # options<Hash>:: You can give :undefine => true if you want commands the method
+      #                 to be undefined from the class as well.
+      #
+      def remove_command(*names)
+        options = names.last.is_a?(Hash) ? names.pop : {}
+
+        names.each do |name|
+          commands.delete(name.to_s)
+          all_commands.delete(name.to_s)
+          undef_method name if options[:undefine]
+        end
+      end
+      alias remove_task remove_command
+
+      # All methods defined inside the given block are not added as commands.
+      #
+      # So you can do:
+      #
+      #   class MyScript < Thor
+      #     no_commands do
+      #       def this_is_not_a_command
+      #       end
+      #     end
+      #   end
+      #
+      # You can also add the method and remove it from the command list:
+      #
+      #   class MyScript < Thor
+      #     def this_is_not_a_command
+      #     end
+      #     remove_command :this_is_not_a_command
+      #   end
+      #
+      def no_commands
+        @no_commands = true
+        yield
+      ensure
+        @no_commands = false
+      end
+      alias no_tasks no_commands
+
+      # Sets the namespace for the Thor or Thor::Group class. By default the
+      # namespace is retrieved from the class name. If your Thor class is named
+      # Scripts::MyScript, the help method, for example, will be called as:
+      #
+      #   thor scripts:my_script -h
+      #
+      # If you change the namespace:
+      #
+      #   namespace :my_scripts
+      #
+      # You change how your commands are invoked:
+      #
+      #   thor my_scripts -h
+      #
+      # Finally, if you change your namespace to default:
+      #
+      #   namespace :default
+      #
+      # Your commands can be invoked with a shortcut. Instead of:
+      #
+      #   thor :my_command
+      #
+      def namespace(name=nil)
+        @namespace = case name
+        when nil
+          @namespace || Thor::Util.namespace_from_thor_class(self)
+        else
+          @namespace = name.to_s
+        end
+      end
+
+      # Parses the command and options from the given args, instantiate the class
+      # and invoke the command. This method is used when the arguments must be parsed
+      # from an array. If you are inside Ruby and want to use a Thor class, you
+      # can simply initialize it:
+      #
+      #   script = MyScript.new(args, options, config)
+      #   script.invoke(:command, first_arg, second_arg, third_arg)
+      #
+      def start(given_args=ARGV, config={})
+        config[:shell] ||= Thor::Base.shell.new
+        dispatch(nil, given_args.dup, nil, config)
+      rescue Thor::Error => e
+        ENV["THOR_DEBUG"] == "1" ? (raise e) : config[:shell].error(e.message)
+        exit(1) if exit_on_failure?
+      rescue Errno::EPIPE
+        # This happens if a thor command is piped to something like `head`,
+        # which closes the pipe when it's done reading. This will also
+        # mean that if the pipe is closed, further unnecessary
+        # computation will not occur.
+        exit(0)
+      end
+
+      # Allows to use private methods from parent in child classes as commands.
+      #
+      # ==== Parameters
+      #   names<Array>:: Method names to be used as commands
+      #
+      # ==== Examples
+      #
+      #   public_command :foo
+      #   public_command :foo, :bar, :baz
+      #
+      def public_command(*names)
+        names.each do |name|
+          class_eval "def #{name}(*); super end"
+        end
+      end
+      alias public_task public_command
+
+      def handle_no_command_error(command, has_namespace = $thor_runner) #:nodoc:
+        if has_namespace
+          raise UndefinedCommandError, "Could not find command #{command.inspect} in #{namespace.inspect} namespace."
+        else
+          raise UndefinedCommandError, "Could not find command #{command.inspect}."
+        end
+      end
+      alias handle_no_task_error handle_no_command_error
+
+      def handle_argument_error(command, error, args, arity) #:nodoc:
+        msg = "ERROR: #{basename} #{command.name} was called with "
+        msg << 'no arguments'               if  args.empty?
+        msg << 'arguments ' << args.inspect if !args.empty?
+        msg << "\nUsage: #{self.banner(command).inspect}."
+        raise InvocationError, msg
+      end
+
+      protected
+
+        # Prints the class options per group. If an option does not belong to
+        # any group, it's printed as Class option.
+        #
+        def class_options_help(shell, groups={}) #:nodoc:
+          # Group options by group
+          class_options.each do |_, value|
+            groups[value.group] ||= []
+            groups[value.group] << value
+          end
+
+          # Deal with default group
+          global_options = groups.delete(nil) || []
+          print_options(shell, global_options)
+
+          # Print all others
+          groups.each do |group_name, options|
+            print_options(shell, options, group_name)
+          end
+        end
+
+        # Receives a set of options and print them.
+        def print_options(shell, options, group_name=nil)
+          return if options.empty?
+
+          list = []
+          padding = options.collect{ |o| o.aliases.size }.max.to_i * 4
+
+          options.each do |option|
+            unless option.hide
+              item = [ option.usage(padding) ]
+              item.push(option.description ? "# #{option.description}" : "")
+
+              list << item
+              list << [ "", "# Default: #{option.default}" ] if option.show_default?
+              list << [ "", "# Possible values: #{option.enum.join(', ')}" ] if option.enum
+            end
+          end
+
+          shell.say(group_name ? "#{group_name} options:" : "Options:")
+          shell.print_table(list, :indent => 2)
+          shell.say ""
+        end
+
+        # Raises an error if the word given is a Thor reserved word.
+        def is_thor_reserved_word?(word, type) #:nodoc:
+          return false unless THOR_RESERVED_WORDS.include?(word.to_s)
+          raise "#{word.inspect} is a Thor reserved word and cannot be defined as #{type}"
+        end
+
+        # Build an option and adds it to the given scope.
+        #
+        # ==== Parameters
+        # name<Symbol>:: The name of the argument.
+        # options<Hash>:: Described in both class_option and method_option.
+        # scope<Hash>:: Options hash that is being built up
+        def build_option(name, options, scope) #:nodoc:
+          scope[name] = Thor::Option.new(name, options)
+        end
+
+        # Receives a hash of options, parse them and add to the scope. This is a
+        # fast way to set a bunch of options:
+        #
+        #   build_options :foo => true, :bar => :required, :baz => :string
+        #
+        # ==== Parameters
+        # Hash[Symbol => Object]
+        def build_options(options, scope) #:nodoc:
+          options.each do |key, value|
+            scope[key] = Thor::Option.parse(key, value)
+          end
+        end
+
+        # Finds a command with the given name. If the command belongs to the current
+        # class, just return it, otherwise dup it and add the fresh copy to the
+        # current command hash.
+        def find_and_refresh_command(name) #:nodoc:
+          command = if command = commands[name.to_s]
+            command
+          elsif command = all_commands[name.to_s]
+            commands[name.to_s] = command.clone
+          else
+            raise ArgumentError, "You supplied :for => #{name.inspect}, but the command #{name.inspect} could not be found."
+          end
+        end
+        alias find_and_refresh_task find_and_refresh_command
+
+        # Everytime someone inherits from a Thor class, register the klass
+        # and file into baseclass.
+        def inherited(klass)
+          Thor::Base.register_klass_file(klass)
+          klass.instance_variable_set(:@no_commands, false)
+        end
+
+        # Fire this callback whenever a method is added. Added methods are
+        # tracked as commands by invoking the create_command method.
+        def method_added(meth)
+          meth = meth.to_s
+
+          if meth == "initialize"
+            initialize_added
+            return
+          end
+
+          # Return if it's not a public instance method
+          return unless public_method_defined?(meth.to_sym)
+
+          return if @no_commands || !create_command(meth)
+
+          is_thor_reserved_word?(meth, :command)
+          Thor::Base.register_klass_file(self)
+        end
+
+        # Retrieves a value from superclass. If it reaches the baseclass,
+        # returns default.
+        def from_superclass(method, default=nil)
+          if self == baseclass || !superclass.respond_to?(method, true)
+            default
+          else
+            value = superclass.send(method)
+
+            if value
+              if value.is_a?(TrueClass) || value.is_a?(Symbol)
+                value
+              else
+                value.dup
+              end
+            end
+          end
+        end
+
+        # A flag that makes the process exit with status 1 if any error happens.
+        def exit_on_failure?
+          false
+        end
+
+        #
+        # The basename of the program invoking the thor class.
+        #
+        def basename
+          File.basename($0).split(' ').first
+        end
+
+        # SIGNATURE: Sets the baseclass. This is where the superclass lookup
+        # finishes.
+        def baseclass #:nodoc:
+        end
+
+        # SIGNATURE: Creates a new command if valid_command? is true. This method is
+        # called when a new method is added to the class.
+        def create_command(meth) #:nodoc:
+        end
+        alias create_task create_command
+
+        # SIGNATURE: Defines behavior when the initialize method is added to the
+        # class.
+        def initialize_added #:nodoc:
+        end
+
+        # SIGNATURE: The hook invoked by start.
+        def dispatch(command, given_args, given_opts, config) #:nodoc:
+          raise NotImplementedError
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/command.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/command.rb
new file mode 100644
index 0000000..e56bd44
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/command.rb
@@ -0,0 +1,136 @@
+class Thor
+  class Command < Struct.new(:name, :description, :long_description, :usage, :options)
+    FILE_REGEXP = /^#{Regexp.escape(File.dirname(__FILE__))}/
+
+    def initialize(name, description, long_description, usage, options=nil)
+      super(name.to_s, description, long_description, usage, options || {})
+    end
+
+    def initialize_copy(other) #:nodoc:
+      super(other)
+      self.options = other.options.dup if other.options
+    end
+
+    def hidden?
+      false
+    end
+
+    # By default, a command invokes a method in the thor class. You can change this
+    # implementation to create custom commands.
+    def run(instance, args=[])
+      arity = nil
+
+      if private_method?(instance)
+        instance.class.handle_no_command_error(name)
+      elsif public_method?(instance)
+        arity = instance.method(name).arity
+        instance.__send__(name, *args)
+      elsif local_method?(instance, :method_missing)
+        instance.__send__(:method_missing, name.to_sym, *args)
+      else
+        instance.class.handle_no_command_error(name)
+      end
+    rescue ArgumentError => e
+      handle_argument_error?(instance, e, caller) ?
+        instance.class.handle_argument_error(self, e, args, arity) : (raise e)
+    rescue NoMethodError => e
+      handle_no_method_error?(instance, e, caller) ?
+        instance.class.handle_no_command_error(name) : (raise e)
+    end
+
+    # Returns the formatted usage by injecting given required arguments
+    # and required options into the given usage.
+    def formatted_usage(klass, namespace = true, subcommand = false)
+      if namespace
+        namespace = klass.namespace
+        formatted = "#{namespace.gsub(/^(default)/,'')}:"
+      end
+      formatted = "#{klass.namespace.split(':').last} " if subcommand
+
+      formatted ||= ""
+
+      # Add usage with required arguments
+      formatted << if klass && !klass.arguments.empty?
+        usage.to_s.gsub(/^#{name}/) do |match|
+          match << " " << klass.arguments.map{ |a| a.usage }.compact.join(' ')
+        end
+      else
+        usage.to_s
+      end
+
+      # Add required options
+      formatted << " #{required_options}"
+
+      # Strip and go!
+      formatted.strip
+    end
+
+  protected
+
+    def not_debugging?(instance)
+      !(instance.class.respond_to?(:debugging) && instance.class.debugging)
+    end
+
+    def required_options
+      @required_options ||= options.map{ |_, o| o.usage if o.required? }.compact.sort.join(" ")
+    end
+
+    # Given a target, checks if this class name is a public method.
+    def public_method?(instance) #:nodoc:
+      !(instance.public_methods & [name.to_s, name.to_sym]).empty?
+    end
+
+    def private_method?(instance)
+      !(instance.private_methods & [name.to_s, name.to_sym]).empty?
+    end
+
+    def local_method?(instance, name)
+      methods = instance.public_methods(false) + instance.private_methods(false) + instance.protected_methods(false)
+      !(methods & [name.to_s, name.to_sym]).empty?
+    end
+
+    def sans_backtrace(backtrace, caller) #:nodoc:
+      saned  = backtrace.reject { |frame| frame =~ FILE_REGEXP || (frame =~ /\.java:/ && RUBY_PLATFORM =~ /java/) }
+      saned -= caller
+    end
+
+    def handle_argument_error?(instance, error, caller)
+      not_debugging?(instance) && error.message =~ /wrong number of arguments/ && begin
+        saned = sans_backtrace(error.backtrace, caller)
+        # Ruby 1.9 always include the called method in the backtrace
+        saned.empty? || (saned.size == 1 && RUBY_VERSION >= "1.9")
+      end
+    end
+
+    def handle_no_method_error?(instance, error, caller)
+      not_debugging?(instance) &&
+        error.message =~ /^undefined method `#{name}' for #{Regexp.escape(instance.to_s)}$/
+    end
+  end
+  Task = Command
+
+  # A command that is hidden in help messages but still invocable.
+  class HiddenCommand < Command
+    def hidden?
+      true
+    end
+  end
+  HiddenTask = HiddenCommand
+
+  # A dynamic command that handles method missing scenarios.
+  class DynamicCommand < Command
+    def initialize(name, options=nil)
+      super(name.to_s, "A dynamically-generated command", name.to_s, name.to_s, options)
+    end
+
+    def run(instance, args=[])
+      if (instance.methods & [name.to_s, name.to_sym]).empty?
+        super
+      else
+        instance.class.handle_no_command_error(name)
+      end
+    end
+  end
+  DynamicTask = DynamicCommand
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/core_ext/hash_with_indifferent_access.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/core_ext/hash_with_indifferent_access.rb
new file mode 100644
index 0000000..0a583e6
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/core_ext/hash_with_indifferent_access.rb
@@ -0,0 +1,80 @@
+class Thor
+  module CoreExt #:nodoc:
+
+    # A hash with indifferent access and magic predicates.
+    #
+    #   hash = Thor::CoreExt::HashWithIndifferentAccess.new 'foo' => 'bar', 'baz' => 'bee', 'force' => true
+    #
+    #   hash[:foo]  #=> 'bar'
+    #   hash['foo'] #=> 'bar'
+    #   hash.foo?   #=> true
+    #
+    class HashWithIndifferentAccess < ::Hash #:nodoc:
+
+      def initialize(hash={})
+        super()
+        hash.each do |key, value|
+          self[convert_key(key)] = value
+        end
+      end
+
+      def [](key)
+        super(convert_key(key))
+      end
+
+      def []=(key, value)
+        super(convert_key(key), value)
+      end
+
+      def delete(key)
+        super(convert_key(key))
+      end
+
+      def values_at(*indices)
+        indices.collect { |key| self[convert_key(key)] }
+      end
+
+      def merge(other)
+        dup.merge!(other)
+      end
+
+      def merge!(other)
+        other.each do |key, value|
+          self[convert_key(key)] = value
+        end
+        self
+      end
+
+      # Convert to a Hash with String keys.
+      def to_hash
+        Hash.new(default).merge!(self)
+      end
+
+      protected
+
+        def convert_key(key)
+          key.is_a?(Symbol) ? key.to_s : key
+        end
+
+        # Magic predicates. For instance:
+        #
+        #   options.force?                  # => !!options['force']
+        #   options.shebang                 # => "/usr/lib/local/ruby"
+        #   options.test_framework?(:rspec) # => options[:test_framework] == :rspec
+        #
+        def method_missing(method, *args, &block)
+          method = method.to_s
+          if method =~ /^(\w+)\?$/
+            if args.empty?
+              !!self[$1]
+            else
+              self[$1] == args.first
+            end
+          else
+            self[method]
+          end
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/core_ext/io_binary_read.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/core_ext/io_binary_read.rb
new file mode 100644
index 0000000..a824f1b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/core_ext/io_binary_read.rb
@@ -0,0 +1,12 @@
+class IO #:nodoc:
+  class << self
+
+    def binread(file, *args)
+      raise ArgumentError, "wrong number of arguments (#{1 + args.size} for 1..3)" unless args.size < 3
+      File.open(file, 'rb') do |f|
+        f.read(*args)
+      end
+    end unless method_defined? :binread
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/core_ext/ordered_hash.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/core_ext/ordered_hash.rb
new file mode 100644
index 0000000..27fea5b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/core_ext/ordered_hash.rb
@@ -0,0 +1,100 @@
+class Thor
+  module CoreExt #:nodoc:
+
+    if RUBY_VERSION >= '1.9'
+      class OrderedHash < ::Hash
+      end
+    else
+      # This class is based on the Ruby 1.9 ordered hashes.
+      #
+      # It keeps the semantics and most of the efficiency of normal hashes
+      # while also keeping track of the order in which elements were set.
+      #
+      class OrderedHash #:nodoc:
+        include Enumerable
+
+        Node = Struct.new(:key, :value, :next, :prev)
+
+        def initialize
+          @hash = {}
+        end
+
+        def [](key)
+          @hash[key] && @hash[key].value
+        end
+
+        def []=(key, value)
+          if node = @hash[key]
+            node.value = value
+          else
+            node = Node.new(key, value)
+
+            if @first.nil?
+              @first = @last = node
+            else
+              node.prev = @last
+              @last.next = node
+              @last = node
+            end
+          end
+
+          @hash[key] = node
+          value
+        end
+
+        def delete(key)
+          if node = @hash[key]
+            prev_node = node.prev
+            next_node = node.next
+
+            next_node.prev = prev_node if next_node
+            prev_node.next = next_node if prev_node
+
+            @first = next_node if @first == node
+            @last = prev_node  if @last  == node
+
+            value = node.value
+          end
+
+          @hash.delete(key)
+          value
+        end
+
+        def keys
+          self.map { |k, v| k }
+        end
+
+        def values
+          self.map { |k, v| v }
+        end
+
+        def each
+          return unless @first
+          yield [@first.key, @first.value]
+          node = @first
+          yield [node.key, node.value] while node = node.next
+          self
+        end
+
+        def merge(other)
+          hash = self.class.new
+
+          self.each do |key, value|
+            hash[key] = value
+          end
+
+          other.each do |key, value|
+            hash[key] = value
+          end
+
+          hash
+        end
+
+        def empty?
+          @hash.empty?
+        end
+      end
+    end
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/error.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/error.rb
new file mode 100644
index 0000000..31e0c4b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/error.rb
@@ -0,0 +1,28 @@
+class Thor
+  # Thor::Error is raised when it's caused by wrong usage of thor classes. Those
+  # errors have their backtrace suppressed and are nicely shown to the user.
+  #
+  # Errors that are caused by the developer, like declaring a method which
+  # overwrites a thor keyword, it SHOULD NOT raise a Thor::Error. This way, we
+  # ensure that developer errors are shown with full backtrace.
+  class Error < StandardError
+  end
+
+  # Raised when a command was not found.
+  class UndefinedCommandError < Error
+  end
+  UndefinedTaskError = UndefinedCommandError
+
+  # Raised when a command was found, but not invoked properly.
+  class InvocationError < Error
+  end
+
+  class UnknownArgumentError < Error
+  end
+
+  class RequiredArgumentMissingError < InvocationError
+  end
+
+  class MalformattedArgumentError < InvocationError
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/group.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/group.rb
new file mode 100644
index 0000000..2aaee73
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/group.rb
@@ -0,0 +1,282 @@
+require 'thor/base'
+
+# Thor has a special class called Thor::Group. The main difference to Thor class
+# is that it invokes all commands at once. It also include some methods that allows
+# invocations to be done at the class method, which are not available to Thor
+# commands.
+class Thor::Group
+  class << self
+    # The description for this Thor::Group. If none is provided, but a source root
+    # exists, tries to find the USAGE one folder above it, otherwise searches
+    # in the superclass.
+    #
+    # ==== Parameters
+    # description<String>:: The description for this Thor::Group.
+    #
+    def desc(description=nil)
+      @desc = case description
+      when nil
+        @desc || from_superclass(:desc, nil)
+      else
+        description
+      end
+    end
+
+    # Prints help information.
+    #
+    # ==== Options
+    # short:: When true, shows only usage.
+    #
+    def help(shell)
+      shell.say "Usage:"
+      shell.say "  #{banner}\n"
+      shell.say
+      class_options_help(shell)
+      shell.say self.desc if self.desc
+    end
+
+    # Stores invocations for this class merging with superclass values.
+    #
+    def invocations #:nodoc:
+      @invocations ||= from_superclass(:invocations, {})
+    end
+
+    # Stores invocation blocks used on invoke_from_option.
+    #
+    def invocation_blocks #:nodoc:
+      @invocation_blocks ||= from_superclass(:invocation_blocks, {})
+    end
+
+    # Invoke the given namespace or class given. It adds an instance
+    # method that will invoke the klass and command. You can give a block to
+    # configure how it will be invoked.
+    #
+    # The namespace/class given will have its options showed on the help
+    # usage. Check invoke_from_option for more information.
+    #
+    def invoke(*names, &block)
+      options = names.last.is_a?(Hash) ? names.pop : {}
+      verbose = options.fetch(:verbose, true)
+
+      names.each do |name|
+        invocations[name] = false
+        invocation_blocks[name] = block if block_given?
+
+        class_eval <<-METHOD, __FILE__, __LINE__
+          def _invoke_#{name.to_s.gsub(/\W/, '_')}
+            klass, command = self.class.prepare_for_invocation(nil, #{name.inspect})
+
+            if klass
+              say_status :invoke, #{name.inspect}, #{verbose.inspect}
+              block = self.class.invocation_blocks[#{name.inspect}]
+              _invoke_for_class_method klass, command, &block
+            else
+              say_status :error, %(#{name.inspect} [not found]), :red
+            end
+          end
+        METHOD
+      end
+    end
+
+    # Invoke a thor class based on the value supplied by the user to the
+    # given option named "name". A class option must be created before this
+    # method is invoked for each name given.
+    #
+    # ==== Examples
+    #
+    #   class GemGenerator < Thor::Group
+    #     class_option :test_framework, :type => :string
+    #     invoke_from_option :test_framework
+    #   end
+    #
+    # ==== Boolean options
+    #
+    # In some cases, you want to invoke a thor class if some option is true or
+    # false. This is automatically handled by invoke_from_option. Then the
+    # option name is used to invoke the generator.
+    #
+    # ==== Preparing for invocation
+    #
+    # In some cases you want to customize how a specified hook is going to be
+    # invoked. You can do that by overwriting the class method
+    # prepare_for_invocation. The class method must necessarily return a klass
+    # and an optional command.
+    #
+    # ==== Custom invocations
+    #
+    # You can also supply a block to customize how the option is going to be
+    # invoked. The block receives two parameters, an instance of the current
+    # class and the klass to be invoked.
+    #
+    def invoke_from_option(*names, &block)
+      options = names.last.is_a?(Hash) ? names.pop : {}
+      verbose = options.fetch(:verbose, :white)
+
+      names.each do |name|
+        unless class_options.key?(name)
+          raise ArgumentError, "You have to define the option #{name.inspect} " <<
+                               "before setting invoke_from_option."
+        end
+
+        invocations[name] = true
+        invocation_blocks[name] = block if block_given?
+
+        class_eval <<-METHOD, __FILE__, __LINE__
+          def _invoke_from_option_#{name.to_s.gsub(/\W/, '_')}
+            return unless options[#{name.inspect}]
+
+            value = options[#{name.inspect}]
+            value = #{name.inspect} if TrueClass === value
+            klass, command = self.class.prepare_for_invocation(#{name.inspect}, value)
+
+            if klass
+              say_status :invoke, value, #{verbose.inspect}
+              block = self.class.invocation_blocks[#{name.inspect}]
+              _invoke_for_class_method klass, command, &block
+            else
+              say_status :error, %(\#{value} [not found]), :red
+            end
+          end
+        METHOD
+      end
+    end
+
+    # Remove a previously added invocation.
+    #
+    # ==== Examples
+    #
+    #   remove_invocation :test_framework
+    #
+    def remove_invocation(*names)
+      names.each do |name|
+        remove_command(name)
+        remove_class_option(name)
+        invocations.delete(name)
+        invocation_blocks.delete(name)
+      end
+    end
+
+    # Overwrite class options help to allow invoked generators options to be
+    # shown recursively when invoking a generator.
+    #
+    def class_options_help(shell, groups={}) #:nodoc:
+      get_options_from_invocations(groups, class_options) do |klass|
+        klass.send(:get_options_from_invocations, groups, class_options)
+      end
+      super(shell, groups)
+    end
+
+    # Get invocations array and merge options from invocations. Those
+    # options are added to group_options hash. Options that already exists
+    # in base_options are not added twice.
+    #
+    def get_options_from_invocations(group_options, base_options) #:nodoc:
+      invocations.each do |name, from_option|
+        value = if from_option
+          option = class_options[name]
+          option.type == :boolean ? name : option.default
+        else
+          name
+        end
+        next unless value
+
+        klass, _ = prepare_for_invocation(name, value)
+        next unless klass && klass.respond_to?(:class_options)
+
+        value = value.to_s
+        human_name = value.respond_to?(:classify) ? value.classify : value
+
+        group_options[human_name] ||= []
+        group_options[human_name] += klass.class_options.values.select do |class_option|
+          base_options[class_option.name.to_sym].nil? && class_option.group.nil? &&
+          !group_options.values.flatten.any? { |i| i.name == class_option.name }
+        end
+
+        yield klass if block_given?
+      end
+    end
+
+    # Returns commands ready to be printed.
+    def printable_commands(*)
+      item = []
+      item << banner
+      item << (desc ? "# #{desc.gsub(/\s+/m,' ')}" : "")
+      [item]
+    end
+    alias printable_tasks printable_commands
+
+    def handle_argument_error(command, error, args, arity) #:nodoc:
+      msg = "#{basename} #{command.name} takes #{arity} argument"
+      msg << "s" if arity > 1
+      msg << ", but it should not."
+      raise error, msg
+    end
+
+    protected
+
+      # The method responsible for dispatching given the args.
+      def dispatch(command, given_args, given_opts, config) #:nodoc:
+        if Thor::HELP_MAPPINGS.include?(given_args.first)
+          help(config[:shell])
+          return
+        end
+
+        args, opts = Thor::Options.split(given_args)
+        opts = given_opts || opts
+
+        instance = new(args, opts, config)
+        yield instance if block_given?
+
+        if command
+          instance.invoke_command(all_commands[command])
+        else
+          instance.invoke_all
+        end
+      end
+
+      # The banner for this class. You can customize it if you are invoking the
+      # thor class by another ways which is not the Thor::Runner.
+      def banner
+        "#{basename} #{self_command.formatted_usage(self, false)}"
+      end
+
+      # Represents the whole class as a command.
+      def self_command #:nodoc:
+        Thor::DynamicCommand.new(self.namespace, class_options)
+      end
+      alias self_task self_command
+
+      def baseclass #:nodoc:
+        Thor::Group
+      end
+
+      def create_command(meth) #:nodoc:
+        commands[meth.to_s] = Thor::Command.new(meth, nil, nil, nil, nil)
+        true
+      end
+      alias create_task create_command
+  end
+
+  include Thor::Base
+
+  protected
+
+  # Shortcut to invoke with padding and block handling. Use internally by
+  # invoke and invoke_from_option class methods.
+  def _invoke_for_class_method(klass, command=nil, *args, &block) #:nodoc:
+    with_padding do
+      if block
+        case block.arity
+        when 3
+          block.call(self, klass, command)
+        when 2
+          block.call(self, klass)
+        when 1
+          instance_exec(klass, &block)
+        end
+      else
+        invoke klass, command, *args
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/invocation.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/invocation.rb
new file mode 100644
index 0000000..a9adeb5
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/invocation.rb
@@ -0,0 +1,172 @@
+class Thor
+  module Invocation
+    def self.included(base) #:nodoc:
+      base.extend ClassMethods
+    end
+
+    module ClassMethods
+      # This method is responsible for receiving a name and find the proper
+      # class and command for it. The key is an optional parameter which is
+      # available only in class methods invocations (i.e. in Thor::Group).
+      def prepare_for_invocation(key, name) #:nodoc:
+        case name
+        when Symbol, String
+          Thor::Util.find_class_and_command_by_namespace(name.to_s, !key)
+        else
+          name
+        end
+      end
+    end
+
+    # Make initializer aware of invocations and the initialization args.
+    def initialize(args=[], options={}, config={}, &block) #:nodoc:
+      @_invocations = config[:invocations] || Hash.new { |h,k| h[k] = [] }
+      @_initializer = [ args, options, config ]
+      super
+    end
+
+    # Receives a name and invokes it. The name can be a string (either "command" or
+    # "namespace:command"), a Thor::Command, a Class or a Thor instance. If the
+    # command cannot be guessed by name, it can also be supplied as second argument.
+    #
+    # You can also supply the arguments, options and configuration values for
+    # the command to be invoked, if none is given, the same values used to
+    # initialize the invoker are used to initialize the invoked.
+    #
+    # When no name is given, it will invoke the default command of the current class.
+    #
+    # ==== Examples
+    #
+    #   class A < Thor
+    #     def foo
+    #       invoke :bar
+    #       invoke "b:hello", ["José"]
+    #     end
+    #
+    #     def bar
+    #       invoke "b:hello", ["José"]
+    #     end
+    #   end
+    #
+    #   class B < Thor
+    #     def hello(name)
+    #       puts "hello #{name}"
+    #     end
+    #   end
+    #
+    # You can notice that the method "foo" above invokes two commands: "bar",
+    # which belongs to the same class and "hello" which belongs to the class B.
+    #
+    # By using an invocation system you ensure that a command is invoked only once.
+    # In the example above, invoking "foo" will invoke "b:hello" just once, even
+    # if it's invoked later by "bar" method.
+    #
+    # When class A invokes class B, all arguments used on A initialization are
+    # supplied to B. This allows lazy parse of options. Let's suppose you have
+    # some rspec commands:
+    #
+    #   class Rspec < Thor::Group
+    #     class_option :mock_framework, :type => :string, :default => :rr
+    #
+    #     def invoke_mock_framework
+    #       invoke "rspec:#{options[:mock_framework]}"
+    #     end
+    #   end
+    #
+    # As you noticed, it invokes the given mock framework, which might have its
+    # own options:
+    #
+    #   class Rspec::RR < Thor::Group
+    #     class_option :style, :type => :string, :default => :mock
+    #   end
+    #
+    # Since it's not rspec concern to parse mock framework options, when RR
+    # is invoked all options are parsed again, so RR can extract only the options
+    # that it's going to use.
+    #
+    # If you want Rspec::RR to be initialized with its own set of options, you
+    # have to do that explicitly:
+    #
+    #   invoke "rspec:rr", [], :style => :foo
+    #
+    # Besides giving an instance, you can also give a class to invoke:
+    #
+    #   invoke Rspec::RR, [], :style => :foo
+    #
+    def invoke(name=nil, *args)
+      if name.nil?
+        warn "[Thor] Calling invoke() without argument is deprecated. Please use invoke_all instead.\n#{caller.join("\n")}"
+        return invoke_all
+      end
+
+      args.unshift(nil) if Array === args.first || NilClass === args.first
+      command, args, opts, config = args
+
+      klass, command = _retrieve_class_and_command(name, command)
+      raise "Expected Thor class, got #{klass}" unless klass <= Thor::Base
+
+      args, opts, config = _parse_initialization_options(args, opts, config)
+      klass.send(:dispatch, command, args, opts, config) do |instance|
+        instance.parent_options = options
+      end
+    end
+
+    # Invoke the given command if the given args.
+    def invoke_command(command, *args) #:nodoc:
+      current = @_invocations[self.class]
+
+      unless current.include?(command.name)
+        current << command.name
+        command.run(self, *args)
+      end
+    end
+    alias invoke_task invoke_command
+
+    # Invoke all commands for the current instance.
+    def invoke_all #:nodoc:
+      self.class.all_commands.map { |_, command| invoke_command(command) }
+    end
+
+    # Invokes using shell padding.
+    def invoke_with_padding(*args)
+      with_padding { invoke(*args) }
+    end
+
+    protected
+
+      # Configuration values that are shared between invocations.
+      def _shared_configuration #:nodoc:
+        { :invocations => @_invocations }
+      end
+
+      # This method simply retrieves the class and command to be invoked.
+      # If the name is nil or the given name is a command in the current class,
+      # use the given name and return self as class. Otherwise, call
+      # prepare_for_invocation in the current class.
+      def _retrieve_class_and_command(name, sent_command=nil) #:nodoc:
+        case
+        when name.nil?
+          [self.class, nil]
+        when self.class.all_commands[name.to_s]
+          [self.class, name.to_s]
+        else
+          klass, command = self.class.prepare_for_invocation(nil, name)
+          [klass, command || sent_command]
+        end
+      end
+      alias _retrieve_class_and_task _retrieve_class_and_command
+
+      # Initialize klass using values stored in the @_initializer.
+      def _parse_initialization_options(args, opts, config) #:nodoc:
+        stored_args, stored_opts, stored_config = @_initializer
+
+        args ||= stored_args.dup
+        opts ||= stored_opts.dup
+
+        config ||= {}
+        config = stored_config.merge(_shared_configuration).merge!(config)
+
+        [ args, opts, config ]
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser.rb
new file mode 100644
index 0000000..57a3f6e
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser.rb
@@ -0,0 +1,4 @@
+require 'thor/parser/argument'
+require 'thor/parser/arguments'
+require 'thor/parser/option'
+require 'thor/parser/options'
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser/argument.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser/argument.rb
new file mode 100644
index 0000000..39ef9f2
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser/argument.rb
@@ -0,0 +1,74 @@
+class Thor
+  class Argument #:nodoc:
+    VALID_TYPES = [ :numeric, :hash, :array, :string ]
+
+    attr_reader :name, :description, :enum, :required, :type, :default, :banner
+    alias :human_name :name
+
+    def initialize(name, options={})
+      class_name = self.class.name.split("::").last
+
+      type = options[:type]
+
+      raise ArgumentError, "#{class_name} name can't be nil."                         if name.nil?
+      raise ArgumentError, "Type :#{type} is not valid for #{class_name.downcase}s."  if type && !valid_type?(type)
+
+      @name        = name.to_s
+      @description = options[:desc]
+      @required    = options.key?(:required) ? options[:required] : true
+      @type        = (type || :string).to_sym
+      @default     = options[:default]
+      @banner      = options[:banner] || default_banner
+      @enum        = options[:enum]
+
+      validate! # Trigger specific validations
+    end
+
+    def usage
+      required? ? banner : "[#{banner}]"
+    end
+
+    def required?
+      required
+    end
+
+    def show_default?
+      case default
+      when Array, String, Hash
+        !default.empty?
+      else
+        default
+      end
+    end
+
+    protected
+
+      def validate!
+        if required? && !default.nil?
+          raise ArgumentError, "An argument cannot be required and have default value."
+        elsif @enum && !@enum.is_a?(Array)
+          raise ArgumentError, "An argument cannot have an enum other than an array."
+        end
+      end
+
+      def valid_type?(type)
+        self.class::VALID_TYPES.include?(type.to_sym)
+      end
+
+      def default_banner
+        case type
+        when :boolean
+          nil
+        when :string, :default
+          human_name.upcase
+        when :numeric
+          "N"
+        when :hash
+          "key:value"
+        when :array
+          "one two three"
+        end
+      end
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser/arguments.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser/arguments.rb
new file mode 100644
index 0000000..f86166d
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser/arguments.rb
@@ -0,0 +1,171 @@
+class Thor
+  class Arguments #:nodoc:
+    NUMERIC = /(\d*\.\d+|\d+)/
+
+    # Receives an array of args and returns two arrays, one with arguments
+    # and one with switches.
+    #
+    def self.split(args)
+      arguments = []
+
+      args.each do |item|
+        break if item =~ /^-/
+        arguments << item
+      end
+
+      return arguments, args[Range.new(arguments.size, -1)]
+    end
+
+    def self.parse(*args)
+      to_parse = args.pop
+      new(*args).parse(to_parse)
+    end
+
+    # Takes an array of Thor::Argument objects.
+    #
+    def initialize(arguments=[])
+      @assigns, @non_assigned_required = {}, []
+      @switches = arguments
+
+      arguments.each do |argument|
+        if argument.default != nil
+          @assigns[argument.human_name] = argument.default
+        elsif argument.required?
+          @non_assigned_required << argument
+        end
+      end
+    end
+
+    def parse(args)
+      @pile = args.dup
+
+      @switches.each do |argument|
+        break unless peek
+        @non_assigned_required.delete(argument)
+        @assigns[argument.human_name] = send(:"parse_#{argument.type}", argument.human_name)
+      end
+
+      check_requirement!
+      @assigns
+    end
+
+    def remaining
+      @pile
+    end
+
+    private
+
+      def no_or_skip?(arg)
+        arg =~ /^--(no|skip)-([-\w]+)$/
+        $2
+      end
+
+      def last?
+        @pile.empty?
+      end
+
+      def peek
+        @pile.first
+      end
+
+      def shift
+        @pile.shift
+      end
+
+      def unshift(arg)
+        unless arg.kind_of?(Array)
+          @pile.unshift(arg)
+        else
+          @pile = arg + @pile
+        end
+      end
+
+      def current_is_value?
+        peek && peek.to_s !~ /^-/
+      end
+
+      # Runs through the argument array getting strings that contains ":" and
+      # mark it as a hash:
+      #
+      #   [ "name:string", "age:integer" ]
+      #
+      # Becomes:
+      #
+      #   { "name" => "string", "age" => "integer" }
+      #
+      def parse_hash(name)
+        return shift if peek.is_a?(Hash)
+        hash = {}
+
+        while current_is_value? && peek.include?(?:)
+          key, value = shift.split(':',2)
+          hash[key] = value
+        end
+        hash
+      end
+
+      # Runs through the argument array getting all strings until no string is
+      # found or a switch is found.
+      #
+      #   ["a", "b", "c"]
+      #
+      # And returns it as an array:
+      #
+      #   ["a", "b", "c"]
+      #
+      def parse_array(name)
+        return shift if peek.is_a?(Array)
+        array = []
+
+        while current_is_value?
+          array << shift
+        end
+        array
+      end
+
+      # Check if the peek is numeric format and return a Float or Integer.
+      # Otherwise raises an error.
+      #
+      def parse_numeric(name)
+        return shift if peek.is_a?(Numeric)
+
+        unless peek =~ NUMERIC && $& == peek
+          raise MalformattedArgumentError, "Expected numeric value for '#{name}'; got #{peek.inspect}"
+        end
+
+        $&.index('.') ? shift.to_f : shift.to_i
+      end
+
+      # Parse string:
+      # for --string-arg, just return the current value in the pile
+      # for --no-string-arg, nil
+      #
+      def parse_string(name)
+        if no_or_skip?(name)
+          nil
+        else
+          value = shift
+          if @switches.is_a?(Hash) && switch = @switches[name]
+            if switch.enum && !switch.enum.include?(value)
+              raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
+            end
+          end
+          value
+        end
+      end
+
+      # Raises an error if @non_assigned_required array is not empty.
+      #
+      def check_requirement!
+        unless @non_assigned_required.empty?
+          names = @non_assigned_required.map do |o|
+            o.respond_to?(:switch_name) ? o.switch_name : o.human_name
+          end.join("', '")
+
+          class_name = self.class.name.split('::').last.downcase
+          raise RequiredArgumentMissingError, "No value provided for required #{class_name} '#{names}'"
+        end
+      end
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser/option.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser/option.rb
new file mode 100644
index 0000000..4781069
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser/option.rb
@@ -0,0 +1,121 @@
+class Thor
+  class Option < Argument #:nodoc:
+    attr_reader :aliases, :group, :lazy_default, :hide
+
+    VALID_TYPES = [:boolean, :numeric, :hash, :array, :string]
+
+    def initialize(name, options={})
+      options[:required] = false unless options.key?(:required)
+      super
+      @lazy_default = options[:lazy_default]
+      @group        = options[:group].to_s.capitalize if options[:group]
+      @aliases      = Array(options[:aliases])
+      @hide         = options[:hide]
+    end
+
+    # This parse quick options given as method_options. It makes several
+    # assumptions, but you can be more specific using the option method.
+    #
+    #   parse :foo => "bar"
+    #   #=> Option foo with default value bar
+    #
+    #   parse [:foo, :baz] => "bar"
+    #   #=> Option foo with default value bar and alias :baz
+    #
+    #   parse :foo => :required
+    #   #=> Required option foo without default value
+    #
+    #   parse :foo => 2
+    #   #=> Option foo with default value 2 and type numeric
+    #
+    #   parse :foo => :numeric
+    #   #=> Option foo without default value and type numeric
+    #
+    #   parse :foo => true
+    #   #=> Option foo with default value true and type boolean
+    #
+    # The valid types are :boolean, :numeric, :hash, :array and :string. If none
+    # is given a default type is assumed. This default type accepts arguments as
+    # string (--foo=value) or booleans (just --foo).
+    #
+    # By default all options are optional, unless :required is given.
+    #
+    def self.parse(key, value)
+      if key.is_a?(Array)
+        name, *aliases = key
+      else
+        name, aliases = key, []
+      end
+
+      name    = name.to_s
+      default = value
+
+      type = case value
+      when Symbol
+        default = nil
+        if VALID_TYPES.include?(value)
+          value
+        elsif required = (value == :required)
+          :string
+        end
+      when TrueClass, FalseClass
+        :boolean
+      when Numeric
+        :numeric
+      when Hash, Array, String
+        value.class.name.downcase.to_sym
+      end
+      self.new(name.to_s, :required => required, :type => type, :default => default, :aliases => aliases)
+    end
+
+    def switch_name
+      @switch_name ||= dasherized? ? name : dasherize(name)
+    end
+
+    def human_name
+      @human_name ||= dasherized? ? undasherize(name) : name
+    end
+
+    def usage(padding=0)
+      sample = if banner && !banner.to_s.empty?
+        "#{switch_name}=#{banner}"
+      else
+        switch_name
+      end
+
+      sample = "[#{sample}]" unless required?
+
+      if aliases.empty?
+        (" " * padding) << sample
+      else
+        "#{aliases.join(', ')}, #{sample}"
+      end
+    end
+
+    VALID_TYPES.each do |type|
+      class_eval <<-RUBY, __FILE__, __LINE__ + 1
+        def #{type}?
+          self.type == #{type.inspect}
+        end
+      RUBY
+    end
+
+  protected
+
+    def validate!
+      raise ArgumentError, "An option cannot be boolean and required." if boolean? && required?
+    end
+
+    def dasherized?
+      name.index('-') == 0
+    end
+
+    def undasherize(str)
+      str.sub(/^-{1,2}/, '')
+    end
+
+    def dasherize(str)
+      (str.length > 1 ? "--" : "-") + str.gsub('_', '-')
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser/options.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser/options.rb
new file mode 100644
index 0000000..9542e81
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/parser/options.rb
@@ -0,0 +1,218 @@
+class Thor
+  class Options < Arguments #:nodoc:
+    LONG_RE     = /^(--\w+(?:-\w+)*)$/
+    SHORT_RE    = /^(-[a-z])$/i
+    EQ_RE       = /^(--\w+(?:-\w+)*|-[a-z])=(.*)$/i
+    SHORT_SQ_RE = /^-([a-z]{2,})$/i # Allow either -x -v or -xv style for single char args
+    SHORT_NUM   = /^(-[a-z])#{NUMERIC}$/i
+    OPTS_END    = '--'.freeze
+
+    # Receives a hash and makes it switches.
+    def self.to_switches(options)
+      options.map do |key, value|
+        case value
+        when true
+          "--#{key}"
+        when Array
+          "--#{key} #{value.map{ |v| v.inspect }.join(' ')}"
+        when Hash
+          "--#{key} #{value.map{ |k,v| "#{k}:#{v}" }.join(' ')}"
+        when nil, false
+          ""
+        else
+          "--#{key} #{value.inspect}"
+        end
+      end.join(" ")
+    end
+
+    # Takes a hash of Thor::Option and a hash with defaults.
+    #
+    # If +stop_on_unknown+ is true, #parse will stop as soon as it encounters
+    # an unknown option or a regular argument.
+    def initialize(hash_options={}, defaults={}, stop_on_unknown=false)
+      @stop_on_unknown = stop_on_unknown
+      options = hash_options.values
+      super(options)
+
+      # Add defaults
+      defaults.each do |key, value|
+        @assigns[key.to_s] = value
+        @non_assigned_required.delete(hash_options[key])
+      end
+
+      @shorts, @switches, @extra = {}, {}, []
+
+      options.each do |option|
+        @switches[option.switch_name] = option
+
+        option.aliases.each do |short|
+          name = short.to_s.sub(/^(?!\-)/, '-')
+          @shorts[name] ||= option.switch_name
+        end
+      end
+    end
+
+    def remaining
+      @extra
+    end
+
+    def peek
+      return super unless @parsing_options
+
+      result = super
+      if result == OPTS_END
+        shift
+        @parsing_options = false
+        super
+      else
+        result
+      end
+    end
+
+    def parse(args)
+      @pile = args.dup
+      @parsing_options = true
+
+      while peek
+        if parsing_options?
+          match, is_switch = current_is_switch?
+          shifted = shift
+
+          if is_switch
+            case shifted
+            when SHORT_SQ_RE
+              unshift($1.split('').map { |f| "-#{f}" })
+              next
+            when EQ_RE, SHORT_NUM
+              unshift($2)
+              switch = $1
+            when LONG_RE, SHORT_RE
+              switch = $1
+            end
+
+            switch = normalize_switch(switch)
+            option = switch_option(switch)
+            @assigns[option.human_name] = parse_peek(switch, option)
+          elsif @stop_on_unknown
+            @parsing_options = false
+            @extra << shifted
+            @extra << shift while peek
+            break
+          elsif match
+            @extra << shifted
+            @extra << shift while peek && peek !~ /^-/
+          else
+            @extra << shifted
+          end
+        else
+          @extra << shift
+        end
+      end
+
+      check_requirement!
+
+      assigns = Thor::CoreExt::HashWithIndifferentAccess.new(@assigns)
+      assigns.freeze
+      assigns
+    end
+
+    def check_unknown!
+      # an unknown option starts with - or -- and has no more --'s afterward.
+      unknown = @extra.select { |str| str =~ /^--?(?:(?!--).)*$/ }
+      raise UnknownArgumentError, "Unknown switches '#{unknown.join(', ')}'" unless unknown.empty?
+    end
+
+    protected
+
+      # Check if the current value in peek is a registered switch.
+      #
+      # Two booleans are returned.  The first is true if the current value
+      # starts with a hyphen; the second is true if it is a registered switch.
+      def current_is_switch?
+        case peek
+        when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM
+          [true, switch?($1)]
+        when SHORT_SQ_RE
+          [true, $1.split('').any? { |f| switch?("-#{f}") }]
+        else
+          [false, false]
+        end
+      end
+
+      def current_is_switch_formatted?
+        case peek
+        when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM, SHORT_SQ_RE
+          true
+        else
+          false
+        end
+      end
+
+      def current_is_value?
+        peek && (!parsing_options? || super)
+      end
+
+      def switch?(arg)
+        switch_option(normalize_switch(arg))
+      end
+
+      def switch_option(arg)
+        if match = no_or_skip?(arg)
+          @switches[arg] || @switches["--#{match}"]
+        else
+          @switches[arg]
+        end
+      end
+
+      # Check if the given argument is actually a shortcut.
+      #
+      def normalize_switch(arg)
+        (@shorts[arg] || arg).tr('_', '-')
+      end
+
+      def parsing_options?
+        peek
+        @parsing_options
+      end
+
+      # Parse boolean values which can be given as --foo=true, --foo or --no-foo.
+      #
+      def parse_boolean(switch)
+        if current_is_value?
+          if ["true", "TRUE", "t", "T", true].include?(peek)
+            shift
+            true
+          elsif ["false", "FALSE", "f", "F", false].include?(peek)
+            shift
+            false
+          else
+            true
+          end
+        else
+          @switches.key?(switch) || !no_or_skip?(switch)
+        end
+      end
+
+      # Parse the value at the peek analyzing if it requires an input or not.
+      #
+      def parse_peek(switch, option)
+        if parsing_options? && (current_is_switch_formatted? || last?)
+          if option.boolean?
+            # No problem for boolean types
+          elsif no_or_skip?(switch)
+            return nil # User set value to nil
+          elsif option.string? && !option.required?
+            # Return the default if there is one, else the human name
+            return option.lazy_default || option.default || option.human_name
+          elsif option.lazy_default
+            return option.lazy_default
+          else
+            raise MalformattedArgumentError, "No value provided for option '#{switch}'"
+          end
+        end
+
+        @non_assigned_required.delete(option)
+        send(:"parse_#{option.type}", switch)
+      end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/rake_compat.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/rake_compat.rb
new file mode 100644
index 0000000..fcb3b24
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/rake_compat.rb
@@ -0,0 +1,72 @@
+require 'rake'
+require 'rake/dsl_definition'
+
+class Thor
+  # Adds a compatibility layer to your Thor classes which allows you to use
+  # rake package tasks. For example, to use rspec rake tasks, one can do:
+  #
+  #   require 'thor/rake_compat'
+  #   require 'rspec/core/rake_task'
+  #
+  #   class Default < Thor
+  #     include Thor::RakeCompat
+  #
+  #     RSpec::Core::RakeTask.new(:spec) do |t|
+  #       t.spec_opts = ['--options', "./.rspec"]
+  #       t.spec_files = FileList['spec/**/*_spec.rb']
+  #     end
+  #   end
+  #
+  module RakeCompat
+    include Rake::DSL if defined?(Rake::DSL)
+
+    def self.rake_classes
+      @rake_classes ||= []
+    end
+
+    def self.included(base)
+      # Hack. Make rakefile point to invoker, so rdoc task is generated properly.
+      rakefile = File.basename(caller[0].match(/(.*):\d+/)[1])
+      Rake.application.instance_variable_set(:@rakefile, rakefile)
+      self.rake_classes << base
+    end
+  end
+end
+
+# override task on (main), for compatibility with Rake 0.9
+self.instance_eval do
+  alias rake_namespace namespace
+
+  def task(*)
+    task = super
+
+    if klass = Thor::RakeCompat.rake_classes.last
+      non_namespaced_name = task.name.split(':').last
+
+      description = non_namespaced_name
+      description << task.arg_names.map{ |n| n.to_s.upcase }.join(' ')
+      description.strip!
+
+      klass.desc description, Rake.application.last_description || non_namespaced_name
+      Rake.application.last_description = nil
+      klass.send :define_method, non_namespaced_name do |*args|
+        Rake::Task[task.name.to_sym].invoke(*args)
+      end
+    end
+
+    task
+  end
+
+  def namespace(name)
+    if klass = Thor::RakeCompat.rake_classes.last
+      const_name = Thor::Util.camel_case(name.to_s).to_sym
+      klass.const_set(const_name, Class.new(Thor))
+      new_klass = klass.const_get(const_name)
+      Thor::RakeCompat.rake_classes << new_klass
+    end
+
+    super
+    Thor::RakeCompat.rake_classes.pop
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/runner.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/runner.rb
new file mode 100644
index 0000000..e51ceb5
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/runner.rb
@@ -0,0 +1,322 @@
+require 'thor'
+require 'thor/group'
+require 'thor/core_ext/io_binary_read'
+
+require 'fileutils'
+require 'open-uri'
+require 'yaml'
+require 'digest/md5'
+require 'pathname'
+
+class Thor::Runner < Thor #:nodoc:
+  map "-T" => :list, "-i" => :install, "-u" => :update, "-v" => :version
+
+  # Override Thor#help so it can give information about any class and any method.
+  #
+  def help(meth = nil)
+    if meth && !self.respond_to?(meth)
+      initialize_thorfiles(meth)
+      klass, command = Thor::Util.find_class_and_command_by_namespace(meth)
+      self.class.handle_no_command_error(command, false) if klass.nil?
+      klass.start(["-h", command].compact, :shell => self.shell)
+    else
+      super
+    end
+  end
+
+  # If a command is not found on Thor::Runner, method missing is invoked and
+  # Thor::Runner is then responsible for finding the command in all classes.
+  #
+  def method_missing(meth, *args)
+    meth = meth.to_s
+    initialize_thorfiles(meth)
+    klass, command = Thor::Util.find_class_and_command_by_namespace(meth)
+    self.class.handle_no_command_error(command, false) if klass.nil?
+    args.unshift(command) if command
+    klass.start(args, :shell => self.shell)
+  end
+
+  desc "install NAME", "Install an optionally named Thor file into your system commands"
+  method_options :as => :string, :relative => :boolean, :force => :boolean
+  def install(name)
+    initialize_thorfiles
+
+    # If a directory name is provided as the argument, look for a 'main.thor'
+    # command in said directory.
+    begin
+      if File.directory?(File.expand_path(name))
+        base, package = File.join(name, "main.thor"), :directory
+        contents      = open(base) {|input| input.read }
+      else
+        base, package = name, :file
+        contents      = open(name) {|input| input.read }
+      end
+    rescue OpenURI::HTTPError
+      raise Error, "Error opening URI '#{name}'"
+    rescue Errno::ENOENT
+      raise Error, "Error opening file '#{name}'"
+    end
+
+    say "Your Thorfile contains:"
+    say contents
+
+    unless options["force"]
+      return false if no?("Do you wish to continue [y/N]?")
+    end
+
+    as = options["as"] || begin
+      first_line = contents.split("\n")[0]
+      (match = first_line.match(/\s*#\s*module:\s*([^\n]*)/)) ? match[1].strip : nil
+    end
+
+    unless as
+      basename = File.basename(name)
+      as = ask("Please specify a name for #{name} in the system repository [#{basename}]:")
+      as = basename if as.empty?
+    end
+
+    location = if options[:relative] || name =~ /^https?:\/\//
+      name
+    else
+      File.expand_path(name)
+    end
+
+    thor_yaml[as] = {
+      :filename   => Digest::MD5.hexdigest(name + as),
+      :location   => location,
+      :namespaces => Thor::Util.namespaces_in_content(contents, base)
+    }
+
+    save_yaml(thor_yaml)
+    say "Storing thor file in your system repository"
+    destination = File.join(thor_root, thor_yaml[as][:filename])
+
+    if package == :file
+      File.open(destination, "w") { |f| f.puts contents }
+    else
+      FileUtils.cp_r(name, destination)
+    end
+
+    thor_yaml[as][:filename] # Indicate success
+  end
+
+  desc "version", "Show Thor version"
+  def version
+    require 'thor/version'
+    say "Thor #{Thor::VERSION}"
+  end
+
+  desc "uninstall NAME", "Uninstall a named Thor module"
+  def uninstall(name)
+    raise Error, "Can't find module '#{name}'" unless thor_yaml[name]
+    say "Uninstalling #{name}."
+    FileUtils.rm_rf(File.join(thor_root, "#{thor_yaml[name][:filename]}"))
+
+    thor_yaml.delete(name)
+    save_yaml(thor_yaml)
+
+    puts "Done."
+  end
+
+  desc "update NAME", "Update a Thor file from its original location"
+  def update(name)
+    raise Error, "Can't find module '#{name}'" if !thor_yaml[name] || !thor_yaml[name][:location]
+
+    say "Updating '#{name}' from #{thor_yaml[name][:location]}"
+
+    old_filename = thor_yaml[name][:filename]
+    self.options = self.options.merge("as" => name)
+
+    if File.directory? File.expand_path(name)
+      FileUtils.rm_rf(File.join(thor_root, old_filename))
+
+      thor_yaml.delete(old_filename)
+      save_yaml(thor_yaml)
+
+      filename = install(name)
+    else
+      filename = install(thor_yaml[name][:location])
+    end
+
+    unless filename == old_filename
+      File.delete(File.join(thor_root, old_filename))
+    end
+  end
+
+  desc "installed", "List the installed Thor modules and commands"
+  method_options :internal => :boolean
+  def installed
+    initialize_thorfiles(nil, true)
+    display_klasses(true, options["internal"])
+  end
+
+  desc "list [SEARCH]", "List the available thor commands (--substring means .*SEARCH)"
+  method_options :substring => :boolean, :group => :string, :all => :boolean, :debug => :boolean
+  def list(search="")
+    initialize_thorfiles
+
+    search = ".*#{search}" if options["substring"]
+    search = /^#{search}.*/i
+    group  = options[:group] || "standard"
+
+    klasses = Thor::Base.subclasses.select do |k|
+      (options[:all] || k.group == group) && k.namespace =~ search
+    end
+
+    display_klasses(false, false, klasses)
+  end
+
+  private
+
+    def self.banner(command, all = false, subcommand = false)
+      "thor " + command.formatted_usage(self, all, subcommand)
+    end
+
+    def thor_root
+      Thor::Util.thor_root
+    end
+
+    def thor_yaml
+      @thor_yaml ||= begin
+        yaml_file = File.join(thor_root, "thor.yml")
+        yaml = YAML.load_file(yaml_file) if File.exists?(yaml_file)
+        yaml || {}
+      end
+    end
+
+    # Save the yaml file. If none exists in thor root, creates one.
+    #
+    def save_yaml(yaml)
+      yaml_file = File.join(thor_root, "thor.yml")
+
+      unless File.exists?(yaml_file)
+        FileUtils.mkdir_p(thor_root)
+        yaml_file = File.join(thor_root, "thor.yml")
+        FileUtils.touch(yaml_file)
+      end
+
+      File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml }
+    end
+
+    def self.exit_on_failure?
+      true
+    end
+
+    # Load the Thorfiles. If relevant_to is supplied, looks for specific files
+    # in the thor_root instead of loading them all.
+    #
+    # By default, it also traverses the current path until find Thor files, as
+    # described in thorfiles. This look up can be skipped by suppliying
+    # skip_lookup true.
+    #
+    def initialize_thorfiles(relevant_to=nil, skip_lookup=false)
+      thorfiles(relevant_to, skip_lookup).each do |f|
+        Thor::Util.load_thorfile(f, nil, options[:debug]) unless Thor::Base.subclass_files.keys.include?(File.expand_path(f))
+      end
+    end
+
+    # Finds Thorfiles by traversing from your current directory down to the root
+    # directory of your system. If at any time we find a Thor file, we stop.
+    #
+    # We also ensure that system-wide Thorfiles are loaded first, so local
+    # Thorfiles can override them.
+    #
+    # ==== Example
+    #
+    # If we start at /Users/wycats/dev/thor ...
+    #
+    # 1. /Users/wycats/dev/thor
+    # 2. /Users/wycats/dev
+    # 3. /Users/wycats <-- we find a Thorfile here, so we stop
+    #
+    # Suppose we start at c:\Documents and Settings\james\dev\thor ...
+    #
+    # 1. c:\Documents and Settings\james\dev\thor
+    # 2. c:\Documents and Settings\james\dev
+    # 3. c:\Documents and Settings\james
+    # 4. c:\Documents and Settings
+    # 5. c:\ <-- no Thorfiles found!
+    #
+    def thorfiles(relevant_to=nil, skip_lookup=false)
+      thorfiles = []
+
+      unless skip_lookup
+        Pathname.pwd.ascend do |path|
+          thorfiles = Thor::Util.globs_for(path).map { |g| Dir[g] }.flatten
+          break unless thorfiles.empty?
+        end
+      end
+
+      files  = (relevant_to ? thorfiles_relevant_to(relevant_to) : Thor::Util.thor_root_glob)
+      files += thorfiles
+      files -= ["#{thor_root}/thor.yml"]
+
+      files.map! do |file|
+        File.directory?(file) ? File.join(file, "main.thor") : file
+      end
+    end
+
+    # Load Thorfiles relevant to the given method. If you provide "foo:bar" it
+    # will load all thor files in the thor.yaml that has "foo" e "foo:bar"
+    # namespaces registered.
+    #
+    def thorfiles_relevant_to(meth)
+      lookup = [ meth, meth.split(":")[0...-1].join(":") ]
+
+      files = thor_yaml.select do |k, v|
+        v[:namespaces] && !(v[:namespaces] & lookup).empty?
+      end
+
+      files.map { |k, v| File.join(thor_root, "#{v[:filename]}") }
+    end
+
+    # Display information about the given klasses. If with_module is given,
+    # it shows a table with information extracted from the yaml file.
+    #
+    def display_klasses(with_modules=false, show_internal=false, klasses=Thor::Base.subclasses)
+      klasses -= [Thor, Thor::Runner, Thor::Group] unless show_internal
+
+      raise Error, "No Thor commands available" if klasses.empty?
+      show_modules if with_modules && !thor_yaml.empty?
+
+      list = Hash.new { |h,k| h[k] = [] }
+      groups = klasses.select { |k| k.ancestors.include?(Thor::Group) }
+
+      # Get classes which inherit from Thor
+      (klasses - groups).each { |k| list[k.namespace.split(":").first] += k.printable_commands(false) }
+
+      # Get classes which inherit from Thor::Base
+      groups.map! { |k| k.printable_commands(false).first }
+      list["root"] = groups
+
+      # Order namespaces with default coming first
+      list = list.sort{ |a,b| a[0].sub(/^default/, '') <=> b[0].sub(/^default/, '') }
+      list.each { |n, commands| display_commands(n, commands) unless commands.empty? }
+    end
+
+    def display_commands(namespace, list) #:nodoc:
+      list.sort!{ |a,b| a[0] <=> b[0] }
+
+      say shell.set_color(namespace, :blue, true)
+      say "-" * namespace.size
+
+      print_table(list, :truncate => true)
+      say
+    end
+    alias display_tasks display_commands
+
+    def show_modules #:nodoc:
+      info  = []
+      labels = ["Modules", "Namespaces"]
+
+      info << labels
+      info << [ "-" * labels[0].size, "-" * labels[1].size ]
+
+      thor_yaml.each do |name, hash|
+        info << [ name, hash[:namespaces].join(", ") ]
+      end
+
+      print_table info
+      say ""
+    end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell.rb
new file mode 100644
index 0000000..a718c53
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell.rb
@@ -0,0 +1,88 @@
+require 'rbconfig'
+
+class Thor
+  module Base
+    # Returns the shell used in all Thor classes. If you are in a Unix platform
+    # it will use a colored log, otherwise it will use a basic one without color.
+    #
+    def self.shell
+      @shell ||= if ENV['THOR_SHELL'] && ENV['THOR_SHELL'].size > 0
+        Thor::Shell.const_get(ENV['THOR_SHELL'])
+      elsif ((RbConfig::CONFIG['host_os'] =~ /mswin|mingw/) && !(ENV['ANSICON']))
+        Thor::Shell::Basic
+      else
+        Thor::Shell::Color
+      end
+    end
+
+    # Sets the shell used in all Thor classes.
+    #
+    def self.shell=(klass)
+      @shell = klass
+    end
+  end
+
+  module Shell
+    SHELL_DELEGATED_METHODS = [:ask, :error, :set_color, :yes?, :no?, :say, :say_status, :print_in_columns, :print_table, :print_wrapped, :file_collision, :terminal_width]
+
+    autoload :Basic, 'thor/shell/basic'
+    autoload :Color, 'thor/shell/color'
+    autoload :HTML,  'thor/shell/html'
+
+    # Add shell to initialize config values.
+    #
+    # ==== Configuration
+    # shell<Object>:: An instance of the shell to be used.
+    #
+    # ==== Examples
+    #
+    #   class MyScript < Thor
+    #     argument :first, :type => :numeric
+    #   end
+    #
+    #   MyScript.new [1.0], { :foo => :bar }, :shell => Thor::Shell::Basic.new
+    #
+    def initialize(args=[], options={}, config={})
+      super
+      self.shell = config[:shell]
+      self.shell.base ||= self if self.shell.respond_to?(:base)
+    end
+
+    # Holds the shell for the given Thor instance. If no shell is given,
+    # it gets a default shell from Thor::Base.shell.
+    def shell
+      @shell ||= Thor::Base.shell.new
+    end
+
+    # Sets the shell for this thor class.
+    def shell=(shell)
+      @shell = shell
+    end
+
+    # Common methods that are delegated to the shell.
+    SHELL_DELEGATED_METHODS.each do |method|
+      module_eval <<-METHOD, __FILE__, __LINE__
+        def #{method}(*args,&block)
+          shell.#{method}(*args,&block)
+        end
+      METHOD
+    end
+
+    # Yields the given block with padding.
+    def with_padding
+      shell.padding += 1
+      yield
+    ensure
+      shell.padding -= 1
+    end
+
+    protected
+
+      # Allow shell to be shared between invocations.
+      #
+      def _shared_configuration #:nodoc:
+        super.merge!(:shell => self.shell)
+      end
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell/basic.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell/basic.rb
new file mode 100644
index 0000000..1e1e9be
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell/basic.rb
@@ -0,0 +1,393 @@
+require 'tempfile'
+
+class Thor
+  module Shell
+    class Basic
+      attr_accessor :base
+      attr_reader   :padding
+
+      # Initialize base, mute and padding to nil.
+      #
+      def initialize #:nodoc:
+        @base, @mute, @padding = nil, false, 0
+      end
+
+      # Mute everything that's inside given block
+      #
+      def mute
+        @mute = true
+        yield
+      ensure
+        @mute = false
+      end
+
+      # Check if base is muted
+      #
+      def mute?
+        @mute
+      end
+
+      # Sets the output padding, not allowing less than zero values.
+      #
+      def padding=(value)
+        @padding = [0, value].max
+      end
+
+      # Asks something to the user and receives a response.
+      #
+      # If asked to limit the correct responses, you can pass in an
+      # array of acceptable answers.  If one of those is not supplied,
+      # they will be shown a message stating that one of those answers
+      # must be given and re-asked the question.
+      #
+      # ==== Example
+      # ask("What is your name?")
+      #
+      # ask("What is your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])
+      #
+      def ask(statement, *args)
+        options = args.last.is_a?(Hash) ? args.pop : {}
+
+        options[:limited_to] ? ask_filtered(statement, options[:limited_to], *args) : ask_simply(statement, *args)
+      end
+
+      # Say (print) something to the user. If the sentence ends with a whitespace
+      # or tab character, a new line is not appended (print + flush). Otherwise
+      # are passed straight to puts (behavior got from Highline).
+      #
+      # ==== Example
+      # say("I know you knew that.")
+      #
+      def say(message="", color=nil, force_new_line=(message.to_s !~ /( |\t)\Z/))
+        message = message.to_s
+
+        message = set_color(message, *color) if color && can_display_colors?
+
+        spaces = "  " * padding
+
+        if force_new_line
+          stdout.puts(spaces + message)
+        else
+          stdout.print(spaces + message)
+        end
+        stdout.flush
+      end
+
+      # Say a status with the given color and appends the message. Since this
+      # method is used frequently by actions, it allows nil or false to be given
+      # in log_status, avoiding the message from being shown. If a Symbol is
+      # given in log_status, it's used as the color.
+      #
+      def say_status(status, message, log_status=true)
+        return if quiet? || log_status == false
+        spaces = "  " * (padding + 1)
+        color  = log_status.is_a?(Symbol) ? log_status : :green
+
+        status = status.to_s.rjust(12)
+        status = set_color status, color, true if color
+
+        stdout.puts "#{status}#{spaces}#{message}"
+        stdout.flush
+      end
+
+      # Make a question the to user and returns true if the user replies "y" or
+      # "yes".
+      #
+      def yes?(statement, color=nil)
+        !!(ask(statement, color) =~ is?(:yes))
+      end
+
+      # Make a question the to user and returns true if the user replies "n" or
+      # "no".
+      #
+      def no?(statement, color=nil)
+        !yes?(statement, color)
+      end
+
+      # Prints values in columns
+      #
+      # ==== Parameters
+      # Array[String, String, ...]
+      #
+      def print_in_columns(array)
+        return if array.empty?
+        colwidth = (array.map{|el| el.to_s.size}.max || 0) + 2
+        array.each_with_index do |value, index|
+          # Don't output trailing spaces when printing the last column
+          if ((((index + 1) % (terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
+            stdout.puts value
+          else
+            stdout.printf("%-#{colwidth}s", value)
+          end
+        end
+      end
+
+      # Prints a table.
+      #
+      # ==== Parameters
+      # Array[Array[String, String, ...]]
+      #
+      # ==== Options
+      # indent<Integer>:: Indent the first column by indent value.
+      # colwidth<Integer>:: Force the first column to colwidth spaces wide.
+      #
+      def print_table(array, options={})
+        return if array.empty?
+
+        formats, indent, colwidth = [], options[:indent].to_i, options[:colwidth]
+        options[:truncate] = terminal_width if options[:truncate] == true
+
+        formats << "%-#{colwidth + 2}s" if colwidth
+        start = colwidth ? 1 : 0
+
+        colcount = array.max{|a,b| a.size <=> b.size }.size
+
+        maximas = []
+
+        start.upto(colcount - 1) do |index|
+          maxima = array.map {|row| row[index] ? row[index].to_s.size : 0 }.max
+          maximas << maxima
+          if index == colcount - 1
+            # Don't output 2 trailing spaces when printing the last column
+            formats << "%-s"
+          else
+            formats << "%-#{maxima + 2}s"
+          end
+        end
+
+        formats[0] = formats[0].insert(0, " " * indent)
+        formats << "%s"
+
+        array.each do |row|
+          sentence = ""
+
+          row.each_with_index do |column, index|
+            maxima = maximas[index]
+
+            if column.is_a?(Numeric)
+              if index == row.size - 1
+                # Don't output 2 trailing spaces when printing the last column
+                f = "%#{maxima}s"
+              else
+                f = "%#{maxima}s  "
+              end
+            else
+              f = formats[index]
+            end
+            sentence << f % column.to_s
+          end
+
+          sentence = truncate(sentence, options[:truncate]) if options[:truncate]
+          stdout.puts sentence
+        end
+      end
+
+      # Prints a long string, word-wrapping the text to the current width of the
+      # terminal display. Ideal for printing heredocs.
+      #
+      # ==== Parameters
+      # String
+      #
+      # ==== Options
+      # indent<Integer>:: Indent each line of the printed paragraph by indent value.
+      #
+      def print_wrapped(message, options={})
+        indent = options[:indent] || 0
+        width = terminal_width - indent
+        paras = message.split("\n\n")
+
+        paras.map! do |unwrapped|
+          unwrapped.strip.gsub(/\n/, " ").squeeze(" ").
+          gsub(/.{1,#{width}}(?:\s|\Z)/){($& + 5.chr).
+          gsub(/\n\005/,"\n").gsub(/\005/,"\n")}
+        end
+
+        paras.each do |para|
+          para.split("\n").each do |line|
+            stdout.puts line.insert(0, " " * indent)
+          end
+          stdout.puts unless para == paras.last
+        end
+      end
+
+      # Deals with file collision and returns true if the file should be
+      # overwritten and false otherwise. If a block is given, it uses the block
+      # response as the content for the diff.
+      #
+      # ==== Parameters
+      # destination<String>:: the destination file to solve conflicts
+      # block<Proc>:: an optional block that returns the value to be used in diff
+      #
+      def file_collision(destination)
+        return true if @always_force
+        options = block_given? ? "[Ynaqdh]" : "[Ynaqh]"
+
+        while true
+          answer = ask %[Overwrite #{destination}? (enter "h" for help) #{options}]
+
+          case answer
+          when is?(:yes), is?(:force), ""
+            return true
+          when is?(:no), is?(:skip)
+            return false
+          when is?(:always)
+            return @always_force = true
+          when is?(:quit)
+            say 'Aborting...'
+            raise SystemExit
+          when is?(:diff)
+            show_diff(destination, yield) if block_given?
+            say 'Retrying...'
+          else
+            say file_collision_help
+          end
+        end
+      end
+
+      # This code was copied from Rake, available under MIT-LICENSE
+      # Copyright (c) 2003, 2004 Jim Weirich
+      def terminal_width
+        if ENV['THOR_COLUMNS']
+          result = ENV['THOR_COLUMNS'].to_i
+        else
+          result = unix? ? dynamic_width : 80
+        end
+        (result < 10) ? 80 : result
+      rescue
+        80
+      end
+
+      # Called if something goes wrong during the execution. This is used by Thor
+      # internally and should not be used inside your scripts. If something went
+      # wrong, you can always raise an exception. If you raise a Thor::Error, it
+      # will be rescued and wrapped in the method below.
+      #
+      def error(statement)
+        stderr.puts statement
+      end
+
+      # Apply color to the given string with optional bold. Disabled in the
+      # Thor::Shell::Basic class.
+      #
+      def set_color(string, *args) #:nodoc:
+        string
+      end
+
+    protected
+
+      def can_display_colors?
+        false
+      end
+
+      def lookup_color(color)
+        return color unless color.is_a?(Symbol)
+        self.class.const_get(color.to_s.upcase)
+      end
+
+      def stdout
+        $stdout
+      end
+
+      def stdin
+        $stdin
+      end
+
+      def stderr
+        $stderr
+      end
+
+      def is?(value) #:nodoc:
+        value = value.to_s
+
+        if value.size == 1
+          /\A#{value}\z/i
+        else
+          /\A(#{value}|#{value[0,1]})\z/i
+        end
+      end
+
+      def file_collision_help #:nodoc:
+<<HELP
+Y - yes, overwrite
+n - no, do not overwrite
+a - all, overwrite this and all others
+q - quit, abort
+d - diff, show the differences between the old and the new
+h - help, show this help
+HELP
+      end
+
+      def show_diff(destination, content) #:nodoc:
+        diff_cmd = ENV['THOR_DIFF'] || ENV['RAILS_DIFF'] || 'diff -u'
+
+        Tempfile.open(File.basename(destination), File.dirname(destination)) do |temp|
+          temp.write content
+          temp.rewind
+          system %(#{diff_cmd} "#{destination}" "#{temp.path}")
+        end
+      end
+
+      def quiet? #:nodoc:
+        mute? || (base && base.options[:quiet])
+      end
+
+      # Calculate the dynamic width of the terminal
+      def dynamic_width
+        @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
+      end
+
+      def dynamic_width_stty
+        %x{stty size 2>/dev/null}.split[1].to_i
+      end
+
+      def dynamic_width_tput
+        %x{tput cols 2>/dev/null}.to_i
+      end
+
+      def unix?
+        RUBY_PLATFORM =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
+      end
+
+      def truncate(string, width)
+        as_unicode do
+          chars = string.chars.to_a
+          if chars.length <= width
+            chars.join
+          else
+            ( chars[0, width-3].join ) + "..."
+          end
+        end
+      end
+
+      if "".respond_to?(:encode)
+        def as_unicode
+          yield
+        end
+      else
+        def as_unicode
+          old, $KCODE = $KCODE, "U"
+          yield
+        ensure
+          $KCODE = old
+        end
+      end
+
+      def ask_simply(statement, color=nil)
+        say("#{statement} ", color)
+        stdin.gets.tap{|text| text.strip! if text}
+      end
+
+      def ask_filtered(statement, answer_set, *args)
+        correct_answer = nil
+        until correct_answer
+          answer = ask_simply("#{statement} #{answer_set.inspect}", *args)
+          correct_answer = answer_set.include?(answer) ? answer : nil
+          answers = answer_set.map(&:inspect).join(", ")
+          say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer
+        end
+        correct_answer
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell/color.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell/color.rb
new file mode 100644
index 0000000..fcf9c25
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell/color.rb
@@ -0,0 +1,148 @@
+require 'thor/shell/basic'
+
+class Thor
+  module Shell
+    # Inherit from Thor::Shell::Basic and add set_color behavior. Check
+    # Thor::Shell::Basic to see all available methods.
+    #
+    class Color < Basic
+      # Embed in a String to clear all previous ANSI sequences.
+      CLEAR      = "\e[0m"
+      # The start of an ANSI bold sequence.
+      BOLD       = "\e[1m"
+
+      # Set the terminal's foreground ANSI color to black.
+      BLACK      = "\e[30m"
+      # Set the terminal's foreground ANSI color to red.
+      RED        = "\e[31m"
+      # Set the terminal's foreground ANSI color to green.
+      GREEN      = "\e[32m"
+      # Set the terminal's foreground ANSI color to yellow.
+      YELLOW     = "\e[33m"
+      # Set the terminal's foreground ANSI color to blue.
+      BLUE       = "\e[34m"
+      # Set the terminal's foreground ANSI color to magenta.
+      MAGENTA    = "\e[35m"
+      # Set the terminal's foreground ANSI color to cyan.
+      CYAN       = "\e[36m"
+      # Set the terminal's foreground ANSI color to white.
+      WHITE      = "\e[37m"
+
+      # Set the terminal's background ANSI color to black.
+      ON_BLACK   = "\e[40m"
+      # Set the terminal's background ANSI color to red.
+      ON_RED     = "\e[41m"
+      # Set the terminal's background ANSI color to green.
+      ON_GREEN   = "\e[42m"
+      # Set the terminal's background ANSI color to yellow.
+      ON_YELLOW  = "\e[43m"
+      # Set the terminal's background ANSI color to blue.
+      ON_BLUE    = "\e[44m"
+      # Set the terminal's background ANSI color to magenta.
+      ON_MAGENTA = "\e[45m"
+      # Set the terminal's background ANSI color to cyan.
+      ON_CYAN    = "\e[46m"
+      # Set the terminal's background ANSI color to white.
+      ON_WHITE   = "\e[47m"
+
+      # Set color by using a string or one of the defined constants. If a third
+      # option is set to true, it also adds bold to the string. This is based
+      # on Highline implementation and it automatically appends CLEAR to the end
+      # of the returned String.
+      #
+      # Pass foreground, background and bold options to this method as
+      # symbols.
+      #
+      # Example:
+      #
+      #   set_color "Hi!", :red, :on_white, :bold
+      #
+      # The available colors are:
+      #
+      #   :bold
+      #   :black
+      #   :red
+      #   :green
+      #   :yellow
+      #   :blue
+      #   :magenta
+      #   :cyan
+      #   :white
+      #   :on_black
+      #   :on_red
+      #   :on_green
+      #   :on_yellow
+      #   :on_blue
+      #   :on_magenta
+      #   :on_cyan
+      #   :on_white
+      def set_color(string, *colors)
+        if colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
+          ansi_colors = colors.map { |color| lookup_color(color) }
+          "#{ansi_colors.join}#{string}#{CLEAR}"
+        else
+          # The old API was `set_color(color, bold=boolean)`. We
+          # continue to support the old API because you should never
+          # break old APIs unnecessarily :P
+          foreground, bold = colors
+          foreground = self.class.const_get(foreground.to_s.upcase) if foreground.is_a?(Symbol)
+
+          bold       = bold ? BOLD : ""
+          "#{bold}#{foreground}#{string}#{CLEAR}"
+        end
+      end
+
+      protected
+
+        def can_display_colors?
+          stdout.tty?
+        end
+
+        # Overwrite show_diff to show diff with colors if Diff::LCS is
+        # available.
+        #
+        def show_diff(destination, content) #:nodoc:
+          if diff_lcs_loaded? && ENV['THOR_DIFF'].nil? && ENV['RAILS_DIFF'].nil?
+            actual  = File.binread(destination).to_s.split("\n")
+            content = content.to_s.split("\n")
+
+            Diff::LCS.sdiff(actual, content).each do |diff|
+              output_diff_line(diff)
+            end
+          else
+            super
+          end
+        end
+
+        def output_diff_line(diff) #:nodoc:
+          case diff.action
+          when '-'
+            say "- #{diff.old_element.chomp}", :red, true
+          when '+'
+            say "+ #{diff.new_element.chomp}", :green, true
+          when '!'
+            say "- #{diff.old_element.chomp}", :red, true
+            say "+ #{diff.new_element.chomp}", :green, true
+          else
+            say "  #{diff.old_element.chomp}", nil, true
+          end
+        end
+
+        # Check if Diff::LCS is loaded. If it is, use it to create pretty output
+        # for diff.
+        #
+        def diff_lcs_loaded? #:nodoc:
+          return true  if defined?(Diff::LCS)
+          return @diff_lcs_loaded unless @diff_lcs_loaded.nil?
+
+          @diff_lcs_loaded = begin
+            require 'diff/lcs'
+            true
+          rescue LoadError
+            false
+          end
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell/html.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell/html.rb
new file mode 100644
index 0000000..2a1bb38
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/shell/html.rb
@@ -0,0 +1,127 @@
+require 'thor/shell/basic'
+
+class Thor
+  module Shell
+    # Inherit from Thor::Shell::Basic and add set_color behavior. Check
+    # Thor::Shell::Basic to see all available methods.
+    #
+    class HTML < Basic
+      # The start of an HTML bold sequence.
+      BOLD       = "font-weight: bold"
+
+      # Set the terminal's foreground HTML color to black.
+      BLACK      = 'color: black'
+      # Set the terminal's foreground HTML color to red.
+      RED        = 'color: red'
+      # Set the terminal's foreground HTML color to green.
+      GREEN      = 'color: green'
+      # Set the terminal's foreground HTML color to yellow.
+      YELLOW     = 'color: yellow'
+      # Set the terminal's foreground HTML color to blue.
+      BLUE       = 'color: blue'
+      # Set the terminal's foreground HTML color to magenta.
+      MAGENTA    = 'color: magenta'
+      # Set the terminal's foreground HTML color to cyan.
+      CYAN       = 'color: cyan'
+      # Set the terminal's foreground HTML color to white.
+      WHITE      = 'color: white'
+
+      # Set the terminal's background HTML color to black.
+      ON_BLACK   = 'background-color: black'
+      # Set the terminal's background HTML color to red.
+      ON_RED     = 'background-color: red'
+      # Set the terminal's background HTML color to green.
+      ON_GREEN   = 'background-color: green'
+      # Set the terminal's background HTML color to yellow.
+      ON_YELLOW  = 'background-color: yellow'
+      # Set the terminal's background HTML color to blue.
+      ON_BLUE    = 'background-color: blue'
+      # Set the terminal's background HTML color to magenta.
+      ON_MAGENTA = 'background-color: magenta'
+      # Set the terminal's background HTML color to cyan.
+      ON_CYAN    = 'background-color: cyan'
+      # Set the terminal's background HTML color to white.
+      ON_WHITE   = 'background-color: white'
+
+      # Set color by using a string or one of the defined constants. If a third
+      # option is set to true, it also adds bold to the string. This is based
+      # on Highline implementation and it automatically appends CLEAR to the end
+      # of the returned String.
+      #
+      def set_color(string, *colors)
+        if colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
+          html_colors = colors.map { |color| lookup_color(color) }
+          "<span style=\"#{html_colors.join("; ")};\">#{string}</span>"
+        else
+          color, bold = colors
+          html_color = self.class.const_get(color.to_s.upcase) if color.is_a?(Symbol)
+          styles = [html_color]
+          styles << BOLD if bold
+          "<span style=\"#{styles.join("; ")};\">#{string}</span>"
+        end
+      end
+
+      # Ask something to the user and receives a response.
+      #
+      # ==== Example
+      # ask("What is your name?")
+      #
+      # TODO: Implement #ask for Thor::Shell::HTML
+      def ask(statement, color=nil)
+        raise NotImplementedError, "Implement #ask for Thor::Shell::HTML"
+      end
+
+      protected
+
+        def can_display_colors?
+          true
+        end
+
+        # Overwrite show_diff to show diff with colors if Diff::LCS is
+        # available.
+        #
+        def show_diff(destination, content) #:nodoc:
+          if diff_lcs_loaded? && ENV['THOR_DIFF'].nil? && ENV['RAILS_DIFF'].nil?
+            actual  = File.binread(destination).to_s.split("\n")
+            content = content.to_s.split("\n")
+
+            Diff::LCS.sdiff(actual, content).each do |diff|
+              output_diff_line(diff)
+            end
+          else
+            super
+          end
+        end
+
+        def output_diff_line(diff) #:nodoc:
+          case diff.action
+          when '-'
+            say "- #{diff.old_element.chomp}", :red, true
+          when '+'
+            say "+ #{diff.new_element.chomp}", :green, true
+          when '!'
+            say "- #{diff.old_element.chomp}", :red, true
+            say "+ #{diff.new_element.chomp}", :green, true
+          else
+            say "  #{diff.old_element.chomp}", nil, true
+          end
+        end
+
+        # Check if Diff::LCS is loaded. If it is, use it to create pretty output
+        # for diff.
+        #
+        def diff_lcs_loaded? #:nodoc:
+          return true  if defined?(Diff::LCS)
+          return @diff_lcs_loaded unless @diff_lcs_loaded.nil?
+
+          @diff_lcs_loaded = begin
+            require 'diff/lcs'
+            true
+          rescue LoadError
+            false
+          end
+        end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/util.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/util.rb
new file mode 100644
index 0000000..2510630
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/util.rb
@@ -0,0 +1,270 @@
+require 'rbconfig'
+
+class Thor
+  module Sandbox #:nodoc:
+  end
+
+  # This module holds several utilities:
+  #
+  # 1) Methods to convert thor namespaces to constants and vice-versa.
+  #
+  #   Thor::Util.namespace_from_thor_class(Foo::Bar::Baz) #=> "foo:bar:baz"
+  #
+  # 2) Loading thor files and sandboxing:
+  #
+  #   Thor::Util.load_thorfile("~/.thor/foo")
+  #
+  module Util
+
+    class << self
+
+      # Receives a namespace and search for it in the Thor::Base subclasses.
+      #
+      # ==== Parameters
+      # namespace<String>:: The namespace to search for.
+      #
+      def find_by_namespace(namespace)
+        namespace = "default#{namespace}" if namespace.empty? || namespace =~ /^:/
+        Thor::Base.subclasses.find { |klass| klass.namespace == namespace }
+      end
+
+      # Receives a constant and converts it to a Thor namespace. Since Thor
+      # commands can be added to a sandbox, this method is also responsable for
+      # removing the sandbox namespace.
+      #
+      # This method should not be used in general because it's used to deal with
+      # older versions of Thor. On current versions, if you need to get the
+      # namespace from a class, just call namespace on it.
+      #
+      # ==== Parameters
+      # constant<Object>:: The constant to be converted to the thor path.
+      #
+      # ==== Returns
+      # String:: If we receive Foo::Bar::Baz it returns "foo:bar:baz"
+      #
+      def namespace_from_thor_class(constant)
+        constant = constant.to_s.gsub(/^Thor::Sandbox::/, "")
+        constant = snake_case(constant).squeeze(":")
+        constant
+      end
+
+      # Given the contents, evaluate it inside the sandbox and returns the
+      # namespaces defined in the sandbox.
+      #
+      # ==== Parameters
+      # contents<String>
+      #
+      # ==== Returns
+      # Array[Object]
+      #
+      def namespaces_in_content(contents, file=__FILE__)
+        old_constants = Thor::Base.subclasses.dup
+        Thor::Base.subclasses.clear
+
+        load_thorfile(file, contents)
+
+        new_constants = Thor::Base.subclasses.dup
+        Thor::Base.subclasses.replace(old_constants)
+
+        new_constants.map!{ |c| c.namespace }
+        new_constants.compact!
+        new_constants
+      end
+
+      # Returns the thor classes declared inside the given class.
+      #
+      def thor_classes_in(klass)
+        stringfied_constants = klass.constants.map { |c| c.to_s }
+        Thor::Base.subclasses.select do |subclass|
+          next unless subclass.name
+          stringfied_constants.include?(subclass.name.gsub("#{klass.name}::", ''))
+        end
+      end
+
+      # Receives a string and convert it to snake case. SnakeCase returns snake_case.
+      #
+      # ==== Parameters
+      # String
+      #
+      # ==== Returns
+      # String
+      #
+      def snake_case(str)
+        return str.downcase if str =~ /^[A-Z_]+$/
+        str.gsub(/\B[A-Z]/, '_\&').squeeze('_') =~ /_*(.*)/
+        return $+.downcase
+      end
+
+      # Receives a string and convert it to camel case. camel_case returns CamelCase.
+      #
+      # ==== Parameters
+      # String
+      #
+      # ==== Returns
+      # String
+      #
+      def camel_case(str)
+        return str if str !~ /_/ && str =~ /[A-Z]+.*/
+        str.split('_').map { |i| i.capitalize }.join
+      end
+
+      # Receives a namespace and tries to retrieve a Thor or Thor::Group class
+      # from it. It first searches for a class using the all the given namespace,
+      # if it's not found, removes the highest entry and searches for the class
+      # again. If found, returns the highest entry as the class name.
+      #
+      # ==== Examples
+      #
+      #   class Foo::Bar < Thor
+      #     def baz
+      #     end
+      #   end
+      #
+      #   class Baz::Foo < Thor::Group
+      #   end
+      #
+      #   Thor::Util.namespace_to_thor_class("foo:bar")     #=> Foo::Bar, nil # will invoke default command
+      #   Thor::Util.namespace_to_thor_class("baz:foo")     #=> Baz::Foo, nil
+      #   Thor::Util.namespace_to_thor_class("foo:bar:baz") #=> Foo::Bar, "baz"
+      #
+      # ==== Parameters
+      # namespace<String>
+      #
+      def find_class_and_command_by_namespace(namespace, fallback = true)
+        if namespace.include?(?:) # look for a namespaced command
+          pieces  = namespace.split(":")
+          command = pieces.pop
+          klass   = Thor::Util.find_by_namespace(pieces.join(":"))
+        end
+        unless klass # look for a Thor::Group with the right name
+          klass, command = Thor::Util.find_by_namespace(namespace), nil
+        end
+        if !klass && fallback # try a command in the default namespace
+          command = namespace
+          klass   = Thor::Util.find_by_namespace('')
+        end
+        return klass, command
+      end
+      alias find_class_and_task_by_namespace find_class_and_command_by_namespace
+
+      # Receives a path and load the thor file in the path. The file is evaluated
+      # inside the sandbox to avoid namespacing conflicts.
+      #
+      def load_thorfile(path, content=nil, debug=false)
+        content ||= File.binread(path)
+
+        begin
+          Thor::Sandbox.class_eval(content, path)
+        rescue Exception => e
+          $stderr.puts("WARNING: unable to load thorfile #{path.inspect}: #{e.message}")
+          if debug
+            $stderr.puts(*e.backtrace)
+          else
+            $stderr.puts(e.backtrace.first)
+          end
+        end
+      end
+
+      def user_home
+        @@user_home ||= if ENV["HOME"]
+          ENV["HOME"]
+        elsif ENV["USERPROFILE"]
+          ENV["USERPROFILE"]
+        elsif ENV["HOMEDRIVE"] && ENV["HOMEPATH"]
+          File.join(ENV["HOMEDRIVE"], ENV["HOMEPATH"])
+        elsif ENV["APPDATA"]
+          ENV["APPDATA"]
+        else
+          begin
+            File.expand_path("~")
+          rescue
+            if File::ALT_SEPARATOR
+              "C:/"
+            else
+              "/"
+            end
+          end
+        end
+      end
+
+      # Returns the root where thor files are located, depending on the OS.
+      #
+      def thor_root
+        File.join(user_home, ".thor").gsub(/\\/, '/')
+      end
+
+      # Returns the files in the thor root. On Windows thor_root will be something
+      # like this:
+      #
+      #   C:\Documents and Settings\james\.thor
+      #
+      # If we don't #gsub the \ character, Dir.glob will fail.
+      #
+      def thor_root_glob
+        files = Dir["#{escape_globs(thor_root)}/*"]
+
+        files.map! do |file|
+          File.directory?(file) ? File.join(file, "main.thor") : file
+        end
+      end
+
+      # Where to look for Thor files.
+      #
+      def globs_for(path)
+        path = escape_globs(path)
+        ["#{path}/Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"]
+      end
+
+      # Return the path to the ruby interpreter taking into account multiple
+      # installations and windows extensions.
+      #
+      def ruby_command
+        @ruby_command ||= begin
+          ruby_name = RbConfig::CONFIG['ruby_install_name']
+          ruby = File.join(RbConfig::CONFIG['bindir'], ruby_name)
+          ruby << RbConfig::CONFIG['EXEEXT']
+
+          # avoid using different name than ruby (on platforms supporting links)
+          if ruby_name != 'ruby' && File.respond_to?(:readlink)
+            begin
+              alternate_ruby = File.join(RbConfig::CONFIG['bindir'], 'ruby')
+              alternate_ruby << RbConfig::CONFIG['EXEEXT']
+
+              # ruby is a symlink
+              if File.symlink? alternate_ruby
+                linked_ruby = File.readlink alternate_ruby
+
+                # symlink points to 'ruby_install_name'
+                ruby = alternate_ruby if linked_ruby == ruby_name || linked_ruby == ruby
+              end
+            rescue NotImplementedError
+              # just ignore on windows
+            end
+          end
+
+          # escape string in case path to ruby executable contain spaces.
+          ruby.sub!(/.*\s.*/m, '"\&"')
+          ruby
+        end
+      end
+
+      # Returns a string that has had any glob characters escaped.
+      # The glob characters are `* ? { } [ ]`.
+      #
+      # ==== Examples
+      #
+      #   Thor::Util.escape_globs('[apps]')   # => '\[apps\]'
+      #
+      # ==== Parameters
+      # String
+      #
+      # ==== Returns
+      # String
+      #
+      def escape_globs(path)
+        path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&')
+      end
+
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/version.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/version.rb
new file mode 100644
index 0000000..646cd37
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/lib/thor/version.rb
@@ -0,0 +1,3 @@
+class Thor
+  VERSION = "0.18.1"
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/create_file_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/create_file_spec.rb
new file mode 100644
index 0000000..2586704
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/create_file_spec.rb
@@ -0,0 +1,170 @@
+require 'helper'
+require 'thor/actions'
+
+describe Thor::Actions::CreateFile do
+  before do
+    ::FileUtils.rm_rf(destination_root)
+  end
+
+  def create_file(destination=nil, config={}, options={})
+    @base = MyCounter.new([1, 2], options, { :destination_root => destination_root })
+    @base.stub!(:file_name).and_return('rdoc')
+
+    @action = Thor::Actions::CreateFile.new(@base, destination, "CONFIGURATION",
+                                            { :verbose => !@silence }.merge(config))
+  end
+
+  def invoke!
+    capture(:stdout) { @action.invoke! }
+  end
+
+  def revoke!
+    capture(:stdout) { @action.revoke! }
+  end
+
+  def silence!
+    @silence = true
+  end
+
+  describe "#invoke!" do
+    it "creates a file" do
+      create_file("doc/config.rb")
+      invoke!
+      expect(File.exists?(File.join(destination_root, "doc/config.rb"))).to be_true
+    end
+
+    it "does not create a file if pretending" do
+      create_file("doc/config.rb", {}, :pretend => true)
+      invoke!
+      expect(File.exists?(File.join(destination_root, "doc/config.rb"))).to be_false
+    end
+
+    it "shows created status to the user" do
+      create_file("doc/config.rb")
+      expect(invoke!).to eq("      create  doc/config.rb\n")
+    end
+
+    it "does not show any information if log status is false" do
+      silence!
+      create_file("doc/config.rb")
+      expect(invoke!).to be_empty
+    end
+
+    it "returns the given destination" do
+      capture(:stdout) do
+        expect(create_file("doc/config.rb").invoke!).to eq("doc/config.rb")
+      end
+    end
+
+    it "converts encoded instructions" do
+      create_file("doc/%file_name%.rb.tt")
+      invoke!
+      expect(File.exists?(File.join(destination_root, "doc/rdoc.rb.tt"))).to be_true
+    end
+
+    describe "when file exists" do
+      before do
+        create_file("doc/config.rb")
+        invoke!
+      end
+
+      describe "and is identical" do
+        it "shows identical status" do
+          create_file("doc/config.rb")
+          invoke!
+          expect(invoke!).to eq("   identical  doc/config.rb\n")
+        end
+      end
+
+      describe "and is not identical" do
+        before do
+          File.open(File.join(destination_root, 'doc/config.rb'), 'w'){ |f| f.write("FOO = 3") }
+        end
+
+        it "shows forced status to the user if force is given" do
+          expect(create_file("doc/config.rb", {}, :force => true)).not_to be_identical
+          expect(invoke!).to eq("       force  doc/config.rb\n")
+        end
+
+        it "shows skipped status to the user if skip is given" do
+          expect(create_file("doc/config.rb", {}, :skip => true)).not_to be_identical
+          expect(invoke!).to eq("        skip  doc/config.rb\n")
+        end
+
+        it "shows forced status to the user if force is configured" do
+          expect(create_file("doc/config.rb", :force => true)).not_to be_identical
+          expect(invoke!).to eq("       force  doc/config.rb\n")
+        end
+
+        it "shows skipped status to the user if skip is configured" do
+          expect(create_file("doc/config.rb", :skip => true)).not_to be_identical
+          expect(invoke!).to eq("        skip  doc/config.rb\n")
+        end
+
+        it "shows conflict status to ther user" do
+          expect(create_file("doc/config.rb")).not_to be_identical
+          $stdin.should_receive(:gets).and_return('s')
+          file = File.join(destination_root, 'doc/config.rb')
+
+          content = invoke!
+          expect(content).to match(/conflict  doc\/config\.rb/)
+          expect(content).to match(/Overwrite #{file}\? \(enter "h" for help\) \[Ynaqdh\]/)
+          expect(content).to match(/skip  doc\/config\.rb/)
+        end
+
+        it "creates the file if the file collision menu returns true" do
+          create_file("doc/config.rb")
+          $stdin.should_receive(:gets).and_return('y')
+          expect(invoke!).to match(/force  doc\/config\.rb/)
+        end
+
+        it "skips the file if the file collision menu returns false" do
+          create_file("doc/config.rb")
+          $stdin.should_receive(:gets).and_return('n')
+          expect(invoke!).to match(/skip  doc\/config\.rb/)
+        end
+
+        it "executes the block given to show file content" do
+          create_file("doc/config.rb")
+          $stdin.should_receive(:gets).and_return('d')
+          $stdin.should_receive(:gets).and_return('n')
+          @base.shell.should_receive(:system).with(/diff -u/)
+          invoke!
+        end
+      end
+    end
+  end
+
+  describe "#revoke!" do
+    it "removes the destination file" do
+      create_file("doc/config.rb")
+      invoke!
+      revoke!
+      expect(File.exists?(@action.destination)).to be_false
+    end
+
+    it "does not raise an error if the file does not exist" do
+      create_file("doc/config.rb")
+      revoke!
+      expect(File.exists?(@action.destination)).to be_false
+    end
+  end
+
+  describe "#exists?" do
+    it "returns true if the destination file exists" do
+      create_file("doc/config.rb")
+      expect(@action.exists?).to be_false
+      invoke!
+      expect(@action.exists?).to be_true
+    end
+  end
+
+  describe "#identical?" do
+    it "returns true if the destination file and is identical" do
+      create_file("doc/config.rb")
+      expect(@action.identical?).to be_false
+      invoke!
+      expect(@action.identical?).to be_true
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/create_link_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/create_link_spec.rb
new file mode 100644
index 0000000..95f25d0
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/create_link_spec.rb
@@ -0,0 +1,95 @@
+require 'helper'
+require 'thor/actions'
+require 'tempfile'
+
+describe Thor::Actions::CreateLink do
+  before do
+    @hardlink_to = File.join(Dir.tmpdir, 'linkdest.rb')
+    ::FileUtils.rm_rf(destination_root)
+    ::FileUtils.rm_rf(@hardlink_to)
+  end
+
+  def create_link(destination=nil, config={}, options={})
+    @base = MyCounter.new([1,2], options, { :destination_root => destination_root })
+    @base.stub!(:file_name).and_return('rdoc')
+
+    @tempfile = Tempfile.new("config.rb")
+
+    @action = Thor::Actions::CreateLink.new(@base, destination, @tempfile.path,
+                                            { :verbose => !@silence }.merge(config))
+  end
+
+  def invoke!
+    capture(:stdout) { @action.invoke! }
+  end
+
+  def revoke!
+    capture(:stdout) { @action.revoke! }
+  end
+
+  def silence!
+    @silence = true
+  end
+
+  describe "#invoke!" do
+    it "creates a symbolic link for :symbolic => true" do
+      create_link("doc/config.rb", :symbolic => true)
+      invoke!
+      destination_path = File.join(destination_root, "doc/config.rb")
+      expect(File.exists?(destination_path)).to be_true
+      expect(File.symlink?(destination_path)).to be_true
+    end
+
+    it "creates a hard link for :symbolic => false" do
+      create_link(@hardlink_to, :symbolic => false)
+      invoke!
+      destination_path = @hardlink_to
+      expect(File.exists?(destination_path)).to be_true
+      expect(File.symlink?(destination_path)).to be_false
+    end
+
+    it "creates a symbolic link by default" do
+      create_link("doc/config.rb")
+      invoke!
+      destination_path = File.join(destination_root, "doc/config.rb")
+      expect(File.exists?(destination_path)).to be_true
+      expect(File.symlink?(destination_path)).to be_true
+    end
+
+    it "does not create a link if pretending" do
+      create_link("doc/config.rb", {}, :pretend => true)
+      invoke!
+      expect(File.exists?(File.join(destination_root, "doc/config.rb"))).to be_false
+    end
+
+    it "shows created status to the user" do
+      create_link("doc/config.rb")
+      expect(invoke!).to eq("      create  doc/config.rb\n")
+    end
+
+    it "does not show any information if log status is false" do
+      silence!
+      create_link("doc/config.rb")
+      expect(invoke!).to be_empty
+    end
+  end
+
+  describe "#identical?" do
+    it "returns true if the destination link exists and is identical" do
+      create_link("doc/config.rb")
+      expect(@action.identical?).to be_false
+      invoke!
+      expect(@action.identical?).to be_true
+    end
+  end
+
+  describe "#revoke!" do
+    it "removes the symbolic link of non-existent destination" do
+      create_link("doc/config.rb")
+      invoke!
+      File.delete(@tempfile.path)
+      revoke!
+      expect(File.symlink?(@action.destination)).to be_false
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/directory_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/directory_spec.rb
new file mode 100644
index 0000000..b7e70f2
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/directory_spec.rb
@@ -0,0 +1,169 @@
+require 'helper'
+require 'thor/actions'
+
+describe Thor::Actions::Directory do
+  before do
+    ::FileUtils.rm_rf(destination_root)
+    invoker.stub!(:file_name).and_return("rdoc")
+  end
+
+  def invoker
+    @invoker ||= WhinyGenerator.new([1,2], {}, { :destination_root => destination_root })
+  end
+
+  def revoker
+    @revoker ||= WhinyGenerator.new([1,2], {}, { :destination_root => destination_root, :behavior => :revoke })
+  end
+
+  def invoke!(*args, &block)
+    capture(:stdout){ invoker.directory(*args, &block) }
+  end
+
+  def revoke!(*args, &block)
+    capture(:stdout){ revoker.directory(*args, &block) }
+  end
+
+  def exists_and_identical?(source_path, destination_path)
+    %w(config.rb README).each do |file|
+      source      = File.join(source_root, source_path, file)
+      destination = File.join(destination_root, destination_path, file)
+
+      expect(File.exists?(destination)).to be_true
+      expect(FileUtils.identical?(source, destination)).to be_true
+    end
+  end
+
+  describe "#invoke!" do
+    it "raises an error if the source does not exist" do
+      expect {
+        invoke! "unknown"
+      }.to raise_error(Thor::Error, /Could not find "unknown" in any of your source paths/)
+    end
+
+    it "does not create a directory in pretend mode" do
+      invoke! "doc", "ghost", :pretend => true
+      expect(File.exists?("ghost")).to be_false
+    end
+
+    it "copies the whole directory recursively to the default destination" do
+      invoke! "doc"
+      exists_and_identical?("doc", "doc")
+    end
+
+    it "copies the whole directory recursively to the specified destination" do
+      invoke! "doc", "docs"
+      exists_and_identical?("doc", "docs")
+    end
+
+    it "copies only the first level files if recursive" do
+      invoke! ".", "commands", :recursive => false
+
+      file = File.join(destination_root, "commands", "group.thor")
+      expect(File.exists?(file)).to be_true
+
+      file = File.join(destination_root, "commands", "doc")
+      expect(File.exists?(file)).to be_false
+
+      file = File.join(destination_root, "commands", "doc", "README")
+      expect(File.exists?(file)).to be_false
+    end
+
+    it "ignores files within excluding/ directories when exclude_pattern is provided" do
+      invoke! "doc", "docs", :exclude_pattern => /excluding\//
+      file = File.join(destination_root, "docs", "excluding", "rdoc.rb")
+      expect(File.exists?(file)).to be_false
+    end
+
+    it "copies and evalutes files within excluding/ directory when no exclude_pattern is present" do
+      invoke! "doc", "docs"
+      file = File.join(destination_root, "docs", "excluding", "rdoc.rb")
+      expect(File.exists?(file)).to be_true
+      expect(File.read(file)).to eq("BAR = BAR\n")
+    end
+
+    it "copies files from the source relative to the current path" do
+      invoker.inside "doc" do
+        invoke! "."
+      end
+      exists_and_identical?("doc", "doc")
+    end
+
+    it "copies and evaluates templates" do
+      invoke! "doc", "docs"
+      file = File.join(destination_root, "docs", "rdoc.rb")
+      expect(File.exists?(file)).to be_true
+      expect(File.read(file)).to eq("FOO = FOO\n")
+    end
+
+    it "copies directories and preserved file mode" do
+      invoke! "preserve", "preserved", :mode => :preserve
+      original = File.join(source_root, "preserve", "script.sh")
+      copy = File.join(destination_root, "preserved", "script.sh")
+      expect(File.stat(original).mode).to eq(File.stat(copy).mode)
+    end
+
+    it "copies directories" do
+      invoke! "doc", "docs"
+      file = File.join(destination_root, "docs", "components")
+      expect(File.exists?(file)).to be_true
+      expect(File.directory?(file)).to be_true
+    end
+
+    it "does not copy .empty_directory files" do
+      invoke! "doc", "docs"
+      file = File.join(destination_root, "docs", "components", ".empty_directory")
+      expect(File.exists?(file)).to be_false
+    end
+
+    it "copies directories even if they are empty" do
+      invoke! "doc/components", "docs/components"
+      file = File.join(destination_root, "docs", "components")
+      expect(File.exists?(file)).to be_true
+    end
+
+    it "does not copy empty directories twice" do
+      content = invoke!("doc/components", "docs/components")
+      expect(content).not_to match(/exist/)
+    end
+
+    it "logs status" do
+      content = invoke!("doc")
+      expect(content).to match(/create  doc\/README/)
+      expect(content).to match(/create  doc\/config\.rb/)
+      expect(content).to match(/create  doc\/rdoc\.rb/)
+      expect(content).to match(/create  doc\/components/)
+    end
+
+    it "yields a block" do
+      checked = false
+      invoke!("doc") do |content|
+        checked ||= !!(content =~ /FOO/)
+      end
+      expect(checked).to be_true
+    end
+
+    it "works with glob characters in the path" do
+      content = invoke!("app{1}")
+      expect(content).to match(/create  app\{1\}\/README/)
+    end
+  end
+
+  describe "#revoke!" do
+    it "removes the destination file" do
+      invoke! "doc"
+      revoke! "doc"
+
+      expect(File.exists?(File.join(destination_root, "doc", "README"))).to be_false
+      expect(File.exists?(File.join(destination_root, "doc", "config.rb"))).to be_false
+      expect(File.exists?(File.join(destination_root, "doc", "components"))).to be_false
+    end
+
+    it "works with glob characters in the path" do
+      invoke! "app{1}"
+      expect(File.exists?(File.join(destination_root, "app{1}", "README"))).to be_true
+
+      revoke! "app{1}"
+      expect(File.exists?(File.join(destination_root, "app{1}", "README"))).to be_false
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/empty_directory_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/empty_directory_spec.rb
new file mode 100644
index 0000000..49a1846
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/empty_directory_spec.rb
@@ -0,0 +1,129 @@
+require 'helper'
+require 'thor/actions'
+
+describe Thor::Actions::EmptyDirectory do
+  before do
+    ::FileUtils.rm_rf(destination_root)
+  end
+
+  def empty_directory(destination, options={})
+    @action = Thor::Actions::EmptyDirectory.new(base, destination)
+  end
+
+  def invoke!
+    capture(:stdout) { @action.invoke! }
+  end
+
+  def revoke!
+    capture(:stdout) { @action.revoke! }
+  end
+
+  def base
+    @base ||= MyCounter.new([1,2], {}, { :destination_root => destination_root })
+  end
+
+  describe "#destination" do
+    it "returns the full destination with the destination_root" do
+      expect(empty_directory('doc').destination).to eq(File.join(destination_root, 'doc'))
+    end
+
+    it "takes relative root into account" do
+      base.inside('doc') do
+        expect(empty_directory('contents').destination).to eq(File.join(destination_root, 'doc', 'contents'))
+      end
+    end
+  end
+
+  describe "#relative_destination" do
+    it "returns the relative destination to the original destination root" do
+      base.inside('doc') do
+        expect(empty_directory('contents').relative_destination).to eq('doc/contents')
+      end
+    end
+  end
+
+  describe "#given_destination" do
+    it "returns the destination supplied by the user" do
+      base.inside('doc') do
+        expect(empty_directory('contents').given_destination).to eq('contents')
+      end
+    end
+  end
+
+  describe "#invoke!" do
+    it "copies the file to the specified destination" do
+      empty_directory("doc")
+      invoke!
+      expect(File.exists?(File.join(destination_root, "doc"))).to be_true
+    end
+
+    it "shows created status to the user" do
+      empty_directory("doc")
+      expect(invoke!).to eq("      create  doc\n")
+    end
+
+    it "does not create a directory if pretending" do
+      base.inside("foo", :pretend => true) do
+        empty_directory("ghost")
+      end
+      expect(File.exists?(File.join(base.destination_root, "ghost"))).to be_false
+    end
+
+    describe "when directory exists" do
+      it "shows exist status" do
+        empty_directory("doc")
+        invoke!
+        expect(invoke!).to eq("       exist  doc\n")
+      end
+    end
+  end
+
+  describe "#revoke!" do
+    it "removes the destination file" do
+      empty_directory("doc")
+      invoke!
+      revoke!
+      expect(File.exists?(@action.destination)).to be_false
+    end
+  end
+
+  describe "#exists?" do
+    it "returns true if the destination file exists" do
+      empty_directory("doc")
+      expect(@action.exists?).to be_false
+      invoke!
+      expect(@action.exists?).to be_true
+    end
+  end
+
+  context "protected methods" do
+    describe "#convert_encoded_instructions" do
+      before do
+        empty_directory("test_dir")
+        @action.base.stub!(:file_name).and_return("expected")
+      end
+
+      it "accepts and executes a 'legal' %\w+% encoded instruction" do
+        expect(@action.send(:convert_encoded_instructions, "%file_name%.txt")).to eq("expected.txt")
+      end
+
+      it "accepts and executes a private %\w+% encoded instruction" do
+        @action.base.extend Module.new {
+          private
+          def private_file_name
+            "expected"
+          end
+        }
+        expect(@action.send(:convert_encoded_instructions, "%private_file_name%.txt")).to eq("expected.txt")
+      end
+
+      it "ignores an 'illegal' %\w+% encoded instruction" do
+        expect(@action.send(:convert_encoded_instructions, "%some_name%.txt")).to eq("%some_name%.txt")
+      end
+
+      it "ignores incorrectly encoded instruction" do
+        expect(@action.send(:convert_encoded_instructions, "%some.name%.txt")).to eq("%some.name%.txt")
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/file_manipulation_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/file_manipulation_spec.rb
new file mode 100644
index 0000000..c4d571c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/file_manipulation_spec.rb
@@ -0,0 +1,382 @@
+require 'helper'
+
+class Application; end
+
+describe Thor::Actions do
+  def runner(options={})
+    @runner ||= MyCounter.new([1], options, { :destination_root => destination_root })
+  end
+
+  def action(*args, &block)
+    capture(:stdout) { runner.send(*args, &block) }
+  end
+
+  def exists_and_identical?(source, destination)
+   destination = File.join(destination_root, destination)
+   expect(File.exists?(destination)).to be_true
+
+   source = File.join(source_root, source)
+   expect(FileUtils).to be_identical(source, destination)
+  end
+
+  def file
+    File.join(destination_root, "foo")
+  end
+
+  before do
+    ::FileUtils.rm_rf(destination_root)
+  end
+
+  describe "#chmod" do
+    it "executes the command given" do
+      FileUtils.should_receive(:chmod_R).with(0755, file)
+      action :chmod, "foo", 0755
+    end
+
+    it "does not execute the command if pretending given" do
+      FileUtils.should_not_receive(:chmod_R)
+      runner(:pretend => true)
+      action :chmod, "foo", 0755
+    end
+
+    it "logs status" do
+      FileUtils.should_receive(:chmod_R).with(0755, file)
+      expect(action(:chmod, "foo", 0755)).to eq("       chmod  foo\n")
+    end
+
+    it "does not log status if required" do
+      FileUtils.should_receive(:chmod_R).with(0755, file)
+      expect(action(:chmod, "foo", 0755, :verbose => false)).to be_empty
+    end
+  end
+
+  describe "#copy_file" do
+    it "copies file from source to default destination" do
+      action :copy_file, "command.thor"
+      exists_and_identical?("command.thor", "command.thor")
+    end
+
+    it "copies file from source to the specified destination" do
+      action :copy_file, "command.thor", "foo.thor"
+      exists_and_identical?("command.thor", "foo.thor")
+    end
+
+    it "copies file from the source relative to the current path" do
+      runner.inside("doc") do
+        action :copy_file, "README"
+      end
+      exists_and_identical?("doc/README", "doc/README")
+    end
+
+    it "copies file from source to default destination and preserves file mode" do
+      action :copy_file, "preserve/script.sh", :mode => :preserve
+      original = File.join(source_root, "preserve/script.sh")
+      copy = File.join(destination_root, "preserve/script.sh")
+      expect(File.stat(original).mode).to eq(File.stat(copy).mode)
+    end
+
+    it "logs status" do
+      expect(action(:copy_file, "command.thor")).to eq("      create  command.thor\n")
+    end
+
+    it "accepts a block to change output" do
+      action :copy_file, "command.thor" do |content|
+        "OMG" + content
+      end
+      expect(File.read(File.join(destination_root, "command.thor"))).to match(/^OMG/)
+    end
+  end
+
+  describe "#link_file" do
+    it "links file from source to default destination" do
+      action :link_file, "command.thor"
+      exists_and_identical?("command.thor", "command.thor")
+    end
+
+    it "links file from source to the specified destination" do
+      action :link_file, "command.thor", "foo.thor"
+      exists_and_identical?("command.thor", "foo.thor")
+    end
+
+    it "links file from the source relative to the current path" do
+      runner.inside("doc") do
+        action :link_file, "README"
+      end
+      exists_and_identical?("doc/README", "doc/README")
+    end
+
+    it "logs status" do
+      expect(action(:link_file, "command.thor")).to eq("      create  command.thor\n")
+    end
+  end
+
+  describe "#get" do
+    it "copies file from source to the specified destination" do
+      action :get, "doc/README", "docs/README"
+      exists_and_identical?("doc/README", "docs/README")
+    end
+
+    it "uses just the source basename as destination if none is specified" do
+      action :get, "doc/README"
+      exists_and_identical?("doc/README", "README")
+    end
+
+    it "allows the destination to be set as a block result" do
+      action(:get, "doc/README"){ |c| "docs/README" }
+      exists_and_identical?("doc/README", "docs/README")
+    end
+
+    it "yields file content to a block" do
+      action :get, "doc/README" do |content|
+        expect(content).to eq("__start__\nREADME\n__end__\n")
+      end
+    end
+
+    it "logs status" do
+      expect(action(:get, "doc/README", "docs/README")).to eq("      create  docs/README\n")
+    end
+
+    it "accepts http remote sources" do
+      body = "__start__\nHTTPFILE\n__end__\n"
+      FakeWeb.register_uri(:get, 'http://example.com/file.txt', :body => body)
+      action :get, "http://example.com/file.txt" do |content|
+        expect(content).to eq(body)
+      end
+      FakeWeb.clean_registry
+    end
+
+    it "accepts https remote sources" do
+      body = "__start__\nHTTPSFILE\n__end__\n"
+      FakeWeb.register_uri(:get, 'https://example.com/file.txt', :body => body)
+      action :get, "https://example.com/file.txt" do |content|
+        expect(content).to eq(body)
+      end
+      FakeWeb.clean_registry
+    end
+  end
+
+  describe "#template" do
+    it "allows using block helpers in the template" do
+      action :template, "doc/block_helper.rb"
+
+      file = File.join(destination_root, "doc/block_helper.rb")
+      expect(File.read(file)).to eq("Hello world!")
+    end
+
+    it "evaluates the template given as source" do
+      runner.instance_variable_set("@klass", "Config")
+      action :template, "doc/config.rb"
+
+      file = File.join(destination_root, "doc/config.rb")
+      expect(File.read(file)).to eq("class Config; end\n")
+    end
+
+    it "copies the template to the specified destination" do
+      action :template, "doc/config.rb", "doc/configuration.rb"
+      file = File.join(destination_root, "doc/configuration.rb")
+      expect(File.exists?(file)).to be_true
+    end
+
+    it "converts enconded instructions" do
+      runner.should_receive(:file_name).and_return("rdoc")
+      action :template, "doc/%file_name%.rb.tt"
+      file = File.join(destination_root, "doc/rdoc.rb")
+      expect(File.exists?(file)).to be_true
+    end
+
+    it "logs status" do
+      expect(capture(:stdout) { runner.template("doc/config.rb") }).to eq("      create  doc/config.rb\n")
+    end
+
+    it "accepts a block to change output" do
+      action :template, "doc/config.rb" do |content|
+        "OMG" + content
+      end
+      expect(File.read(File.join(destination_root, "doc/config.rb"))).to match(/^OMG/)
+    end
+
+    it "guesses the destination name when given only a source" do
+      action :template, "doc/config.yaml.tt"
+
+      file = File.join(destination_root, "doc/config.yaml")
+      expect(File.exists?(file)).to be_true
+    end
+  end
+
+  describe "when changing existent files" do
+    before do
+      ::FileUtils.cp_r(source_root, destination_root)
+    end
+
+    def file
+      File.join(destination_root, "doc", "README")
+    end
+
+    describe "#remove_file" do
+      it "removes the file given" do
+        action :remove_file, "doc/README"
+        expect(File.exists?(file)).to be_false
+      end
+
+      it "removes directories too" do
+        action :remove_dir, "doc"
+        expect(File.exists?(File.join(destination_root, "doc"))).to be_false
+      end
+
+      it "does not remove if pretending" do
+        runner(:pretend => true)
+        action :remove_file, "doc/README"
+        expect(File.exists?(file)).to be_true
+      end
+
+      it "logs status" do
+        expect(action(:remove_file, "doc/README")).to eq("      remove  doc/README\n")
+      end
+
+      it "does not log status if required" do
+        expect(action(:remove_file, "doc/README", :verbose => false)).to be_empty
+      end
+    end
+
+    describe "#gsub_file" do
+      it "replaces the content in the file" do
+        action :gsub_file, "doc/README", "__start__", "START"
+        expect(File.binread(file)).to eq("START\nREADME\n__end__\n")
+      end
+
+      it "does not replace if pretending" do
+        runner(:pretend => true)
+        action :gsub_file, "doc/README", "__start__", "START"
+        expect(File.binread(file)).to eq("__start__\nREADME\n__end__\n")
+      end
+
+      it "accepts a block" do
+        action(:gsub_file, "doc/README", "__start__"){ |match| match.gsub('__', '').upcase  }
+        expect(File.binread(file)).to eq("START\nREADME\n__end__\n")
+      end
+
+      it "logs status" do
+        expect(action(:gsub_file, "doc/README", "__start__", "START")).to eq("        gsub  doc/README\n")
+      end
+
+      it "does not log status if required" do
+        expect(action(:gsub_file, file, "__", :verbose => false){ |match| match * 2 }).to be_empty
+      end
+    end
+
+    describe "#append_to_file" do
+      it "appends content to the file" do
+        action :append_to_file, "doc/README", "END\n"
+        expect(File.binread(file)).to eq("__start__\nREADME\n__end__\nEND\n")
+      end
+
+      it "accepts a block" do
+        action(:append_to_file, "doc/README"){ "END\n" }
+        expect(File.binread(file)).to eq("__start__\nREADME\n__end__\nEND\n")
+      end
+
+      it "logs status" do
+        expect(action(:append_to_file, "doc/README", "END")).to eq("      append  doc/README\n")
+      end
+    end
+
+    describe "#prepend_to_file" do
+      it "prepends content to the file" do
+        action :prepend_to_file, "doc/README", "START\n"
+        expect(File.binread(file)).to eq("START\n__start__\nREADME\n__end__\n")
+      end
+
+      it "accepts a block" do
+        action(:prepend_to_file, "doc/README"){ "START\n" }
+        expect(File.binread(file)).to eq("START\n__start__\nREADME\n__end__\n")
+      end
+
+      it "logs status" do
+        expect(action(:prepend_to_file, "doc/README", "START")).to eq("     prepend  doc/README\n")
+      end
+    end
+
+    describe "#inject_into_class" do
+      def file
+        File.join(destination_root, "application.rb")
+      end
+
+      it "appends content to a class" do
+        action :inject_into_class, "application.rb", Application, "  filter_parameters :password\n"
+        expect(File.binread(file)).to eq("class Application < Base\n  filter_parameters :password\nend\n")
+      end
+
+      it "accepts a block" do
+        action(:inject_into_class, "application.rb", Application){ "  filter_parameters :password\n" }
+        expect(File.binread(file)).to eq("class Application < Base\n  filter_parameters :password\nend\n")
+      end
+
+      it "logs status" do
+        expect(action(:inject_into_class, "application.rb", Application, "  filter_parameters :password\n")).to eq("      insert  application.rb\n")
+      end
+
+      it "does not append if class name does not match" do
+        action :inject_into_class, "application.rb", "App", "  filter_parameters :password\n"
+        expect(File.binread(file)).to eq("class Application < Base\nend\n")
+      end
+    end
+  end
+
+  describe "when adjusting comments" do
+    before do
+      ::FileUtils.cp_r(source_root, destination_root)
+    end
+
+    def file
+      File.join(destination_root, "doc", "COMMENTER")
+    end
+
+    unmodified_comments_file = /__start__\n # greenblue\n#\n# yellowblue\n#yellowred\n #greenred\norange\n    purple\n  ind#igo\n  # ind#igo\n__end__/
+
+    describe "#uncomment_lines" do
+      it "uncomments all matching lines in the file" do
+        action :uncomment_lines, "doc/COMMENTER", "green"
+        expect(File.binread(file)).to match(/__start__\n greenblue\n#\n# yellowblue\n#yellowred\n greenred\norange\n    purple\n  ind#igo\n  # ind#igo\n__end__/)
+
+        action :uncomment_lines, "doc/COMMENTER", "red"
+        expect(File.binread(file)).to match(/__start__\n greenblue\n#\n# yellowblue\nyellowred\n greenred\norange\n    purple\n  ind#igo\n  # ind#igo\n__end__/)
+      end
+
+      it "correctly uncomments lines with hashes in them" do
+        action :uncomment_lines, "doc/COMMENTER", "ind#igo"
+        expect(File.binread(file)).to match(/__start__\n # greenblue\n#\n# yellowblue\n#yellowred\n #greenred\norange\n    purple\n  ind#igo\n  ind#igo\n__end__/)
+      end
+
+      it "does not modify already uncommented lines in the file" do
+        action :uncomment_lines, "doc/COMMENTER", "orange"
+        action :uncomment_lines, "doc/COMMENTER", "purple"
+        expect(File.binread(file)).to match(unmodified_comments_file)
+      end
+
+      it "does not uncomment the wrong line when uncommenting lines preceded by blank commented line" do
+        action :uncomment_lines, "doc/COMMENTER", "yellow"
+        expect(File.binread(file)).to match(/__start__\n # greenblue\n#\nyellowblue\nyellowred\n #greenred\norange\n    purple\n  ind#igo\n  # ind#igo\n__end__/)
+      end
+    end
+
+    describe "#comment_lines" do
+      it "comments lines which are not commented" do
+        action :comment_lines, "doc/COMMENTER", "orange"
+        expect(File.binread(file)).to match(/__start__\n # greenblue\n#\n# yellowblue\n#yellowred\n #greenred\n# orange\n    purple\n  ind#igo\n  # ind#igo\n__end__/)
+
+        action :comment_lines, "doc/COMMENTER", "purple"
+        expect(File.binread(file)).to match(/__start__\n # greenblue\n#\n# yellowblue\n#yellowred\n #greenred\n# orange\n    # purple\n  ind#igo\n  # ind#igo\n__end__/)
+      end
+
+      it "correctly comments lines with hashes in them" do
+        action :comment_lines, "doc/COMMENTER", "ind#igo"
+        expect(File.binread(file)).to match(/__start__\n # greenblue\n#\n# yellowblue\n#yellowred\n #greenred\norange\n    purple\n  # ind#igo\n  # ind#igo\n__end__/)
+      end
+
+      it "does not modify already commented lines" do
+        action :comment_lines, "doc/COMMENTER", "green"
+        expect(File.binread(file)).to match(unmodified_comments_file)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/inject_into_file_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/inject_into_file_spec.rb
new file mode 100644
index 0000000..cf577de
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions/inject_into_file_spec.rb
@@ -0,0 +1,135 @@
+require 'helper'
+require 'thor/actions'
+
+describe Thor::Actions::InjectIntoFile do
+  before do
+    ::FileUtils.rm_rf(destination_root)
+    ::FileUtils.cp_r(source_root, destination_root)
+  end
+
+  def invoker(options={})
+    @invoker ||= MyCounter.new([1,2], options, { :destination_root => destination_root })
+  end
+
+  def revoker
+    @revoker ||= MyCounter.new([1,2], {}, { :destination_root => destination_root, :behavior => :revoke })
+  end
+
+  def invoke!(*args, &block)
+    capture(:stdout) { invoker.insert_into_file(*args, &block) }
+  end
+
+  def revoke!(*args, &block)
+    capture(:stdout) { revoker.insert_into_file(*args, &block) }
+  end
+
+  def file
+    File.join(destination_root, "doc/README")
+  end
+
+  describe "#invoke!" do
+    it "changes the file adding content after the flag" do
+      invoke! "doc/README", "\nmore content", :after => "__start__"
+      expect(File.read(file)).to eq("__start__\nmore content\nREADME\n__end__\n")
+    end
+
+    it "changes the file adding content before the flag" do
+      invoke! "doc/README", "more content\n", :before => "__end__"
+      expect(File.read(file)).to eq("__start__\nREADME\nmore content\n__end__\n")
+    end
+
+    it "accepts data as a block" do
+      invoke! "doc/README", :before => "__end__" do
+        "more content\n"
+      end
+
+      expect(File.read(file)).to eq("__start__\nREADME\nmore content\n__end__\n")
+    end
+
+    it "logs status" do
+      expect(invoke!("doc/README", "\nmore content", :after => "__start__")).to eq("      insert  doc/README\n")
+    end
+
+    it "does not change the file if pretending" do
+      invoker :pretend => true
+      invoke! "doc/README", "\nmore content", :after => "__start__"
+      expect(File.read(file)).to eq("__start__\nREADME\n__end__\n")
+    end
+
+    it "does not change the file if already include content" do
+      invoke! "doc/README", :before => "__end__" do
+        "more content\n"
+      end
+
+      expect(File.read(file)).to eq("__start__\nREADME\nmore content\n__end__\n")
+
+      invoke! "doc/README", :before => "__end__" do
+        "more content\n"
+      end
+
+      expect(File.read(file)).to eq("__start__\nREADME\nmore content\n__end__\n")
+    end
+
+    it "does change the file if already include content and :force == true" do
+      invoke! "doc/README", :before => "__end__" do
+        "more content\n"
+      end
+
+      expect(File.read(file)).to eq("__start__\nREADME\nmore content\n__end__\n")
+
+      invoke! "doc/README", :before => "__end__", :force => true do
+        "more content\n"
+      end
+
+      expect(File.read(file)).to eq("__start__\nREADME\nmore content\nmore content\n__end__\n")
+    end
+
+  end
+
+  describe "#revoke!" do
+    it "substracts the destination file after injection" do
+      invoke! "doc/README", "\nmore content", :after => "__start__"
+      revoke! "doc/README", "\nmore content", :after => "__start__"
+      expect(File.read(file)).to eq("__start__\nREADME\n__end__\n")
+    end
+
+    it "substracts the destination file before injection" do
+      invoke! "doc/README", "more content\n", :before => "__start__"
+      revoke! "doc/README", "more content\n", :before => "__start__"
+      expect(File.read(file)).to eq("__start__\nREADME\n__end__\n")
+    end
+
+    it "substracts even with double after injection" do
+      invoke! "doc/README", "\nmore content", :after => "__start__"
+      invoke! "doc/README", "\nanother stuff", :after => "__start__"
+      revoke! "doc/README", "\nmore content", :after => "__start__"
+      expect(File.read(file)).to eq("__start__\nanother stuff\nREADME\n__end__\n")
+    end
+
+    it "substracts even with double before injection" do
+      invoke! "doc/README", "more content\n", :before => "__start__"
+      invoke! "doc/README", "another stuff\n", :before => "__start__"
+      revoke! "doc/README", "more content\n", :before => "__start__"
+      expect(File.read(file)).to eq("another stuff\n__start__\nREADME\n__end__\n")
+    end
+
+    it "substracts when prepending" do
+      invoke! "doc/README", "more content\n", :after => /\A/
+      invoke! "doc/README", "another stuff\n", :after => /\A/
+      revoke! "doc/README", "more content\n", :after => /\A/
+      expect(File.read(file)).to eq("another stuff\n__start__\nREADME\n__end__\n")
+    end
+
+    it "substracts when appending" do
+      invoke! "doc/README", "more content\n", :before => /\z/
+      invoke! "doc/README", "another stuff\n", :before => /\z/
+      revoke! "doc/README", "more content\n", :before => /\z/
+      expect(File.read(file)).to eq("__start__\nREADME\n__end__\nanother stuff\n")
+    end
+
+    it "shows progress information to the user" do
+      invoke!("doc/README", "\nmore content", :after => "__start__")
+      expect(revoke!("doc/README", "\nmore content", :after => "__start__")).to eq("    subtract  doc/README\n")
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions_spec.rb
new file mode 100644
index 0000000..fc452c6
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/actions_spec.rb
@@ -0,0 +1,331 @@
+require 'helper'
+
+describe Thor::Actions do
+  def runner(options={})
+    @runner ||= MyCounter.new([1], options, { :destination_root => destination_root })
+  end
+
+  def action(*args, &block)
+    capture(:stdout) { runner.send(*args, &block) }
+  end
+
+  def file
+    File.join(destination_root, "foo")
+  end
+
+  describe "on include" do
+    it "adds runtime options to the base class" do
+      expect(MyCounter.class_options.keys).to include(:pretend)
+      expect(MyCounter.class_options.keys).to include(:force)
+      expect(MyCounter.class_options.keys).to include(:quiet)
+      expect(MyCounter.class_options.keys).to include(:skip)
+    end
+  end
+
+  describe "#initialize" do
+    it "has default behavior invoke" do
+      expect(runner.behavior).to eq(:invoke)
+    end
+
+    it "can have behavior revoke" do
+      expect(MyCounter.new([1], {}, :behavior => :revoke).behavior).to eq(:revoke)
+    end
+
+    it "when behavior is set to force, overwrite options" do
+      runner = MyCounter.new([1], { :force => false, :skip => true }, :behavior => :force)
+      expect(runner.behavior).to eq(:invoke)
+      expect(runner.options.force).to be_true
+      expect(runner.options.skip).not_to be_true
+    end
+
+    it "when behavior is set to skip, overwrite options" do
+      runner = MyCounter.new([1], ["--force"], :behavior => :skip)
+      expect(runner.behavior).to eq(:invoke)
+      expect(runner.options.force).not_to be_true
+      expect(runner.options.skip).to be_true
+    end
+  end
+
+  describe "accessors" do
+    describe "#destination_root=" do
+      it "gets the current directory and expands the path to set the root" do
+        base = MyCounter.new([1])
+        base.destination_root = "here"
+        expect(base.destination_root).to eq(File.expand_path(File.join(File.dirname(__FILE__), "..", "here")))
+      end
+
+      it "does not use the current directory if one is given" do
+        root = File.expand_path("/")
+        base = MyCounter.new([1])
+        base.destination_root = root
+        expect(base.destination_root).to eq(root)
+      end
+
+      it "uses the current directory if none is given" do
+        base = MyCounter.new([1])
+        expect(base.destination_root).to eq(File.expand_path(File.join(File.dirname(__FILE__), "..")))
+      end
+    end
+
+    describe "#relative_to_original_destination_root" do
+      it "returns the path relative to the absolute root" do
+        expect(runner.relative_to_original_destination_root(file)).to eq("foo")
+      end
+
+      it "does not remove dot if required" do
+        expect(runner.relative_to_original_destination_root(file, false)).to eq("./foo")
+      end
+
+      it "always use the absolute root" do
+        runner.inside("foo") do
+          expect(runner.relative_to_original_destination_root(file)).to eq("foo")
+        end
+      end
+
+      it "creates proper relative paths for absolute file location" do
+        expect(runner.relative_to_original_destination_root('/test/file')).to eq("/test/file")
+      end
+
+      it "does not fail with files constaining regexp characters" do
+        runner = MyCounter.new([1], {}, { :destination_root => File.join(destination_root, "fo[o-b]ar") })
+        expect(runner.relative_to_original_destination_root("bar")).to eq("bar")
+      end
+
+      describe "#source_paths_for_search" do
+        it "add source_root to source_paths_for_search" do
+          expect(MyCounter.source_paths_for_search).to include(File.expand_path("fixtures", File.dirname(__FILE__)))
+        end
+
+        it "keeps only current source root in source paths" do
+          expect(ClearCounter.source_paths_for_search).to include(File.expand_path("fixtures/bundle", File.dirname(__FILE__)))
+          expect(ClearCounter.source_paths_for_search).not_to include(File.expand_path("fixtures", File.dirname(__FILE__)))
+        end
+
+        it "customized source paths should be before source roots" do
+          expect(ClearCounter.source_paths_for_search[0]).to eq(File.expand_path("fixtures/doc", File.dirname(__FILE__)))
+          expect(ClearCounter.source_paths_for_search[1]).to eq(File.expand_path("fixtures/bundle", File.dirname(__FILE__)))
+        end
+
+        it "keeps inherited source paths at the end" do
+          expect(ClearCounter.source_paths_for_search.last).to eq(File.expand_path("fixtures/broken", File.dirname(__FILE__)))
+        end
+      end
+    end
+
+    describe "#find_in_source_paths" do
+      it "raises an error if source path is empty" do
+        expect {
+          A.new.find_in_source_paths("foo")
+        }.to raise_error(Thor::Error, /Currently you have no source paths/)
+      end
+
+      it "finds a template inside the source path" do
+        expect(runner.find_in_source_paths("doc")).to eq(File.expand_path("doc", source_root))
+        expect{ runner.find_in_source_paths("README") }.to raise_error
+
+        new_path = File.join(source_root, "doc")
+        runner.instance_variable_set(:@source_paths, nil)
+        runner.source_paths.unshift(new_path)
+        expect(runner.find_in_source_paths("README")).to eq(File.expand_path("README", new_path))
+      end
+    end
+  end
+
+  describe "#inside" do
+    it "executes the block inside the given folder" do
+      runner.inside("foo") do
+        expect(Dir.pwd).to eq(file)
+      end
+    end
+
+    it "changes the base root" do
+      runner.inside("foo") do
+        expect(runner.destination_root).to eq(file)
+      end
+    end
+
+    it "creates the directory if it does not exist" do
+      runner.inside("foo") do
+        expect(File.exists?(file)).to be_true
+      end
+    end
+
+    describe "when pretending" do
+      it "no directories should be created" do
+        runner.inside("bar", :pretend => true) {}
+        expect(File.exists?("bar")).to be_false
+      end
+    end
+
+    describe "when verbose" do
+      it "logs status" do
+        expect(capture(:stdout) {
+          runner.inside("foo", :verbose => true) {}
+        }).to match(/inside  foo/)
+      end
+
+      it "uses padding in next status" do
+        expect(capture(:stdout) {
+          runner.inside("foo", :verbose => true) do
+            runner.say_status :cool, :padding
+          end
+        }).to match(/cool    padding/)
+      end
+
+      it "removes padding after block" do
+        expect(capture(:stdout) {
+          runner.inside("foo", :verbose => true) {}
+          runner.say_status :no, :padding
+        }).to match(/no  padding/)
+      end
+    end
+  end
+
+  describe "#in_root" do
+    it "executes the block in the root folder" do
+      runner.inside("foo") do
+        runner.in_root { expect(Dir.pwd).to eq(destination_root) }
+      end
+    end
+
+    it "changes the base root" do
+      runner.inside("foo") do
+        runner.in_root { expect(runner.destination_root).to eq(destination_root) }
+      end
+    end
+
+    it "returns to the previous state" do
+      runner.inside("foo") do
+        runner.in_root { }
+        expect(runner.destination_root).to eq(file)
+      end
+    end
+  end
+
+  describe "#apply" do
+    before do
+      @template = <<-TEMPLATE
+        @foo = "FOO"
+        say_status :cool, :padding
+      TEMPLATE
+      @template.stub(:read).and_return(@template)
+
+      @file = '/'
+      runner.stub(:open).and_return(@template)
+    end
+
+    it "accepts a URL as the path" do
+      @file = "http://gist.github.com/103208.txt"
+      runner.should_receive(:open).with(@file, "Accept" => "application/x-thor-template").and_return(@template)
+      action(:apply, @file)
+    end
+
+    it "accepts a secure URL as the path" do
+      @file = "https://gist.github.com/103208.txt"
+      runner.should_receive(:open).with(@file, "Accept" => "application/x-thor-template").and_return(@template)
+      action(:apply, @file)
+    end
+
+    it "accepts a local file path with spaces" do
+      @file = File.expand_path("fixtures/path with spaces", File.dirname(__FILE__))
+      runner.should_receive(:open).with(@file).and_return(@template)
+      action(:apply, @file)
+    end
+
+    it "opens a file and executes its content in the instance binding" do
+      action :apply, @file
+      expect(runner.instance_variable_get("@foo")).to eq("FOO")
+    end
+
+    it "applies padding to the content inside the file" do
+      expect(action(:apply, @file)).to match(/cool    padding/)
+    end
+
+    it "logs its status" do
+      expect(action(:apply, @file)).to match(/       apply  #{@file}\n/)
+    end
+
+    it "does not log status" do
+      content = action(:apply, @file, :verbose => false)
+      expect(content).to match(/cool  padding/)
+      expect(content).not_to match(/apply http/)
+    end
+  end
+
+  describe "#run" do
+    before do
+      runner.should_receive(:system).with("ls")
+    end
+
+    it "executes the command given" do
+      action :run, "ls"
+    end
+
+    it "logs status" do
+      expect(action(:run, "ls")).to eq("         run  ls from \".\"\n")
+    end
+
+    it "does not log status if required" do
+      expect(action(:run, "ls", :verbose => false)).to be_empty
+    end
+
+    it "accepts a color as status" do
+      runner.shell.should_receive(:say_status).with(:run, 'ls from "."', :yellow)
+      action :run, "ls", :verbose => :yellow
+    end
+  end
+
+  describe "#run_ruby_script" do
+    before do
+      Thor::Util.stub!(:ruby_command).and_return("/opt/jruby")
+      runner.should_receive(:system).with("/opt/jruby script.rb")
+    end
+
+    it "executes the ruby script" do
+      action :run_ruby_script, "script.rb"
+    end
+
+    it "logs status" do
+      expect(action(:run_ruby_script, "script.rb")).to eq("         run  jruby script.rb from \".\"\n")
+    end
+
+    it "does not log status if required" do
+      expect(action(:run_ruby_script, "script.rb", :verbose => false)).to be_empty
+    end
+  end
+
+  describe "#thor" do
+    it "executes the thor command" do
+      runner.should_receive(:system).with("thor list")
+      action :thor, :list, :verbose => true
+    end
+
+    it "converts extra arguments to command arguments" do
+      runner.should_receive(:system).with("thor list foo bar")
+      action :thor, :list, "foo", "bar"
+    end
+
+    it "converts options hash to switches" do
+      runner.should_receive(:system).with("thor list foo bar --foo")
+      action :thor, :list, "foo", "bar", :foo => true
+
+      runner.should_receive(:system).with("thor list --foo 1 2 3")
+      action :thor, :list, :foo => [1,2,3]
+    end
+
+    it "logs status" do
+      runner.should_receive(:system).with("thor list")
+      expect(action(:thor, :list)).to eq("         run  thor list from \".\"\n")
+    end
+
+    it "does not log status if required" do
+      runner.should_receive(:system).with("thor list --foo 1 2 3")
+      expect(action(:thor, :list, :foo => [1,2,3], :verbose => false)).to be_empty
+    end
+
+    it "captures the output when :capture is given" do
+      runner.should_receive(:`).with("thor foo bar")
+      action(:thor, "foo", "bar", :capture => true)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/base_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/base_spec.rb
new file mode 100644
index 0000000..12143fd
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/base_spec.rb
@@ -0,0 +1,291 @@
+require 'helper'
+require 'thor/base'
+
+class Amazing
+  desc "hello", "say hello"
+  def hello
+    puts "Hello"
+  end
+end
+
+describe Thor::Base do
+  describe "#initialize" do
+    it "sets arguments array" do
+      base = MyCounter.new [1, 2]
+      expect(base.first).to eq(1)
+      expect(base.second).to eq(2)
+    end
+
+    it "sets arguments default values" do
+      base = MyCounter.new [1]
+      expect(base.second).to eq(2)
+    end
+
+    it "sets options default values" do
+      base = MyCounter.new [1, 2]
+      expect(base.options[:third]).to eq(3)
+    end
+
+    it "allows options to be given as symbols or strings" do
+      base = MyCounter.new [1, 2], :third => 4
+      expect(base.options[:third]).to eq(4)
+
+      base = MyCounter.new [1, 2], "third" => 4
+      expect(base.options[:third]).to eq(4)
+    end
+
+    it "creates options with indifferent access" do
+      base = MyCounter.new [1, 2], :third => 3
+      expect(base.options['third']).to eq(3)
+    end
+
+    it "creates options with magic predicates" do
+      base = MyCounter.new [1, 2], :third => 3
+      expect(base.options.third).to eq(3)
+    end
+  end
+
+  describe "#no_commands" do
+    it "avoids methods being added as commands" do
+      expect(MyScript.commands.keys).to include("animal")
+      expect(MyScript.commands.keys).not_to include("this_is_not_a_command")
+    end
+  end
+
+  describe "#argument" do
+    it "sets a value as required and creates an accessor for it" do
+      expect(MyCounter.start(["1", "2", "--third", "3"])[0]).to eq(1)
+      expect(Scripts::MyScript.start(["zoo", "my_special_param", "--param=normal_param"])).to eq("my_special_param")
+    end
+
+    it "does not set a value in the options hash" do
+      expect(BrokenCounter.start(["1", "2", "--third", "3"])[0]).to be_nil
+    end
+  end
+
+  describe "#arguments" do
+    it "returns the arguments for the class" do
+      expect(MyCounter.arguments).to have(2).items
+    end
+  end
+
+  describe ":aliases" do
+    it "supports string aliases without a dash prefix" do
+      expect(MyCounter.start(["1", "2", "-z", "3"])[4]).to eq(3)
+    end
+
+    it "supports symbol aliases" do
+      expect(MyCounter.start(["1", "2", "-y", "3"])[5]).to eq(3)
+      expect(MyCounter.start(["1", "2", "-r", "3"])[5]).to eq(3)
+    end
+  end
+
+  describe "#class_option" do
+    it "sets options class wise" do
+      expect(MyCounter.start(["1", "2", "--third", "3"])[2]).to eq(3)
+    end
+
+    it "does not create an accessor for it" do
+      expect(BrokenCounter.start(["1", "2", "--third", "3"])[3]).to be_false
+    end
+  end
+
+  describe "#class_options" do
+    it "sets default options overwriting superclass definitions" do
+      options = Scripts::MyScript.class_options
+      expect(options[:force]).not_to be_required
+    end
+  end
+
+  describe "#remove_argument" do
+    it "removes previous defined arguments from class" do
+      expect(ClearCounter.arguments).to be_empty
+    end
+
+    it "undefine accessors if required" do
+      expect(ClearCounter.new).not_to respond_to(:first)
+      expect(ClearCounter.new).not_to respond_to(:second)
+    end
+  end
+
+  describe "#remove_class_option" do
+    it "removes previous defined class option" do
+      expect(ClearCounter.class_options[:third]).to be_nil
+    end
+  end
+
+  describe "#class_options_help" do
+    before do
+      @content = capture(:stdout) { MyCounter.help(Thor::Base.shell.new) }
+    end
+
+    it "shows options description" do
+      expect(@content).to match(/# The third argument/)
+    end
+
+    it "shows usage with banner content" do
+      expect(@content).to match(/\[\-\-third=THREE\]/)
+    end
+
+    it "shows default values below description" do
+      expect(@content).to match(/# Default: 3/)
+    end
+
+    it "shows options in different groups" do
+      expect(@content).to match(/Options\:/)
+      expect(@content).to match(/Runtime options\:/)
+      expect(@content).to match(/\-p, \[\-\-pretend\]/)
+    end
+
+    it "use padding in options that does not have aliases" do
+      expect(@content).to match(/^  -t, \[--third/)
+      expect(@content).to match(/^          \[--fourth/)
+    end
+
+    it "allows extra options to be given" do
+      hash = { "Foo" => B.class_options.values }
+
+      content = capture(:stdout) { MyCounter.send(:class_options_help, Thor::Base.shell.new, hash) }
+      expect(content).to match(/Foo options\:/)
+      expect(content).to match(/--last-name=LAST_NAME/)
+    end
+
+    it "displays choices for enums" do
+      content = capture(:stdout) { Enum.help(Thor::Base.shell.new) }
+      expect(content).to match(/Possible values\: apple, banana/)
+    end
+  end
+
+  describe "#namespace" do
+    it "returns the default class namespace" do
+      expect(Scripts::MyScript.namespace).to eq("scripts:my_script")
+    end
+
+    it "sets a namespace to the class" do
+      expect(Scripts::MyDefaults.namespace).to eq("default")
+    end
+  end
+
+  describe "#group" do
+    it "sets a group" do
+      expect(MyScript.group).to eq("script")
+    end
+
+    it "inherits the group from parent" do
+      expect(MyChildScript.group).to eq("script")
+    end
+
+    it "defaults to standard if no group is given" do
+      expect(Amazing.group).to eq("standard")
+    end
+  end
+
+  describe "#subclasses" do
+    it "tracks its subclasses in an Array" do
+      expect(Thor::Base.subclasses).to include(MyScript)
+      expect(Thor::Base.subclasses).to include(MyChildScript)
+      expect(Thor::Base.subclasses).to include(Scripts::MyScript)
+    end
+  end
+
+  describe "#subclass_files" do
+    it "returns tracked subclasses, grouped by the files they come from" do
+      thorfile = File.join(File.dirname(__FILE__), "fixtures", "script.thor")
+      expect(Thor::Base.subclass_files[File.expand_path(thorfile)]).to eq([
+        MyScript, MyScript::AnotherScript, MyChildScript, Barn,
+        PackageNameScript, Scripts::MyScript, Scripts::MyDefaults,
+        Scripts::ChildDefault, Scripts::Arities
+      ])
+    end
+
+    it "tracks a single subclass across multiple files" do
+      thorfile = File.join(File.dirname(__FILE__), "fixtures", "command.thor")
+      expect(Thor::Base.subclass_files[File.expand_path(thorfile)]).to include(Amazing)
+      expect(Thor::Base.subclass_files[File.expand_path(__FILE__)]).to include(Amazing)
+    end
+  end
+
+  describe "#commands" do
+    it "returns a list with all commands defined in this class" do
+      expect(MyChildScript.new).to respond_to("animal")
+      expect(MyChildScript.commands.keys).to include("animal")
+    end
+
+    it "raises an error if a command with reserved word is defined" do
+      expect {
+        klass = Class.new(Thor::Group)
+        klass.class_eval "def shell; end"
+      }.to raise_error(RuntimeError, /"shell" is a Thor reserved word and cannot be defined as command/)
+    end
+  end
+
+  describe "#all_commands" do
+    it "returns a list with all commands defined in this class plus superclasses" do
+      expect(MyChildScript.new).to respond_to("foo")
+      expect(MyChildScript.all_commands.keys).to include("foo")
+    end
+  end
+
+  describe "#remove_command" do
+    it "removes the command from its commands hash" do
+      expect(MyChildScript.commands.keys).not_to include("bar")
+      expect(MyChildScript.commands.keys).not_to include("boom")
+    end
+
+    it "undefines the method if desired" do
+      expect(MyChildScript.new).not_to respond_to("boom")
+    end
+  end
+
+  describe "#from_superclass" do
+    it "does not send a method to the superclass if the superclass does not respond to it" do
+      expect(MyCounter.get_from_super).to eq(13)
+    end
+  end
+
+  describe "#start" do
+    it "raises an error instead of rescueing if THOR_DEBUG=1 is given" do
+      begin
+        ENV["THOR_DEBUG"] = 1
+        expect {
+          MyScript.start ["what", "--debug"]
+        }.to raise_error(Thor::UndefinedcommandError, 'Could not find command "what" in "my_script" namespace.')
+      rescue
+        ENV["THOR_DEBUG"] = nil
+      end
+    end
+
+    it "does not steal args" do
+      args = ["foo", "bar", "--force", "true"]
+      MyScript.start(args)
+      expect(args).to eq(["foo", "bar", "--force", "true"])
+    end
+
+    it "checks unknown options" do
+      expect(capture(:stderr) {
+        MyScript.start(["foo", "bar", "--force", "true", "--unknown", "baz"])
+      }.strip).to eq("Unknown switches '--unknown'")
+    end
+
+    it "checks unknown options except specified" do
+      expect(capture(:stderr) {
+        expect(MyScript.start(["with_optional", "NAME", "--omg", "--invalid"])).to eq(["NAME", {}, ["--omg", "--invalid"]])
+      }.strip).to be_empty
+    end
+  end
+
+  describe "attr_*" do
+    it "does not add attr_reader as a command" do
+      expect(capture(:stderr){ MyScript.start(["another_attribute"]) }).to match(/Could not find/)
+    end
+
+    it "does not add attr_writer as a command" do
+      expect(capture(:stderr){ MyScript.start(["another_attribute=", "foo"]) }).to match(/Could not find/)
+    end
+
+    it "does not add attr_accessor as a command" do
+      expect(capture(:stderr){ MyScript.start(["some_attribute"]) }).to match(/Could not find/)
+      expect(capture(:stderr){ MyScript.start(["some_attribute=", "foo"]) }).to match(/Could not find/)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/command_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/command_spec.rb
new file mode 100644
index 0000000..2f8dac0
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/command_spec.rb
@@ -0,0 +1,80 @@
+require 'helper'
+
+describe Thor::Command do
+  def command(options={})
+    options.each do |key, value|
+      options[key] = Thor::Option.parse(key, value)
+    end
+
+    @command ||= Thor::Command.new(:can_has, "I can has cheezburger", "I can has cheezburger\nLots and lots of it", "can_has", options)
+  end
+
+  describe "#formatted_usage" do
+    it "includes namespace within usage" do
+      object = Struct.new(:namespace, :arguments).new("foo", [])
+      expect(command(:bar => :required).formatted_usage(object)).to eq("foo:can_has --bar=BAR")
+    end
+
+    it "includes subcommand name within subcommand usage" do
+      object = Struct.new(:namespace, :arguments).new("main:foo", [])
+      expect(command(:bar => :required).formatted_usage(object, false, true)).to eq("foo can_has --bar=BAR")
+    end
+
+    it "removes default from namespace" do
+      object = Struct.new(:namespace, :arguments).new("default:foo", [])
+      expect(command(:bar => :required).formatted_usage(object)).to eq(":foo:can_has --bar=BAR")
+    end
+
+    it "injects arguments into usage" do
+      options = {:required => true, :type => :string}
+      object = Struct.new(:namespace, :arguments).new("foo", [Thor::Argument.new(:bar, options)])
+      expect(command(:foo => :required).formatted_usage(object)).to eq("foo:can_has BAR --foo=FOO")
+    end
+  end
+
+  describe "#dynamic" do
+    it "creates a dynamic command with the given name" do
+      expect(Thor::DynamicCommand.new('command').name).to eq('command')
+      expect(Thor::DynamicCommand.new('command').description).to eq('A dynamically-generated command')
+      expect(Thor::DynamicCommand.new('command').usage).to eq('command')
+      expect(Thor::DynamicCommand.new('command').options).to eq({})
+    end
+
+    it "does not invoke an existing method" do
+      mock = mock()
+      mock.class.should_receive(:handle_no_command_error).with("to_s")
+      Thor::DynamicCommand.new('to_s').run(mock)
+    end
+  end
+
+  describe "#dup" do
+    it "dup options hash" do
+      command = Thor::Command.new("can_has", nil, nil, nil, :foo => true, :bar => :required)
+      command.dup.options.delete(:foo)
+      expect(command.options[:foo]).to be
+    end
+  end
+
+  describe "#run" do
+    it "runs a command by calling a method in the given instance" do
+      mock = mock()
+      mock.should_receive(:can_has).and_return {|*args| args }
+      expect(command.run(mock, [1, 2, 3])).to eq([1, 2, 3])
+    end
+
+    it "raises an error if the method to be invoked is private" do
+      klass = Class.new do
+        def self.handle_no_command_error(name)
+          name
+        end
+
+      private
+        def can_has
+          "fail"
+        end
+      end
+
+      expect(command.run(klass.new)).to eq("can_has")
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/core_ext/hash_with_indifferent_access_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/core_ext/hash_with_indifferent_access_spec.rb
new file mode 100644
index 0000000..5d66951
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/core_ext/hash_with_indifferent_access_spec.rb
@@ -0,0 +1,48 @@
+require 'helper'
+require 'thor/core_ext/hash_with_indifferent_access'
+
+describe Thor::CoreExt::HashWithIndifferentAccess do
+  before do
+    @hash = Thor::CoreExt::HashWithIndifferentAccess.new :foo => 'bar', 'baz' => 'bee', :force => true
+  end
+
+  it "has values accessible by either strings or symbols" do
+    expect(@hash['foo']).to eq('bar')
+    expect(@hash[:foo]).to eq('bar')
+
+    expect(@hash.values_at(:foo, :baz)).to eq(['bar', 'bee'])
+    expect(@hash.delete(:foo)).to eq('bar')
+  end
+
+  it "handles magic boolean predicates" do
+    expect(@hash.force?).to be_true
+    expect(@hash.foo?).to be_true
+    expect(@hash.nothing?).to be_false
+  end
+
+  it "handles magic comparisions" do
+    expect(@hash.foo?('bar')).to be_true
+    expect(@hash.foo?('bee')).to be_false
+  end
+
+  it "maps methods to keys" do
+    expect(@hash.foo).to eq(@hash['foo'])
+  end
+
+  it "merges keys independent if they are symbols or strings" do
+    @hash.merge!('force' => false, :baz => "boom")
+    expect(@hash[:force]).to eq(false)
+    expect(@hash[:baz]).to eq("boom")
+  end
+
+  it "creates a new hash by merging keys independent if they are symbols or strings" do
+    other = @hash.merge('force' => false, :baz => "boom")
+    expect(other[:force]).to eq(false)
+    expect(other[:baz]).to eq("boom")
+  end
+
+  it "converts to a traditional hash" do
+    expect(@hash.to_hash.class).to eq(Hash)
+    expect(@hash).to eq({ 'foo' => 'bar', 'baz' => 'bee', 'force' => true })
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/core_ext/ordered_hash_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/core_ext/ordered_hash_spec.rb
new file mode 100644
index 0000000..aba5226
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/core_ext/ordered_hash_spec.rb
@@ -0,0 +1,115 @@
+require 'helper'
+require 'thor/core_ext/ordered_hash'
+
+describe Thor::CoreExt::OrderedHash do
+  before do
+    @hash = Thor::CoreExt::OrderedHash.new
+  end
+
+  describe "without any items" do
+    it "returns nil for an undefined key" do
+      expect(@hash["foo"]).to be_nil
+    end
+
+    it "doesn't iterate through any items" do
+      @hash.each { fail }
+    end
+
+    it "has an empty key and values list" do
+      expect(@hash.keys).to be_empty
+      expect(@hash.values).to be_empty
+    end
+
+    it "must be empty" do
+      expect(@hash).to be_empty
+    end
+  end
+
+  describe "with several items" do
+    before do
+      @hash[:foo] = "Foo!"
+      @hash[:bar] = "Bar!"
+      @hash[:baz] = "Baz!"
+      @hash[:bop] = "Bop!"
+      @hash[:bat] = "Bat!"
+    end
+
+    it "returns nil for an undefined key" do
+      expect(@hash[:boom]).to be_nil
+    end
+
+    it "returns the value for each key" do
+      expect(@hash[:foo]).to eq("Foo!")
+      expect(@hash[:bar]).to eq("Bar!")
+      expect(@hash[:baz]).to eq("Baz!")
+      expect(@hash[:bop]).to eq("Bop!")
+      expect(@hash[:bat]).to eq("Bat!")
+    end
+
+    it "iterates through the keys and values in order of assignment" do
+      arr = []
+      @hash.each do |key, value|
+        arr << [key, value]
+      end
+      expect(arr).to eq([[:foo, "Foo!"], [:bar, "Bar!"], [:baz, "Baz!"],
+                     [:bop, "Bop!"], [:bat, "Bat!"]])
+    end
+
+    it "returns the keys in order of insertion" do
+      expect(@hash.keys).to eq([:foo, :bar, :baz, :bop, :bat])
+    end
+
+    it "returns the values in order of insertion" do
+      expect(@hash.values).to eq(["Foo!", "Bar!", "Baz!", "Bop!", "Bat!"])
+    end
+
+    it "does not move an overwritten node to the end of the ordering" do
+      @hash[:baz] = "Bip!"
+      expect(@hash.values).to eq(["Foo!", "Bar!", "Bip!", "Bop!", "Bat!"])
+
+      @hash[:foo] = "Bip!"
+      expect(@hash.values).to eq(["Bip!", "Bar!", "Bip!", "Bop!", "Bat!"])
+
+      @hash[:bat] = "Bip!"
+      expect(@hash.values).to eq(["Bip!", "Bar!", "Bip!", "Bop!", "Bip!"])
+    end
+
+    it "appends another ordered hash while preserving ordering" do
+      other_hash = Thor::CoreExt::OrderedHash.new
+      other_hash[1] = "one"
+      other_hash[2] = "two"
+      other_hash[3] = "three"
+      expect(@hash.merge(other_hash).values).to eq(["Foo!", "Bar!", "Baz!", "Bop!", "Bat!", "one", "two", "three"])
+    end
+
+    it "overwrites hash keys with matching appended keys" do
+      other_hash = Thor::CoreExt::OrderedHash.new
+      other_hash[:bar] = "bar"
+      expect(@hash.merge(other_hash)[:bar]).to eq("bar")
+      expect(@hash[:bar]).to eq("Bar!")
+    end
+
+    it "converts to an array" do
+      expect(@hash.to_a).to eq([[:foo, "Foo!"], [:bar, "Bar!"], [:baz, "Baz!"], [:bop, "Bop!"], [:bat, "Bat!"]])
+    end
+
+    it "must not be empty" do
+      expect(@hash).not_to be_empty
+    end
+
+    it "deletes values from hash" do
+      expect(@hash.delete(:baz)).to eq("Baz!")
+      expect(@hash.values).to eq(["Foo!", "Bar!", "Bop!", "Bat!"])
+
+      expect(@hash.delete(:foo)).to eq("Foo!")
+      expect(@hash.values).to eq(["Bar!", "Bop!", "Bat!"])
+
+      expect(@hash.delete(:bat)).to eq("Bat!")
+      expect(@hash.values).to eq(["Bar!", "Bop!"])
+    end
+
+    it "returns nil if the value to be deleted can't be found" do
+      expect(@hash.delete(:nothing)).to be_nil
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/exit_condition_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/exit_condition_spec.rb
new file mode 100644
index 0000000..a7571ce
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/exit_condition_spec.rb
@@ -0,0 +1,19 @@
+require 'helper'
+require 'thor/base'
+
+describe "Exit conditions" do
+  it "exits 0, not bubble up EPIPE, if EPIPE is raised" do
+    epiped = false
+
+    command = Class.new(Thor) do
+      desc "my_action", "testing EPIPE"
+      define_method :my_action do
+        epiped = true
+        raise Errno::EPIPE
+      end
+    end
+
+    expect{ command.start(["my_action"]) }.to raise_error(SystemExit)
+    expect(epiped).to eq(true)
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/application.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/application.rb
new file mode 100644
index 0000000..50d2fae
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/application.rb
@@ -0,0 +1,2 @@
+class Application < Base
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/app{1}/README b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/app{1}/README
new file mode 100644
index 0000000..16374df
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/app{1}/README
@@ -0,0 +1,3 @@
+__start__
+README
+__end__
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/bundle/execute.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/bundle/execute.rb
new file mode 100644
index 0000000..0530d87
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/bundle/execute.rb
@@ -0,0 +1,6 @@
+class Execute < Thor
+  desc "ls", "Execute ls"
+  def ls
+    system "ls"
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/bundle/main.thor b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/bundle/main.thor
new file mode 100644
index 0000000..38bdfbc
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/bundle/main.thor
@@ -0,0 +1 @@
+require File.join(File.dirname(__FILE__), 'execute')
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/command.thor b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/command.thor
new file mode 100644
index 0000000..26a0268
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/command.thor
@@ -0,0 +1,10 @@
+# module: random
+
+class Amazing < Thor
+  desc "describe NAME", "say that someone is amazing"
+  method_options :forcefully => :boolean
+  def describe(name, opts)
+    ret = "#{name} is amazing"
+    puts opts["forcefully"] ? ret.upcase : ret
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/%file_name%.rb.tt b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/%file_name%.rb.tt
new file mode 100644
index 0000000..4c4c6c0
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/%file_name%.rb.tt
@@ -0,0 +1 @@
+FOO = <%= "FOO" %>
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/COMMENTER b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/COMMENTER
new file mode 100644
index 0000000..384cb3a
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/COMMENTER
@@ -0,0 +1,11 @@
+__start__
+ # greenblue
+#
+# yellowblue
+#yellowred
+ #greenred
+orange
+    purple
+  ind#igo
+  # ind#igo
+__end__
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/README b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/README
new file mode 100644
index 0000000..16374df
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/README
@@ -0,0 +1,3 @@
+__start__
+README
+__end__
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/block_helper.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/block_helper.rb
new file mode 100644
index 0000000..df59211
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/block_helper.rb
@@ -0,0 +1,3 @@
+<% world do -%>
+Hello
+<% end -%>
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/config.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/config.rb
new file mode 100644
index 0000000..6211739
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/config.rb
@@ -0,0 +1 @@
+class <%= @klass %>; end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/config.yaml.tt b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/config.yaml.tt
new file mode 100644
index 0000000..e75615c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/config.yaml.tt
@@ -0,0 +1 @@
+--- Hi from yaml
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/excluding/%file_name%.rb.tt b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/excluding/%file_name%.rb.tt
new file mode 100644
index 0000000..6296c46
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/doc/excluding/%file_name%.rb.tt
@@ -0,0 +1 @@
+BAR = <%= "BAR" %>
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/enum.thor b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/enum.thor
new file mode 100644
index 0000000..b5a7ded
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/enum.thor
@@ -0,0 +1,10 @@
+class Enum < Thor::Group
+  include Thor::Actions
+
+  desc "snack"
+  class_option "fruit", :aliases => "-f", :type => :string, :enum => %w(apple banana)
+  def snack
+    puts options['fruit']
+  end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/group.thor b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/group.thor
new file mode 100644
index 0000000..bc7e102
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/group.thor
@@ -0,0 +1,128 @@
+class MyCounter < Thor::Group
+  include Thor::Actions
+  add_runtime_options!
+
+  def self.get_from_super
+    from_superclass(:get_from_super, 13)
+  end
+
+  source_root File.expand_path(File.dirname(__FILE__))
+  source_paths << File.expand_path("broken", File.dirname(__FILE__))
+
+  argument :first,       :type => :numeric
+  argument :second,      :type => :numeric, :default => 2
+
+  class_option :third,    :type => :numeric, :desc => "The third argument", :default => 3,
+                          :banner => "THREE", :aliases => "-t"
+  class_option :fourth,   :type => :numeric, :desc => "The fourth argument"
+  class_option :simple,   :type => :numeric, :aliases => 'z'
+  class_option :symbolic, :type => :numeric, :aliases => [:y, :r]
+
+  desc <<-FOO
+Description:
+  This generator runs three commands: one, two and three.
+FOO
+
+  def one
+    first
+  end
+
+  def two
+    second
+  end
+
+  def three
+    options[:third]
+  end
+
+  def four
+    options[:fourth]
+  end
+
+  def five
+    options[:simple]
+  end
+
+  def six
+    options[:symbolic]
+  end
+
+  def self.inherited(base)
+    super
+    base.source_paths.unshift(File.expand_path(File.join(File.dirname(__FILE__), "doc")))
+  end
+
+  no_commands do
+    def world(&block)
+      result = capture(&block)
+      concat(result.strip + " world!")
+    end
+  end
+end
+
+class ClearCounter < MyCounter
+  remove_argument :first, :second, :undefine => true
+  remove_class_option :third
+
+  def self.source_root
+    File.expand_path(File.join(File.dirname(__FILE__), "bundle"))
+  end
+end
+
+class BrokenCounter < MyCounter
+  namespace "app:broken:counter"
+  class_option :fail, :type => :boolean, :default => false
+
+  class << self
+    undef_method :source_root
+  end
+
+  def one
+    options[:first]
+  end
+
+  def four
+    respond_to?(:fail)
+  end
+
+  def five
+    options[:fail] ? this_method_does_not_exist : 5
+  end
+end
+
+class WhinyGenerator < Thor::Group
+  include Thor::Actions
+
+  def self.source_root
+    File.expand_path(File.dirname(__FILE__))
+  end
+
+  def wrong_arity(required)
+  end
+end
+
+class CommandConflict < Thor::Group
+  desc "A group with the same name as a default command"
+  def group
+    puts "group"
+  end
+end
+
+class ParentGroup < Thor::Group
+private
+  def foo
+    "foo"
+  end
+
+  def baz(name = 'baz')
+    name
+  end
+end
+
+class ChildGroup < ParentGroup
+  def bar
+    "bar"
+  end
+
+  public_command :foo, :baz
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/invoke.thor b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/invoke.thor
new file mode 100644
index 0000000..75bd51b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/invoke.thor
@@ -0,0 +1,112 @@
+class A < Thor
+  include Thor::Actions
+
+  desc "one", "invoke one"
+  def one
+    p 1
+    invoke :two
+    invoke :three
+  end
+
+  desc "two", "invoke two"
+  def two
+    p 2
+    invoke :three
+  end
+
+  desc "three", "invoke three"
+  def three
+    p 3
+  end
+
+  desc "four", "invoke four"
+  def four
+    p 4
+    invoke "defined:five"
+  end
+
+  desc "five N", "check if number is equal 5"
+  def five(number)
+    number == 5
+  end
+
+  desc "invoker", "invoke a b command"
+  def invoker(*args)
+    invoke :b, :one, ["Jose"]
+  end
+end
+
+class B < Thor
+  class_option :last_name, :type => :string
+
+  desc "one FIRST_NAME", "invoke one"
+  def one(first_name)
+    "#{options.last_name}, #{first_name}"
+  end
+
+  desc "two", "invoke two"
+  def two
+    options
+  end
+
+  desc "three", "invoke three"
+  def three
+    self
+  end
+end
+
+class C < Thor::Group
+  include Thor::Actions
+
+  def one
+    p 1
+  end
+
+  def two
+    p 2
+  end
+
+  def three
+    p 3
+  end
+end
+
+class Defined < Thor::Group
+  class_option :unused, :type => :boolean, :desc => "This option has no use"
+
+  def one
+    p 1
+    invoke "a:two"
+    invoke "a:three"
+    invoke "a:four"
+    invoke "defined:five"
+  end
+
+  def five
+    p 5
+  end
+
+  def print_status
+    say_status :finished, :counting
+  end
+end
+
+class E < Thor::Group
+  invoke Defined
+end
+
+class F < Thor::Group
+  invoke "b:one" do |instance, klass, command|
+    instance.invoke klass, command, [ "Jose" ], :last_name => "Valim"
+  end
+end
+
+class G < Thor::Group
+  class_option :invoked, :type => :string, :default => "defined"
+  invoke_from_option :invoked
+end
+
+class H < Thor::Group
+  class_option :defined, :type => :boolean, :default => true
+  invoke_from_option :defined
+end
diff --git a/vendor/json_pure-1.7.7/diagrams/.keep b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/path with spaces
similarity index 100%
rename from vendor/json_pure-1.7.7/diagrams/.keep
rename to .bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/path with spaces
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/preserve/script.sh b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/preserve/script.sh
new file mode 100755
index 0000000..c52d3c2
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/preserve/script.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+exit 0
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/script.thor b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/script.thor
new file mode 100644
index 0000000..3875133
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/script.thor
@@ -0,0 +1,220 @@
+class MyScript < Thor
+  check_unknown_options! :except => :with_optional
+
+  attr_accessor :some_attribute
+  attr_writer :another_attribute
+  attr_reader :another_attribute
+
+  private
+  attr_reader :private_attribute
+
+  public
+  group :script
+  default_command :example_default_command
+
+  map "-T" => :animal, ["-f", "--foo"] => :foo
+
+  map "animal_prison" => "zoo"
+
+  desc "zoo", "zoo around"
+  def zoo
+    true
+  end
+
+  desc "animal TYPE", "horse around"
+
+  no_commands do
+    def this_is_not_a_command
+    end
+  end
+
+  def animal(type)
+    [type]
+  end
+
+  map "hid" => "hidden"
+
+  desc "hidden TYPE", "this is hidden", :hide => true
+  def hidden(type)
+    [type]
+  end
+
+  map "fu" => "zoo"
+
+  desc "foo BAR", <<END
+do some fooing
+  This is more info!
+  Everyone likes more info!
+END
+  method_option :force, :type => :boolean, :desc => "Force to do some fooing"
+  def foo(bar)
+    [bar, options]
+  end
+
+  desc "example_default_command", "example!"
+  method_options :with => :string
+  def example_default_command
+    options.empty? ? "default command" : options
+  end
+
+  desc "call_myself_with_wrong_arity", "get the right error"
+  def call_myself_with_wrong_arity
+    call_myself_with_wrong_arity(4)
+  end
+
+  desc "call_unexistent_method", "Call unexistent method inside a command"
+  def call_unexistent_method
+    boom!
+  end
+
+  desc "long_description", "a" * 80
+  long_desc <<-D
+    This is a really really really long description.
+    Here you go. So very long.
+
+    It even has two paragraphs.
+  D
+  def long_description
+  end
+
+  desc "name-with-dashes", "Ensure normalization of command names"
+  def name_with_dashes
+  end
+
+  method_options :all => :boolean
+  method_option :lazy, :lazy_default => "yes"
+  method_option :lazy_numeric, :type => :numeric, :lazy_default => 42
+  method_option :lazy_array,   :type => :array,   :lazy_default => %w[eat at joes]
+  method_option :lazy_hash,    :type => :hash,    :lazy_default => {'swedish' => 'meatballs'}
+  desc "with_optional NAME", "invoke with optional name"
+  def with_optional(name=nil, *args)
+    [ name, options, args ]
+  end
+
+  class AnotherScript < Thor
+    desc "baz", "do some bazing"
+    def baz
+    end
+  end
+
+  desc "send", "send as a command name"
+  def send
+    true
+  end
+
+  private
+
+    def method_missing(meth, *args)
+      if meth == :boom!
+        super
+      else
+        [meth, args]
+      end
+    end
+
+    desc "what", "what"
+    def what
+    end
+end
+
+class MyChildScript < MyScript
+  remove_command :bar
+
+  method_options :force => :boolean, :param => :numeric
+  def initialize(*args)
+    super
+  end
+
+  desc "zoo", "zoo around"
+  method_options :param => :required
+  def zoo
+    options
+  end
+
+  desc "animal TYPE", "horse around"
+  def animal(type)
+    [type, options]
+  end
+  method_option :other, :type => :string, :default => "method default", :for => :animal
+  desc "animal KIND", "fish around", :for => :animal
+
+  desc "boom", "explodes everything"
+  def boom
+  end
+
+  remove_command :boom, :undefine => true
+end
+
+class Barn < Thor
+  desc "open [ITEM]", "open the barn door"
+  def open(item = nil)
+    if item == "shotgun"
+      puts "That's going to leave a mark."
+    else
+      puts "Open sesame!"
+    end
+  end
+
+  desc "paint [COLOR]", "paint the barn"
+  method_option :coats, :type => :numeric, :default => 2, :desc => 'how many coats of paint'
+  def paint(color='red')
+    puts "#{options[:coats]} coats of #{color} paint"
+  end
+end
+
+class PackageNameScript < Thor
+  package_name "Baboon"
+end
+
+module Scripts
+  class MyScript < MyChildScript
+    argument :accessor, :type => :string
+    class_options :force => :boolean
+    method_option :new_option, :type => :string, :for => :example_default_command
+
+    def zoo
+      self.accessor
+    end
+  end
+
+  class MyDefaults < Thor
+    check_unknown_options!
+
+    namespace :default
+    desc "cow", "prints 'moo'"
+    def cow
+      puts "moo"
+    end
+
+    desc "command_conflict", "only gets called when prepended with a colon"
+    def command_conflict
+      puts "command"
+    end
+
+    desc "barn", "commands to manage the barn"
+    subcommand "barn", Barn
+  end
+
+  class ChildDefault < Thor
+    namespace "default:child"
+  end
+
+  class Arities < Thor
+    desc "zero_args", "takes zero args"
+    def zero_args
+    end
+
+    desc "one_arg ARG", "takes one arg"
+    def one_arg(arg)
+    end
+
+    desc "two_args ARG1 ARG2", "takes two args"
+    def two_args(arg1, arg2)
+    end
+
+    desc "optional_arg [ARG]", "takes an optional arg"
+    def optional_arg(arg='default')
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/subcommand.thor b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/subcommand.thor
new file mode 100644
index 0000000..35d0b57
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/fixtures/subcommand.thor
@@ -0,0 +1,17 @@
+module TestSubcommands
+
+  class Subcommand < Thor
+    desc "print_opt", "My method"
+    def print_opt
+      print options["opt"]
+    end
+  end
+
+  class Parent < Thor
+    class_option "opt"
+
+    desc "sub", "My subcommand"
+    subcommand "sub", Subcommand
+  end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/group_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/group_spec.rb
new file mode 100644
index 0000000..0fc88fe
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/group_spec.rb
@@ -0,0 +1,216 @@
+require 'helper'
+
+describe Thor::Group do
+  describe "command" do
+    it "allows to use private methods from parent class as commands" do
+      expect(ChildGroup.start).to eq(["bar", "foo", "baz"])
+      expect(ChildGroup.new.baz("bar")).to eq("bar")
+    end
+  end
+
+  describe "#start" do
+    it "invokes all the commands under the Thor group" do
+      expect(MyCounter.start(["1", "2", "--third", "3"])).to eq([ 1, 2, 3, nil, nil, nil ])
+    end
+
+    it "uses argument default value" do
+      expect(MyCounter.start(["1", "--third", "3"])).to eq([ 1, 2, 3, nil, nil, nil ])
+    end
+
+    it "invokes all the commands in the Thor group and its parents" do
+      expect(BrokenCounter.start(["1", "2", "--third", "3"])).to eq([ nil, 2, 3, false, 5, nil ])
+    end
+
+    it "raises an error if a required argument is added after a non-required" do
+      expect {
+        MyCounter.argument(:foo, :type => :string)
+      }.to raise_error(ArgumentError, 'You cannot have "foo" as required argument after the non-required argument "second".')
+    end
+
+    it "raises when an exception happens within the command call" do
+      expect{ BrokenCounter.start(["1", "2", "--fail"]) }.to raise_error
+    end
+
+    it "raises an error when a Thor group command expects arguments" do
+      expect{ WhinyGenerator.start }.to raise_error(ArgumentError, /thor wrong_arity takes 1 argument, but it should not/)
+    end
+
+    it "invokes help message if any of the shortcuts is given" do
+      MyCounter.should_receive(:help)
+      MyCounter.start(["-h"])
+    end
+  end
+
+  describe "#desc" do
+    it "sets the description for a given class" do
+      expect(MyCounter.desc).to eq("Description:\n  This generator runs three commands: one, two and three.\n")
+    end
+
+    it "can be inherited" do
+      expect(BrokenCounter.desc).to eq("Description:\n  This generator runs three commands: one, two and three.\n")
+    end
+
+    it "can be nil" do
+      expect(WhinyGenerator.desc).to be_nil
+    end
+  end
+
+  describe "#help" do
+    before do
+      @content = capture(:stdout) { MyCounter.help(Thor::Base.shell.new) }
+    end
+
+    it "provides usage information" do
+      expect(@content).to match(/my_counter N \[N\]/)
+    end
+
+    it "shows description" do
+      expect(@content).to match(/Description:/)
+      expect(@content).to match(/This generator runs three commands: one, two and three./)
+    end
+
+    it "shows options information" do
+      expect(@content).to match(/Options/)
+      expect(@content).to match(/\[\-\-third=THREE\]/)
+    end
+  end
+
+  describe "#invoke" do
+    before do
+      @content = capture(:stdout) { E.start }
+    end
+
+    it "allows to invoke a class from the class binding" do
+      expect(@content).to match(/1\n2\n3\n4\n5\n/)
+    end
+
+    it "shows invocation information to the user" do
+      expect(@content).to match(/invoke  Defined/)
+    end
+
+    it "uses padding on status generated by the invoked class" do
+      expect(@content).to match(/finished    counting/)
+    end
+
+    it "allows invocation to be configured with blocks" do
+      capture(:stdout) do
+        expect(F.start).to eq(["Valim, Jose"])
+      end
+    end
+
+    it "shows invoked options on help" do
+      content = capture(:stdout) { E.help(Thor::Base.shell.new) }
+      expect(content).to match(/Defined options:/)
+      expect(content).to match(/\[--unused\]/)
+      expect(content).to match(/# This option has no use/)
+    end
+  end
+
+  describe "#invoke_from_option" do
+    describe "with default type" do
+      before do
+        @content = capture(:stdout) { G.start }
+      end
+
+      it "allows to invoke a class from the class binding by a default option" do
+        expect(@content).to match(/1\n2\n3\n4\n5\n/)
+      end
+
+      it "does not invoke if the option is nil" do
+        expect(capture(:stdout) { G.start(["--skip-invoked"]) }).not_to match(/invoke/)
+      end
+
+      it "prints a message if invocation cannot be found" do
+        content = capture(:stdout) { G.start(["--invoked", "unknown"]) }
+        expect(content).to match(/error  unknown \[not found\]/)
+      end
+
+      it "allows to invoke a class from the class binding by the given option" do
+        content = capture(:stdout) { G.start(["--invoked", "e"]) }
+        expect(content).to match(/invoke  e/)
+      end
+
+      it "shows invocation information to the user" do
+        expect(@content).to match(/invoke  defined/)
+      end
+
+      it "uses padding on status generated by the invoked class" do
+        expect(@content).to match(/finished    counting/)
+      end
+
+      it "shows invoked options on help" do
+        content = capture(:stdout) { G.help(Thor::Base.shell.new) }
+        expect(content).to match(/defined options:/)
+        expect(content).to match(/\[--unused\]/)
+        expect(content).to match(/# This option has no use/)
+      end
+    end
+
+    describe "with boolean type" do
+      before do
+        @content = capture(:stdout) { H.start }
+      end
+
+      it "allows to invoke a class from the class binding by a default option" do
+        expect(@content).to match(/1\n2\n3\n4\n5\n/)
+      end
+
+      it "does not invoke if the option is false" do
+        expect(capture(:stdout) { H.start(["--no-defined"]) }).not_to match(/invoke/)
+      end
+
+      it "shows invocation information to the user" do
+        expect(@content).to match(/invoke  defined/)
+      end
+
+      it "uses padding on status generated by the invoked class" do
+        expect(@content).to match(/finished    counting/)
+      end
+
+      it "shows invoked options on help" do
+        content = capture(:stdout) { H.help(Thor::Base.shell.new) }
+        expect(content).to match(/defined options:/)
+        expect(content).to match(/\[--unused\]/)
+        expect(content).to match(/# This option has no use/)
+      end
+    end
+  end
+
+  describe "edge-cases" do
+    it "can handle boolean options followed by arguments" do
+      klass = Class.new(Thor::Group) do
+        desc "say hi to name"
+        argument :name, :type => :string
+        class_option :loud, :type => :boolean
+
+        def hi
+          name.upcase! if options[:loud]
+          "Hi #{name}"
+        end
+      end
+
+      expect(klass.start(["jose"])).to eq(["Hi jose"])
+      expect(klass.start(["jose", "--loud"])).to eq(["Hi JOSE"])
+      expect(klass.start(["--loud", "jose"])).to eq(["Hi JOSE"])
+    end
+
+    it "provides extra args as `args`" do
+      klass = Class.new(Thor::Group) do
+        desc "say hi to name"
+        argument :name, :type => :string
+        class_option :loud, :type => :boolean
+
+        def hi
+          name.upcase! if options[:loud]
+          out = "Hi #{name}"
+          out << ": " << args.join(", ") unless args.empty?
+          out
+        end
+      end
+
+      expect(klass.start(["jose"])).to eq(["Hi jose"])
+      expect(klass.start(["jose", "--loud"])).to eq(["Hi JOSE"])
+      expect(klass.start(["--loud", "jose"])).to eq(["Hi JOSE"])
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/helper.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/helper.rb
new file mode 100644
index 0000000..6372759
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/helper.rb
@@ -0,0 +1,67 @@
+$TESTING=true
+
+require 'simplecov'
+require 'coveralls'
+
+SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
+  SimpleCov::Formatter::HTMLFormatter,
+  Coveralls::SimpleCov::Formatter
+]
+SimpleCov.start
+
+$:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
+require 'thor'
+require 'thor/group'
+require 'stringio'
+
+require 'rdoc'
+require 'rspec'
+require 'diff/lcs' # You need diff/lcs installed to run specs (but not to run Thor).
+require 'fakeweb'  # You need fakeweb installed to run specs (but not to run Thor).
+
+# Set shell to basic
+$0 = "thor"
+$thor_runner = true
+ARGV.clear
+Thor::Base.shell = Thor::Shell::Basic
+
+# Load fixtures
+load File.join(File.dirname(__FILE__), "fixtures", "enum.thor")
+load File.join(File.dirname(__FILE__), "fixtures", "group.thor")
+load File.join(File.dirname(__FILE__), "fixtures", "invoke.thor")
+load File.join(File.dirname(__FILE__), "fixtures", "script.thor")
+load File.join(File.dirname(__FILE__), "fixtures", "subcommand.thor")
+load File.join(File.dirname(__FILE__), "fixtures", "command.thor")
+
+RSpec.configure do |config|
+  config.before do
+    ARGV.replace []
+  end
+
+  config.expect_with :rspec do |c|
+    c.syntax = :expect
+  end
+
+  def capture(stream)
+    begin
+      stream = stream.to_s
+      eval "$#{stream} = StringIO.new"
+      yield
+      result = eval("$#{stream}").string
+    ensure
+      eval("$#{stream} = #{stream.upcase}")
+    end
+
+    result
+  end
+
+  def source_root
+    File.join(File.dirname(__FILE__), 'fixtures')
+  end
+
+  def destination_root
+    File.join(File.dirname(__FILE__), 'sandbox')
+  end
+
+  alias :silence :capture
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/invocation_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/invocation_spec.rb
new file mode 100644
index 0000000..2c0db51
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/invocation_spec.rb
@@ -0,0 +1,100 @@
+require 'helper'
+require 'thor/base'
+
+describe Thor::Invocation do
+  describe "#invoke" do
+    it "invokes a command inside another command" do
+      expect(capture(:stdout) { A.new.invoke(:two) }).to eq("2\n3\n")
+    end
+
+    it "invokes a command just once" do
+      expect(capture(:stdout) { A.new.invoke(:one) }).to eq("1\n2\n3\n")
+    end
+
+    it "invokes a command just once even if they belongs to different classes" do
+      expect(capture(:stdout) { Defined.new.invoke(:one) }).to eq("1\n2\n3\n4\n5\n")
+    end
+
+    it "invokes a command with arguments" do
+      expect(A.new.invoke(:five, [5])).to be_true
+      expect(A.new.invoke(:five, [7])).to be_false
+    end
+
+    it "invokes the default command if none is given to a Thor class" do
+      content = capture(:stdout) { A.new.invoke("b") }
+      expect(content).to match(/Commands/)
+      expect(content).to match(/LAST_NAME/)
+    end
+
+    it "accepts a class as argument without a command to invoke" do
+      content = capture(:stdout) { A.new.invoke(B) }
+      expect(content).to match(/Commands/)
+      expect(content).to match(/LAST_NAME/)
+    end
+
+    it "accepts a class as argument with a command to invoke" do
+      base = A.new([], :last_name => "Valim")
+      expect(base.invoke(B, :one, ["Jose"])).to eq("Valim, Jose")
+    end
+
+    it "allows customized options to be given" do
+      base = A.new([], :last_name => "Wrong")
+      expect(base.invoke(B, :one, ["Jose"], :last_name => "Valim")).to eq("Valim, Jose")
+    end
+
+    it "reparses options in the new class" do
+      expect(A.start(["invoker", "--last-name", "Valim"])).to eq("Valim, Jose")
+    end
+
+    it "shares initialize options with invoked class" do
+      expect(A.new([], :foo => :bar).invoke("b:two")).to eq({ "foo" => :bar })
+    end
+
+    it "dump configuration values to be used in the invoked class" do
+      base = A.new
+      expect(base.invoke("b:three").shell).to eq(base.shell)
+    end
+
+    it "allow extra configuration values to be given" do
+      base, shell = A.new, Thor::Base.shell.new
+      expect(base.invoke("b:three", [], {}, :shell => shell).shell).to eq(shell)
+    end
+
+    it "invokes a Thor::Group and all of its commands" do
+      expect(capture(:stdout) { A.new.invoke(:c) }).to eq("1\n2\n3\n")
+    end
+
+    it "does not invoke a Thor::Group twice" do
+      base = A.new
+      silence(:stdout){ base.invoke(:c) }
+      expect(capture(:stdout) { base.invoke(:c) }).to be_empty
+    end
+
+    it "does not invoke any of Thor::Group commands twice" do
+      base = A.new
+      silence(:stdout){ base.invoke(:c) }
+      expect(capture(:stdout) { base.invoke("c:one") }).to be_empty
+    end
+
+    it "raises Thor::UndefinedcommandError if the command can't be found" do
+      expect {
+        A.new.invoke("foo:bar")
+      }.to raise_error(Thor::UndefinedCommandError)
+    end
+
+    it "raises Thor::UndefinedcommandError if the command can't be found even if all commands were already executed" do
+      base = C.new
+      silence(:stdout){ base.invoke_all }
+
+      expect {
+        base.invoke("foo:bar")
+      }.to raise_error(Thor::UndefinedCommandError)
+    end
+
+    it "raises an error if a non Thor class is given" do
+      expect {
+        A.new.invoke(Object)
+      }.to raise_error(RuntimeError, "Expected Thor class, got Object")
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/parser/argument_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/parser/argument_spec.rb
new file mode 100644
index 0000000..6c6b0e8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/parser/argument_spec.rb
@@ -0,0 +1,53 @@
+require 'helper'
+require 'thor/parser'
+
+describe Thor::Argument do
+
+  def argument(name, options={})
+    @argument ||= Thor::Argument.new(name, options)
+  end
+
+  describe "errors" do
+    it "raises an error if name is not supplied" do
+      expect {
+        argument(nil)
+      }.to raise_error(ArgumentError, "Argument name can't be nil.")
+    end
+
+    it "raises an error if type is unknown" do
+      expect {
+        argument(:command, :type => :unknown)
+      }.to raise_error(ArgumentError, "Type :unknown is not valid for arguments.")
+    end
+
+    it "raises an error if argument is required and have default values" do
+      expect {
+        argument(:command, :type => :string, :default => "bar", :required => true)
+      }.to raise_error(ArgumentError, "An argument cannot be required and have default value.")
+    end
+
+    it "raises an error if enum isn't an array" do
+      expect {
+        argument(:command, :type => :string, :enum => "bar")
+      }.to raise_error(ArgumentError, "An argument cannot have an enum other than an array.")
+    end
+  end
+
+  describe "#usage" do
+    it "returns usage for string types" do
+      expect(argument(:foo, :type => :string).usage).to eq("FOO")
+    end
+
+    it "returns usage for numeric types" do
+      expect(argument(:foo, :type => :numeric).usage).to eq("N")
+    end
+
+    it "returns usage for array types" do
+      expect(argument(:foo, :type => :array).usage).to eq("one two three")
+    end
+
+    it "returns usage for hash types" do
+      expect(argument(:foo, :type => :hash).usage).to eq("key:value")
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/parser/arguments_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/parser/arguments_spec.rb
new file mode 100644
index 0000000..19588d9
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/parser/arguments_spec.rb
@@ -0,0 +1,66 @@
+require 'helper'
+require 'thor/parser'
+
+describe Thor::Arguments do
+  def create(opts={})
+    arguments = opts.map do |type, default|
+      options = {:required => default.nil?, :type => type, :default => default}
+      Thor::Argument.new(type.to_s, options)
+    end
+
+    arguments.sort!{ |a,b| b.name <=> a.name }
+    @opt = Thor::Arguments.new(arguments)
+  end
+
+  def parse(*args)
+    @opt.parse(args)
+  end
+
+  describe "#parse" do
+    it "parses arguments in the given order" do
+      create :string => nil, :numeric => nil
+      expect(parse("name", "13")["string"]).to eq("name")
+      expect(parse("name", "13")["numeric"]).to eq(13)
+    end
+
+    it "accepts hashes" do
+      create :string => nil, :hash => nil
+      expect(parse("product", "title:string", "age:integer")["string"]).to eq("product")
+      expect(parse("product", "title:string", "age:integer")["hash"]).to eq({ "title" => "string", "age" => "integer"})
+      expect(parse("product", "url:http://www.amazon.com/gp/product/123")["hash"]).to eq({ "url" => "http://www.amazon.com/gp/product/123" })
+    end
+
+    it "accepts arrays" do
+      create :string => nil, :array => nil
+      expect(parse("product", "title", "age")["string"]).to eq("product")
+      expect(parse("product", "title", "age")["array"]).to eq(%w(title age))
+    end
+
+    describe "with no inputs" do
+      it "and no arguments returns an empty hash" do
+        create
+        expect(parse).to eq({})
+      end
+
+      it "and required arguments raises an error" do
+        create :string => nil, :numeric => nil
+        expect{ parse }.to raise_error(Thor::RequiredArgumentMissingError, "No value provided for required arguments 'string', 'numeric'")
+      end
+
+      it "and default arguments returns default values" do
+        create :string => "name", :numeric => 13
+        expect(parse).to eq({ "string" => "name", "numeric" => 13 })
+      end
+    end
+
+    it "returns the input if it's already parsed" do
+      create :string => nil, :hash => nil, :array => nil, :numeric => nil
+      expect(parse("", 0, {}, [])).to eq({ "string" => "", "numeric" => 0, "hash" => {}, "array" => [] })
+    end
+
+    it "returns the default value if none is provided" do
+      create :string => "foo", :numeric => 3.0
+      expect(parse("bar")).to eq({ "string" => "bar", "numeric" => 3.0 })
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/parser/option_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/parser/option_spec.rb
new file mode 100644
index 0000000..d573976
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/parser/option_spec.rb
@@ -0,0 +1,202 @@
+require 'helper'
+require 'thor/parser'
+
+describe Thor::Option do
+  def parse(key, value)
+    Thor::Option.parse(key, value)
+  end
+
+  def option(name, options={})
+    @option ||= Thor::Option.new(name, options)
+  end
+
+  describe "#parse" do
+
+    describe "with value as a symbol" do
+      describe "and symbol is a valid type" do
+        it "has type equals to the symbol" do
+          expect(parse(:foo, :string).type).to eq(:string)
+          expect(parse(:foo, :numeric).type).to eq(:numeric)
+        end
+
+        it "has not default value" do
+          expect(parse(:foo, :string).default).to be_nil
+          expect(parse(:foo, :numeric).default).to be_nil
+        end
+      end
+
+      describe "equals to :required" do
+        it "has type equals to :string" do
+          expect(parse(:foo, :required).type).to eq(:string)
+        end
+
+        it "has no default value" do
+          expect(parse(:foo, :required).default).to be_nil
+        end
+      end
+
+      describe "and symbol is not a reserved key" do
+        it "has type equals to :string" do
+          expect(parse(:foo, :bar).type).to eq(:string)
+        end
+
+        it "has no default value" do
+          expect(parse(:foo, :bar).default).to be_nil
+        end
+      end
+    end
+
+    describe "with value as hash" do
+      it "has default type :hash" do
+        expect(parse(:foo, :a => :b).type).to eq(:hash)
+      end
+
+      it "has default value equals to the hash" do
+        expect(parse(:foo, :a => :b).default).to eq({ :a => :b })
+      end
+    end
+
+    describe "with value as array" do
+      it "has default type :array" do
+        expect(parse(:foo, [:a, :b]).type).to eq(:array)
+      end
+
+      it "has default value equals to the array" do
+        expect(parse(:foo, [:a, :b]).default).to eq([:a, :b])
+      end
+    end
+
+    describe "with value as string" do
+      it "has default type :string" do
+        expect(parse(:foo, "bar").type).to eq(:string)
+      end
+
+      it "has default value equals to the string" do
+        expect(parse(:foo, "bar").default).to eq("bar")
+      end
+    end
+
+    describe "with value as numeric" do
+      it "has default type :numeric" do
+        expect(parse(:foo, 2.0).type).to eq(:numeric)
+      end
+
+      it "has default value equals to the numeric" do
+        expect(parse(:foo, 2.0).default).to eq(2.0)
+      end
+    end
+
+    describe "with value as boolean" do
+      it "has default type :boolean" do
+        expect(parse(:foo, true).type).to eq(:boolean)
+        expect(parse(:foo, false).type).to eq(:boolean)
+      end
+
+      it "has default value equals to the boolean" do
+        expect(parse(:foo, true).default).to eq(true)
+        expect(parse(:foo, false).default).to eq(false)
+      end
+    end
+
+    describe "with key as a symbol" do
+      it "sets the name equals to the key" do
+        expect(parse(:foo, true).name).to eq("foo")
+      end
+    end
+
+    describe "with key as an array" do
+      it "sets the first items in the array to the name" do
+        expect(parse([:foo, :bar, :baz], true).name).to eq("foo")
+      end
+
+      it "sets all other items as aliases" do
+        expect(parse([:foo, :bar, :baz], true).aliases).to eq([:bar, :baz])
+      end
+    end
+  end
+
+  it "returns the switch name" do
+    expect(option("foo").switch_name).to eq("--foo")
+    expect(option("--foo").switch_name).to eq("--foo")
+  end
+
+  it "returns the human name" do
+    expect(option("foo").human_name).to eq("foo")
+    expect(option("--foo").human_name).to eq("foo")
+  end
+
+  it "converts underscores to dashes" do
+    expect(option("foo_bar").switch_name).to eq("--foo-bar")
+  end
+
+  it "can be required and have default values" do
+    option = option("foo", :required => true, :type => :string, :default => "bar")
+    expect(option.default).to eq("bar")
+    expect(option).to be_required
+  end
+
+  it "cannot be required and have type boolean" do
+    expect {
+      option("foo", :required => true, :type => :boolean)
+    }.to raise_error(ArgumentError, "An option cannot be boolean and required.")
+  end
+
+  it "allows type predicates" do
+    expect(parse(:foo, :string)).to be_string
+    expect(parse(:foo, :boolean)).to be_boolean
+    expect(parse(:foo, :numeric)).to be_numeric
+  end
+
+  it "raises an error on method missing" do
+    expect {
+      parse(:foo, :string).unknown?
+    }.to raise_error(NoMethodError)
+  end
+
+  describe "#usage" do
+
+    it "returns usage for string types" do
+      expect(parse(:foo, :string).usage).to eq("[--foo=FOO]")
+    end
+
+    it "returns usage for numeric types" do
+      expect(parse(:foo, :numeric).usage).to eq("[--foo=N]")
+    end
+
+    it "returns usage for array types" do
+      expect(parse(:foo, :array).usage).to eq("[--foo=one two three]")
+    end
+
+    it "returns usage for hash types" do
+      expect(parse(:foo, :hash).usage).to eq("[--foo=key:value]")
+    end
+
+    it "returns usage for boolean types" do
+      expect(parse(:foo, :boolean).usage).to eq("[--foo]")
+    end
+
+    it "uses padding when no aliases is given" do
+      expect(parse(:foo, :boolean).usage(4)).to eq("    [--foo]")
+    end
+
+    it "uses banner when supplied" do
+      expect(option(:foo, :required => false, :type => :string, :banner => "BAR").usage).to eq("[--foo=BAR]")
+    end
+
+    it "checkes when banner is an empty string" do
+      expect(option(:foo, :required => false, :type => :string, :banner => "").usage).to eq("[--foo]")
+    end
+
+    describe "with required values" do
+      it "does not show the usage between brackets" do
+        expect(parse(:foo, :required).usage).to eq("--foo=FOO")
+      end
+    end
+
+    describe "with aliases" do
+      it "does not show the usage between brackets" do
+        expect(parse([:foo, "-f", "-b"], :required).usage).to eq("-f, -b, --foo=FOO")
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/parser/options_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/parser/options_spec.rb
new file mode 100644
index 0000000..1505b38
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/parser/options_spec.rb
@@ -0,0 +1,400 @@
+require 'helper'
+require 'thor/parser'
+
+describe Thor::Options do
+  def create(opts, defaults={}, stop_on_unknown=false)
+    opts.each do |key, value|
+      opts[key] = Thor::Option.parse(key, value) unless value.is_a?(Thor::Option)
+    end
+
+    @opt = Thor::Options.new(opts, defaults, stop_on_unknown)
+  end
+
+  def parse(*args)
+    @opt.parse(args.flatten)
+  end
+
+  def check_unknown!
+    @opt.check_unknown!
+  end
+
+  def remaining
+    @opt.remaining
+  end
+
+  describe "#to_switches" do
+    it "turns true values into a flag" do
+      expect(Thor::Options.to_switches(:color => true)).to eq("--color")
+    end
+
+    it "ignores nil" do
+      expect(Thor::Options.to_switches(:color => nil)).to eq("")
+    end
+
+    it "ignores false" do
+      expect(Thor::Options.to_switches(:color => false)).to eq("")
+    end
+
+    it "writes --name value for anything else" do
+      expect(Thor::Options.to_switches(:format => "specdoc")).to eq('--format "specdoc"')
+    end
+
+    it "joins several values" do
+      switches = Thor::Options.to_switches(:color => true, :foo => "bar").split(' ').sort
+      expect(switches).to eq(['"bar"', "--color", "--foo"])
+    end
+
+    it "accepts arrays" do
+      expect(Thor::Options.to_switches(:count => [1,2,3])).to eq("--count 1 2 3")
+    end
+
+    it "accepts hashes" do
+      expect(Thor::Options.to_switches(:count => {:a => :b})).to eq("--count a:b")
+    end
+
+    it "accepts underscored options" do
+      expect(Thor::Options.to_switches(:under_score_option => "foo bar")).to eq('--under_score_option "foo bar"')
+    end
+
+  end
+
+  describe "#parse" do
+    it "allows multiple aliases for a given switch" do
+      create ["--foo", "--bar", "--baz"] => :string
+      expect(parse("--foo", "12")["foo"]).to eq("12")
+      expect(parse("--bar", "12")["foo"]).to eq("12")
+      expect(parse("--baz", "12")["foo"]).to eq("12")
+    end
+
+    it "allows custom short names" do
+      create "-f" => :string
+      expect(parse("-f", "12")).to eq({"f" => "12"})
+    end
+
+    it "allows custom short-name aliases" do
+      create ["--bar", "-f"] => :string
+      expect(parse("-f", "12")).to eq({"bar" => "12"})
+    end
+
+    it "accepts conjoined short switches" do
+      create ["--foo", "-f"] => true, ["--bar", "-b"] => true, ["--app", "-a"] => true
+      opts = parse("-fba")
+      expect(opts["foo"]).to be_true
+      expect(opts["bar"]).to be_true
+      expect(opts["app"]).to be_true
+    end
+
+    it "accepts conjoined short switches with input" do
+      create ["--foo", "-f"] => true, ["--bar", "-b"] => true, ["--app", "-a"] => :required
+      opts = parse "-fba", "12"
+      expect(opts["foo"]).to be_true
+      expect(opts["bar"]).to be_true
+      expect(opts["app"]).to eq("12")
+    end
+
+    it "returns the default value if none is provided" do
+      create :foo => "baz", :bar => :required
+      expect(parse("--bar", "boom")["foo"]).to eq("baz")
+    end
+
+    it "returns the default value from defaults hash to required arguments" do
+      create Hash[:bar => :required], Hash[:bar => "baz"]
+      expect(parse["bar"]).to eq("baz")
+    end
+
+    it "gives higher priority to defaults given in the hash" do
+      create Hash[:bar => true], Hash[:bar => false]
+      expect(parse["bar"]).to eq(false)
+    end
+
+    it "raises an error for unknown switches" do
+      create :foo => "baz", :bar => :required
+      parse("--bar", "baz", "--baz", "unknown")
+      expect{ check_unknown! }.to raise_error(Thor::UnknownArgumentError, "Unknown switches '--baz'")
+    end
+
+    it "skips leading non-switches" do
+      create(:foo => "baz")
+
+      expect(parse("asdf", "--foo", "bar")).to eq({"foo" => "bar"})
+    end
+
+    it "correctly recognizes things that look kind of like options, but aren't, as not options" do
+      create(:foo => "baz")
+      expect(parse("--asdf---asdf", "baz", "--foo", "--asdf---dsf--asdf")).to eq({"foo" => "--asdf---dsf--asdf"})
+      check_unknown!
+    end
+
+    it "accepts underscores in commandline args hash for boolean" do
+      create :foo_bar => :boolean
+      expect(parse("--foo_bar")["foo_bar"]).to eq(true)
+      expect(parse("--no_foo_bar")["foo_bar"]).to eq(false)
+    end
+
+    it "accepts underscores in commandline args hash for strings" do
+      create :foo_bar => :string, :baz_foo => :string
+      expect(parse("--foo_bar", "baz")["foo_bar"]).to eq("baz")
+      expect(parse("--baz_foo", "foo bar")["baz_foo"]).to eq("foo bar")
+    end
+
+    it "interprets everything after -- as args instead of options" do
+      create(:foo => :string, :bar => :required)
+      expect(parse(%w[--bar abc moo -- --foo def -a])).to eq({"bar" => "abc"})
+      expect(remaining).to eq(%w[moo --foo def -a])
+    end
+
+    it "ignores -- when looking for single option values" do
+      create(:foo => :string, :bar => :required)
+      expect(parse(%w[--bar -- --foo def -a])).to eq({"bar" => "--foo"})
+      expect(remaining).to eq(%w[def -a])
+    end
+
+    it "ignores -- when looking for array option values" do
+      create(:foo => :array)
+      expect(parse(%w[--foo a b -- c d -e])).to eq({"foo" => %w[a b c d -e]})
+      expect(remaining).to eq([])
+    end
+
+    it "ignores -- when looking for hash option values" do
+      create(:foo => :hash)
+      expect(parse(%w[--foo a:b -- c:d -e])).to eq({"foo" => {'a' => 'b', 'c' => 'd'}})
+      expect(remaining).to eq(%w[-e])
+    end
+
+    it "ignores trailing --" do
+      create(:foo => :string)
+      expect(parse(%w[--foo --])).to eq({"foo" => nil})
+      expect(remaining).to eq([])
+    end
+
+    describe "with no input" do
+      it "and no switches returns an empty hash" do
+        create({})
+        expect(parse).to eq({})
+      end
+
+      it "and several switches returns an empty hash" do
+        create "--foo" => :boolean, "--bar" => :string
+        expect(parse).to eq({})
+      end
+
+      it "and a required switch raises an error" do
+        create "--foo" => :required
+        expect{ parse }.to raise_error(Thor::RequiredArgumentMissingError, "No value provided for required options '--foo'")
+      end
+    end
+
+    describe "with one required and one optional switch" do
+      before do
+        create "--foo" => :required, "--bar" => :boolean
+      end
+
+      it "raises an error if the required switch has no argument" do
+        expect{ parse("--foo") }.to raise_error(Thor::MalformattedArgumentError)
+      end
+
+      it "raises an error if the required switch isn't given" do
+        expect{ parse("--bar") }.to raise_error(Thor::RequiredArgumentMissingError)
+      end
+
+      it "raises an error if the required switch is set to nil" do
+        expect{ parse("--no-foo") }.to raise_error(Thor::RequiredArgumentMissingError)
+      end
+
+      it "does not raises an error if the required option has a default value" do
+        options = {:required => true, :type => :string, :default => "baz"}
+        create :foo => Thor::Option.new("foo", options), :bar => :boolean
+        expect{ parse("--bar") }.not_to raise_error
+      end
+    end
+
+    context "when stop_on_unknown is true" do
+      before do
+        create({:foo => :string, :verbose => :boolean}, {}, true)
+      end
+
+      it "stops parsing on first non-option" do
+        expect(parse(%w[foo --verbose])).to eq({})
+        expect(remaining).to eq(["foo", "--verbose"])
+      end
+
+      it "stops parsing on unknown option" do
+        expect(parse(%w[--bar --verbose])).to eq({})
+        expect(remaining).to eq(["--bar", "--verbose"])
+      end
+
+      it "retains -- after it has stopped parsing" do
+        expect(parse(%w[--bar -- whatever])).to eq({})
+        expect(remaining).to eq(["--bar", "--", "whatever"])
+      end
+
+      it "still accepts options that are given before non-options" do
+        expect(parse(%w[--verbose foo])).to eq({"verbose" => true})
+        expect(remaining).to eq(["foo"])
+      end
+
+      it "still accepts options that require a value" do
+        expect(parse(%w[--foo bar baz])).to eq({"foo" => "bar"})
+        expect(remaining).to eq(["baz"])
+      end
+
+      it "still interprets everything after -- as args instead of options" do
+        expect(parse(%w[-- --verbose])).to eq({})
+        expect(remaining).to eq(["--verbose"])
+      end
+    end
+
+    describe "with :string type" do
+      before do
+        create ["--foo", "-f"] => :required
+      end
+
+      it "accepts a switch <value> assignment" do
+        expect(parse("--foo", "12")["foo"]).to eq("12")
+      end
+
+      it "accepts a switch=<value> assignment" do
+        expect(parse("-f=12")["foo"]).to eq("12")
+        expect(parse("--foo=12")["foo"]).to eq("12")
+        expect(parse("--foo=bar=baz")["foo"]).to eq("bar=baz")
+      end
+
+      it "must accept underscores switch=value assignment" do
+        create :foo_bar => :required
+        expect(parse("--foo_bar=http://example.com/under_score/")["foo_bar"]).to eq("http://example.com/under_score/")
+      end
+
+      it "accepts a --no-switch format" do
+        create "--foo" => "bar"
+        expect(parse("--no-foo")["foo"]).to be_nil
+      end
+
+      it "does not consume an argument for --no-switch format" do
+        create "--cheese" => :string
+        expect(parse('burger', '--no-cheese', 'fries')["cheese"]).to be_nil
+      end
+
+      it "accepts a --switch format on non required types" do
+        create "--foo" => :string
+        expect(parse("--foo")["foo"]).to eq("foo")
+      end
+
+      it "accepts a --switch format on non required types with default values" do
+        create "--baz" => :string, "--foo" => "bar"
+        expect(parse("--baz", "bang", "--foo")["foo"]).to eq("bar")
+      end
+
+      it "overwrites earlier values with later values" do
+        expect(parse("--foo=bar", "--foo", "12")["foo"]).to eq("12")
+        expect(parse("--foo", "12", "--foo", "13")["foo"]).to eq("13")
+      end
+    end
+
+    describe "with :boolean type" do
+      before do
+        create "--foo" => false
+      end
+
+      it "accepts --opt assignment" do
+        expect(parse("--foo")["foo"]).to eq(true)
+        expect(parse("--foo", "--bar")["foo"]).to eq(true)
+      end
+
+      it "uses the default value if no switch is given" do
+        expect(parse("")["foo"]).to eq(false)
+      end
+
+      it "accepts --opt=value assignment" do
+        expect(parse("--foo=true")["foo"]).to eq(true)
+        expect(parse("--foo=false")["foo"]).to eq(false)
+      end
+
+      it "accepts --[no-]opt variant, setting false for value" do
+        expect(parse("--no-foo")["foo"]).to eq(false)
+      end
+
+      it "accepts --[skip-]opt variant, setting false for value" do
+        expect(parse("--skip-foo")["foo"]).to eq(false)
+      end
+
+      it "will prefer 'no-opt' variant over inverting 'opt' if explicitly set" do
+        create "--no-foo" => true
+        expect(parse("--no-foo")["no-foo"]).to eq(true)
+      end
+
+      it "will prefer 'skip-opt' variant over inverting 'opt' if explicitly set" do
+        create "--skip-foo" => true
+        expect(parse("--skip-foo")["skip-foo"]).to eq(true)
+      end
+
+      it "accepts inputs in the human name format" do
+        create :foo_bar => :boolean
+        expect(parse("--foo-bar")["foo_bar"]).to eq(true)
+        expect(parse("--no-foo-bar")["foo_bar"]).to eq(false)
+        expect(parse("--skip-foo-bar")["foo_bar"]).to eq(false)
+      end
+
+      it "doesn't eat the next part of the param" do
+        create :foo => :boolean
+        expect(parse("--foo", "bar")).to eq({"foo" => true})
+        expect(@opt.remaining).to eq(["bar"])
+      end
+    end
+
+    describe "with :hash type" do
+      before do
+        create "--attributes" => :hash
+      end
+
+      it "accepts a switch=<value> assignment" do
+        expect(parse("--attributes=name:string", "age:integer")["attributes"]).to eq({"name" => "string", "age" => "integer"})
+      end
+
+      it "accepts a switch <value> assignment" do
+        expect(parse("--attributes", "name:string", "age:integer")["attributes"]).to eq({"name" => "string", "age" => "integer"})
+      end
+
+      it "must not mix values with other switches" do
+        expect(parse("--attributes", "name:string", "age:integer", "--baz", "cool")["attributes"]).to eq({"name" => "string", "age" => "integer"})
+      end
+    end
+
+    describe "with :array type" do
+      before do
+        create "--attributes" => :array
+      end
+
+      it "accepts a switch=<value> assignment" do
+        expect(parse("--attributes=a", "b", "c")["attributes"]).to eq(["a", "b", "c"])
+      end
+
+      it "accepts a switch <value> assignment" do
+        expect(parse("--attributes", "a", "b", "c")["attributes"]).to eq(["a", "b", "c"])
+      end
+
+      it "must not mix values with other switches" do
+        expect(parse("--attributes", "a", "b", "c", "--baz", "cool")["attributes"]).to eq(["a", "b", "c"])
+      end
+    end
+
+    describe "with :numeric type" do
+      before do
+        create "n" => :numeric, "m" => 5
+      end
+
+      it "accepts a -nXY assignment" do
+        expect(parse("-n12")["n"]).to eq(12)
+      end
+
+      it "converts values to numeric types" do
+        expect(parse("-n", "3", "-m", ".5")).to eq({"n" => 3, "m" => 0.5})
+      end
+
+      it "raises error when value isn't numeric" do
+        expect{ parse("-n", "foo") }.to raise_error(Thor::MalformattedArgumentError,
+          "Expected numeric value for '-n'; got \"foo\"")
+      end
+    end
+
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/rake_compat_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/rake_compat_spec.rb
new file mode 100644
index 0000000..4009661
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/rake_compat_spec.rb
@@ -0,0 +1,72 @@
+require 'helper'
+require 'thor/rake_compat'
+require 'rake/tasklib'
+
+$main = self
+
+class RakeTask < Rake::TaskLib
+  def initialize
+    define
+  end
+
+  def define
+    $main.instance_eval do
+      desc "Say it's cool"
+      task :cool do
+        puts "COOL"
+      end
+
+      namespace :hiper_mega do
+        task :super do
+          puts "HIPER MEGA SUPER"
+        end
+      end
+    end
+  end
+end
+
+class ThorTask < Thor
+  include Thor::RakeCompat
+  RakeTask.new
+end
+
+describe Thor::RakeCompat do
+  it "sets the rakefile application" do
+    expect(["rake_compat_spec.rb", "Thorfile"]).to include(Rake.application.rakefile)
+  end
+
+  it "adds rake tasks to thor classes too" do
+    task = ThorTask.tasks["cool"]
+    expect(task).to be
+  end
+
+  it "uses rake tasks descriptions on thor" do
+    expect(ThorTask.tasks["cool"].description).to eq("Say it's cool")
+  end
+
+  it "gets usage from rake tasks name" do
+    expect(ThorTask.tasks["cool"].usage).to eq("cool")
+  end
+
+  it "uses non namespaced name as description if non is available" do
+    expect(ThorTask::HiperMega.tasks["super"].description).to eq("super")
+  end
+
+  it "converts namespaces to classes" do
+    expect(ThorTask.const_get(:HiperMega)).to eq(ThorTask::HiperMega)
+  end
+
+  it "does not add tasks from higher namespaces in lowers namespaces" do
+    expect(ThorTask.tasks["super"]).not_to be
+  end
+
+  it "invoking the thor task invokes the rake task" do
+    expect(capture(:stdout) {
+      ThorTask.start ["cool"]
+    }).to eq("COOL\n")
+
+    expect(capture(:stdout) {
+      ThorTask::HiperMega.start ["super"]
+    }).to eq("HIPER MEGA SUPER\n")
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/register_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/register_spec.rb
new file mode 100644
index 0000000..3810831
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/register_spec.rb
@@ -0,0 +1,197 @@
+require 'helper'
+
+class BoringVendorProvidedCLI < Thor
+  desc "boring", "do boring stuff"
+  def boring
+    puts "bored. <yawn>"
+  end
+end
+
+class ExcitingPluginCLI < Thor
+  desc "hooray", "say hooray!"
+  def hooray
+    puts "hooray!"
+  end
+
+  desc "fireworks", "exciting fireworks!"
+  def fireworks
+    puts "kaboom!"
+  end
+end
+
+class SuperSecretPlugin < Thor
+  default_command :squirrel
+
+  desc "squirrel", "All of secret squirrel's secrets"
+  def squirrel
+    puts "I love nuts"
+  end
+end
+
+class GroupPlugin < Thor::Group
+  desc "part one"
+  def part_one
+    puts "part one"
+  end
+
+  desc "part two"
+  def part_two
+    puts "part two"
+  end
+end
+
+class ClassOptionGroupPlugin < Thor::Group
+  class_option :who,
+    :type => :string,
+    :aliases => "-w",
+    :default => "zebra"
+end
+
+class CompatibleWith19Plugin < ClassOptionGroupPlugin
+  desc "animal"
+  def animal
+    p options[:who]
+  end
+end
+
+class PluginWithDefault < Thor
+  desc "say MSG", "print MSG"
+  def say(msg)
+    puts msg
+  end
+
+  default_command :say
+end
+
+class PluginWithDefaultMultipleArguments < Thor
+  desc "say MSG [MSG]", "print multiple messages"
+  def say(*args)
+    puts args
+  end
+
+  default_command :say
+end
+
+class PluginWithDefaultcommandAndDeclaredArgument < Thor
+  desc "say MSG [MSG]", "print multiple messages"
+  argument :msg
+  def say
+    puts msg
+  end
+
+  default_command :say
+end
+
+BoringVendorProvidedCLI.register(
+  ExcitingPluginCLI,
+  "exciting",
+  "do exciting things",
+  "Various non-boring actions")
+
+BoringVendorProvidedCLI.register(
+  SuperSecretPlugin,
+  "secret",
+  "secret stuff",
+  "Nothing to see here. Move along.",
+  :hide => true)
+
+BoringVendorProvidedCLI.register(
+  GroupPlugin,
+  'groupwork',
+  "Do a bunch of things in a row",
+  "purple monkey dishwasher")
+
+BoringVendorProvidedCLI.register(
+  CompatibleWith19Plugin,
+  'zoo',
+  "zoo [-w animal]",
+  "Shows a provided animal or just zebra")
+
+BoringVendorProvidedCLI.register(
+  PluginWithDefault,
+  'say',
+  'say message',
+  'subcommands ftw')
+
+BoringVendorProvidedCLI.register(
+  PluginWithDefaultMultipleArguments,
+  'say_multiple',
+  'say message',
+  'subcommands ftw')
+
+BoringVendorProvidedCLI.register(
+  PluginWithDefaultcommandAndDeclaredArgument,
+  'say_argument',
+  'say message',
+  'subcommands ftw')
+
+describe ".register-ing a Thor subclass" do
+  it "registers the plugin as a subcommand" do
+    fireworks_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[exciting fireworks]) }
+    expect(fireworks_output).to eq("kaboom!\n")
+  end
+
+  it "includes the plugin's usage in the help" do
+    help_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[help]) }
+    expect(help_output).to include('do exciting things')
+  end
+
+  it "invokes the default command correctly" do
+    output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[say hello]) }
+    expect(output).to include("hello")
+  end
+
+  it "invokes the default command correctly with multiple args" do
+    output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[say_multiple hello adam]) }
+    expect(output).to include("hello")
+    expect(output).to include("adam")
+  end
+
+  it "invokes the default command correctly with a declared argument" do
+    output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[say_argument hello]) }
+    expect(output).to include("hello")
+  end
+
+  context "when $thor_runner is false" do
+    it "includes the plugin's subcommand name in subcommand's help" do
+      begin
+        $thor_runner = false
+        help_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[exciting]) }
+        expect(help_output).to include('thor exciting_plugin_c_l_i fireworks')
+      ensure
+        $thor_runner = true
+      end
+    end
+  end
+
+  context "when hidden" do
+    it "omits the hidden plugin's usage from the help" do
+      help_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[help]) }
+      expect(help_output).not_to include('secret stuff')
+    end
+
+    it "registers the plugin as a subcommand" do
+      secret_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[secret squirrel]) }
+      expect(secret_output).to eq("I love nuts\n")
+    end
+  end
+end
+
+describe ".register-ing a Thor::Group subclass" do
+  it "registers the group as a single command" do
+    group_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[groupwork]) }
+    expect(group_output).to eq("part one\npart two\n")
+  end
+end
+
+describe "1.8 and 1.9 syntax compatibility" do
+  it "is compatible with both 1.8 and 1.9 syntax w/o command options" do
+    group_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[zoo]) }
+    expect(group_output).to match(/zebra/)
+  end
+
+  it "is compatible with both 1.8 and 1.9 syntax w/command options" do
+    group_output = capture(:stdout) { BoringVendorProvidedCLI.start(%w[zoo -w lion]) }
+    expect(group_output).to match(/lion/)
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/runner_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/runner_spec.rb
new file mode 100644
index 0000000..17fd29f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/runner_spec.rb
@@ -0,0 +1,241 @@
+require 'helper'
+require 'thor/runner'
+
+describe Thor::Runner do
+  def when_no_thorfiles_exist
+    old_dir = Dir.pwd
+    Dir.chdir '..'
+    delete = Thor::Base.subclasses.select {|e| e.namespace == 'default' }
+    delete.each {|e| Thor::Base.subclasses.delete e }
+    yield
+    Thor::Base.subclasses.concat delete
+    Dir.chdir old_dir
+  end
+
+  describe "#help" do
+    it "shows information about Thor::Runner itself" do
+      expect(capture(:stdout) { Thor::Runner.start(["help"]) }).to match(/List the available thor commands/)
+    end
+
+    it "shows information about a specific Thor::Runner command" do
+      content = capture(:stdout) { Thor::Runner.start(["help", "list"]) }
+      expect(content).to match(/List the available thor commands/)
+      expect(content).not_to match(/help \[COMMAND\]/)
+    end
+
+    it "shows information about a specific Thor class" do
+      content = capture(:stdout) { Thor::Runner.start(["help", "my_script"]) }
+      expect(content).to match(/zoo\s+# zoo around/m)
+    end
+
+    it "shows information about an specific command from an specific Thor class" do
+      content = capture(:stdout) { Thor::Runner.start(["help", "my_script:zoo"]) }
+      expect(content).to match(/zoo around/)
+      expect(content).not_to match(/help \[COMMAND\]/)
+    end
+
+    it "shows information about a specific Thor group class" do
+      content = capture(:stdout) { Thor::Runner.start(["help", "my_counter"]) }
+      expect(content).to match(/my_counter N/)
+    end
+
+    it "raises error if a class/command cannot be found" do
+      content = capture(:stderr){ Thor::Runner.start(["help", "unknown"]) }
+      expect(content.strip).to eq('Could not find command "unknown" in "default" namespace.')
+    end
+
+    it "raises error if a class/command cannot be found for a setup without thorfiles" do
+      when_no_thorfiles_exist do
+        Thor::Runner.should_receive :exit
+        content = capture(:stderr){ Thor::Runner.start(["help", "unknown"]) }
+        expect(content.strip).to eq('Could not find command "unknown".')
+      end
+    end
+  end
+
+  describe "#start" do
+    it "invokes a command from Thor::Runner" do
+      ARGV.replace ["list"]
+      expect(capture(:stdout) { Thor::Runner.start }).to match(/my_counter N/)
+    end
+
+    it "invokes a command from a specific Thor class" do
+      ARGV.replace ["my_script:zoo"]
+      expect(Thor::Runner.start).to be_true
+    end
+
+    it "invokes the default command from a specific Thor class if none is specified" do
+      ARGV.replace ["my_script"]
+      expect(Thor::Runner.start).to eq("default command")
+    end
+
+    it "forwads arguments to the invoked command" do
+      ARGV.replace ["my_script:animal", "horse"]
+      expect(Thor::Runner.start).to eq(["horse"])
+    end
+
+    it "invokes commands through shortcuts" do
+      ARGV.replace ["my_script", "-T", "horse"]
+      expect(Thor::Runner.start).to eq(["horse"])
+    end
+
+    it "invokes a Thor::Group" do
+      ARGV.replace ["my_counter", "1", "2", "--third", "3"]
+      expect(Thor::Runner.start).to eq([1, 2, 3, nil, nil, nil])
+    end
+
+    it "raises an error if class/command can't be found" do
+      ARGV.replace ["unknown"]
+      content = capture(:stderr){ Thor::Runner.start }
+      expect(content.strip).to eq('Could not find command "unknown" in "default" namespace.')
+    end
+
+    it "raises an error if class/command can't be found in a setup without thorfiles" do
+      when_no_thorfiles_exist do
+        ARGV.replace ["unknown"]
+        Thor::Runner.should_receive :exit
+        content = capture(:stderr){ Thor::Runner.start }
+        expect(content.strip).to eq('Could not find command "unknown".')
+      end
+    end
+
+    it "does not swallow NoMethodErrors that occur inside the called method" do
+      ARGV.replace ["my_script:call_unexistent_method"]
+      expect{ Thor::Runner.start }.to raise_error(NoMethodError)
+    end
+
+    it "does not swallow Thor::Group InvocationError" do
+      ARGV.replace ["whiny_generator"]
+      expect{ Thor::Runner.start }.to raise_error(ArgumentError, /thor wrong_arity takes 1 argument, but it should not/)
+    end
+
+    it "does not swallow Thor InvocationError" do
+      ARGV.replace ["my_script:animal"]
+      content = capture(:stderr) { Thor::Runner.start }
+      expect(content.strip).to eq(%Q'ERROR: thor animal was called with no arguments\nUsage: "thor my_script:animal TYPE".')
+    end
+  end
+
+  describe "commands" do
+    before do
+      @location = "#{File.dirname(__FILE__)}/fixtures/command.thor"
+      @original_yaml = {
+        "random" => {
+          :location  => @location,
+          :filename  => "4a33b894ffce85d7b412fc1b36f88fe0",
+          :namespaces => ["amazing"]
+        }
+      }
+
+      root_file = File.join(Thor::Util.thor_root, "thor.yml")
+
+      # Stub load and save to avoid thor.yaml from being overwritten
+      YAML.stub!(:load_file).and_return(@original_yaml)
+      File.stub!(:exists?).with(root_file).and_return(true)
+      File.stub!(:open).with(root_file, "w")
+    end
+
+    describe "list" do
+      it "gives a list of the available commands" do
+        ARGV.replace ["list"]
+        content = capture(:stdout) { Thor::Runner.start }
+        expect(content).to match(/amazing:describe NAME\s+# say that someone is amazing/m)
+      end
+
+      it "gives a list of the available Thor::Group classes" do
+        ARGV.replace ["list"]
+        expect(capture(:stdout) { Thor::Runner.start }).to match(/my_counter N/)
+      end
+
+      it "can filter a list of the available commands by --group" do
+        ARGV.replace ["list", "--group", "standard"]
+        expect(capture(:stdout) { Thor::Runner.start }).to match(/amazing:describe NAME/)
+        ARGV.replace []
+        expect(capture(:stdout) { Thor::Runner.start }).not_to match(/my_script:animal TYPE/)
+        ARGV.replace ["list", "--group", "script"]
+        expect(capture(:stdout) { Thor::Runner.start }).to match(/my_script:animal TYPE/)
+      end
+
+      it "can skip all filters to show all commands using --all" do
+        ARGV.replace ["list", "--all"]
+        content = capture(:stdout) { Thor::Runner.start }
+        expect(content).to match(/amazing:describe NAME/)
+        expect(content).to match(/my_script:animal TYPE/)
+      end
+
+      it "doesn't list superclass commands in the subclass" do
+        ARGV.replace ["list"]
+        expect(capture(:stdout) { Thor::Runner.start }).not_to match(/amazing:help/)
+      end
+
+      it "presents commands in the default namespace with an empty namespace" do
+        ARGV.replace ["list"]
+        expect(capture(:stdout) { Thor::Runner.start }).to match(/^thor :cow\s+# prints 'moo'/m)
+      end
+
+      it "runs commands with an empty namespace from the default namespace" do
+        ARGV.replace [":command_conflict"]
+        expect(capture(:stdout) { Thor::Runner.start }).to eq("command\n")
+      end
+
+      it "runs groups even when there is a command with the same name" do
+        ARGV.replace ["command_conflict"]
+        expect(capture(:stdout) { Thor::Runner.start }).to eq("group\n")
+      end
+
+      it "runs commands with no colon in the default namespace" do
+        ARGV.replace ["cow"]
+        expect(capture(:stdout) { Thor::Runner.start }).to eq("moo\n")
+      end
+    end
+
+    describe "uninstall" do
+      before do
+        path = File.join(Thor::Util.thor_root, @original_yaml["random"][:filename])
+        FileUtils.should_receive(:rm_rf).with(path)
+      end
+
+      it "uninstalls existing thor modules" do
+        silence(:stdout) { Thor::Runner.start(["uninstall", "random"]) }
+      end
+    end
+
+    describe "installed" do
+      before do
+        Dir.should_receive(:[]).and_return([])
+      end
+
+      it "displays the modules installed in a pretty way" do
+        stdout = capture(:stdout) { Thor::Runner.start(["installed"]) }
+        expect(stdout).to match(/random\s*amazing/)
+        expect(stdout).to match(/amazing:describe NAME\s+# say that someone is amazing/m)
+      end
+    end
+
+    describe "install/update" do
+      before do
+        FileUtils.stub!(:mkdir_p)
+        FileUtils.stub!(:touch)
+        $stdin.stub!(:gets).and_return("Y")
+
+        path = File.join(Thor::Util.thor_root, Digest::MD5.hexdigest(@location + "random"))
+        File.should_receive(:open).with(path, "w")
+      end
+
+      it "updates existing thor files" do
+        path = File.join(Thor::Util.thor_root, @original_yaml["random"][:filename])
+        if File.directory? path
+          FileUtils.should_receive(:rm_rf).with(path)
+        else
+          File.should_receive(:delete).with(path)
+        end
+        silence(:stdout) { Thor::Runner.start(["update", "random"]) }
+      end
+
+      it "installs thor files" do
+        ARGV.replace ["install", @location]
+        silence(:stdout) { Thor::Runner.start }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/shell/basic_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/shell/basic_spec.rb
new file mode 100644
index 0000000..c1a4173
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/shell/basic_spec.rb
@@ -0,0 +1,311 @@
+# coding: UTF-8
+require 'helper'
+
+describe Thor::Shell::Basic do
+  def shell
+    @shell ||= Thor::Shell::Basic.new
+  end
+
+  describe "#padding" do
+    it "cannot be set to below zero" do
+      shell.padding = 10
+      expect(shell.padding).to eq(10)
+
+      shell.padding = -1
+      expect(shell.padding).to eq(0)
+    end
+  end
+
+  describe "#ask" do
+    it "prints a message to the user and gets the response" do
+      $stdout.should_receive(:print).with("Should I overwrite it? ")
+      $stdin.should_receive(:gets).and_return('Sure')
+      expect(shell.ask("Should I overwrite it?")).to eq("Sure")
+    end
+
+    it "prints a message and returns nil if EOF is sent to stdin" do
+      $stdout.should_receive(:print).with(" ")
+      $stdin.should_receive(:gets).and_return(nil)
+      expect(shell.ask("")).to eq(nil)
+    end
+
+
+    it "prints a message to the user with the available options and determines the correctness of the answer" do
+      $stdout.should_receive(:print).with('What\'s your favorite Neopolitan flavor? ["strawberry", "chocolate", "vanilla"] ')
+      $stdin.should_receive(:gets).and_return('chocolate')
+      expect(shell.ask("What's your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])).to eq("chocolate")
+    end
+
+    it "prints a message to the user with the available options and reasks the question after an incorrect repsonse" do
+      $stdout.should_receive(:print).with('What\'s your favorite Neopolitan flavor? ["strawberry", "chocolate", "vanilla"] ').twice
+      $stdout.should_receive(:puts).with('Your response must be one of: ["strawberry", "chocolate", "vanilla"]. Please try again.')
+      $stdin.should_receive(:gets).and_return('moose tracks', 'chocolate')
+      expect(shell.ask("What's your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])).to eq("chocolate")
+    end
+  end
+
+  describe "#yes?" do
+    it "asks the user and returns true if the user replies yes" do
+      $stdout.should_receive(:print).with("Should I overwrite it? ")
+        $stdin.should_receive(:gets).and_return('y')
+      expect(shell.yes?("Should I overwrite it?")).to be_true
+
+      $stdout.should_receive(:print).with("Should I overwrite it? ")
+        $stdin.should_receive(:gets).and_return('n')
+      expect(shell.yes?("Should I overwrite it?")).not_to be_true
+    end
+  end
+
+  describe "#no?" do
+    it "asks the user and returns true if the user replies no" do
+      $stdout.should_receive(:print).with("Should I overwrite it? ")
+        $stdin.should_receive(:gets).and_return('n')
+      expect(shell.no?("Should I overwrite it?")).to be_true
+
+      $stdout.should_receive(:print).with("Should I overwrite it? ")
+        $stdin.should_receive(:gets).and_return('Yes')
+      expect(shell.no?("Should I overwrite it?")).to be_false
+    end
+  end
+
+  describe "#say" do
+    it "prints a message to the user" do
+      $stdout.should_receive(:puts).with("Running...")
+      shell.say("Running...")
+    end
+
+    it "prints a message to the user without new line if it ends with a whitespace" do
+      $stdout.should_receive(:print).with("Running... ")
+      shell.say("Running... ")
+    end
+
+    it "does not use a new line with whitespace+newline embedded" do
+      $stdout.should_receive(:puts).with("It's \nRunning...")
+      shell.say("It's \nRunning...")
+    end
+
+    it "prints a message to the user without new line" do
+      $stdout.should_receive(:print).with("Running...")
+      shell.say("Running...", nil, false)
+    end
+  end
+
+  describe "#say_status" do
+    it "prints a message to the user with status" do
+      $stdout.should_receive(:puts).with("      create  ~/.thor/command.thor")
+      shell.say_status(:create, "~/.thor/command.thor")
+    end
+
+    it "always use new line" do
+      $stdout.should_receive(:puts).with("      create  ")
+      shell.say_status(:create, "")
+    end
+
+    it "does not print a message if base is muted" do
+      shell.should_receive(:mute?).and_return(true)
+      $stdout.should_not_receive(:puts)
+
+      shell.mute do
+        shell.say_status(:created, "~/.thor/command.thor")
+      end
+    end
+
+    it "does not print a message if base is set to quiet" do
+      base = MyCounter.new [1,2]
+      base.should_receive(:options).and_return(:quiet => true)
+
+      $stdout.should_not_receive(:puts)
+      shell.base = base
+      shell.say_status(:created, "~/.thor/command.thor")
+    end
+
+    it "does not print a message if log status is set to false" do
+      $stdout.should_not_receive(:puts)
+      shell.say_status(:created, "~/.thor/command.thor", false)
+    end
+
+    it "uses padding to set messages left margin" do
+      shell.padding = 2
+      $stdout.should_receive(:puts).with("      create      ~/.thor/command.thor")
+      shell.say_status(:create, "~/.thor/command.thor")
+    end
+  end
+
+  describe "#print_in_columns" do
+    before do
+      @array = [1234567890]
+      @array += ('a'..'e').to_a
+    end
+
+    it "prints in columns" do
+      content = capture(:stdout) { shell.print_in_columns(@array) }
+      expect(content.rstrip).to eq("1234567890  a           b           c           d           e")
+    end
+  end
+
+  describe "#print_table" do
+    before do
+      @table = []
+      @table << ["abc", "#123", "first three"]
+      @table << ["", "#0", "empty"]
+      @table << ["xyz", "#786", "last three"]
+    end
+
+    it "prints a table" do
+      content = capture(:stdout) { shell.print_table(@table) }
+      expect(content).to eq(<<-TABLE)
+abc  #123  first three
+     #0    empty
+xyz  #786  last three
+TABLE
+    end
+
+    it "prints a table with indentation" do
+      content = capture(:stdout) { shell.print_table(@table, :indent => 2) }
+      expect(content).to eq(<<-TABLE)
+  abc  #123  first three
+       #0    empty
+  xyz  #786  last three
+TABLE
+    end
+
+    it "uses maximum terminal width" do
+      @table << ["def", "#456", "Lançam foo bar"]
+      @table << ["ghi", "#789", "بالله  عليكم"]
+      shell.should_receive(:terminal_width).and_return(20)
+      content = capture(:stdout) { shell.print_table(@table, :indent => 2, :truncate => true) }
+      expect(content).to eq(<<-TABLE)
+  abc  #123  firs...
+       #0    empty
+  xyz  #786  last...
+  def  #456  Lanç...
+  ghi  #789  بالل...
+TABLE
+    end
+
+    it "honors the colwidth option" do
+      content = capture(:stdout) { shell.print_table(@table, :colwidth => 10)}
+      expect(content).to eq(<<-TABLE)
+abc         #123  first three
+            #0    empty
+xyz         #786  last three
+TABLE
+    end
+
+    it "prints tables with implicit columns" do
+      2.times { @table.first.pop }
+      content = capture(:stdout) { shell.print_table(@table) }
+      expect(content).to eq(<<-TABLE)
+abc  
+     #0    empty
+xyz  #786  last three
+TABLE
+    end
+
+    it "prints a table with small numbers and right-aligns them" do
+      table = [
+        ["Name", "Number", "Color"],
+        ["Erik", 1, "green"]
+      ]
+      content = capture(:stdout) { shell.print_table(table) }
+      expect(content).to eq(<<-TABLE)
+Name  Number  Color
+Erik       1  green
+TABLE
+    end
+
+    it "doesn't output extra spaces for right-aligned columns in the last column" do
+      table = [
+        ["Name", "Number"],
+        ["Erik", 1]
+      ]
+      content = capture(:stdout) { shell.print_table(table) }
+      expect(content).to eq(<<-TABLE)
+Name  Number
+Erik       1
+TABLE
+    end
+
+    it "prints a table with big numbers" do
+      table = [
+        ["Name", "Number", "Color"],
+        ["Erik", 1234567890123, "green"]
+      ]
+      content = capture(:stdout) { shell.print_table(table) }
+      expect(content).to eq(<<-TABLE)
+Name  Number         Color
+Erik  1234567890123  green
+TABLE
+    end
+  end
+
+  describe "#file_collision" do
+    it "shows a menu with options" do
+      $stdout.should_receive(:print).with('Overwrite foo? (enter "h" for help) [Ynaqh] ')
+      $stdin.should_receive(:gets).and_return('n')
+      shell.file_collision('foo')
+    end
+
+    it "returns true if the user choose default option" do
+      $stdout.stub!(:print)
+      $stdin.should_receive(:gets).and_return('')
+      expect(shell.file_collision('foo')).to be_true
+    end
+
+    it "returns false if the user choose no" do
+      $stdout.stub!(:print)
+      $stdin.should_receive(:gets).and_return('n')
+      expect(shell.file_collision('foo')).to be_false
+    end
+
+    it "returns true if the user choose yes" do
+      $stdout.stub!(:print)
+      $stdin.should_receive(:gets).and_return('y')
+      expect(shell.file_collision('foo')).to be_true
+    end
+
+    it "shows help usage if the user choose help" do
+      $stdout.stub!(:print)
+      $stdin.should_receive(:gets).and_return('h')
+      $stdin.should_receive(:gets).and_return('n')
+      help = capture(:stdout) { shell.file_collision('foo') }
+      expect(help).to match(/h \- help, show this help/)
+    end
+
+    it "quits if the user choose quit" do
+      $stdout.stub!(:print)
+      $stdout.should_receive(:puts).with('Aborting...')
+      $stdin.should_receive(:gets).and_return('q')
+
+      expect {
+        shell.file_collision('foo')
+      }.to raise_error(SystemExit)
+    end
+
+    it "always returns true if the user choose always" do
+      $stdout.should_receive(:print).with('Overwrite foo? (enter "h" for help) [Ynaqh] ')
+      $stdin.should_receive(:gets).and_return('a')
+
+      expect(shell.file_collision('foo')).to be_true
+
+      $stdout.should_not_receive(:print)
+      expect(shell.file_collision('foo')).to be_true
+    end
+
+    describe "when a block is given" do
+      it "displays diff options to the user" do
+        $stdout.should_receive(:print).with('Overwrite foo? (enter "h" for help) [Ynaqdh] ')
+        $stdin.should_receive(:gets).and_return('s')
+        shell.file_collision('foo'){ }
+      end
+
+      it "invokes the diff command" do
+        $stdout.stub!(:print)
+        $stdin.should_receive(:gets).and_return('d')
+        $stdin.should_receive(:gets).and_return('n')
+        shell.should_receive(:system).with(/diff -u/)
+        capture(:stdout) { shell.file_collision('foo'){ } }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/shell/color_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/shell/color_spec.rb
new file mode 100644
index 0000000..7822fab
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/shell/color_spec.rb
@@ -0,0 +1,95 @@
+require 'helper'
+
+describe Thor::Shell::Color do
+  def shell
+    @shell ||= Thor::Shell::Color.new
+  end
+
+  before do
+    StringIO.any_instance.stub(:tty?).and_return(true)
+  end
+
+  describe "#say" do
+    it "set the color if specified and tty?" do
+      out = capture(:stdout) do
+        shell.say "Wow! Now we have colors!", :green
+      end
+
+      expect(out.chomp).to eq("\e[32mWow! Now we have colors!\e[0m")
+    end
+
+    it "does not set the color if output is not a tty" do
+      out = capture(:stdout) do
+        $stdout.should_receive(:tty?).and_return(false)
+        shell.say "Wow! Now we have colors!", :green
+      end
+
+      expect(out.chomp).to eq("Wow! Now we have colors!")
+    end
+
+    it "does not use a new line even with colors" do
+      out = capture(:stdout) do
+        shell.say "Wow! Now we have colors! ", :green
+      end
+
+      expect(out.chomp).to eq("\e[32mWow! Now we have colors! \e[0m")
+    end
+
+    it "handles an Array of colors" do
+      out = capture(:stdout) do
+        shell.say "Wow! Now we have colors *and* background colors", [:green, :on_red, :bold]
+      end
+
+      expect(out.chomp).to eq("\e[32m\e[41m\e[1mWow! Now we have colors *and* background colors\e[0m")
+    end
+  end
+
+  describe "#say_status" do
+    it "uses color to say status" do
+      out = capture(:stdout) do
+        shell.say_status :conflict, "README", :red
+      end
+
+      expect(out.chomp).to eq("\e[1m\e[31m    conflict\e[0m  README")
+    end
+  end
+
+  describe "#set_color" do
+    it "colors a string with a foreground color" do
+      red = shell.set_color "hi!", :red
+      expect(red).to eq("\e[31mhi!\e[0m")
+    end
+
+    it "colors a string with a background color" do
+      on_red = shell.set_color "hi!", :white, :on_red
+      expect(on_red).to eq("\e[37m\e[41mhi!\e[0m")
+    end
+
+    it "colors a string with a bold color" do
+      bold = shell.set_color "hi!", :white, true
+      expect(bold).to eq("\e[1m\e[37mhi!\e[0m")
+
+      bold = shell.set_color "hi!", :white, :bold
+      expect(bold).to eq("\e[37m\e[1mhi!\e[0m")
+
+      bold = shell.set_color "hi!", :white, :on_red, :bold
+      expect(bold).to eq("\e[37m\e[41m\e[1mhi!\e[0m")
+    end
+  end
+
+  describe "#file_collision" do
+    describe "when a block is given" do
+      it "invokes the diff command" do
+        $stdout.stub!(:print)
+        $stdout.stub!(:tty?).and_return(true)
+        $stdin.should_receive(:gets).and_return('d')
+        $stdin.should_receive(:gets).and_return('n')
+
+        output = capture(:stdout) { shell.file_collision('spec/fixtures/doc/README'){ "README\nEND\n" } }
+        expect(output).to match(/\e\[31m\- __start__\e\[0m/)
+        expect(output).to match(/^  README/)
+        expect(output).to match(/\e\[32m\+ END\e\[0m/)
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/shell/html_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/shell/html_spec.rb
new file mode 100644
index 0000000..b32f72c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/shell/html_spec.rb
@@ -0,0 +1,32 @@
+require 'helper'
+
+describe Thor::Shell::HTML do
+  def shell
+    @shell ||= Thor::Shell::HTML.new
+  end
+
+  describe "#say" do
+    it "set the color if specified" do
+      out = capture(:stdout) { shell.say "Wow! Now we have colors!", :green }
+      expect(out.chomp).to eq('<span style="color: green;">Wow! Now we have colors!</span>')
+    end
+
+    it "sets bold if specified" do
+      out = capture(:stdout) { shell.say "Wow! Now we have colors *and* bold!", [:green, :bold] }
+      expect(out.chomp).to eq('<span style="color: green; font-weight: bold;">Wow! Now we have colors *and* bold!</span>')
+    end
+
+    it "does not use a new line even with colors" do
+      out = capture(:stdout) { shell.say "Wow! Now we have colors! ", :green }
+      expect(out.chomp).to eq('<span style="color: green;">Wow! Now we have colors! </span>')
+    end
+  end
+
+  describe "#say_status" do
+    it "uses color to say status" do
+      $stdout.should_receive(:puts).with('<span style="color: red; font-weight: bold;">    conflict</span>  README')
+      shell.say_status :conflict, "README", :red
+    end
+  end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/shell_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/shell_spec.rb
new file mode 100644
index 0000000..7ee9c47
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/shell_spec.rb
@@ -0,0 +1,47 @@
+require 'helper'
+
+describe Thor::Shell do
+  def shell
+    @shell ||= Thor::Base.shell.new
+  end
+
+  describe "#initialize" do
+    it "sets shell value" do
+      base = MyCounter.new [1, 2], { }, :shell => shell
+      expect(base.shell).to eq(shell)
+    end
+
+    it "sets the base value on the shell if an accessor is available" do
+      base = MyCounter.new [1, 2], { }, :shell => shell
+      expect(shell.base).to eq(base)
+    end
+  end
+
+  describe "#shell" do
+    it "returns the shell in use" do
+      expect(MyCounter.new([1,2]).shell).to be_kind_of(Thor::Base.shell)
+    end
+
+    it "uses $THOR_SHELL" do
+      class Thor::Shell::TestShell < Thor::Shell::Basic; end
+
+      expect(Thor::Base.shell).to eq(shell.class)
+      ENV['THOR_SHELL'] = 'TestShell'
+      Thor::Base.shell = nil
+      expect(Thor::Base.shell).to eq(Thor::Shell::TestShell)
+      ENV['THOR_SHELL'] = ''
+      Thor::Base.shell = shell.class
+      expect(Thor::Base.shell).to eq(shell.class)
+    end
+  end
+
+  describe "with_padding" do
+    it "uses padding for inside block outputs" do
+      base = MyCounter.new([1,2])
+      base.with_padding do
+        expect(capture(:stdout) { base.say_status :padding, "cool" }.strip).to eq("padding    cool")
+      end
+    end
+  end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/subcommand_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/subcommand_spec.rb
new file mode 100644
index 0000000..721fedb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/subcommand_spec.rb
@@ -0,0 +1,30 @@
+require 'helper'
+
+describe Thor do
+
+  describe "#subcommand" do
+
+    it "maps a given subcommand to another Thor subclass" do
+      barn_help = capture(:stdout) { Scripts::MyDefaults.start(%w[barn]) }
+      expect(barn_help).to include("barn help [COMMAND]  # Describe subcommands or one specific subcommand")
+    end
+
+    it "passes commands to subcommand classes" do
+      expect(capture(:stdout) { Scripts::MyDefaults.start(%w[barn open]) }.strip).to eq("Open sesame!")
+    end
+
+    it "passes arguments to subcommand classes" do
+      expect(capture(:stdout) { Scripts::MyDefaults.start(%w[barn open shotgun]) }.strip).to eq("That's going to leave a mark.")
+    end
+
+    it "ignores unknown options (the subcommand class will handle them)" do
+      expect(capture(:stdout) { Scripts::MyDefaults.start(%w[barn paint blue --coats 4])}.strip).to eq("4 coats of blue paint")
+    end
+
+    it "passes parsed options to subcommands" do
+      output = capture(:stdout) { TestSubcommands::Parent.start(%w[sub print_opt --opt output]) }
+      expect(output).to eq("output")
+    end
+  end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/thor_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/thor_spec.rb
new file mode 100644
index 0000000..1bc484e
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/thor_spec.rb
@@ -0,0 +1,491 @@
+require 'helper'
+
+describe Thor do
+  describe "#method_option" do
+    it "sets options to the next method to be invoked" do
+      args = ["foo", "bar", "--force"]
+      arg, options = MyScript.start(args)
+      expect(options).to eq({ "force" => true })
+    end
+
+    describe ":lazy_default" do
+      it "is absent when option is not specified" do
+        arg, options = MyScript.start(["with_optional"])
+        expect(options).to eq({})
+      end
+
+      it "sets a default that can be overridden for strings" do
+        arg, options = MyScript.start(["with_optional", "--lazy"])
+        expect(options).to eq({ "lazy" => "yes" })
+
+        arg, options = MyScript.start(["with_optional", "--lazy", "yesyes!"])
+        expect(options).to eq({ "lazy" => "yesyes!" })
+      end
+
+      it "sets a default that can be overridden for numerics" do
+        arg, options = MyScript.start(["with_optional", "--lazy-numeric"])
+        expect(options).to eq({ "lazy_numeric" => 42 })
+
+        arg, options = MyScript.start(["with_optional", "--lazy-numeric", 20000])
+        expect(options).to eq({ "lazy_numeric" => 20000 })
+      end
+
+      it "sets a default that can be overridden for arrays" do
+        arg, options = MyScript.start(["with_optional", "--lazy-array"])
+        expect(options).to eq({ "lazy_array" => %w[eat at joes] })
+
+        arg, options = MyScript.start(["with_optional", "--lazy-array", "hello", "there"])
+        expect(options).to eq({ "lazy_array" => %w[hello there] })
+      end
+
+      it "sets a default that can be overridden for hashes" do
+        arg, options = MyScript.start(["with_optional", "--lazy-hash"])
+        expect(options).to eq({ "lazy_hash" => {'swedish' => 'meatballs'} })
+
+        arg, options = MyScript.start(["with_optional", "--lazy-hash", "polish:sausage"])
+        expect(options).to eq({ "lazy_hash" => {'polish' => 'sausage'} })
+      end
+    end
+
+    describe "when :for is supplied" do
+      it "updates an already defined command" do
+        args, options = MyChildScript.start(["animal", "horse", "--other=fish"])
+        expect(options[:other]).to eq("fish")
+      end
+
+      describe "and the target is on the parent class" do
+        it "updates an already defined command" do
+          args = ["example_default_command", "my_param", "--new-option=verified"]
+          options = Scripts::MyScript.start(args)
+          expect(options[:new_option]).to eq("verified")
+        end
+
+        it "adds a command to the command list if the updated command is on the parent class" do
+          expect(Scripts::MyScript.commands["example_default_command"]).to be
+        end
+
+        it "clones the parent command" do
+          expect(Scripts::MyScript.commands["example_default_command"]).not_to eq(MyChildScript.commands["example_default_command"])
+        end
+      end
+    end
+  end
+
+  describe "#default_command" do
+    it "sets a default command" do
+      expect(MyScript.default_command).to eq("example_default_command")
+    end
+
+    it "invokes the default command if no command is specified" do
+      expect(MyScript.start([])).to eq("default command")
+    end
+
+    it "invokes the default command if no command is specified even if switches are given" do
+      expect(MyScript.start(["--with", "option"])).to eq({"with"=>"option"})
+    end
+
+    it "inherits the default command from parent" do
+      expect(MyChildScript.default_command).to eq("example_default_command")
+    end
+  end
+
+  describe "#stop_on_unknown_option!" do
+    my_script = Class.new(Thor) do
+      class_option "verbose",   :type => :boolean
+      class_option "mode",      :type => :string
+
+      stop_on_unknown_option! :exec
+
+      desc "exec", "Run a command"
+      def exec(*args)
+        return options, args
+      end
+
+      desc "boring", "An ordinary command"
+      def boring(*args)
+        return options, args
+      end
+    end
+
+    it "passes remaining args to command when it encounters a non-option" do
+      expect(my_script.start(%w[exec command --verbose])).to eq [{}, ["command", "--verbose"]]
+    end
+
+    it "passes remaining args to command when it encounters an unknown option" do
+      expect(my_script.start(%w[exec --foo command --bar])).to eq [{}, ["--foo", "command", "--bar"]]
+    end
+
+    it "still accepts options that are given before non-options" do
+      expect(my_script.start(%w[exec --verbose command --foo])).to eq [{"verbose" => true}, ["command", "--foo"]]
+    end
+
+    it "still accepts options that require a value" do
+      expect(my_script.start(%w[exec --mode rashly command])).to eq [{"mode" => "rashly"}, ["command"]]
+    end
+
+    it "still passes everything after -- to command" do
+      expect(my_script.start(%w[exec -- --verbose])).to eq [{}, ["--verbose"]]
+    end
+
+    it "does not affect ordinary commands"  do
+      expect(my_script.start(%w[boring command --verbose])).to eq [{"verbose" => true}, ["command"]]
+    end
+
+    context "when provided with multiple command names" do
+      klass = Class.new(Thor) do
+        stop_on_unknown_option! :foo, :bar
+      end
+      it "affects all specified commands" do
+        expect(klass.stop_on_unknown_option?(mock :name => "foo")).to be_true
+        expect(klass.stop_on_unknown_option?(mock :name => "bar")).to be_true
+        expect(klass.stop_on_unknown_option?(mock :name => "baz")).to be_false
+      end
+    end
+
+    context "when invoked several times" do
+      klass = Class.new(Thor) do
+        stop_on_unknown_option! :foo
+        stop_on_unknown_option! :bar
+      end
+      it "affects all specified commands" do
+        expect(klass.stop_on_unknown_option?(mock :name => "foo")).to be_true
+        expect(klass.stop_on_unknown_option?(mock :name => "bar")).to be_true
+        expect(klass.stop_on_unknown_option?(mock :name => "baz")).to be_false
+      end
+    end
+  end
+
+  describe "#map" do
+    it "calls the alias of a method if one is provided" do
+      expect(MyScript.start(["-T", "fish"])).to eq(["fish"])
+    end
+
+    it "calls the alias of a method if several are provided via .map" do
+      expect(MyScript.start(["-f", "fish"])).to eq(["fish", {}])
+      expect(MyScript.start(["--foo", "fish"])).to eq(["fish", {}])
+    end
+
+    it "inherits all mappings from parent" do
+      expect(MyChildScript.default_command).to eq("example_default_command")
+    end
+  end
+
+  describe "#package_name" do
+    it "provides a proper description for a command when the package_name is assigned" do
+      content = capture(:stdout) { PackageNameScript.start(["help"]) }
+      expect(content).to match(/Baboon commands:/m)
+    end
+
+    # TODO: remove this, might be redundant, just wanted to prove full coverage
+    it "provides a proper description for a command when the package_name is NOT assigned" do
+      content = capture(:stdout) { MyScript.start(["help"]) }
+      expect(content).to match(/Commands:/m)
+    end
+  end
+
+  describe "#desc" do
+    it "provides description for a command" do
+      content = capture(:stdout) { MyScript.start(["help"]) }
+      expect(content).to match(/thor my_script:zoo\s+# zoo around/m)
+    end
+
+    it "provides no namespace if $thor_runner is false" do
+      begin
+        $thor_runner = false
+        content = capture(:stdout) { MyScript.start(["help"]) }
+        expect(content).to match(/thor zoo\s+# zoo around/m)
+      ensure
+        $thor_runner = true
+      end
+    end
+
+    describe "when :for is supplied" do
+      it "overwrites a previous defined command" do
+        expect(capture(:stdout) { MyChildScript.start(["help"]) }).to match(/animal KIND \s+# fish around/m)
+      end
+    end
+
+    describe "when :hide is supplied" do
+      it "does not show the command in help" do
+        expect(capture(:stdout) { MyScript.start(["help"]) }).not_to match(/this is hidden/m)
+      end
+
+      it "but the command is still invokcable not show the command in help" do
+        expect(MyScript.start(["hidden", "yesyes"])).to eq(["yesyes"])
+      end
+    end
+  end
+
+  describe "#method_options" do
+    it "sets default options if called before an initializer" do
+      options = MyChildScript.class_options
+      expect(options[:force].type).to eq(:boolean)
+      expect(options[:param].type).to eq(:numeric)
+    end
+
+    it "overwrites default options if called on the method scope" do
+      args = ["zoo", "--force", "--param", "feathers"]
+      options = MyChildScript.start(args)
+      expect(options).to eq({ "force" => true, "param" => "feathers" })
+    end
+
+    it "allows default options to be merged with method options" do
+      args = ["animal", "bird", "--force", "--param", "1.0", "--other", "tweets"]
+      arg, options = MyChildScript.start(args)
+      expect(arg).to eq('bird')
+      expect(options).to eq({ "force"=>true, "param"=>1.0, "other"=>"tweets" })
+    end
+  end
+
+  describe "#start" do
+    it "calls a no-param method when no params are passed" do
+      expect(MyScript.start(["zoo"])).to eq(true)
+    end
+
+    it "calls a single-param method when a single param is passed" do
+      expect(MyScript.start(["animal", "fish"])).to eq(["fish"])
+    end
+
+    it "does not set options in attributes" do
+      expect(MyScript.start(["with_optional", "--all"])).to eq([nil, { "all" => true }, []])
+    end
+
+    it "raises an error if the wrong number of params are provided" do
+      arity_asserter = lambda do |args, msg|
+        stderr = capture(:stderr) { Scripts::Arities.start(args) }
+        expect(stderr.strip).to eq(msg)
+      end
+      arity_asserter.call ["zero_args",    "one"         ], %Q'ERROR: thor zero_args was called with arguments ["one"]\nUsage: "thor scripts:arities:zero_args".'
+      arity_asserter.call ["one_arg"                     ], %Q'ERROR: thor one_arg was called with no arguments\nUsage: "thor scripts:arities:one_arg ARG".'
+      arity_asserter.call ["one_arg",      "one", "two"  ], %Q'ERROR: thor one_arg was called with arguments ["one", "two"]\nUsage: "thor scripts:arities:one_arg ARG".'
+      arity_asserter.call ["one_arg",      "one", "two"  ], %Q'ERROR: thor one_arg was called with arguments ["one", "two"]\nUsage: "thor scripts:arities:one_arg ARG".'
+      arity_asserter.call ["two_args",     "one"         ], %Q'ERROR: thor two_args was called with arguments ["one"]\nUsage: "thor scripts:arities:two_args ARG1 ARG2".'
+      arity_asserter.call ["optional_arg", "one", "two"  ], %Q'ERROR: thor optional_arg was called with arguments ["one", "two"]\nUsage: "thor scripts:arities:optional_arg [ARG]".'
+    end
+
+    it "raises an error if the invoked command does not exist" do
+      expect(capture(:stderr) { Amazing.start(["animal"]) }.strip).to eq('Could not find command "animal" in "amazing" namespace.')
+    end
+
+    it "calls method_missing if an unknown method is passed in" do
+      expect(MyScript.start(["unk", "hello"])).to eq([:unk, ["hello"]])
+    end
+
+    it "does not call a private method no matter what" do
+      expect(capture(:stderr) { MyScript.start(["what"]) }.strip).to eq('Could not find command "what" in "my_script" namespace.')
+    end
+
+    it "uses command default options" do
+      options = MyChildScript.start(["animal", "fish"]).last
+      expect(options).to eq({ "other" => "method default" })
+    end
+
+    it "raises when an exception happens within the command call" do
+      expect{ MyScript.start(["call_myself_with_wrong_arity"]) }.to raise_error(ArgumentError)
+    end
+
+    context "when the user enters an unambiguous substring of a command" do
+      it "invokes a command" do
+        expect(MyScript.start(["z"])).to eq(MyScript.start(["zoo"]))
+      end
+
+      it "invokes a command, even when there's an alias it resolves to the same command" do
+        expect(MyScript.start(["hi", "arg"])).to eq(MyScript.start(["hidden", "arg"]))
+      end
+
+      it "invokes an alias" do
+        expect(MyScript.start(["animal_pri"])).to eq(MyScript.start(["zoo"]))
+      end
+    end
+
+    context "when the user enters an ambiguous substring of a command" do
+      it "raises an exception that explains the ambiguity" do
+        expect{ MyScript.start(["call"]) }.to raise_error(ArgumentError, 'Ambiguous command call matches [call_myself_with_wrong_arity, call_unexistent_method]')
+      end
+
+      it "raises an exception when there is an alias" do
+        expect{ MyScript.start(["f"]) }.to raise_error(ArgumentError, 'Ambiguous command f matches [foo, fu]')
+      end
+    end
+
+  end
+
+  describe "#help" do
+    def shell
+      @shell ||= Thor::Base.shell.new
+    end
+
+    describe "on general" do
+      before do
+        @content = capture(:stdout) { MyScript.help(shell) }
+      end
+
+      it "provides useful help info for the help method itself" do
+        expect(@content).to match(/help \[COMMAND\]\s+# Describe available commands/)
+      end
+
+      it "provides useful help info for a method with params" do
+        expect(@content).to match(/animal TYPE\s+# horse around/)
+      end
+
+      it "uses the maximum terminal size to show commands" do
+        @shell.should_receive(:terminal_width).and_return(80)
+        content = capture(:stdout) { MyScript.help(shell) }
+        expect(content).to match(/aaa\.\.\.$/)
+      end
+
+      it "provides description for commands from classes in the same namespace" do
+        expect(@content).to match(/baz\s+# do some bazing/)
+      end
+
+      it "shows superclass commands" do
+        content = capture(:stdout) { MyChildScript.help(shell) }
+        expect(content).to match(/foo BAR \s+# do some fooing/)
+      end
+
+      it "shows class options information" do
+        content = capture(:stdout) { MyChildScript.help(shell) }
+        expect(content).to match(/Options\:/)
+        expect(content).to match(/\[\-\-param=N\]/)
+      end
+
+      it "injects class arguments into default usage" do
+        content = capture(:stdout) { Scripts::MyScript.help(shell) }
+        expect(content).to match(/zoo ACCESSOR \-\-param\=PARAM/)
+      end
+    end
+
+    describe "for a specific command" do
+      it "provides full help info when talking about a specific command" do
+        expect(capture(:stdout) { MyScript.command_help(shell, "foo") }).to eq(<<-END)
+Usage:
+  thor my_script:foo BAR
+
+Options:
+  [--force]  # Force to do some fooing
+
+do some fooing
+  This is more info!
+  Everyone likes more info!
+END
+      end
+
+      it "raises an error if the command can't be found" do
+        expect {
+          MyScript.command_help(shell, "unknown")
+        }.to raise_error(Thor::UndefinedCommandError, 'Could not find command "unknown" in "my_script" namespace.')
+      end
+
+      it "normalizes names before claiming they don't exist" do
+        expect(capture(:stdout) { MyScript.command_help(shell, "name-with-dashes") }).to match(/thor my_script:name-with-dashes/)
+      end
+
+      it "uses the long description if it exists" do
+        expect(capture(:stdout) { MyScript.command_help(shell, "long_description") }).to eq(<<-HELP)
+Usage:
+  thor my_script:long_description
+
+Description:
+  This is a really really really long description. Here you go. So very long.
+
+  It even has two paragraphs.
+HELP
+      end
+
+      it "doesn't assign the long description to the next command without one" do
+        expect(capture(:stdout) {
+          MyScript.command_help(shell, "name_with_dashes")
+        }).not_to match(/so very long/i)
+      end
+    end
+
+    describe "instance method" do
+      it "calls the class method" do
+        expect(capture(:stdout) { MyScript.start(["help"]) }).to match(/Commands:/)
+      end
+
+      it "calls the class method" do
+        expect(capture(:stdout) { MyScript.start(["help", "foo"]) }).to match(/Usage:/)
+      end
+    end
+  end
+
+  describe "when creating commands" do
+    it "prints a warning if a public method is created without description or usage" do
+      expect(capture(:stdout) {
+        klass = Class.new(Thor)
+        klass.class_eval "def hello_from_thor; end"
+      }).to match(/\[WARNING\] Attempted to create command "hello_from_thor" without usage or description/)
+    end
+
+    it "does not print if overwriting a previous command" do
+      expect(capture(:stdout) {
+        klass = Class.new(Thor)
+        klass.class_eval "def help; end"
+      }).to be_empty
+    end
+  end
+
+  describe "edge-cases" do
+    it "can handle boolean options followed by arguments" do
+      klass = Class.new(Thor) do
+        method_option :loud, :type => :boolean
+        desc "hi NAME", "say hi to name"
+        def hi(name)
+          name.upcase! if options[:loud]
+          "Hi #{name}"
+        end
+      end
+
+      expect(klass.start(["hi", "jose"])).to eq("Hi jose")
+      expect(klass.start(["hi", "jose", "--loud"])).to eq("Hi JOSE")
+      expect(klass.start(["hi", "--loud", "jose"])).to eq("Hi JOSE")
+    end
+
+    it "passes through unknown options" do
+      klass = Class.new(Thor) do
+        desc "unknown", "passing unknown options"
+        def unknown(*args)
+          args
+        end
+      end
+
+      expect(klass.start(["unknown", "foo", "--bar", "baz", "bat", "--bam"])).to eq(["foo", "--bar", "baz", "bat", "--bam"])
+      expect(klass.start(["unknown", "--bar", "baz"])).to eq(["--bar", "baz"])
+    end
+
+    it "does not pass through unknown options with strict args" do
+      klass = Class.new(Thor) do
+        strict_args_position!
+
+        desc "unknown", "passing unknown options"
+        def unknown(*args)
+          args
+        end
+      end
+
+      expect(klass.start(["unknown", "--bar", "baz"])).to eq([])
+      expect(klass.start(["unknown", "foo", "--bar", "baz"])).to eq(["foo"])
+    end
+
+    it "strict args works in the inheritance chain" do
+      parent = Class.new(Thor) do
+        strict_args_position!
+      end
+
+      klass = Class.new(parent) do
+        desc "unknown", "passing unknown options"
+        def unknown(*args)
+          args
+        end
+      end
+
+      expect(klass.start(["unknown", "--bar", "baz"])).to eq([])
+      expect(klass.start(["unknown", "foo", "--bar", "baz"])).to eq(["foo"])
+    end
+
+    it "send as a command name" do
+      expect(MyScript.start(["send"])).to eq(true)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/util_spec.rb b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/util_spec.rb
new file mode 100644
index 0000000..f451b53
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/spec/util_spec.rb
@@ -0,0 +1,196 @@
+require 'helper'
+
+module Thor::Util
+  def self.clear_user_home!
+    @@user_home = nil
+  end
+end
+
+describe Thor::Util do
+  describe "#find_by_namespace" do
+    it "returns 'default' if no namespace is given" do
+      expect(Thor::Util.find_by_namespace('')).to eq(Scripts::MyDefaults)
+    end
+
+    it "adds 'default' if namespace starts with :" do
+      expect(Thor::Util.find_by_namespace(':child')).to eq(Scripts::ChildDefault)
+    end
+
+    it "returns nil if the namespace can't be found" do
+      expect(Thor::Util.find_by_namespace('thor:core_ext:ordered_hash')).to be_nil
+    end
+
+    it "returns a class if it matches the namespace" do
+      expect(Thor::Util.find_by_namespace('app:broken:counter')).to eq(BrokenCounter)
+    end
+
+    it "matches classes default namespace" do
+      expect(Thor::Util.find_by_namespace('scripts:my_script')).to eq(Scripts::MyScript)
+    end
+  end
+
+  describe "#namespace_from_thor_class" do
+    it "replaces constant nesting with command namespacing" do
+      expect(Thor::Util.namespace_from_thor_class("Foo::Bar::Baz")).to eq("foo:bar:baz")
+    end
+
+    it "snake-cases component strings" do
+      expect(Thor::Util.namespace_from_thor_class("FooBar::BarBaz::BazBoom")).to eq("foo_bar:bar_baz:baz_boom")
+    end
+
+    it "accepts class and module objects" do
+      expect(Thor::Util.namespace_from_thor_class(Thor::CoreExt::OrderedHash)).to eq("thor:core_ext:ordered_hash")
+      expect(Thor::Util.namespace_from_thor_class(Thor::Util)).to eq("thor:util")
+    end
+
+    it "removes Thor::Sandbox namespace" do
+      expect(Thor::Util.namespace_from_thor_class("Thor::Sandbox::Package")).to eq("package")
+    end
+  end
+
+  describe "#namespaces_in_content" do
+    it "returns an array of names of constants defined in the string" do
+      list = Thor::Util.namespaces_in_content("class Foo; class Bar < Thor; end; end; class Baz; class Bat; end; end")
+      expect(list).to include("foo:bar")
+      expect(list).not_to include("bar:bat")
+    end
+
+    it "doesn't put the newly-defined constants in the enclosing namespace" do
+      Thor::Util.namespaces_in_content("class Blat; end")
+      expect(defined?(Blat)).not_to be
+      expect(defined?(Thor::Sandbox::Blat)).to be
+    end
+  end
+
+  describe "#snake_case" do
+    it "preserves no-cap strings" do
+      expect(Thor::Util.snake_case("foo")).to eq("foo")
+      expect(Thor::Util.snake_case("foo_bar")).to eq("foo_bar")
+    end
+
+    it "downcases all-caps strings" do
+      expect(Thor::Util.snake_case("FOO")).to eq("foo")
+      expect(Thor::Util.snake_case("FOO_BAR")).to eq("foo_bar")
+    end
+
+    it "downcases initial-cap strings" do
+      expect(Thor::Util.snake_case("Foo")).to eq("foo")
+    end
+
+    it "replaces camel-casing with underscores" do
+      expect(Thor::Util.snake_case("FooBarBaz")).to eq("foo_bar_baz")
+      expect(Thor::Util.snake_case("Foo_BarBaz")).to eq("foo_bar_baz")
+    end
+
+    it "places underscores between multiple capitals" do
+      expect(Thor::Util.snake_case("ABClass")).to eq("a_b_class")
+    end
+  end
+
+  describe "#find_class_and_command_by_namespace" do
+    it "returns a Thor::Group class if full namespace matches" do
+      expect(Thor::Util.find_class_and_command_by_namespace("my_counter")).to eq([MyCounter, nil])
+    end
+
+    it "returns a Thor class if full namespace matches" do
+      expect(Thor::Util.find_class_and_command_by_namespace("thor")).to eq([Thor, nil])
+    end
+
+    it "returns a Thor class and the command name" do
+      expect(Thor::Util.find_class_and_command_by_namespace("thor:help")).to eq([Thor, "help"])
+    end
+
+    it "falls back in the namespace:command look up even if a full namespace does not match" do
+      Thor.const_set(:Help, Module.new)
+      expect(Thor::Util.find_class_and_command_by_namespace("thor:help")).to eq([Thor, "help"])
+      Thor.send :remove_const, :Help
+    end
+
+    it "falls back on the default namespace class if nothing else matches" do
+      expect(Thor::Util.find_class_and_command_by_namespace("test")).to eq([Scripts::MyDefaults, "test"])
+    end
+  end
+
+  describe "#thor_classes_in" do
+    it "returns thor classes inside the given class" do
+      expect(Thor::Util.thor_classes_in(MyScript)).to eq([MyScript::AnotherScript])
+      expect(Thor::Util.thor_classes_in(MyScript::AnotherScript)).to be_empty
+    end
+  end
+
+  describe "#user_home" do
+    before do
+      ENV.stub!(:[])
+      Thor::Util.clear_user_home!
+    end
+
+    it "returns the user path if none variable is set on the environment" do
+      expect(Thor::Util.user_home).to eq(File.expand_path("~"))
+    end
+
+    it "returns the *unix system path if file cannot be expanded and separator does not exist" do
+      File.should_receive(:expand_path).with("~").and_raise(RuntimeError)
+      previous_value = File::ALT_SEPARATOR
+      capture(:stderr){ File.const_set(:ALT_SEPARATOR, false) }
+      expect(Thor::Util.user_home).to eq("/")
+      capture(:stderr){ File.const_set(:ALT_SEPARATOR, previous_value) }
+    end
+
+    it "returns the windows system path if file cannot be expanded and a separator exists" do
+      File.should_receive(:expand_path).with("~").and_raise(RuntimeError)
+      previous_value = File::ALT_SEPARATOR
+      capture(:stderr){ File.const_set(:ALT_SEPARATOR, true) }
+      expect(Thor::Util.user_home).to eq("C:/")
+      capture(:stderr){ File.const_set(:ALT_SEPARATOR, previous_value) }
+    end
+
+    it "returns HOME/.thor if set" do
+      ENV.stub!(:[]).with("HOME").and_return("/home/user/")
+      expect(Thor::Util.user_home).to eq("/home/user/")
+    end
+
+    it "returns path with HOMEDRIVE and HOMEPATH if set" do
+      ENV.stub!(:[]).with("HOMEDRIVE").and_return("D:/")
+      ENV.stub!(:[]).with("HOMEPATH").and_return("Documents and Settings/James")
+      expect(Thor::Util.user_home).to eq("D:/Documents and Settings/James")
+    end
+
+    it "returns APPDATA/.thor if set" do
+      ENV.stub!(:[]).with("APPDATA").and_return("/home/user/")
+      expect(Thor::Util.user_home).to eq("/home/user/")
+    end
+  end
+
+  describe "#thor_root_glob" do
+    before do
+      ENV.stub!(:[])
+      Thor::Util.clear_user_home!
+    end
+
+    it "escapes globs in path" do
+      ENV.stub!(:[]).with("HOME").and_return("/home/user{1}/")
+      Dir.should_receive(:[]).with("/home/user\\{1\\}/.thor/*").and_return([])
+      expect(Thor::Util.thor_root_glob).to eq([])
+    end
+  end
+
+  describe "#globs_for" do
+    it "escapes globs in path" do
+      expect(Thor::Util.globs_for("/home/apps{1}")).to eq([
+        "/home/apps\\{1\\}/Thorfile",
+        "/home/apps\\{1\\}/*.thor",
+        "/home/apps\\{1\\}/tasks/*.thor",
+        "/home/apps\\{1\\}/lib/tasks/*.thor"
+      ])
+    end
+  end
+
+  describe "#escape_globs" do
+    it "escapes ? * { } [ ] glob characters" do
+      expect(Thor::Util.escape_globs("apps?")).to eq("apps\\?")
+      expect(Thor::Util.escape_globs("apps*")).to eq("apps\\*")
+      expect(Thor::Util.escape_globs("apps {1}")).to eq("apps \\{1\\}")
+      expect(Thor::Util.escape_globs("apps [1]")).to eq("apps \\[1\\]")
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/thor-0.18.1/thor.gemspec b/.bundle/ruby/2.0.0/gems/thor-0.18.1/thor.gemspec
new file mode 100644
index 0000000..3124644
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/thor-0.18.1/thor.gemspec
@@ -0,0 +1,24 @@
+# coding: utf-8
+lib = File.expand_path('../lib/', __FILE__)
+$:.unshift lib unless $:.include?(lib)
+require 'thor/version'
+
+Gem::Specification.new do |spec|
+  spec.add_development_dependency 'bundler', '~> 1.0'
+  spec.authors = ['Yehuda Katz', 'José Valim']
+  spec.description = %q{A scripting framework that replaces rake, sake and rubigen}
+  spec.email = 'ruby-thor at googlegroups.com'
+  spec.executables = %w(thor)
+  spec.files = %w(.document CHANGELOG.md LICENSE.md README.md Thorfile thor.gemspec)
+  spec.files += Dir.glob("bin/**/*")
+  spec.files += Dir.glob("lib/**/*.rb")
+  spec.files += Dir.glob("spec/**/*")
+  spec.homepage = 'http://whatisthor.com/'
+  spec.licenses = ['MIT']
+  spec.name = 'thor'
+  spec.require_paths = ['lib']
+  spec.required_rubygems_version = '>= 1.3.6'
+  spec.summary = spec.description
+  spec.test_files = Dir.glob("spec/**/*")
+  spec.version = Thor::VERSION
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/CHANGELOG.md b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/CHANGELOG.md
new file mode 100644
index 0000000..23f3fdb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/CHANGELOG.md
@@ -0,0 +1,44 @@
+## master
+
+## 1.4.1 (2013-05-08)
+
+* Support Arrays in pre/postambles (#193, jbwiv)
+
+## 1.4.0 (2013-05-01)
+
+* Better encoding support
+
+## 1.3.7 (2013-04-09)
+
+* Erubis: Check for the correct constant (#183, mattwildig)
+* Don't fail when BasicObject is defined in 1.8 (#182, technobrat, judofyr)
+
+## 1.3.6 (2013-03-17)
+
+* Accept Hash that implements #path as options (#180, lawso017)
+* Changed extension for CsvTemplate from '.csv' to '.rcsv' (#177, alexgb)
+
+## 1.3.5 (2013-03-06)
+
+* Fixed extension for PlainTemplate (judofyr)
+* Improved local variables regexp (#174, razorinc)
+* Added CHANGELOG.md
+
+## 1.3.4 (2013-02-28)
+
+* Support RDoc 4.0 (#168, judofyr)
+* Add mention of Org-Mode support (#165, aslakknutsen)
+* Add AsciiDoctorTemplate (#163, #164, aslakknutsen)
+* Add PlainTextTemplate (nathanaeljones)
+* Restrict locals to valid variable names (#158, thinkerbot)
+* ERB: Improve trim mode support (#156, ssimeonov)
+* Add CSVTemplate (#153, alexgb)
+* Remove special case for 1.9.1 (#147, guilleiguaran)
+* Add allows\_script? method to Template (#143, bhollis)
+* Default to using Redcarpet2 (#139, DAddYE)
+* Allow File/Tempfile as filenames (#134, jamesotron)
+* Add EtanniTemplate (#131, manveru)
+* Support RDoc 3.10 (#112, timfel)
+* Always compile templates; remove old source evaluator (rtomayko)
+* Less: Options are now being passed to the parser (#106, cowboyd)
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/COPYING b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/COPYING
new file mode 100644
index 0000000..2f99dc1
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/COPYING
@@ -0,0 +1,18 @@
+Copyright (c) 2010 Ryan Tomayko <http://tomayko.com/about>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/Gemfile b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/Gemfile
new file mode 100644
index 0000000..dd73064
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/Gemfile
@@ -0,0 +1,32 @@
+source "http://rubygems.org"
+
+gem 'rake'
+gem 'asciidoctor', '>= 0.1.0'
+gem 'builder'
+gem 'coffee-script'
+gem 'contest'
+gem 'creole'
+gem 'erubis'
+gem 'haml', '>= 2.2.11', '< 4'
+gem 'kramdown'
+gem 'less'
+gem 'liquid'
+gem 'markaby'
+gem 'maruku'
+gem 'nokogiri'
+gem 'radius'
+gem 'sass'
+gem 'wikicloth'
+gem 'rdoc', (ENV['RDOC_VERSION'] || '> 0')
+
+platform :ruby do
+  gem 'yajl-ruby'
+  gem 'redcarpet'
+  gem 'rdiscount' if RUBY_VERSION != '1.9.2'
+  gem 'RedCloth'
+end
+
+platform :mri do
+  gem 'therubyracer'
+  gem 'bluecloth'
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/HACKING b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/HACKING
new file mode 100644
index 0000000..46e35f6
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/HACKING
@@ -0,0 +1,16 @@
+Clone:
+
+    git clone git://github.com/rtomayko/tilt.git
+    cd tilt
+
+Install needed packages under ./vendor and run tests (requires bundler):
+
+    rake
+
+Run tests under your current gem environment. Do not install anything:
+
+    rake test
+
+Only install needed packages under ./vendor:
+
+    rake setup
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/README.md b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/README.md
new file mode 100644
index 0000000..19a89ac
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/README.md
@@ -0,0 +1,232 @@
+Tilt [![Build Status](https://secure.travis-ci.org/rtomayko/tilt.png)](http://travis-ci.org/rtomayko/tilt) [![Dependency Status](https://gemnasium.com/rtomayko/tilt.png)](https://gemnasium.com/rtomayko/tilt)
+====
+
+Tilt is a thin interface over a bunch of different Ruby template engines in
+an attempt to make their usage as generic possible. This is useful for web
+frameworks, static site generators, and other systems that support multiple
+template engines but don't want to code for each of them individually.
+
+The following features are supported for all template engines (assuming the
+feature is relevant to the engine):
+
+ * Custom template evaluation scopes / bindings
+ * Ability to pass locals to template evaluation
+ * Support for passing a block to template evaluation for "yield"
+ * Backtraces with correct filenames and line numbers
+ * Template file caching and reloading
+ * Fast, method-based template source compilation
+
+The primary goal is to get all of the things listed above right for all
+template engines included in the distribution.
+
+Support for these template engines is included with the package:
+
+    ENGINE                     FILE EXTENSIONS         REQUIRED LIBRARIES
+    -------------------------- ----------------------- ----------------------------
+    Asciidoctor                .ad, .adoc, .asciidoc   asciidoctor (>= 0.1.0)
+    ERB                        .erb, .rhtml            none (included ruby stdlib)
+    Interpolated String        .str                    none (included ruby core)
+    Erubis                     .erb, .rhtml, .erubis   erubis
+    Haml                       .haml                   haml
+    Sass                       .sass                   haml (< 3.1) or sass (>= 3.1)
+    Scss                       .scss                   haml (< 3.1) or sass (>= 3.1)
+    Less CSS                   .less                   less
+    Builder                    .builder                builder
+    Liquid                     .liquid                 liquid
+    RDiscount                  .markdown, .mkd, .md    rdiscount
+    Redcarpet                  .markdown, .mkd, .md    redcarpet
+    BlueCloth                  .markdown, .mkd, .md    bluecloth
+    Kramdown                   .markdown, .mkd, .md    kramdown
+    Maruku                     .markdown, .mkd, .md    maruku
+    RedCloth                   .textile                redcloth
+    RDoc                       .rdoc                   rdoc
+    Radius                     .radius                 radius
+    Markaby                    .mab                    markaby
+    Nokogiri                   .nokogiri               nokogiri
+    CoffeeScript               .coffee                 coffee-script (+ javascript)
+    Creole (Wiki markup)       .wiki, .creole          creole
+    WikiCloth (Wiki markup)    .wiki, .mediawiki, .mw  wikicloth
+    Yajl                       .yajl                   yajl-ruby
+    CSV                        .rcsv                   none (Ruby >= 1.9), fastercsv (Ruby < 1.9)
+
+These template engines ship with their own Tilt integration:
+
+    ENGINE                     FILE EXTENSIONS   REQUIRED LIBRARIES
+    -------------------------- ----------------- ----------------------------
+    Slim                       .slim             slim (>= 0.7)
+    Embedded JavaScript                          sprockets
+    Embedded CoffeeScript                        sprockets
+    JST                                          sprockets
+    Org-mode                   .org              org-ruby (>= 0.6.2)
+
+See [TEMPLATES.md][t] for detailed information on template engine
+options and supported features.
+
+[t]: http://github.com/rtomayko/tilt/blob/master/TEMPLATES.md
+   "Tilt Template Engine Documentation"
+
+Basic Usage
+-----------
+
+Instant gratification:
+
+    require 'erb'
+    require 'tilt'
+    template = Tilt.new('templates/foo.erb')
+    => #<Tilt::ERBTemplate @file="templates/foo.rb" ...>
+    output = template.render
+    => "Hello world!"
+
+It's recommended that calling programs explicitly require template engine
+libraries (like 'erb' above) at load time. Tilt attempts to lazy require the
+template engine library the first time a template is created but this is
+prone to error in threaded environments.
+
+The `Tilt` module contains generic implementation classes for all supported
+template engines. Each template class adheres to the same interface for
+creation and rendering. In the instant gratification example, we let Tilt
+determine the template implementation class based on the filename, but
+`Tilt::Template` implementations can also be used directly:
+
+    template = Tilt::HamlTemplate.new('templates/foo.haml')
+    output = template.render
+
+The `render` method takes an optional evaluation scope and locals hash
+arguments. Here, the template is evaluated within the context of the
+`Person` object with locals `x` and `y`:
+
+    template = Tilt::ERBTemplate.new('templates/foo.erb')
+    joe = Person.find('joe')
+    output = template.render(joe, :x => 35, :y => 42)
+
+If no scope is provided, the template is evaluated within the context of an
+object created with `Object.new`.
+
+A single `Template` instance's `render` method may be called multiple times
+with different scope and locals arguments. Continuing the previous example,
+we render the same compiled template but this time in jane's scope:
+
+    jane = Person.find('jane')
+    output = template.render(jane, :x => 22, :y => nil)
+
+Blocks can be passed to `render` for templates that support running
+arbitrary ruby code (usually with some form of `yield`). For instance,
+assuming the following in `foo.erb`:
+
+    Hey <%= yield %>!
+
+The block passed to `render` is called on `yield`:
+
+    template = Tilt::ERBTemplate.new('foo.erb')
+    template.render { 'Joe' }
+    # => "Hey Joe!"
+
+Template Mappings
+-----------------
+
+The `Tilt` module includes methods for associating template implementation
+classes with filename patterns and for locating/instantiating template
+classes based on those associations.
+
+The `Tilt::register` method associates a filename pattern with a specific
+template implementation. To use ERB for files ending in a `.bar` extension:
+
+     >> Tilt.register Tilt::ERBTemplate, 'bar'
+     >> Tilt.new('views/foo.bar')
+     => #<Tilt::ERBTemplate @file="views/foo.bar" ...>
+
+Retrieving the template class for a file or file extension:
+
+     >> Tilt['foo.bar']
+     => Tilt::ERBTemplate
+     >> Tilt['haml']
+     => Tilt::HamlTemplate
+
+It's also possible to register template file mappings that are more specific
+than a file extension. To use Erubis for `bar.erb` but ERB for all other `.erb`
+files:
+
+     >> Tilt.register Tilt::ErubisTemplate, 'bar.erb'
+     >> Tilt.new('views/foo.erb')
+     => Tilt::ERBTemplate
+     >> Tilt.new('views/bar.erb')
+     => Tilt::ErubisTemplate
+
+The template class is determined by searching for a series of decreasingly
+specific name patterns. When creating a new template with
+`Tilt.new('views/foo.html.erb')`, we check for the following template
+mappings:
+
+  1. `views/foo.html.erb`
+  2. `foo.html.erb`
+  3. `html.erb`
+  4. `erb`
+
+### Fallback mode
+
+If there are more than one template class registered for a file extension, Tilt
+will automatically try to load the version that works on your machine:
+
+  1. If any of the template engines has been loaded already: Use that one.
+  2. If not, it will try to initialize each of the classes with an empty template.
+  3. Tilt will use the first that doesn't raise an exception.
+  4. If however *all* of them failed, Tilt will raise the exception of the first
+     template engine, since that was the most preferred one.
+
+Template classes that were registered *last* would be tried first. Because the
+Markdown extensions are registered like this:
+
+    Tilt.register Tilt::BlueClothTemplate, 'md'
+    Tilt.register Tilt::RDiscountTemplate, 'md'
+
+Tilt will first try RDiscount and then BlueCloth. You could say that RDiscount
+has a *higher priority* than BlueCloth.
+
+The fallback mode works nicely when you just need to render an ERB or Markdown
+template, but if you depend on a specific implementation, you should use #prefer:
+
+    # Prefer BlueCloth for all its registered extensions (markdown, mkd, md)
+    Tilt.prefer Tilt::BlueClothTemplate
+
+    # Prefer Erubis for .erb only:
+    Tilt.prefer Tilt::ErubisTemplate, 'erb'
+
+When a file extension has a preferred template class, Tilt will *always* use
+that class, even if it raises an exception.
+
+Encodings
+---------
+
+Tilt needs to know the encoding of the template in order to work properly:
+
+Tilt will use `Encoding.default_external` as the encoding when reading external
+files. If you're mostly working with one encoding (e.g. UTF-8) we *highly*
+recommend setting this option. When providing a custom reader block (`Tilt.new
+{ custom_string }`) you'll have ensure the string is properly encoded yourself.
+
+Most of the template engines in Tilt also allows you to override the encoding
+using the `:default_encoding`-option:
+
+```ruby
+tmpl = Tilt.new('hello.erb', :default_encoding => 'Big5')
+```
+
+Ultimately it's up to the template engine how to handle the encoding: It might
+respect `:default_encoding`, it might always assume it's UTF-8 (like
+CoffeScript), or it can do its own encoding detection.
+
+Template Compilation
+--------------------
+
+Tilt compiles generated Ruby source code produced by template engines and reuses
+it on subsequent template invocations. Benchmarks show this yields a 5x-10x
+performance increase over evaluating the Ruby source on each invocation.
+
+Template compilation is currently supported for these template engines:
+StringTemplate, ERB, Erubis, Haml, Nokogiri, Builder and Yajl.
+
+LICENSE
+-------
+
+Tilt is Copyright (c) 2010 [Ryan Tomayko](http://tomayko.com/about) and
+distributed under the MIT license. See the `COPYING` file for more info.
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/Rakefile b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/Rakefile
new file mode 100644
index 0000000..4228b1b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/Rakefile
@@ -0,0 +1,104 @@
+require 'rbconfig'
+require 'rake/testtask'
+task :default => [:setup, :test]
+
+# set GEM_HOME to use local ./vendor dir for tests
+vendor_dir = './vendor'
+ruby_version = RbConfig::CONFIG['ruby_version']
+ruby_engine = (defined?(RUBY_ENGINE) && RUBY_ENGINE) || 'ruby'
+gem_home = ENV['GEM_HOME'] = "#{vendor_dir}/#{ruby_engine}/#{ruby_version}"
+
+# Write the current version.
+task :version do
+  puts "#{ruby_engine} #{RUBY_VERSION} (#{gem_home})"
+end
+
+desc "Install gems to #{ENV['GEM_HOME']}"
+task :setup do
+  verbose false do
+    sh "
+      bundle check >/dev/null || {
+        echo 'Updating #{gem_home}' &&
+        bundle install --path='#{vendor_dir}'; }
+    "
+  end
+end
+
+# SPECS =====================================================================
+
+desc 'Generate test coverage report'
+task :rcov do
+  sh "rcov -Ilib:test test/*_test.rb"
+end
+
+desc 'Run tests (default)'
+Rake::TestTask.new(:test) do |t|
+  t.test_files = FileList['test/*_test.rb']
+  t.ruby_opts = ['-Itest']
+  t.ruby_opts << '-rubygems' if defined? Gem
+end
+task :test => :version
+
+# PACKAGING =================================================================
+
+begin
+  require 'rubygems'
+rescue LoadError
+end
+
+if defined?(Gem)
+  SPEC = eval(File.read('tilt.gemspec'))
+
+  def package(ext='')
+    "pkg/tilt-#{SPEC.version}" + ext
+  end
+
+  desc 'Build packages'
+  task :package => %w[.gem .tar.gz].map {|e| package(e)}
+
+  desc 'Build and install as local gem'
+  task :install => package('.gem') do
+    sh "gem install #{package('.gem')}"
+  end
+
+  directory 'pkg/'
+
+  file package('.gem') => %w[pkg/ tilt.gemspec] + SPEC.files do |f|
+    sh "gem build tilt.gemspec"
+    mv File.basename(f.name), f.name
+  end
+
+  file package('.tar.gz') => %w[pkg/] + SPEC.files do |f|
+    sh "git archive --format=tar HEAD | gzip > #{f.name}"
+  end
+
+  desc 'Upload gem and tar.gz distributables to rubyforge'
+  task :release => [package('.gem'), package('.tar.gz')] do |t|
+    sh <<-SH
+      rubyforge add_release sinatra tilt #{SPEC.version} #{package('.gem')} &&
+      rubyforge add_file    sinatra tilt #{SPEC.version} #{package('.tar.gz')}
+    SH
+  end
+end
+
+# GEMSPEC ===================================================================
+
+file 'tilt.gemspec' => FileList['{lib,test}/**','Rakefile'] do |f|
+  # read version from tilt.rb
+  version = File.read('lib/tilt.rb')[/VERSION = '(.*)'/] && $1
+  # read spec file and split out manifest section
+  spec = File.
+    read(f.name).
+    sub(/s\.version\s*=\s*'.*'/, "s.version = '#{version}'")
+  parts = spec.split("  # = MANIFEST =\n")
+  # determine file list from git ls-files
+  files = `git ls-files`.
+    split("\n").sort.reject{ |file| file =~ /^\./ }.
+    map{ |file| "    #{file}" }.join("\n")
+  # piece file back together and write...
+  parts[1] = "  s.files = %w[\n#{files}\n  ]\n"
+  spec = parts.join("  # = MANIFEST =\n")
+  spec.sub!(/s.date = '.*'/, "s.date = '#{Time.now.strftime("%Y-%m-%d")}'")
+  File.open(f.name, 'w') { |io| io.write(spec) }
+  puts "updated #{f.name}"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/TEMPLATES.md b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/TEMPLATES.md
new file mode 100644
index 0000000..ac5b583
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/TEMPLATES.md
@@ -0,0 +1,516 @@
+Tilt Templates
+==============
+
+(See <https://github.com/rtomayko/tilt/blob/master/TEMPLATES.md> for a rendered,
+HTML-version of this file).
+
+While all Tilt templates use the same basic interface for template loading and
+evaluation, each varies in its capabilities and available options. Detailed
+documentation on each supported template engine is provided below.
+
+There are also some file extensions that have several implementations
+(currently ERB and Markdown). These template classes have certain features
+which are guaranteed to work across all the implementations. If you wish to be
+compatible with all of these template classes, you should only depend on the
+cross-implementation features.
+
+ * [ERB](#erb) - Generic ERB implementation (backed by erb.rb or Erubis)
+ * [erb.rb](#erbrb) - `Tilt::ERBTemplate`
+ * [Erubis](#erubis) - `Tilt::ErubisTemplate`
+ * [Haml](#haml) - `Tilt::HamlTemplate`
+ * [Liquid](#liquid) - `Tilt::LiquidTemplate`
+ * Nokogiri - `Tilt::NokogiriTemplate`
+ * Builder - `Tilt::BuilderTemplate`
+ * Markaby - `Tilt::MarkabyTemplate`
+ * [Radius](#radius) - `Tilt::RadiusTemplate`
+
+Tilt also includes support for CSS processors like [LessCSS][lesscss] and
+[Sass][sass], [CoffeeScript][coffee-script] and some simple text formats.
+
+ * Less - `Tilt::LessTemplate`
+ * Sass - `Tilt::SassTemplate`
+ * Scss - `Tilt::ScssTemplate`
+ * CoffeeScript - `Tilt::CoffeeScriptTemplate`
+ * [Textile](#redcloth) - `Tilt::RedClothTemplate`
+ * Creole - `Tilt::CreoleTemplate`
+ * [RDoc](#rdoc) - `Tilt::RDocTemplate`
+
+Tilt has extensive support for Markdown, backed by one of four different
+implementations (depending on which are available on your system):
+
+ * [Markdown](#markdown) - Generic Markdown implementation
+ * [RDiscount](#rdiscount) - `Tilt::RDiscountTemplate`
+ * Redcarpet - `Tilt::RedcarpetTemplate`
+ * BlueCloth - `Tilt::BlueClothTemplate`
+ * Kramdown - `Tilt::KramdownTemplate`
+ * Maruku - `Tilt::MarukuTemplate`
+
+<a name='erb'></a>
+ERB (`erb`, `rhtml`)
+--------------------
+
+ERB is a simple but powerful template languge for Ruby. In Tilt it's backed by
+[Erubis](#erubis) (if installed on your system) or by [erb.rb](#erbrb) (which
+is included in Ruby's standard library). This documentation applies to both
+implementations.
+
+### Example
+
+    Hello <%= world %>!
+
+### Usage
+
+ERB templates support custom evaluation scopes and locals:
+
+    >> require 'erb'
+    >> template = Tilt.new('hello.html.erb')
+    >> template.render(self, :world => 'World!')
+    => "Hello World!"
+
+Or, use `Tilt['erb']` directly to process strings:
+
+    template = Tilt['erb'].new { "Hello <%= world %>!" }
+    template.render(self, :world => 'World!')
+
+### Options
+
+#### `:trim => trim`
+
+Omits newlines and spaces around certain lines (usually those that starts with
+`<%` and ends with `%>`). There isn't a specification for how trimming in ERB
+should work, so if you need more control over the whitespace, you should use
+[erb.rb](#erbrb) or [Erubis](#erubis) directly.
+
+
+#### `:outvar => '_erbout'`
+
+The name of the variable used to accumulate template output. This can be
+any valid Ruby expression but must be assignable. By default a local
+variable named `_erbout` is used.
+
+<a name='erbrb'></a>
+erb.rb (`erb`, `rhtml`)
+-----------------------
+
+[ERB](#erb) implementation available in Ruby's standard library.
+
+All the documentation of [ERB](#erb) applies in addition to the following:
+
+### Usage
+
+The `Tilt::ERBTemplate` class is registered for all files ending in `.erb` or
+`.rhtml` by default, but with a *lower* priority than ErubisTemplate. If you
+specifically want to use ERB, it's recommended to use `#prefer`:
+
+    Tilt.prefer Tilt::ERBTemplate
+
+__NOTE:__ It's suggested that your program `require 'erb'` at load time when
+using this template engine within a threaded environment.
+
+### Options
+
+#### `:trim => true`
+
+The ERB trim mode flags. This is a string consisting of any combination of the
+following characters:
+
+  * `'>'`  omits newlines for lines ending in `>`
+  * `'<>'` omits newlines for lines starting with `<%` and ending in `%>`
+  * `'%'`  enables processing of lines beginning with `%`
+  * `true` is an alias of `<>`
+
+#### `:safe => nil`
+
+The `$SAFE` level; when set, ERB code will be run in a
+separate thread with `$SAFE` set to the provided level.
+
+#### `:outvar => '_erbout'`
+
+The name of the variable used to accumulate template output. This can be
+any valid Ruby expression but must be assignable. By default a local
+variable named `_erbout` is used.
+
+### See also
+
+  * [ERB documentation](http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html)
+
+
+<a name='erubis'></a>
+Erubis (`erb`, `rhtml`, `erubis`)
+---------------------------------
+
+[Erubis][erubis] is a fast, secure, and very extensible implementation of [ERB](#erb).
+
+All the documentation of [ERB](#erb) applies in addition to the following:
+
+### Usage
+
+The `Tilt::ErubisTemplate` class is registered for all files ending in `.erb` or
+`.rhtml` by default, but with a *higher* priority than `ERBTemplate`. If you
+specifically want to use Erubis, it's recommended to use `#prefer`:
+
+    Tilt.prefer Tilt::ErubisTemplate
+
+__NOTE:__ It's suggested that your program `require 'erubis'` at load time when
+using this template engine within a threaded environment.
+
+### Options
+
+#### `:engine_class => Erubis::Eruby`
+
+Allows you to specify a custom engine class to use instead of the
+default which is `Erubis::Eruby`.
+
+#### `:escape_html => false`
+
+When `true`, `Erubis::EscapedEruby` will be used as the engine class
+instead of the default. All content within `<%= %>` blocks will be
+automatically html escaped.
+
+#### `:outvar => '_erbout'`
+
+The name of the variable used to accumulate template output. This can be
+any valid Ruby expression but must be assignable. By default a local
+variable named `_erbout` is used.
+
+#### `:pattern => '<% %>'`
+
+Set pattern for embedded Ruby code.
+
+#### `:trim => true`
+
+Delete spaces around `<% %>`. (But, spaces around `<%= %>` are preserved.)
+
+### See also
+
+  * [Erubis Home][erubis]
+  * [Erubis User's Guide](http://www.kuwata-lab.com/erubis/users-guide.html)
+
+
+<a name='haml'></a>
+Haml (`haml`)
+-------------
+
+[Haml][haml] is a markup language that’s used to cleanly and simply describe
+the HTML of any web document without the use of inline code. Haml functions as
+a replacement for inline page templating systems such as PHP, ASP, and ERB, the
+templating language used in most Ruby on Rails applications. However, Haml
+avoids the need for explicitly coding HTML into the template, because it itself
+is a description of the HTML, with some code to generate dynamic content.
+([more](http://haml.info/about.html))
+
+
+### Example
+
+    %html
+      %head
+        %title= @title
+      %body
+        %h1
+          Hello
+          = world + '!'
+
+### Usage
+
+The `Tilt::HamlTemplate` class is registered for all files ending in `.haml`
+by default. Haml templates support custom evaluation scopes and locals:
+
+    >> require 'haml'
+    >> template = Tilt.new('hello.haml')
+    => #<Tilt::HamlTemplate @file='hello.haml'>
+    >> @title = "Hello Haml!"
+    >> template.render(self, :world => 'Haml!')
+    => "
+    <html>
+      <head>
+        <title>Hello Haml!</title>
+      </head>
+      <body>
+        <h1>Hello Haml!</h1>
+      </body>
+    </html>"
+
+Or, use the `Tilt::HamlTemplate` class directly to process strings:
+
+    >> require 'haml'
+    >> template = Tilt::HamlTemplate.new { "%h1= 'Hello Haml!'" }
+    => #<Tilt::HamlTemplate @file=nil ...>
+    >> template.render
+    => "<h1>Hello Haml!</h1>"
+
+__NOTE:__ It's suggested that your program `require 'haml'` at load time when
+using this template engine within a threaded environment.
+
+### Options
+
+Please see the [Haml Reference](http://haml.info/docs/yardoc/file.HAML_REFERENCE.html#options) for all available options.
+
+### See also
+
+  * [#haml.docs](http://haml.info/docs.html)
+  * [Haml Tutorial](http://haml.info/tutorial.html)
+  * [Haml Reference](http://haml.info/docs/yardoc/file.HAML_REFERENCE.html)
+
+
+<a name='liquid'></a>
+Liquid (`liquid`)
+-----------------
+
+[Liquid][liquid] is for rendering safe templates which cannot affect the
+security of the server they are rendered on.
+
+### Example
+
+    <html>
+      <head>
+        <title>{{ title }}</title>
+      </head>
+      <body>
+        <h1>Hello {{ world }}!</h1>
+      </body>
+    </html>
+
+### Usage
+
+`Tilt::LiquidTemplate` is registered for all files ending in `.liquid` by
+default. Liquid templates support locals and objects that respond to
+`#to_h` as scopes:
+
+    >> require 'liquid'
+    >> require 'tilt'
+    >> template = Tilt.new('hello.liquid')
+    => #<Tilt::LiquidTemplate @file='hello.liquid'>
+    >> scope = { :title => "Hello Liquid Templates" }
+    >> template.render(nil, :world => "Liquid")
+    => "
+    <html>
+      <head>
+        <title>Hello Liquid Templates</title>
+      </head>
+      <body>
+        <h1>Hello Liquid!</h1>
+      </body>
+    </html>"
+
+Or, use `Tilt::LiquidTemplate` directly to process strings:
+
+    >> require 'liquid'
+    >> template = Tilt::LiquidTemplate.new { "<h1>Hello Liquid!</h1>" }
+    => #<Tilt::LiquidTemplate @file=nil ...>
+    >> template.render
+    => "<h1>Hello Liquid!</h1>"
+
+__NOTE:__ It's suggested that your program `require 'liquid'` at load
+time when using this template engine within a threaded environment.
+
+### See also
+
+  * [Liquid for Programmers](https://wiki.github.com/Shopify/liquid/liquid-for-programmers)
+  * [Liquid Docs](http://liquid.rubyforge.org/)
+  * GitHub: [Shopify/liquid](https://github.com/Shopify/liquid/)
+
+
+<a name='radius'></a>
+Radius (`radius`)
+-----------------
+
+[Radius][radius] is the template language used by [Radiant CMS][radiant]. It is
+a tag language designed to be valid XML/HTML.
+
+### Example
+
+    <html>
+    <body>
+      <h1><r:title /></h1>
+      <ul class="<r:type />">
+      <r:repeat times="3">
+        <li><r:hello />!</li>
+      </r:repeat>
+      </ul>
+      <r:yield />
+    </body>
+    </html>
+
+### Usage
+
+To render a template such as the one above.
+
+    scope = OpenStruct.new
+    scope.title = "Radius Example"
+    scope.hello = "Hello, World!"
+
+    require 'radius'
+    template = Tilt::RadiusTemplate.new('example.radius', :tag_prefix=>'r')
+    template.render(scope, :type=>'hlist'){ "Jackpot!" }
+
+The result will be:
+
+    <html>
+    <body>
+      <h1>Radius Example</h1>
+      <ul class="hlist">
+        <li>Hello, World!</li>
+        <li>Hello, World!</li>
+        <li>Hello, World!</li>
+      </ul>
+      Jackpot!
+    </body>
+    </html>
+
+### See also
+
+  * [Radius][radius]
+  * [Radiant CMS][radiant]
+
+
+<a name='textile'></a>
+Textile (`textile`)
+-------------------
+
+Textile is a lightweight markup language originally developed by Dean Allen and
+billed as a "humane Web text generator". Textile converts its marked-up text
+input to valid, well-formed XHTML and also inserts character entity references
+for apostrophes, opening and closing single and double quotation marks,
+ellipses and em dashes.
+
+Textile formatted texts are converted to HTML with the [RedCloth][redcloth]
+engine, which is a Ruby extension written in C.
+
+### Example
+
+    h1. Hello Textile Templates
+
+    Hello World. This is a paragraph.
+
+### Usage
+
+__NOTE:__ It's suggested that your program `require 'redcloth'` at load time
+when using this template engine in a threaded environment.
+
+### See Also
+
+  * [RedCloth][redcloth]
+
+
+<a name='rdoc'></a>
+RDoc (`rdoc`)
+-------------
+
+[RDoc][rdoc] is the simple text markup system that comes with Ruby's standard
+library.
+
+### Example
+
+    = Hello RDoc Templates
+
+    Hello World. This is a paragraph.
+
+### Usage
+
+__NOTE:__ It's suggested that your program `require 'rdoc'`,
+`require 'rdoc/markup'`, and `require 'rdoc/markup/to_html'` at load time
+when using this template engine in a threaded environment.
+
+### See also
+
+ * [RDoc][rdoc]
+
+
+<a name='markdown'></a>
+Markdown (`markdown`, `md`, `mkd`)
+----------------------------------
+
+[Markdown][markdown] is a lightweight markup language, created by John Gruber
+and Aaron Swartz. For any markup that is not covered by Markdown’s syntax, HTML
+is used.  Marking up plain text with Markdown markup is easy and Markdown
+formatted texts are readable.
+
+Markdown formatted texts are converted to HTML with one of these libraries:
+
+  * [RDiscount](#rdiscount) - `Tilt::RDiscountTemplate`
+  * Redcarpet - `Tilt::RedcarpetTemplate`
+  * BlueCloth - `Tilt::BlueClothTemplate`
+  * Kramdown - `Tilt::KramdownTemplate`
+  * Maruku - `Tilt::MarukuTemplate`
+
+Tilt will use fallback mode (as documented in the README) for determining which
+library to use. RDiscount has highest priority - Maruku has lowest.
+
+### Example
+
+    Hello Markdown Templates
+    ========================
+
+    Hello World. This is a paragraph.
+
+### Usage
+
+To wrap a Markdown formatted document with a layout:
+
+    layout = Tilt['erb'].new do
+      "<!doctype html><title></title><%= yield %>"
+    end
+    data = Tilt['md'].new { "# hello tilt" }
+    layout.render { data.render }
+    # => "<!doctype html><title></title><h1>hello tilt</h1>\n"
+
+### Options
+
+Every implementation of Markdown *should* support these options, but there are
+some known problems with the Kramdown and Maruku engines.
+
+#### `:smartypants => true|false`
+
+Set `true` to enable [Smarty Pants][smartypants]
+style punctuation replacement.
+
+#### `:escape_html => true|false`
+
+Set `true` disallow raw HTML in Markdown contents. HTML is converted to
+literal text by escaping `<` characters.
+
+### See also
+
+ * [Markdown Syntax Documentation](http://daringfireball.net/projects/markdown/syntax/)
+
+<a name='rdiscount'></a>
+RDiscount (`markdown`, `md`, `mkd`)
+-----------------------------------
+
+[Discount][discount] is an implementation of the Markdown markup language in C.
+[RDiscount][rdiscount] is a Ruby wrapper around Discount.
+
+All the documentation of [Markdown](#markdown) applies in addition to the following:
+
+### Usage
+
+The `Tilt::RDiscountTemplate` class is registered for all files ending in
+`.markdown`, `.md` or `.mkd` by default with the highest priority. If you
+specifically want to use RDiscount, it's recommended to use `#prefer`:
+
+    Tilt.prefer Tilt::RDiscountTemplate
+
+__NOTE:__ It's suggested that your program `require 'erubis'` at load time when
+using this template engine within a threaded environment.
+
+### See also
+
+  * [Discount][discount]
+  * [RDiscount][rdiscount]
+  * GitHub: [rtomayko/rdiscount][rdiscount]
+
+
+[lesscss]: http://lesscss.org/ "Less CSS"
+[sass]: http://sass-lang.com/ "Sass"
+[coffee-script]: http://jashkenas.github.com/coffee-script/ "Coffee Script"
+[erubis]: http://www.kuwata-lab.com/erubis/ "Erubis"
+[haml]: http://haml.info/ "Haml"
+[liquid]: http://www.liquidmarkup.org/ "Liquid"
+[radius]: http://radius.rubyforge.org/ "Radius"
+[radiant]: http://radiantcms.org/ "Radiant CMS"
+[redcloth]: http://redcloth.org/ "RedCloth"
+[rdoc]: http://rdoc.rubyforge.org/ "RDoc"
+[discount]: http://www.pell.portland.or.us/~orc/Code/discount/ "Discount"
+[rdiscount]: http://github.com/rtomayko/rdiscount/ "RDiscount"
+[smartypants]: http://daringfireball.net/projects/smartypants/ "Smarty Pants"
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/bin/tilt b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/bin/tilt
new file mode 100755
index 0000000..91ca399
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/bin/tilt
@@ -0,0 +1,112 @@
+#!/usr/bin/env ruby
+require 'ostruct'
+require 'optparse'
+require 'tilt'
+
+usage = <<USAGE
+Usage: tilt <options> <file>
+Process template <file> and write output to stdout. With no <file> or
+when <file> is '-', read template from stdin and use the --type option
+to determine the template's type.
+
+Options
+  -l, --list           List template engines + file patterns and exit
+  -t, --type=<pattern> Use this template engine; required if no <file>
+  -y, --layout=<file>  Use <file> as a layout template
+
+  -D<name>=<value>     Define variable <name> as <value>
+  --vars=<ruby>        Evaluate <ruby> to Hash and use for variables
+
+  -h, --help           Show this help message
+
+Convert markdown to HTML:
+  $ tilt foo.markdown > foo.html
+
+Process ERB template:
+  $ echo "Answer: <%= 2 + 2 %>" | tilt -t erb
+  Answer: 4
+
+Define variables:
+  $ echo "Answer: <%= 2 + n %>" | tilt -t erb --vars="{:n=>40}"
+  Answer: 42
+  $ echo "Answer: <%= 2 + n.to_i %>" | tilt -t erb -Dn=40
+  Answer: 42
+USAGE
+
+script_name = File.basename($0)
+pattern = nil
+layout = nil
+locals = {}
+
+ARGV.options do |o|
+  o.program_name = script_name
+
+  # list all available template engines
+  o.on("-l", "--list") do
+    groups = {}
+    Tilt.mappings.each do |pattern,engines|
+      engines.each do |engine|
+        key = engine.name.split('::').last.sub(/Template$/, '')
+        (groups[key] ||= []) << pattern
+      end
+    end
+    groups.sort { |(k1,v1),(k2,v2)| k1 <=> k2 }.each do |engine,files|
+      printf "%-15s %s\n", engine, files.sort.join(', ')
+    end
+    exit
+  end
+
+  # the template type / pattern
+  o.on("-t", "--type=PATTERN", String) do |val|
+    abort "unknown template type: #{val}" if Tilt[val].nil?
+    pattern = val
+  end
+
+  # pass template output into the specified layout template
+  o.on("-y", "--layout=FILE", String)  do |file|
+    paths = [file, "~/.tilt/#{file}", "/etc/tilt/#{file}"]
+    layout = paths.
+      map  { |p| File.expand_path(p) }.
+      find { |p| File.exist?(p) }
+    abort "no such layout: #{file}" if layout.nil?
+  end
+
+  # define a local variable
+  o.on("-D", "--define=PAIR", String) do |pair|
+    key, value = pair.split(/[=:]/, 2)
+    locals[key.to_sym] = value
+  end
+
+  # define local variables using a Ruby hash
+  o.on("--vars=RUBY") do |ruby|
+    hash = eval(ruby)
+    abort "vars must be a Hash, not #{hash.inspect}" if !hash.is_a?(Hash)
+    hash.each { |key, value| locals[key.to_sym] = value }
+  end
+
+  o.on_tail("-h", "--help") { puts usage; exit }
+
+  o.parse!
+end
+
+file = ARGV.first || '-'
+pattern = file if pattern.nil?
+abort "template type not given. see: #{$0} --help" if ['-', ''].include?(pattern)
+
+engine = Tilt[pattern]
+abort "template engine not found for: #{pattern}" if engine.nil?
+
+template =
+  engine.new(file) {
+    if file == '-'
+      $stdin.read
+    else
+      File.read(file)
+    end
+  }
+output = template.render(self, locals)
+
+# process layout
+output = Tilt.new(layout).render(self, locals) { output } if layout
+
+$stdout.write(output)
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt.rb
new file mode 100644
index 0000000..52756db
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt.rb
@@ -0,0 +1,204 @@
+module Tilt
+  VERSION = '1.4.1'
+
+  @preferred_mappings = Hash.new
+  @template_mappings = Hash.new { |h, k| h[k] = [] }
+
+  # Hash of template path pattern => template implementation class mappings.
+  def self.mappings
+    @template_mappings
+  end
+
+  def self.normalize(ext)
+    ext.to_s.downcase.sub(/^\./, '')
+  end
+
+  # Register a template implementation by file extension.
+  def self.register(template_class, *extensions)
+    if template_class.respond_to?(:to_str)
+      # Support register(ext, template_class) too
+      extensions, template_class = [template_class], extensions[0]
+    end
+
+    extensions.each do |ext|
+      ext = normalize(ext)
+      mappings[ext].unshift(template_class).uniq!
+    end
+  end
+
+  # Makes a template class preferred for the given file extensions. If you
+  # don't provide any extensions, it will be preferred for all its already
+  # registered extensions:
+  #
+  #   # Prefer RDiscount for its registered file extensions:
+  #   Tilt.prefer(Tilt::RDiscountTemplate)
+  #
+  #   # Prefer RDiscount only for the .md extensions:
+  #   Tilt.prefer(Tilt::RDiscountTemplate, '.md')
+  def self.prefer(template_class, *extensions)
+    if extensions.empty?
+      mappings.each do |ext, klasses|
+        @preferred_mappings[ext] = template_class if klasses.include? template_class
+      end
+    else
+      extensions.each do |ext|
+        ext = normalize(ext)
+        register(template_class, ext)
+        @preferred_mappings[ext] = template_class
+      end
+    end
+  end
+
+  # Returns true when a template exists on an exact match of the provided file extension
+  def self.registered?(ext)
+    mappings.key?(ext.downcase) && !mappings[ext.downcase].empty?
+  end
+
+  # Create a new template for the given file using the file's extension
+  # to determine the the template mapping.
+  def self.new(file, line=nil, options={}, &block)
+    if template_class = self[file]
+      template_class.new(file, line, options, &block)
+    else
+      fail "No template engine registered for #{File.basename(file)}"
+    end
+  end
+
+  # Lookup a template class for the given filename or file
+  # extension. Return nil when no implementation is found.
+  def self.[](file)
+    pattern = file.to_s.downcase
+    until pattern.empty? || registered?(pattern)
+      pattern = File.basename(pattern)
+      pattern.sub!(/^[^.]*\.?/, '')
+    end
+
+    # Try to find a preferred engine.
+    preferred_klass = @preferred_mappings[pattern]
+    return preferred_klass if preferred_klass
+
+    # Fall back to the general list of mappings.
+    klasses = @template_mappings[pattern]
+
+    # Try to find an engine which is already loaded.
+    template = klasses.detect do |klass|
+      if klass.respond_to?(:engine_initialized?)
+        klass.engine_initialized?
+      end
+    end
+
+    return template if template
+
+    # Try each of the classes until one succeeds. If all of them fails,
+    # we'll raise the error of the first class.
+    first_failure = nil
+
+    klasses.each do |klass|
+      begin
+        klass.new { '' }
+      rescue Exception => ex
+        first_failure ||= ex
+        next
+      else
+        return klass
+      end
+    end
+
+    raise first_failure if first_failure
+  end
+
+  # Deprecated module.
+  module CompileSite
+  end
+
+  # Extremely simple template cache implementation. Calling applications
+  # create a Tilt::Cache instance and use #fetch with any set of hashable
+  # arguments (such as those to Tilt.new):
+  #   cache = Tilt::Cache.new
+  #   cache.fetch(path, line, options) { Tilt.new(path, line, options) }
+  #
+  # Subsequent invocations return the already loaded template object.
+  class Cache
+    def initialize
+      @cache = {}
+    end
+
+    def fetch(*key)
+      @cache[key] ||= yield
+    end
+
+    def clear
+      @cache = {}
+    end
+  end
+
+
+  # Template Implementations ================================================
+
+  require 'tilt/string'
+  register StringTemplate, 'str'
+
+  require 'tilt/erb'
+  register ERBTemplate,    'erb', 'rhtml'
+  register ErubisTemplate, 'erb', 'rhtml', 'erubis'
+
+  require 'tilt/etanni'
+  register EtanniTemplate, 'etn', 'etanni'
+
+  require 'tilt/haml'
+  register HamlTemplate,   'haml'
+
+  require 'tilt/css'
+  register SassTemplate, 'sass'
+  register ScssTemplate, 'scss'
+  register LessTemplate, 'less'
+
+  require 'tilt/csv'
+  register CSVTemplate, 'rcsv'
+
+  require 'tilt/coffee'
+  register CoffeeScriptTemplate, 'coffee'
+
+  require 'tilt/nokogiri'
+  register NokogiriTemplate, 'nokogiri'
+
+  require 'tilt/builder'
+  register BuilderTemplate,  'builder'
+
+  require 'tilt/markaby'
+  register MarkabyTemplate,  'mab'
+
+  require 'tilt/liquid'
+  register LiquidTemplate, 'liquid'
+
+  require 'tilt/radius'
+  register RadiusTemplate, 'radius'
+
+  require 'tilt/markdown'
+  register MarukuTemplate,    'markdown', 'mkd', 'md'
+  register KramdownTemplate,  'markdown', 'mkd', 'md'
+  register BlueClothTemplate, 'markdown', 'mkd', 'md'
+  register RDiscountTemplate, 'markdown', 'mkd', 'md'
+  register RedcarpetTemplate::Redcarpet1, 'markdown', 'mkd', 'md'
+  register RedcarpetTemplate::Redcarpet2, 'markdown', 'mkd', 'md'
+  register RedcarpetTemplate, 'markdown', 'mkd', 'md'
+
+  require 'tilt/textile'
+  register RedClothTemplate, 'textile'
+
+  require 'tilt/rdoc'
+  register RDocTemplate, 'rdoc'
+
+  require 'tilt/wiki'
+  register CreoleTemplate,    'wiki', 'creole'
+  register WikiClothTemplate, 'wiki', 'mediawiki', 'mw'
+
+  require 'tilt/yajl'
+  register YajlTemplate, 'yajl'
+
+  require 'tilt/asciidoc'
+  register AsciidoctorTemplate, 'ad', 'adoc', 'asciidoc'
+
+  require 'tilt/plain'
+  register PlainTemplate, 'html'
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/asciidoc.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/asciidoc.rb
new file mode 100644
index 0000000..6e3029c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/asciidoc.rb
@@ -0,0 +1,34 @@
+require 'tilt/template'
+
+# AsciiDoc see: http://asciidoc.org/
+module Tilt
+  # Asciidoctor implementation for AsciiDoc see:
+  # http://asciidoctor.github.com/
+  #
+  # Asciidoctor is an open source, pure-Ruby processor for
+  # converting AsciiDoc documents or strings into HTML 5,
+  # DocBook 4.5 and other formats.
+  class AsciidoctorTemplate < Template
+    self.default_mime_type = 'text/html'
+
+    def self.engine_initialized?
+      defined? ::Asciidoctor::Document
+    end
+
+    def initialize_engine
+      require_template_library 'asciidoctor'
+    end
+
+    def prepare
+      options[:header_footer] = false if options[:header_footer].nil?
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= Asciidoctor.render(data, options, &block)
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/builder.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/builder.rb
new file mode 100644
index 0000000..f928952
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/builder.rb
@@ -0,0 +1,40 @@
+require 'tilt/template'
+
+module Tilt
+   # Builder template implementation. See:
+  # http://builder.rubyforge.org/
+  class BuilderTemplate < Template
+    self.default_mime_type = 'text/xml'
+
+    def self.engine_initialized?
+      defined? ::Builder
+    end
+
+    def initialize_engine
+      require_template_library 'builder'
+    end
+
+    def prepare; end
+
+    def evaluate(scope, locals, &block)
+      return super(scope, locals, &block) if data.respond_to?(:to_str)
+      xml = ::Builder::XmlMarkup.new(:indent => 2)
+      data.call(xml)
+      xml.target!
+    end
+
+    def precompiled_preamble(locals)
+      return super if locals.include? :xml
+      "xml = ::Builder::XmlMarkup.new(:indent => 2)\n#{super}"
+    end
+
+    def precompiled_postamble(locals)
+      "xml.target!"
+    end
+
+    def precompiled_template(locals)
+      data.to_str
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/coffee.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/coffee.rb
new file mode 100644
index 0000000..fafaac8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/coffee.rb
@@ -0,0 +1,54 @@
+require 'tilt/template'
+
+module Tilt
+  # CoffeeScript template implementation. See:
+  # http://coffeescript.org/
+  #
+  # CoffeeScript templates do not support object scopes, locals, or yield.
+  class CoffeeScriptTemplate < Template
+    self.default_mime_type = 'application/javascript'
+
+    @@default_bare = false
+
+    def self.default_bare
+      @@default_bare
+    end
+
+    def self.default_bare=(value)
+      @@default_bare = value
+    end
+
+    # DEPRECATED
+    def self.default_no_wrap
+      @@default_bare
+    end
+
+    # DEPRECATED
+    def self.default_no_wrap=(value)
+      @@default_bare = value
+    end
+
+    def self.engine_initialized?
+      defined? ::CoffeeScript
+    end
+
+    def initialize_engine
+      require_template_library 'coffee_script'
+    end
+
+    def prepare
+      if !options.key?(:bare) and !options.key?(:no_wrap)
+        options[:bare] = self.class.default_bare
+      end
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= CoffeeScript.compile(data, options)
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/css.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/css.rb
new file mode 100644
index 0000000..b237de9
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/css.rb
@@ -0,0 +1,80 @@
+require 'tilt/template'
+
+module Tilt
+  # Sass template implementation. See:
+  # http://haml.hamptoncatlin.com/
+  #
+  # Sass templates do not support object scopes, locals, or yield.
+  class SassTemplate < Template
+    self.default_mime_type = 'text/css'
+
+    def self.engine_initialized?
+      defined? ::Sass::Engine
+    end
+
+    def initialize_engine
+      require_template_library 'sass'
+    end
+
+    def prepare
+      @engine = ::Sass::Engine.new(data, sass_options)
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.render
+    end
+
+    def allows_script?
+      false
+    end
+
+  private
+    def sass_options
+      options.merge(:filename => eval_file, :line => line, :syntax => :sass)
+    end
+  end
+
+  # Sass's new .scss type template implementation.
+  class ScssTemplate < SassTemplate
+    self.default_mime_type = 'text/css'
+
+  private
+    def sass_options
+      options.merge(:filename => eval_file, :line => line, :syntax => :scss)
+    end
+  end
+
+   # Lessscss template implementation. See:
+  # http://lesscss.org/
+  #
+  # Less templates do not support object scopes, locals, or yield.
+  class LessTemplate < Template
+    self.default_mime_type = 'text/css'
+
+    def self.engine_initialized?
+      defined? ::Less
+    end
+
+    def initialize_engine
+      require_template_library 'less'
+    end
+
+    def prepare
+      if ::Less.const_defined? :Engine
+        @engine = ::Less::Engine.new(data)
+      else
+        parser  = ::Less::Parser.new(options.merge :filename => eval_file, :line => line)
+        @engine = parser.parse(data)
+      end
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_css(options)
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/csv.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/csv.rb
new file mode 100644
index 0000000..31214fa
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/csv.rb
@@ -0,0 +1,71 @@
+require 'tilt/template'
+
+module Tilt
+
+  # CSV Template implementation. See:
+  # http://ruby-doc.org/stdlib/libdoc/csv/rdoc/CSV.html
+  #
+  # == Example
+  #
+  #    # Example of csv template
+  #    tpl = <<-EOS
+  #      # header
+  #      csv << ['NAME', 'ID']
+  #
+  #      # data rows
+  #      @people.each do |person|
+  #        csv << [person[:name], person[:id]]
+  #      end
+  #    EOS
+  #
+  #    @people = [
+  #      {:name => "Joshua Peek", :id => 1},
+  #      {:name => "Ryan Tomayko", :id => 2},
+  #      {:name => "Simone Carletti", :id => 3}
+  #    ]
+  #
+  #    template = Tilt::CSVTemplate.new { tpl }
+  #    template.render(self)
+  #
+  class CSVTemplate < Template
+    self.default_mime_type = 'text/csv'
+
+    def self.engine_initialized?
+      engine
+    end
+
+    def self.engine
+      if RUBY_VERSION >= '1.9.0' && defined? ::CSV
+        ::CSV
+      elsif defined? ::FasterCSV
+        ::FasterCSV 
+      end
+    end
+
+    def initialize_engine
+      if RUBY_VERSION >= '1.9.0'
+        require_template_library 'csv'
+      else
+        require_template_library 'fastercsv'
+      end
+    end
+
+    def prepare
+      @code =<<-RUBY
+        #{self.class.engine}.generate do |csv|
+          #{data}
+        end
+      RUBY
+    end
+
+    def precompiled_template(locals)
+      @code
+    end
+
+    def precompiled(locals)
+      source, offset = super
+      [source, offset + 1]
+    end
+
+  end
+end
\ No newline at end of file
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/erb.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/erb.rb
new file mode 100644
index 0000000..513ac70
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/erb.rb
@@ -0,0 +1,110 @@
+require 'tilt/template'
+
+module Tilt
+  # ERB template implementation. See:
+  # http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html
+  class ERBTemplate < Template
+    @@default_output_variable = '_erbout'
+
+    def self.default_output_variable
+      @@default_output_variable
+    end
+
+    def self.default_output_variable=(name)
+      @@default_output_variable = name
+    end
+
+    def self.engine_initialized?
+      defined? ::ERB
+    end
+
+    def initialize_engine
+      require_template_library 'erb'
+    end
+
+    def prepare
+      @outvar = options[:outvar] || self.class.default_output_variable
+      options[:trim] = '<>' if !(options[:trim] == false) && (options[:trim].nil? || options[:trim] == true)
+      @engine = ::ERB.new(data, options[:safe], options[:trim], @outvar)
+    end
+
+    def precompiled_template(locals)
+      source = @engine.src
+      source
+    end
+
+    def precompiled_preamble(locals)
+      <<-RUBY
+        begin
+          __original_outvar = #{@outvar} if defined?(#{@outvar})
+          #{super}
+      RUBY
+    end
+
+    def precompiled_postamble(locals)
+      <<-RUBY
+          #{super}
+        ensure
+          #{@outvar} = __original_outvar
+        end
+      RUBY
+    end
+
+    # ERB generates a line to specify the character coding of the generated
+    # source in 1.9. Account for this in the line offset.
+    if RUBY_VERSION >= '1.9.0'
+      def precompiled(locals)
+        source, offset = super
+        [source, offset + 1]
+      end
+    end
+  end
+
+  # Erubis template implementation. See:
+  # http://www.kuwata-lab.com/erubis/
+  #
+  # ErubisTemplate supports the following additional options, which are not
+  # passed down to the Erubis engine:
+  #
+  #   :engine_class   allows you to specify a custom engine class to use
+  #                   instead of the default (which is ::Erubis::Eruby).
+  #
+  #   :escape_html    when true, ::Erubis::EscapedEruby will be used as
+  #                   the engine class instead of the default. All content
+  #                   within <%= %> blocks will be automatically html escaped.
+  class ErubisTemplate < ERBTemplate
+    def self.engine_initialized?
+      defined? ::Erubis::Eruby
+    end
+
+    def initialize_engine
+      require_template_library 'erubis'
+    end
+
+    def prepare
+      @outvar = options.delete(:outvar) || self.class.default_output_variable
+      @options.merge!(:preamble => false, :postamble => false, :bufvar => @outvar)
+      engine_class = options.delete(:engine_class)
+      engine_class = ::Erubis::EscapedEruby if options.delete(:escape_html)
+      @engine = (engine_class || ::Erubis::Eruby).new(data, options)
+    end
+
+    def precompiled_preamble(locals)
+      [super, "#{@outvar} = _buf = ''"].join("\n")
+    end
+
+    def precompiled_postamble(locals)
+      [@outvar, super].join("\n")
+    end
+
+    # Erubis doesn't have ERB's line-off-by-one under 1.9 problem.
+    # Override and adjust back.
+    if RUBY_VERSION >= '1.9.0'
+      def precompiled(locals)
+        source, offset = super
+        [source, offset - 1]
+      end
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/etanni.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/etanni.rb
new file mode 100644
index 0000000..e598ced
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/etanni.rb
@@ -0,0 +1,27 @@
+require 'tilt/template'
+
+module Tilt
+  class EtanniTemplate < Template
+    def prepare
+      separator = data.hash.abs
+      chomp = "<<#{separator}.chomp!"
+      start = "\n_out_ << #{chomp}\n"
+      stop = "\n#{separator}\n"
+      replacement = "#{stop}\\1#{start}"
+
+      temp = data.strip
+      temp.gsub!(/<\?r\s+(.*?)\s+\?>/m, replacement)
+
+      @code = "_out_ = [<<#{separator}.chomp!]\n#{temp}#{stop}_out_.join"
+    end
+
+    def precompiled_template(locals)
+      @code
+    end
+
+    def precompiled(locals)
+      source, offset = super
+      [source, offset + 1]
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/haml.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/haml.rb
new file mode 100644
index 0000000..6312206
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/haml.rb
@@ -0,0 +1,64 @@
+require 'tilt/template'
+
+module Tilt
+  # Haml template implementation. See:
+  # http://haml.hamptoncatlin.com/
+  class HamlTemplate < Template
+    self.default_mime_type = 'text/html'
+
+    def self.engine_initialized?
+      defined? ::Haml::Engine
+    end
+
+    def initialize_engine
+      require_template_library 'haml'
+    end
+
+    def prepare
+      options = @options.merge(:filename => eval_file, :line => line)
+      @engine = ::Haml::Engine.new(data, options)
+    end
+
+    def evaluate(scope, locals, &block)
+      if @engine.respond_to?(:precompiled_method_return_value, true)
+        super
+      else
+        @engine.render(scope, locals, &block)
+      end
+    end
+
+    # Precompiled Haml source. Taken from the precompiled_with_ambles
+    # method in Haml::Precompiler:
+    # http://github.com/nex3/haml/blob/master/lib/haml/precompiler.rb#L111-126
+    def precompiled_template(locals)
+      @engine.precompiled
+    end
+
+    def precompiled_preamble(locals)
+      local_assigns = super
+      @engine.instance_eval do
+        <<-RUBY
+          begin
+            extend Haml::Helpers
+            _hamlout = @haml_buffer = Haml::Buffer.new(@haml_buffer, #{options_for_buffer.inspect})
+            _erbout = _hamlout.buffer
+            __in_erb_template = true
+            _haml_locals = locals
+            #{local_assigns}
+        RUBY
+      end
+    end
+
+    def precompiled_postamble(locals)
+      @engine.instance_eval do
+        <<-RUBY
+            #{precompiled_method_return_value}
+          ensure
+            @haml_buffer = @haml_buffer.upper
+          end
+        RUBY
+      end
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/liquid.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/liquid.rb
new file mode 100644
index 0000000..3364911
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/liquid.rb
@@ -0,0 +1,45 @@
+require 'tilt/template'
+
+module Tilt
+  # Liquid template implementation. See:
+  # http://liquid.rubyforge.org/
+  #
+  # Liquid is designed to be a *safe* template system and threfore
+  # does not provide direct access to execuatable scopes. In order to
+  # support a +scope+, the +scope+ must be able to represent itself
+  # as a hash by responding to #to_h. If the +scope+ does not respond
+  # to #to_h it will be ignored.
+  #
+  # LiquidTemplate does not support yield blocks.
+  #
+  # It's suggested that your program require 'liquid' at load
+  # time when using this template engine.
+  class LiquidTemplate < Template
+    def self.engine_initialized?
+      defined? ::Liquid::Template
+    end
+
+    def initialize_engine
+      require_template_library 'liquid'
+    end
+
+    def prepare
+      @engine = ::Liquid::Template.parse(data)
+    end
+
+    def evaluate(scope, locals, &block)
+      locals = locals.inject({}){ |h,(k,v)| h[k.to_s] = v ; h }
+      if scope.respond_to?(:to_h)
+        scope  = scope.to_h.inject({}){ |h,(k,v)| h[k.to_s] = v ; h }
+        locals = scope.merge(locals)
+      end
+      locals['yield'] = block.nil? ? '' : yield
+      locals['content'] = locals['yield']
+      @engine.render(locals)
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/markaby.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/markaby.rb
new file mode 100644
index 0000000..3271e14
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/markaby.rb
@@ -0,0 +1,52 @@
+require 'tilt/template'
+
+module Tilt
+  # Markaby
+  # http://github.com/markaby/markaby
+  class MarkabyTemplate < Template
+    def self.builder_class
+      @builder_class ||= Class.new(Markaby::Builder) do
+        def __capture_markaby_tilt__(&block)
+          __run_markaby_tilt__ do
+            text capture(&block)
+          end
+        end
+      end
+    end
+
+    def self.engine_initialized?
+      defined? ::Markaby
+    end
+
+    def initialize_engine
+      require_template_library 'markaby'
+    end
+
+    def prepare
+    end
+
+    def evaluate(scope, locals, &block)
+      builder = self.class.builder_class.new({}, scope)
+      builder.locals = locals
+
+      if data.kind_of? Proc
+        (class << builder; self end).send(:define_method, :__run_markaby_tilt__, &data)
+      else
+        builder.instance_eval <<-CODE, __FILE__, __LINE__
+          def __run_markaby_tilt__
+            #{data}
+          end
+        CODE
+      end
+
+      if block
+        builder.__capture_markaby_tilt__(&block)
+      else
+        builder.__run_markaby_tilt__
+      end
+
+      builder.to_s
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/markdown.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/markdown.rb
new file mode 100644
index 0000000..0d089f1
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/markdown.rb
@@ -0,0 +1,214 @@
+require 'tilt/template'
+
+module Tilt
+  # Discount Markdown implementation. See:
+  # http://github.com/rtomayko/rdiscount
+  #
+  # RDiscount is a simple text filter. It does not support +scope+ or
+  # +locals+. The +:smart+ and +:filter_html+ options may be set true
+  # to enable those flags on the underlying RDiscount object.
+  class RDiscountTemplate < Template
+    self.default_mime_type = 'text/html'
+
+    ALIAS = {
+      :escape_html => :filter_html,
+      :smartypants => :smart
+    }
+
+    FLAGS = [:smart, :filter_html, :smartypants, :escape_html]
+
+    def flags
+      FLAGS.select { |flag| options[flag] }.map { |flag| ALIAS[flag] || flag }
+    end
+
+    def self.engine_initialized?
+      defined? ::RDiscount
+    end
+
+    def initialize_engine
+      require_template_library 'rdiscount'
+    end
+
+    def prepare
+      @engine = RDiscount.new(data, *flags)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+
+  # Upskirt Markdown implementation. See:
+  # https://github.com/tanoku/redcarpet
+  #
+  # Supports both Redcarpet 1.x and 2.x
+  class RedcarpetTemplate < Template
+    def self.engine_initialized?
+      defined? ::Redcarpet
+    end
+
+    def initialize_engine
+      require_template_library 'redcarpet'
+    end
+
+    def prepare
+      klass = [Redcarpet2, Redcarpet1].detect { |e| e.engine_initialized? }
+      @engine = klass.new(file, line, options) { data }
+    end
+
+    def evaluate(scope, locals, &block)
+      @engine.evaluate(scope, locals, &block)
+    end
+
+    def allows_script?
+      false
+    end
+
+    # Compatibility mode for Redcarpet 1.x
+    class Redcarpet1 < RDiscountTemplate
+      self.default_mime_type = 'text/html'
+
+      def self.engine_initialized?
+        defined? ::RedcarpetCompat
+      end
+
+      def prepare
+        @engine = RedcarpetCompat.new(data, *flags)
+        @output = nil
+      end
+    end
+
+    # Future proof mode for Redcarpet 2.x (not yet released)
+    class Redcarpet2 < Template
+      self.default_mime_type = 'text/html'
+
+      def self.engine_initialized?
+        defined? ::Redcarpet::Render and defined? ::Redcarpet::Markdown
+      end
+
+      def generate_renderer
+        renderer = options.delete(:renderer) || ::Redcarpet::Render::HTML
+        return renderer unless options.delete(:smartypants)
+        return renderer if renderer.is_a?(Class) && renderer <= ::Redcarpet::Render::SmartyPants
+
+        if renderer == ::Redcarpet::Render::XHTML
+          ::Redcarpet::Render::SmartyHTML.new(:xhtml => true)
+        elsif renderer == ::Redcarpet::Render::HTML
+          ::Redcarpet::Render::SmartyHTML
+        elsif renderer.is_a? Class
+          Class.new(renderer) { include ::Redcarpet::Render::SmartyPants }
+        else
+          renderer.extend ::Redcarpet::Render::SmartyPants
+        end
+      end
+
+      def prepare
+        # try to support the same aliases
+        RDiscountTemplate::ALIAS.each do |opt, aka|
+          next if options.key? opt or not options.key? aka
+          options[opt] = options.delete(aka)
+        end
+
+        # only raise an exception if someone is trying to enable :escape_html
+        options.delete(:escape_html) unless options[:escape_html]
+
+        @engine = ::Redcarpet::Markdown.new(generate_renderer, options)
+        @output = nil
+      end
+
+      def evaluate(scope, locals, &block)
+        @output ||= @engine.render(data)
+      end
+
+      def allows_script?
+        false
+      end
+    end
+  end
+
+  # BlueCloth Markdown implementation. See:
+  # http://deveiate.org/projects/BlueCloth/
+  class BlueClothTemplate < Template
+    self.default_mime_type = 'text/html'
+
+    def self.engine_initialized?
+      defined? ::BlueCloth
+    end
+
+    def initialize_engine
+      require_template_library 'bluecloth'
+    end
+
+    def prepare
+      @engine = BlueCloth.new(data, options)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+
+  # Maruku markdown implementation. See:
+  # http://maruku.rubyforge.org/
+  class MarukuTemplate < Template
+    def self.engine_initialized?
+      defined? ::Maruku
+    end
+
+    def initialize_engine
+      require_template_library 'maruku'
+    end
+
+    def prepare
+      @engine = Maruku.new(data, options)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+
+  # Kramdown Markdown implementation. See:
+  # http://kramdown.rubyforge.org/
+  class KramdownTemplate < Template
+    DUMB_QUOTES = [39, 39, 34, 34]
+
+    def self.engine_initialized?
+      defined? ::Kramdown
+    end
+
+    def initialize_engine
+      require_template_library 'kramdown'
+    end
+
+    def prepare
+      options[:smart_quotes] = DUMB_QUOTES unless options[:smartypants]
+      @engine = Kramdown::Document.new(data, options)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/nokogiri.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/nokogiri.rb
new file mode 100644
index 0000000..556c284
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/nokogiri.rb
@@ -0,0 +1,43 @@
+require 'tilt/template'
+
+module Tilt
+  # Nokogiri template implementation. See:
+  # http://nokogiri.org/
+  class NokogiriTemplate < Template
+    DOCUMENT_HEADER = /^<\?xml version=\"1\.0\"\?>\n?/
+    self.default_mime_type = 'text/xml'
+
+    def self.engine_initialized?
+      defined? ::Nokogiri
+    end
+
+    def initialize_engine
+      require_template_library 'nokogiri'
+    end
+
+    def prepare; end
+
+    def evaluate(scope, locals)
+      if data.respond_to?(:to_str)
+        wrapper = proc { yield.sub(DOCUMENT_HEADER, "") } if block_given?
+        super(scope, locals, &wrapper)
+      else
+        ::Nokogiri::XML::Builder.new.tap(&data).to_xml
+      end
+    end
+
+    def precompiled_preamble(locals)
+      return super if locals.include? :xml
+      "xml = ::Nokogiri::XML::Builder.new { |xml| }\n#{super}"
+    end
+
+    def precompiled_postamble(locals)
+      "xml.to_xml"
+    end
+
+    def precompiled_template(locals)
+      data.to_str
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/plain.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/plain.rb
new file mode 100644
index 0000000..4c08052
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/plain.rb
@@ -0,0 +1,20 @@
+require 'tilt/template'
+
+
+module Tilt
+  # Raw text (no template functionality).
+  class PlainTemplate < Template
+    self.default_mime_type = 'text/html'
+
+    def self.engine_initialized?
+      true
+    end
+
+    def prepare
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= data
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/radius.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/radius.rb
new file mode 100644
index 0000000..64ec908
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/radius.rb
@@ -0,0 +1,55 @@
+require 'tilt/template'
+
+module Tilt
+  # Radius Template
+  # http://github.com/jlong/radius/
+  class RadiusTemplate < Template
+    def self.engine_initialized?
+      defined? ::Radius
+    end
+
+    def self.context_class
+      @context_class ||= Class.new(Radius::Context) do
+        attr_accessor :tilt_scope
+
+        def tag_missing(name, attributes)
+          tilt_scope.__send__(name)
+        end
+
+        def dup
+          i = super
+          i.tilt_scope = tilt_scope
+          i
+        end
+      end
+    end
+
+    def initialize_engine
+      require_template_library 'radius'
+    end
+
+    def prepare
+    end
+
+    def evaluate(scope, locals, &block)
+      context = self.class.context_class.new
+      context.tilt_scope = scope
+      context.define_tag("yield") do
+        block.call
+      end
+      locals.each do |tag, value|
+        context.define_tag(tag) do
+          value
+        end
+      end
+
+      options = {:tag_prefix => 'r'}.merge(@options)
+      parser = Radius::Parser.new(context, options)
+      parser.parse(data)
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/rdoc.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/rdoc.rb
new file mode 100644
index 0000000..91f0dce
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/rdoc.rb
@@ -0,0 +1,47 @@
+require 'tilt/template'
+
+module Tilt
+  # RDoc template. See:
+  # http://rdoc.rubyforge.org/
+  #
+  # It's suggested that your program `require 'rdoc/markup'` and
+  # `require 'rdoc/markup/to_html'` at load time when using this template
+  # engine in a threaded environment.
+  class RDocTemplate < Template
+    self.default_mime_type = 'text/html'
+
+    def self.engine_initialized?
+      defined? ::RDoc::Markup::ToHtml
+    end
+
+    def initialize_engine
+      require_template_library 'rdoc'
+      require_template_library 'rdoc/markup'
+      require_template_library 'rdoc/markup/to_html'
+    end
+
+    def markup
+      begin
+        # RDoc 4.0
+        require 'rdoc/options'
+        RDoc::Markup::ToHtml.new(RDoc::Options.new, nil)
+      rescue ArgumentError
+        # RDoc < 4.0
+        RDoc::Markup::ToHtml.new
+      end
+    end
+
+    def prepare
+      @engine = markup.convert(data)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_s
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/string.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/string.rb
new file mode 100644
index 0000000..5bc6958
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/string.rb
@@ -0,0 +1,21 @@
+require 'tilt/template'
+
+module Tilt
+  # The template source is evaluated as a Ruby string. The #{} interpolation
+  # syntax can be used to generated dynamic output.
+  class StringTemplate < Template
+    def prepare
+      hash = "TILT#{data.hash.abs}"
+      @code = "<<#{hash}.chomp\n#{data}\n#{hash}"
+    end
+
+    def precompiled_template(locals)
+      @code
+    end
+
+    def precompiled(locals)
+      source, offset = super
+      [source, offset + 1]
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb
new file mode 100644
index 0000000..9b52237
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb
@@ -0,0 +1,292 @@
+module Tilt
+  TOPOBJECT = Object.superclass || Object
+
+  # Base class for template implementations. Subclasses must implement
+  # the #prepare method and one of the #evaluate or #precompiled_template
+  # methods.
+  class Template
+    # Template source; loaded from a file or given directly.
+    attr_reader :data
+
+    # The name of the file where the template data was loaded from.
+    attr_reader :file
+
+    # The line number in #file where template data was loaded from.
+    attr_reader :line
+
+    # A Hash of template engine specific options. This is passed directly
+    # to the underlying engine and is not used by the generic template
+    # interface.
+    attr_reader :options
+
+    # Used to determine if this class's initialize_engine method has
+    # been called yet.
+    @engine_initialized = false
+    class << self
+      attr_accessor :engine_initialized
+      alias engine_initialized? engine_initialized
+
+      attr_accessor :default_mime_type
+    end
+
+    # Create a new template with the file, line, and options specified. By
+    # default, template data is read from the file. When a block is given,
+    # it should read template data and return as a String. When file is nil,
+    # a block is required.
+    #
+    # All arguments are optional.
+    def initialize(file=nil, line=1, options={}, &block)
+      @file, @line, @options = nil, 1, {}
+
+      [options, line, file].compact.each do |arg|
+        case
+        when arg.respond_to?(:to_str)  ; @file = arg.to_str
+        when arg.respond_to?(:to_int)  ; @line = arg.to_int
+        when arg.respond_to?(:to_hash) ; @options = arg.to_hash.dup
+        when arg.respond_to?(:path)    ; @file = arg.path
+        else raise TypeError
+        end
+      end
+
+      raise ArgumentError, "file or block required" if (@file || block).nil?
+
+      # call the initialize_engine method if this is the very first time
+      # an instance of this class has been created.
+      if !self.class.engine_initialized?
+        initialize_engine
+        self.class.engine_initialized = true
+      end
+
+      # used to hold compiled template methods
+      @compiled_method = {}
+
+      # used on 1.9 to set the encoding if it is not set elsewhere (like a magic comment)
+      # currently only used if template compiles to ruby
+      @default_encoding = @options.delete :default_encoding
+
+      # load template data and prepare (uses binread to avoid encoding issues)
+      @reader = block || lambda { |t| read_template_file }
+      @data = @reader.call(self)
+
+      if @data.respond_to?(:force_encoding)
+        @data.force_encoding(default_encoding) if default_encoding
+
+        if !@data.valid_encoding?
+          raise Encoding::InvalidByteSequenceError, "#{eval_file} is not valid #{@data.encoding}"
+        end
+      end
+
+      prepare
+    end
+
+    # The encoding of the source data. Defaults to the
+    # default_encoding-option if present. You may override this method
+    # in your template class if you have a better hint of the data's
+    # encoding.
+    def default_encoding
+      @default_encoding
+    end
+
+    def read_template_file
+      data = File.open(file, 'rb') { |io| io.read }
+      if data.respond_to?(:force_encoding)
+        # Set it to the default external (without verifying)
+        data.force_encoding(Encoding.default_external) if Encoding.default_external
+      end
+      data
+    end
+
+    # Render the template in the given scope with the locals specified. If a
+    # block is given, it is typically available within the template via
+    # +yield+.
+    def render(scope=Object.new, locals={}, &block)
+      evaluate scope, locals || {}, &block
+    end
+
+    # The basename of the template file.
+    def basename(suffix='')
+      File.basename(file, suffix) if file
+    end
+
+    # The template file's basename with all extensions chomped off.
+    def name
+      basename.split('.', 2).first if basename
+    end
+
+    # The filename used in backtraces to describe the template.
+    def eval_file
+      file || '(__TEMPLATE__)'
+    end
+
+    # Whether or not this template engine allows executing Ruby script
+    # within the template. If this is false, +scope+ and +locals+ will
+    # generally not be used, nor will the provided block be avaiable 
+    # via +yield+.
+    # This should be overridden by template subclasses.
+    def allows_script?
+      true
+    end
+
+  protected
+    # Called once and only once for each template subclass the first time
+    # the template class is initialized. This should be used to require the
+    # underlying template library and perform any initial setup.
+    def initialize_engine
+    end
+
+    # Like Kernel#require but issues a warning urging a manual require when
+    # running under a threaded environment.
+    def require_template_library(name)
+      if Thread.list.size > 1
+        warn "WARN: tilt autoloading '#{name}' in a non thread-safe way; " +
+             "explicit require '#{name}' suggested."
+      end
+      require name
+    end
+
+    # Do whatever preparation is necessary to setup the underlying template
+    # engine. Called immediately after template data is loaded. Instance
+    # variables set in this method are available when #evaluate is called.
+    #
+    # Subclasses must provide an implementation of this method.
+    def prepare
+      if respond_to?(:compile!)
+        # backward compat with tilt < 0.6; just in case
+        warn 'Tilt::Template#compile! is deprecated; implement #prepare instead.'
+        compile!
+      else
+        raise NotImplementedError
+      end
+    end
+
+    # Execute the compiled template and return the result string. Template
+    # evaluation is guaranteed to be performed in the scope object with the
+    # locals specified and with support for yielding to the block.
+    #
+    # This method is only used by source generating templates. Subclasses that
+    # override render() may not support all features.
+    def evaluate(scope, locals, &block)
+      method = compiled_method(locals.keys)
+      method.bind(scope).call(locals, &block)
+    end
+
+    # Generates all template source by combining the preamble, template, and
+    # postamble and returns a two-tuple of the form: [source, offset], where
+    # source is the string containing (Ruby) source code for the template and
+    # offset is the integer line offset where line reporting should begin.
+    #
+    # Template subclasses may override this method when they need complete
+    # control over source generation or want to adjust the default line
+    # offset. In most cases, overriding the #precompiled_template method is
+    # easier and more appropriate.
+    def precompiled(locals)
+      preamble = precompiled_preamble(locals)
+      template = precompiled_template(locals)
+      postamble = precompiled_postamble(locals)
+      source = ''
+
+      # Ensure that our generated source code has the same encoding as the
+      # the source code generated by the template engine.
+      if source.respond_to?(:force_encoding)
+        template_encoding = extract_encoding(template)
+
+        source.force_encoding(template_encoding)
+        template.force_encoding(template_encoding)
+      end
+
+      # https://github.com/rtomayko/tilt/issues/193
+      warn "precompiled_preamble should return String (not Array)" if preamble.is_a?(Array)
+      warn "precompiled_postamble should return String (not Array)" if postamble.is_a?(Array)
+      source << [preamble, template, postamble].join("\n")
+
+      [source, preamble.count("\n")+1]
+    end
+
+    # A string containing the (Ruby) source code for the template. The
+    # default Template#evaluate implementation requires either this
+    # method or the #precompiled method be overridden. When defined,
+    # the base Template guarantees correct file/line handling, locals
+    # support, custom scopes, proper encoding, and support for template
+    # compilation.
+    def precompiled_template(locals)
+      raise NotImplementedError
+    end
+
+    # Generates preamble code for initializing template state, and performing
+    # locals assignment. The default implementation performs locals
+    # assignment only. Lines included in the preamble are subtracted from the
+    # source line offset, so adding code to the preamble does not effect line
+    # reporting in Kernel::caller and backtraces.
+    def precompiled_preamble(locals)
+      locals.map do |k,v|
+        if k.to_s =~ /\A[a-z_][a-zA-Z_0-9]*\z/
+          "#{k} = locals[#{k.inspect}]"
+        else
+          raise "invalid locals key: #{k.inspect} (keys must be variable names)"
+        end
+      end.join("\n")
+    end
+
+    # Generates postamble code for the precompiled template source. The
+    # string returned from this method is appended to the precompiled
+    # template source.
+    def precompiled_postamble(locals)
+      ''
+    end
+
+    # The compiled method for the locals keys provided.
+    def compiled_method(locals_keys)
+      @compiled_method[locals_keys] ||=
+        compile_template_method(locals_keys)
+    end
+
+  private
+    def compile_template_method(locals)
+      source, offset = precompiled(locals)
+      method_name = "__tilt_#{Thread.current.object_id.abs}"
+      method_source = ""
+
+      if method_source.respond_to?(:force_encoding)
+        method_source.force_encoding(source.encoding) 
+      end
+
+      method_source << <<-RUBY
+        TOPOBJECT.class_eval do
+          def #{method_name}(locals)
+            Thread.current[:tilt_vars] = [self, locals]
+            class << self
+              this, locals = Thread.current[:tilt_vars]
+              this.instance_eval do
+      RUBY
+      offset += method_source.count("\n")
+      method_source << source
+      method_source << "\nend;end;end;end"
+      Object.class_eval method_source, eval_file, line - offset
+      unbind_compiled_method(method_name)
+    end
+
+    def unbind_compiled_method(method_name)
+      method = TOPOBJECT.instance_method(method_name)
+      TOPOBJECT.class_eval { remove_method(method_name) }
+      method
+    end
+
+    def extract_encoding(script)
+      extract_magic_comment(script) || script.encoding
+    end
+
+    def extract_magic_comment(script)
+      binary script do
+        script[/\A[ \t]*\#.*coding\s*[=:]\s*([[:alnum:]\-_]+).*$/n, 1]
+      end
+    end
+
+    def binary(string)
+      original_encoding = string.encoding
+      string.force_encoding(Encoding::BINARY)
+      yield
+    ensure
+      string.force_encoding(original_encoding)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/textile.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/textile.rb
new file mode 100644
index 0000000..9135598
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/textile.rb
@@ -0,0 +1,30 @@
+require 'tilt/template'
+
+module Tilt
+  # RedCloth implementation. See:
+  # http://redcloth.org/
+  class RedClothTemplate < Template
+    def self.engine_initialized?
+      defined? ::RedCloth
+    end
+
+    def initialize_engine
+      require_template_library 'redcloth'
+    end
+
+    def prepare
+      @engine = RedCloth.new(data)
+      options.each {|k, v| @engine.send("#{k}=", v) if @engine.respond_to? "#{k}="}
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/wiki.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/wiki.rb
new file mode 100644
index 0000000..1349eb2
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/wiki.rb
@@ -0,0 +1,58 @@
+require 'tilt/template'
+
+module Tilt
+  # Creole implementation. See:
+  # http://www.wikicreole.org/
+  class CreoleTemplate < Template
+    def self.engine_initialized?
+      defined? ::Creole
+    end
+
+    def initialize_engine
+      require_template_library 'creole'
+    end
+
+    def prepare
+      opts = {}
+      [:allowed_schemes, :extensions, :no_escape].each do |k|
+        opts[k] = options[k] if options[k]
+      end
+      @engine = Creole::Parser.new(data, opts)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+
+  # WikiCloth implementation. See:
+  # http://redcloth.org/
+  class WikiClothTemplate < Template
+    def self.engine_initialized?
+      defined? ::WikiCloth::Parser
+    end
+
+    def initialize_engine
+      require_template_library 'wikicloth'
+    end
+
+    def prepare
+      @parser = options.delete(:parser) || WikiCloth::Parser
+      @engine = @parser.new options.merge(:data => data)
+      @output = nil
+    end
+
+    def evaluate(scope, locals, &block)
+      @output ||= @engine.to_html
+    end
+
+    def allows_script?
+      false
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/yajl.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/yajl.rb
new file mode 100644
index 0000000..0b9b702
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/lib/tilt/yajl.rb
@@ -0,0 +1,94 @@
+require 'tilt/template'
+
+module Tilt
+
+  # Yajl Template implementation
+  #
+  # Yajl is a fast JSON parsing and encoding library for Ruby
+  # See https://github.com/brianmario/yajl-ruby
+  #
+  # The template source is evaluated as a Ruby string,
+  # and the result is converted #to_json.
+  #
+  # == Example
+  #
+  #    # This is a template example.
+  #    # The template can contain any Ruby statement.
+  #    tpl <<-EOS
+  #      @counter = 0
+  #
+  #      # The json variable represents the buffer
+  #      # and holds the data to be serialized into json.
+  #      # It defaults to an empty hash, but you can override it at any time.
+  #      json = {
+  #        :"user#{@counter += 1}" => { :name => "Joshua Peek", :id => @counter },
+  #        :"user#{@counter += 1}" => { :name => "Ryan Tomayko", :id => @counter },
+  #        :"user#{@counter += 1}" => { :name => "Simone Carletti", :id => @counter },
+  #      }
+  #
+  #      # Since the json variable is a Hash,
+  #      # you can use conditional statements or any other Ruby statement
+  #      # to populate it.
+  #      json[:"user#{@counter += 1}"] = { :name => "Unknown" } if 1 == 2
+  #
+  #      # The last line doesn't affect the returned value.
+  #      nil
+  #    EOS
+  #
+  #    template = Tilt::YajlTemplate.new { tpl }
+  #    template.render(self)
+  #
+  class YajlTemplate < Template
+
+    self.default_mime_type = 'application/json'
+
+    def self.engine_initialized?
+      defined? ::Yajl
+    end
+
+    def initialize_engine
+      require_template_library 'yajl'
+    end
+
+    def prepare
+    end
+
+    def evaluate(scope, locals, &block)
+      decorate super(scope, locals, &block)
+    end
+
+    def precompiled_preamble(locals)
+      return super if locals.include? :json
+      "json = {}\n#{super}"
+    end
+
+    def precompiled_postamble(locals)
+      "Yajl::Encoder.new.encode(json)"
+    end
+
+    def precompiled_template(locals)
+      data.to_str
+    end
+
+
+    # Decorates the +json+ input according to given +options+.
+    #
+    # json    - The json String to decorate.
+    # options - The option Hash to customize the behavior.
+    #
+    # Returns the decorated String.
+    def decorate(json)
+      callback, variable = options[:callback], options[:variable]
+      if callback && variable
+        "var #{variable} = #{json}; #{callback}(#{variable});"
+      elsif variable
+        "var #{variable} = #{json};"
+      elsif callback
+        "#{callback}(#{json});"
+      else
+        json
+      end
+    end
+  end
+
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/contest.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/contest.rb
new file mode 100644
index 0000000..075f941
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/contest.rb
@@ -0,0 +1,68 @@
+require "test/unit"
+
+# Test::Unit loads a default test if the suite is empty, whose purpose is to
+# fail. Since having empty contexts is a common practice, we decided to
+# overwrite TestSuite#empty? in order to allow them. Having a failure when no
+# tests have been defined seems counter-intuitive.
+class Test::Unit::TestSuite
+  def empty?
+    false
+  end
+end
+
+# Contest adds +teardown+, +test+ and +context+ as class methods, and the
+# instance methods +setup+ and +teardown+ now iterate on the corresponding
+# blocks. Note that all setup and teardown blocks must be defined with the
+# block syntax. Adding setup or teardown instance methods defeats the purpose
+# of this library.
+class Test::Unit::TestCase
+  def self.setup(&block)
+    define_method :setup do
+      super(&block)
+      instance_eval(&block)
+    end
+  end
+
+  def self.teardown(&block)
+    define_method :teardown do
+      instance_eval(&block)
+      super(&block)
+    end
+  end
+
+  def self.context(name, &block)
+    subclass = Class.new(self)
+    remove_tests(subclass)
+    subclass.class_eval(&block) if block_given?
+    const_set(context_name(name), subclass)
+  end
+
+  def self.test(name, &block)
+    define_method(test_name(name), &block)
+  end
+
+  class << self
+    alias_method :should, :test
+    alias_method :describe, :context
+  end
+
+private
+
+  def self.context_name(name)
+    "Test#{sanitize_name(name).gsub(/(^| )(\w)/) { $2.upcase }}".to_sym
+  end
+
+  def self.test_name(name)
+    "test_#{sanitize_name(name).gsub(/\s+/,'_')}".to_sym
+  end
+
+  def self.sanitize_name(name)
+    name.gsub(/\W+/, ' ').strip
+  end
+
+  def self.remove_tests(subclass)
+    subclass.public_instance_methods.grep(/^test_/).each do |meth|
+      subclass.send(:undef_method, meth.to_sym)
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/locals.mab b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/locals.mab
new file mode 100644
index 0000000..36e29e6
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/locals.mab
@@ -0,0 +1 @@
+li foo
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/markaby.mab b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/markaby.mab
new file mode 100644
index 0000000..45f3fe4
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/markaby.mab
@@ -0,0 +1 @@
+text "hello from markaby!"
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/markaby_other_static.mab b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/markaby_other_static.mab
new file mode 100644
index 0000000..75c03fd
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/markaby_other_static.mab
@@ -0,0 +1 @@
+text "_why?"
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/render_twice.mab b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/render_twice.mab
new file mode 100644
index 0000000..f350322
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/render_twice.mab
@@ -0,0 +1 @@
+text "foo"
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/scope.mab b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/scope.mab
new file mode 100644
index 0000000..36e29e6
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/scope.mab
@@ -0,0 +1 @@
+li foo
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/yielding.mab b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/yielding.mab
new file mode 100644
index 0000000..6e95a1b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/markaby/yielding.mab
@@ -0,0 +1,2 @@
+text("Hey ")
+yield
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_asciidoctor_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_asciidoctor_test.rb
new file mode 100644
index 0000000..27fccdc
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_asciidoctor_test.rb
@@ -0,0 +1,44 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'asciidoctor'
+
+  class AsciidoctorTemplateTest < Test::Unit::TestCase
+    HTML5_OUTPUT = "<div class=\"sect1\"><h2 id=\"_hello_world\">Hello World!</h2><div class=\"sectionbody\"></div></div>"
+    DOCBOOK_OUTPUT = "<section id=\"_hello_world\"><title>Hello World!</title></section>"
+
+    def strip_space(str)
+      str.gsub(/>\s+</, '><').strip
+    end
+
+    test "registered for '.ad' files" do
+      assert Tilt.mappings['ad'].include?(Tilt::AsciidoctorTemplate)
+    end
+
+    test "registered for '.adoc' files" do
+      assert Tilt.mappings['adoc'].include?(Tilt::AsciidoctorTemplate)
+    end
+
+    test "registered for '.asciidoc' files" do
+      assert Tilt.mappings['asciidoc'].include?(Tilt::AsciidoctorTemplate)
+    end
+
+    test "preparing and evaluating html5 templates on #render" do
+      template = Tilt::AsciidoctorTemplate.new(:attributes => {"backend" => 'html5'}) { |t| "== Hello World!" } 
+      assert_equal HTML5_OUTPUT, strip_space(template.render)
+    end
+
+    test "preparing and evaluating docbook templates on #render" do
+      template = Tilt::AsciidoctorTemplate.new(:attributes => {"backend" => 'docbook'}) { |t| "== Hello World!" } 
+      assert_equal DOCBOOK_OUTPUT, strip_space(template.render)
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::AsciidoctorTemplate.new(:attributes => {"backend" => 'html5'}) { |t| "== Hello World!" } 
+      3.times { assert_equal HTML5_OUTPUT, strip_space(template.render) }
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::AsciidoctorTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_blueclothtemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_blueclothtemplate_test.rb
new file mode 100644
index 0000000..1952ef9
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_blueclothtemplate_test.rb
@@ -0,0 +1,45 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'bluecloth'
+
+  class BlueClothTemplateTest < Test::Unit::TestCase
+    test "registered for '.md' files" do
+      assert Tilt.mappings['md'].include?(Tilt::BlueClothTemplate)
+    end
+
+    test "registered for '.mkd' files" do
+      assert Tilt.mappings['mkd'].include?(Tilt::BlueClothTemplate)
+    end
+
+    test "registered for '.markdown' files" do
+      assert Tilt.mappings['markdown'].include?(Tilt::BlueClothTemplate)
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::BlueClothTemplate.new { |t| "# Hello World!" }
+      assert_equal "<h1>Hello World!</h1>", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::BlueClothTemplate.new { |t| "# Hello World!" }
+      3.times { assert_equal "<h1>Hello World!</h1>", template.render }
+    end
+
+    test "smartypants when :smart is set" do
+      template = Tilt::BlueClothTemplate.new(:smartypants => true) { |t|
+        "OKAY -- 'Smarty Pants'" }
+      assert_equal "<p>OKAY — ‘Smarty Pants’</p>",
+        template.render
+    end
+
+    test "stripping HTML when :filter_html is set" do
+      template = Tilt::BlueClothTemplate.new(:escape_html => true) { |t|
+        "HELLO <blink>WORLD</blink>" }
+      assert_equal "<p>HELLO <blink>WORLD</blink></p>", template.render
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::BlueClothTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_buildertemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_buildertemplate_test.rb
new file mode 100644
index 0000000..44d8deb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_buildertemplate_test.rb
@@ -0,0 +1,59 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'builder'
+  class BuilderTemplateTest < Test::Unit::TestCase
+    test "registered for '.builder' files" do
+      assert_equal Tilt::BuilderTemplate, Tilt['test.builder']
+      assert_equal Tilt::BuilderTemplate, Tilt['test.xml.builder']
+    end
+
+    test "preparing and evaluating the template on #render" do
+      template = Tilt::BuilderTemplate.new { |t| "xml.em 'Hello World!'" }
+      assert_equal "<em>Hello World!</em>\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::BuilderTemplate.new { |t| "xml.em 'Hello World!'" }
+      3.times { assert_equal "<em>Hello World!</em>\n", template.render }
+    end
+
+    test "passing locals" do
+      template = Tilt::BuilderTemplate.new { "xml.em('Hey ' + name + '!')" }
+      assert_equal "<em>Hey Joe!</em>\n", template.render(Object.new, :name => 'Joe')
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::BuilderTemplate.new { "xml.em('Hey ' + @name + '!')" }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal "<em>Hey Joe!</em>\n", template.render(scope)
+    end
+
+    test "passing a block for yield" do
+      template = Tilt::BuilderTemplate.new { "xml.em('Hey ' + yield + '!')" }
+      3.times { assert_equal "<em>Hey Joe!</em>\n", template.render { 'Joe' }}
+    end
+
+    test "block style templates" do
+      template =
+        Tilt::BuilderTemplate.new do |t|
+          lambda { |xml| xml.em('Hey Joe!') }
+        end
+      assert_equal "<em>Hey Joe!</em>\n", template.render
+    end
+
+    test "allows nesting raw XML" do
+      subtemplate = Tilt::BuilderTemplate.new { "xml.em 'Hello World!'" }
+      template = Tilt::BuilderTemplate.new { "xml.strong { xml << yield }" }
+      3.times do
+        options = { :xml => Builder::XmlMarkup.new }
+        assert_equal "<strong>\n<em>Hello World!</em>\n</strong>\n",
+          template.render(options) { subtemplate.render(options) }
+      end
+    end
+  end
+rescue LoadError
+  warn "Tilt::BuilderTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_cache_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_cache_test.rb
new file mode 100644
index 0000000..8c8e050
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_cache_test.rb
@@ -0,0 +1,32 @@
+require 'contest'
+require 'tilt'
+
+class TiltCacheTest < Test::Unit::TestCase
+  setup { @cache = Tilt::Cache.new }
+
+  test "caching with single simple argument to #fetch" do
+    template = nil
+    result = @cache.fetch('hello') { template = Tilt::StringTemplate.new {''} }
+    assert_same template, result
+    result = @cache.fetch('hello') { fail 'should be cached' }
+    assert_same template, result
+  end
+
+  test "caching with multiple complex arguments to #fetch" do
+    template = nil
+    result = @cache.fetch('hello', {:foo => 'bar', :baz => 'bizzle'}) { template = Tilt::StringTemplate.new {''} }
+    assert_same template, result
+    result = @cache.fetch('hello', {:foo => 'bar', :baz => 'bizzle'}) { fail 'should be cached' }
+    assert_same template, result
+  end
+
+  test "clearing the cache with #clear" do
+    template, other = nil
+    result = @cache.fetch('hello') { template = Tilt::StringTemplate.new {''} }
+    assert_same template, result
+
+    @cache.clear
+    result = @cache.fetch('hello') { other = Tilt::StringTemplate.new {''} }
+    assert_same other, result
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_coffeescripttemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_coffeescripttemplate_test.rb
new file mode 100644
index 0000000..377b6f7
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_coffeescripttemplate_test.rb
@@ -0,0 +1,114 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'coffee_script'
+
+  class CoffeeScriptTemplateTest < Test::Unit::TestCase
+
+    unless method_defined?(:assert_not_match)
+      # assert_not_match is missing on 1.8.7, which uses assert_no_match
+      def assert_not_match(a, b)
+        unless a.kind_of?(Regexp)
+          a = Regexp.new(Regexp.escape(a))
+        end
+        assert_no_match(a,b)
+      end
+    end
+
+    test "is registered for '.coffee' files" do
+      assert_equal Tilt::CoffeeScriptTemplate, Tilt['test.coffee']
+    end
+
+    test "bare is disabled by default" do
+      assert_equal false, Tilt::CoffeeScriptTemplate.default_bare
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::CoffeeScriptTemplate.new { |t| "puts 'Hello, World!'\n" }
+      assert_match "puts('Hello, World!');", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::CoffeeScriptTemplate.new { |t| "puts 'Hello, World!'\n" }
+      3.times { assert_match "puts('Hello, World!');", template.render }
+    end
+
+    test "disabling coffee-script wrapper" do
+      str = 'name = "Josh"; puts "Hello #{name}"'
+
+      template = Tilt::CoffeeScriptTemplate.new { str }
+      assert_match "(function() {", template.render
+      assert_match "puts(\"Hello \" + name);\n", template.render
+
+      template = Tilt::CoffeeScriptTemplate.new(:bare => true) { str }
+      assert_not_match "(function() {", template.render
+      assert_equal "var name;\n\nname = \"Josh\";\n\nputs(\"Hello \" + name);\n", template.render
+
+      template2 = Tilt::CoffeeScriptTemplate.new(:no_wrap => true) { str}
+      assert_not_match "(function() {", template.render
+      assert_equal "var name;\n\nname = \"Josh\";\n\nputs(\"Hello \" + name);\n", template.render
+    end
+
+    context "wrapper globally enabled" do
+      setup do
+        @bare = Tilt::CoffeeScriptTemplate.default_bare
+        Tilt::CoffeeScriptTemplate.default_bare = false
+      end
+
+      teardown do
+        Tilt::CoffeeScriptTemplate.default_bare = @bare
+      end
+
+      test "no options" do
+        template = Tilt::CoffeeScriptTemplate.new { |t| 'name = "Josh"; puts "Hello, #{name}"' }
+        assert_match "puts(\"Hello, \" + name);", template.render
+        assert_match "(function() {", template.render
+      end
+
+      test "overridden by :bare" do
+        template = Tilt::CoffeeScriptTemplate.new(:bare => true) { |t| 'name = "Josh"; puts "Hello, #{name}"' }
+        assert_match "puts(\"Hello, \" + name);", template.render
+        assert_not_match "(function() {", template.render
+      end
+
+      test "overridden by :no_wrap" do
+        template = Tilt::CoffeeScriptTemplate.new(:no_wrap => true) { |t| 'name = "Josh"; puts "Hello, #{name}"' }
+        assert_match "puts(\"Hello, \" + name);", template.render
+        assert_not_match "(function() {", template.render
+      end
+    end
+
+    context "wrapper globally disabled" do
+      setup do
+        @bare = Tilt::CoffeeScriptTemplate.default_bare
+        Tilt::CoffeeScriptTemplate.default_bare = true
+      end
+
+      teardown do
+        Tilt::CoffeeScriptTemplate.default_bare = @bare
+      end
+
+      test "no options" do
+        template = Tilt::CoffeeScriptTemplate.new { |t| 'name = "Josh"; puts "Hello, #{name}"' }
+        assert_match "puts(\"Hello, \" + name);", template.render
+        assert_not_match "(function() {", template.render
+      end
+
+      test "overridden by :bare" do
+        template = Tilt::CoffeeScriptTemplate.new(:bare => false) { |t| 'name = "Josh"; puts "Hello, #{name}"' }
+        assert_match "puts(\"Hello, \" + name);", template.render
+        assert_match "(function() {", template.render
+      end
+
+      test "overridden by :no_wrap" do
+        template = Tilt::CoffeeScriptTemplate.new(:no_wrap => false) { |t| 'name = "Josh"; puts "Hello, #{name}"' }
+        assert_match "puts(\"Hello, \" + name);", template.render
+        assert_match "(function() {", template.render
+      end
+    end
+  end
+
+rescue LoadError => boom
+  warn "Tilt::CoffeeScriptTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_compilesite_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_compilesite_test.rb
new file mode 100644
index 0000000..2944c84
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_compilesite_test.rb
@@ -0,0 +1,51 @@
+require 'contest'
+require 'tilt'
+require 'thread'
+
+class CompileSiteTest < Test::Unit::TestCase
+  def setup
+    GC.start
+  end
+
+  class CompilingTemplate < Tilt::Template
+    def prepare
+    end
+
+    def precompiled_template(locals)
+      @data.inspect
+    end
+  end
+
+  class Scope
+  end
+
+  test "compiling template source to a method" do
+    template = CompilingTemplate.new { |t| "Hello World!" }
+    template.render(Scope.new)
+    method = template.send(:compiled_method, [])
+    assert_kind_of UnboundMethod, method
+  end
+
+  # This test attempts to surface issues with compiling templates from
+  # multiple threads.
+  test "using compiled templates from multiple threads" do
+    template = CompilingTemplate.new { 'template' }
+    main_thread = Thread.current
+    10.times do |i|
+      threads =
+        (1..50).map do |j|
+          Thread.new {
+            begin
+              locals = { "local#{i}" => 'value' }
+              res = template.render(self, locals)
+              thread_id = Thread.current.object_id
+              res = template.render(self, "local#{thread_id.abs.to_s}" => 'value')
+            rescue => boom
+              main_thread.raise(boom)
+            end
+          }
+        end
+      threads.each { |t| t.join }
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_creoletemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_creoletemplate_test.rb
new file mode 100644
index 0000000..b4e8098
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_creoletemplate_test.rb
@@ -0,0 +1,28 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'creole'
+
+  class CreoleTemplateTest < Test::Unit::TestCase
+    test "is registered for '.creole' files" do
+      assert_equal Tilt::CreoleTemplate, Tilt['test.creole']
+    end
+
+    test "registered for '.wiki' files" do
+      assert Tilt.mappings['wiki'].include?(Tilt::CreoleTemplate)
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::CreoleTemplate.new { |t| "= Hello World!" }
+      assert_equal "<h1>Hello World!</h1>", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::CreoleTemplate.new { |t| "= Hello World!" }
+      3.times { assert_equal "<h1>Hello World!</h1>", template.render }
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::CreoleTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_csv_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_csv_test.rb
new file mode 100644
index 0000000..c11ce03
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_csv_test.rb
@@ -0,0 +1,69 @@
+require 'contest'
+require 'tilt'
+
+begin
+  if RUBY_VERSION >= '1.9.0'
+    require 'csv'
+  else
+    require 'fastercsv'
+  end
+
+  class CSVTemplateTest < Test::Unit::TestCase
+
+    test "registered for '.rcsv' files" do
+      assert Tilt.mappings['rcsv'].include?(Tilt::CSVTemplate)
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::CSVTemplate.new { "csv << ['hello', 'world']" }
+      assert_equal "hello,world\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::CSVTemplate.new { "csv << [1,2,3]" }
+      3.times { assert_equal "1,2,3\n", template.render }
+    end
+
+    test "can pass locals" do
+      template = Tilt::CSVTemplate.new { 'csv << [1, name]' }
+      assert_equal "1,Joe\n", template.render(Object.new, :name => 'Joe')
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::CSVTemplate.new { 'csv << [1, @name]' }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal "1,Joe\n", template.render(scope)
+    end
+
+    test "backtrace file and line reporting" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      template = Tilt::CSVTemplate.new('test.csv') { data }
+      begin
+        template.render
+        fail 'should have raised an exception'
+      rescue => boom
+        assert_kind_of NameError, boom
+        line = boom.backtrace.grep(/^test\.csv:/).first
+        assert line, "Backtrace didn't contain test.csv"
+        file, line, meth = line.split(":")
+        assert_equal '4', line
+      end
+    end
+
+  end
+
+rescue LoadError => boom
+  warn "Tilt::CSVTemplate (disabled) please install 'fastercsv' if using ruby 1.8.x"
+end
+
+
+__END__
+# header
+csv << ['Type', 'Age']
+
+raise NameError
+
+# rows
+csv << ['Frog', 2]
+csv << ['Cat', 5]
\ No newline at end of file
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_erbtemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_erbtemplate_test.rb
new file mode 100644
index 0000000..5faffcb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_erbtemplate_test.rb
@@ -0,0 +1,239 @@
+# coding: utf-8
+require 'contest'
+require 'tilt'
+require 'erb'
+require 'tempfile'
+
+class ERBTemplateTest < Test::Unit::TestCase
+  test "registered for '.erb' files" do
+    assert Tilt.mappings['erb'].include?(Tilt::ERBTemplate)
+  end
+
+  test "registered for '.rhtml' files" do
+    assert Tilt.mappings['rhtml'].include?(Tilt::ERBTemplate)
+  end
+
+  test "loading and evaluating templates on #render" do
+    template = Tilt::ERBTemplate.new { |t| "Hello World!" }
+    assert_equal "Hello World!", template.render
+  end
+
+  test "can be rendered more than once" do
+    template = Tilt::ERBTemplate.new { |t| "Hello World!" }
+    3.times { assert_equal "Hello World!", template.render }
+  end
+
+  test "passing locals" do
+    template = Tilt::ERBTemplate.new { 'Hey <%= name %>!' }
+    assert_equal "Hey Joe!", template.render(Object.new, :name => 'Joe')
+  end
+
+  test "evaluating in an object scope" do
+    template = Tilt::ERBTemplate.new { 'Hey <%= @name %>!' }
+    scope = Object.new
+    scope.instance_variable_set :@name, 'Joe'
+    assert_equal "Hey Joe!", template.render(scope)
+  end
+
+  class MockOutputVariableScope
+    attr_accessor :exposed_buffer
+  end
+
+  test "exposing the buffer to the template by default" do
+    begin
+      Tilt::ERBTemplate.default_output_variable = '@_out_buf'
+      template = Tilt::ERBTemplate.new { '<% self.exposed_buffer = @_out_buf %>hey' }
+      scope = MockOutputVariableScope.new
+      template.render(scope)
+      assert_not_nil scope.exposed_buffer
+      assert_equal scope.exposed_buffer, 'hey'
+    ensure
+      Tilt::ERBTemplate.default_output_variable = '_erbout'
+    end
+  end
+
+  test "passing a block for yield" do
+    template = Tilt::ERBTemplate.new { 'Hey <%= yield %>!' }
+    assert_equal "Hey Joe!", template.render { 'Joe' }
+  end
+
+  test "backtrace file and line reporting without locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::ERBTemplate.new('test.erb', 11) { data }
+    begin
+      template.render
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of NameError, boom
+      line = boom.backtrace.grep(/^test\.erb:/).first
+      assert line, "Backtrace didn't contain test.erb"
+      file, line, meth = line.split(":")
+      assert_equal '13', line
+    end
+  end
+
+  test "backtrace file and line reporting with locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::ERBTemplate.new('test.erb', 1) { data }
+    begin
+      template.render(nil, :name => 'Joe', :foo => 'bar')
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of RuntimeError, boom
+      line = boom.backtrace.first
+      file, line, meth = line.split(":")
+      assert_equal 'test.erb', file
+      assert_equal '6', line
+    end
+  end
+
+  test "explicit disabling of trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb', 1, :trim => false) { "\n<%= 1 + 1 %>\n" }
+    assert_equal "\n2\n", template.render
+  end
+
+  test "default stripping trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb', 1) { "\n<%= 1 + 1 %>\n" }
+    assert_equal "\n2", template.render
+  end
+
+  test "stripping trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb', 1, :trim => '-') { "\n<%= 1 + 1 -%>\n" }
+    assert_equal "\n2", template.render
+  end
+
+  test "shorthand whole line syntax trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb', :trim => '%') { "\n% if true\nhello\n%end\n" }
+    assert_equal "\nhello\n", template.render
+  end
+
+  test "using an instance variable as the outvar" do
+    template = Tilt::ERBTemplate.new(nil, :outvar => '@buf') { "<%= 1 + 1 %>" }
+    scope = Object.new
+    scope.instance_variable_set(:@buf, 'original value')
+    assert_equal '2', template.render(scope)
+    assert_equal 'original value', scope.instance_variable_get(:@buf)
+  end
+end
+
+class CompiledERBTemplateTest < Test::Unit::TestCase
+  def teardown
+    GC.start
+  end
+
+  class Scope
+  end
+
+  test "compiling template source to a method" do
+    template = Tilt::ERBTemplate.new { |t| "Hello World!" }
+    template.render(Scope.new)
+    method = template.send(:compiled_method, [])
+    assert_kind_of UnboundMethod, method
+  end
+
+  test "loading and evaluating templates on #render" do
+    template = Tilt::ERBTemplate.new { |t| "Hello World!" }
+    assert_equal "Hello World!", template.render(Scope.new)
+    assert_equal "Hello World!", template.render(Scope.new)
+  end
+
+  test "passing locals" do
+    template = Tilt::ERBTemplate.new { 'Hey <%= name %>!' }
+    assert_equal "Hey Joe!", template.render(Scope.new, :name => 'Joe')
+  end
+
+  test "evaluating in an object scope" do
+    template = Tilt::ERBTemplate.new { 'Hey <%= @name %>!' }
+    scope = Scope.new
+    scope.instance_variable_set :@name, 'Joe'
+    assert_equal "Hey Joe!", template.render(scope)
+    scope.instance_variable_set :@name, 'Jane'
+    assert_equal "Hey Jane!", template.render(scope)
+  end
+
+  test "passing a block for yield" do
+    template = Tilt::ERBTemplate.new { 'Hey <%= yield %>!' }
+    assert_equal "Hey Joe!", template.render(Scope.new) { 'Joe' }
+    assert_equal "Hey Jane!", template.render(Scope.new) { 'Jane' }
+  end
+
+  test "backtrace file and line reporting without locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::ERBTemplate.new('test.erb', 11) { data }
+    begin
+      template.render(Scope.new)
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of NameError, boom
+      line = boom.backtrace.grep(/^test\.erb:/).first
+      assert line, "Backtrace didn't contain test.erb"
+      file, line, meth = line.split(":")
+      assert_equal '13', line
+    end
+  end
+
+  test "backtrace file and line reporting with locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::ERBTemplate.new('test.erb') { data }
+    begin
+      template.render(Scope.new, :name => 'Joe', :foo => 'bar')
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of RuntimeError, boom
+      line = boom.backtrace.first
+      file, line, meth = line.split(":")
+      assert_equal 'test.erb', file
+      assert_equal '6', line
+    end
+  end
+
+  test "default stripping trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb') { "\n<%= 1 + 1 %>\n" }
+    assert_equal "\n2", template.render(Scope.new)
+  end
+
+  test "stripping trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb', :trim => '-') { "\n<%= 1 + 1 -%>\n" }
+    assert_equal "\n2", template.render(Scope.new)
+  end
+
+  test "shorthand whole line syntax trim mode" do
+    template = Tilt::ERBTemplate.new('test.erb', :trim => '%') { "\n% if true\nhello\n%end\n" }
+    assert_equal "\nhello\n", template.render(Scope.new)
+  end
+
+  test "encoding with magic comment" do
+    f = Tempfile.open("template")
+    f.puts('<%# coding: UTF-8 %>')
+    f.puts('ふが <%= @hoge %>')
+    f.close()
+    @hoge = "ほげ"
+    erb = Tilt::ERBTemplate.new(f.path)
+    3.times { erb.render(self) }
+    f.delete
+  end
+
+  test "encoding with :default_encoding" do
+    f = Tempfile.open("template")
+    f.puts('ふが <%= @hoge %>')
+    f.close()
+    @hoge = "ほげ"
+    erb = Tilt::ERBTemplate.new(f.path, :default_encoding => 'UTF-8')
+    3.times { erb.render(self) }
+    f.delete
+  end
+end
+
+__END__
+<html>
+<body>
+  <h1>Hey <%= name %>!</h1>
+
+
+  <p><% fail %></p>
+</body>
+</html>
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_erubistemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_erubistemplate_test.rb
new file mode 100644
index 0000000..f908c0f
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_erubistemplate_test.rb
@@ -0,0 +1,151 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'erubis'
+  class ErubisTemplateTest < Test::Unit::TestCase
+    test "registered for '.erubis' files" do
+      assert_equal Tilt::ErubisTemplate, Tilt['test.erubis']
+      assert_equal Tilt::ErubisTemplate, Tilt['test.html.erubis']
+    end
+
+    test "registered above ERB" do
+      %w[erb rhtml].each do |ext|
+        mappings = Tilt.mappings[ext]
+        erubis_idx = mappings.index(Tilt::ErubisTemplate)
+        erb_idx = mappings.index(Tilt::ERBTemplate)
+        assert erubis_idx < erb_idx,
+          "#{erubis_idx} should be lower than #{erb_idx}"
+      end
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::ErubisTemplate.new { |t| "Hello World!" }
+      assert_equal "Hello World!", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::ErubisTemplate.new { |t| "Hello World!" }
+      3.times { assert_equal "Hello World!", template.render }
+    end
+
+    test "passing locals" do
+      template = Tilt::ErubisTemplate.new { 'Hey <%= name %>!' }
+      assert_equal "Hey Joe!", template.render(Object.new, :name => 'Joe')
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::ErubisTemplate.new { 'Hey <%= @name %>!' }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal "Hey Joe!", template.render(scope)
+    end
+
+    class MockOutputVariableScope
+      attr_accessor :exposed_buffer
+    end
+
+    test "exposing the buffer to the template by default" do
+      begin
+        Tilt::ErubisTemplate.default_output_variable = '@_out_buf'
+        template = Tilt::ErubisTemplate.new { '<% self.exposed_buffer = @_out_buf %>hey' }
+        scope = MockOutputVariableScope.new
+        template.render(scope)
+        assert_not_nil scope.exposed_buffer
+        assert_equal scope.exposed_buffer, 'hey'
+      ensure
+        Tilt::ErubisTemplate.default_output_variable = '_erbout'
+      end
+    end
+
+    test "passing a block for yield" do
+      template = Tilt::ErubisTemplate.new { 'Hey <%= yield %>!' }
+      assert_equal "Hey Joe!", template.render { 'Joe' }
+    end
+
+    test "backtrace file and line reporting without locals" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      fail unless data[0] == ?<
+      template = Tilt::ErubisTemplate.new('test.erubis', 11) { data }
+      begin
+        template.render
+        fail 'should have raised an exception'
+      rescue => boom
+        assert_kind_of NameError, boom
+        line = boom.backtrace.grep(/^test\.erubis:/).first
+        assert line, "Backtrace didn't contain test.erubis"
+        file, line, meth = line.split(":")
+        assert_equal '13', line
+      end
+    end
+
+    test "backtrace file and line reporting with locals" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      fail unless data[0] == ?<
+      template = Tilt::ErubisTemplate.new('test.erubis', 1) { data }
+      begin
+        template.render(nil, :name => 'Joe', :foo => 'bar')
+        fail 'should have raised an exception'
+      rescue => boom
+        assert_kind_of RuntimeError, boom
+        line = boom.backtrace.first
+        file, line, meth = line.split(":")
+        assert_equal 'test.erubis', file
+        assert_equal '6', line
+      end
+    end
+
+    test "erubis template options" do
+      template = Tilt::ErubisTemplate.new(nil, :pattern => '\{% %\}') { 'Hey {%= @name %}!' }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal "Hey Joe!", template.render(scope)
+    end
+
+    test "using an instance variable as the outvar" do
+      template = Tilt::ErubisTemplate.new(nil, :outvar => '@buf') { "<%= 1 + 1 %>" }
+      scope = Object.new
+      scope.instance_variable_set(:@buf, 'original value')
+      assert_equal '2', template.render(scope)
+      assert_equal 'original value', scope.instance_variable_get(:@buf)
+    end
+
+    test "using Erubis::EscapedEruby subclass via :engine_class option" do
+      template = Tilt::ErubisTemplate.new(nil, :engine_class => ::Erubis::EscapedEruby) { |t| %(<%= "<p>Hello World!</p>" %>) }
+      assert_equal "<p>Hello World!</p>", template.render
+    end
+
+    test "using :escape_html => true option" do
+      template = Tilt::ErubisTemplate.new(nil, :escape_html => true) { |t| %(<%= "<p>Hello World!</p>" %>) }
+      assert_equal "<p>Hello World!</p>", template.render
+    end
+
+    test "using :escape_html => false option" do
+      template = Tilt::ErubisTemplate.new(nil, :escape_html => false) { |t| %(<%= "<p>Hello World!</p>" %>) }
+      assert_equal "<p>Hello World!</p>", template.render
+    end
+
+    test "erubis default does not escape html" do
+      template = Tilt::ErubisTemplate.new { |t| %(<%= "<p>Hello World!</p>" %>) }
+      assert_equal "<p>Hello World!</p>", template.render
+    end
+
+    test "does not modify options argument" do
+      options_hash = {:escape_html => true}
+      template = Tilt::ErubisTemplate.new(nil, options_hash) { |t| "Hello World!" }
+      assert_equal({:escape_html => true}, options_hash)
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::ErubisTemplate (disabled)"
+end
+
+__END__
+<html>
+<body>
+  <h1>Hey <%= name %>!</h1>
+
+
+  <p><% fail %></p>
+</body>
+</html>
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_etannitemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_etannitemplate_test.rb
new file mode 100644
index 0000000..32c81e8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_etannitemplate_test.rb
@@ -0,0 +1,173 @@
+require 'contest'
+require 'tilt'
+
+class EtanniTemplateTest < Test::Unit::TestCase
+  test "registered for '.etn' files" do
+    assert_equal Tilt::EtanniTemplate, Tilt['test.etn']
+  end
+
+  test "registered for '.etanni' files" do
+    assert_equal Tilt::EtanniTemplate, Tilt['test.etanni']
+  end
+
+  test "loading and evaluating templates on #render" do
+    template = Tilt::EtanniTemplate.new { |t| "Hello World!" }
+    assert_equal "Hello World!", template.render
+  end
+
+  test "can be rendered more than once" do
+    template = Tilt::EtanniTemplate.new { |t| "Hello World!" }
+    3.times { assert_equal "Hello World!", template.render }
+  end
+
+  test "passing locals" do
+    template = Tilt::EtanniTemplate.new { 'Hey #{name}!' }
+    assert_equal "Hey Joe!", template.render(Object.new, :name => 'Joe')
+  end
+
+  test "evaluating in an object scope" do
+    template = Tilt::EtanniTemplate.new { 'Hey #{@name}!' }
+    scope = Object.new
+    scope.instance_variable_set :@name, 'Joe'
+    assert_equal "Hey Joe!", template.render(scope)
+  end
+
+  test "passing a block for yield" do
+    template = Tilt::EtanniTemplate.new { 'Hey #{yield}!' }
+    assert_equal "Hey Joe!", template.render { 'Joe' }
+    assert_equal "Hey Moe!", template.render { 'Moe' }
+  end
+
+  test "multiline templates" do
+    template = Tilt::EtanniTemplate.new { "Hello\nWorld!\n" }
+    assert_equal "Hello\nWorld!", template.render
+  end
+
+  test "backtrace file and line reporting without locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::EtanniTemplate.new('test.etn', 11) { data }
+    begin
+      template.render
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of NameError, boom
+      line = boom.backtrace.grep(/^test\.etn:/).first
+      assert line, "Backtrace didn't contain test.etn"
+      file, line, meth = line.split(":")
+      assert_equal '13', line
+    end
+  end
+
+  test "backtrace file and line reporting with locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::EtanniTemplate.new('test.etn', 1) { data }
+    begin
+      template.render(nil, :name => 'Joe', :foo => 'bar')
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of RuntimeError, boom
+      line = boom.backtrace.first
+      file, line, meth = line.split(":")
+      assert_equal 'test.etn', file
+      assert_equal '6', line
+    end
+  end
+end
+
+
+class CompiledEtanniTemplateTest < Test::Unit::TestCase
+  def teardown
+    GC.start
+  end
+
+  class Scope
+  end
+
+  test "compiling template source to a method" do
+    template = Tilt::EtanniTemplate.new { |t| "Hello World!" }
+    template.render(Scope.new)
+    method = template.send(:compiled_method, [])
+    assert_kind_of UnboundMethod, method
+  end
+
+  test "loading and evaluating templates on #render" do
+    template = Tilt::EtanniTemplate.new { |t| "Hello World!" }
+    assert_equal "Hello World!", template.render(Scope.new)
+  end
+
+  test "passing locals" do
+    template = Tilt::EtanniTemplate.new { 'Hey #{name}!' }
+    assert_equal "Hey Joe!", template.render(Scope.new, :name => 'Joe')
+    assert_equal "Hey Moe!", template.render(Scope.new, :name => 'Moe')
+  end
+
+  test "evaluating in an object scope" do
+    template = Tilt::EtanniTemplate.new { 'Hey #{@name}!' }
+    scope = Scope.new
+    scope.instance_variable_set :@name, 'Joe'
+    assert_equal "Hey Joe!", template.render(scope)
+    scope.instance_variable_set :@name, 'Moe'
+    assert_equal "Hey Moe!", template.render(scope)
+  end
+
+  test "passing a block for yield" do
+    template = Tilt::EtanniTemplate.new { 'Hey #{yield}!' }
+    assert_equal "Hey Joe!", template.render(Scope.new) { 'Joe' }
+    assert_equal "Hey Moe!", template.render(Scope.new) { 'Moe' }
+  end
+
+  test "multiline templates" do
+    template = Tilt::EtanniTemplate.new { "Hello\nWorld!\n" }
+    assert_equal "Hello\nWorld!", template.render(Scope.new)
+  end
+
+  test "template with '}'" do
+    template = Tilt::EtanniTemplate.new { "Hello }" }
+    assert_equal "Hello }", template.render
+  end
+
+  test "backtrace file and line reporting without locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::EtanniTemplate.new('test.etn', 11) { data }
+    begin
+      template.render(Scope.new)
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of NameError, boom
+      line = boom.backtrace.first
+      line = boom.backtrace.grep(/^test\.etn:/).first
+      assert line, "Backtrace didn't contain test.etn"
+      file, line, meth = line.split(":")
+      assert_equal '13', line
+    end
+  end
+
+  test "backtrace file and line reporting with locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::EtanniTemplate.new('test.etn') { data }
+    begin
+      template.render(Scope.new, :name => 'Joe', :foo => 'bar')
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of RuntimeError, boom
+      line = boom.backtrace.first
+      file, line, meth = line.split(":")
+      assert_equal 'test.etn', file
+      assert_equal '6', line
+    end
+  end
+end
+
+__END__
+<html>
+<body>
+  <h1>Hey #{name}!</h1>
+
+
+  <p>#{fail}</p>
+</body>
+</html>
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_fallback_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_fallback_test.rb
new file mode 100644
index 0000000..067fae1
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_fallback_test.rb
@@ -0,0 +1,122 @@
+require 'contest'
+require 'tilt'
+
+class TiltFallbackTest < Test::Unit::TestCase
+  class FailTemplate  < Tilt::Template
+    def self.engine_initialized?; false end
+    def prepare;                        end
+
+    def initialize_engine
+      raise LoadError, "can't load #{self.class}"
+    end
+  end
+
+  class WinTemplate < Tilt::Template
+    def self.engine_initialized?; true end
+    def prepare;                       end
+  end
+
+  FailTemplate2 = Class.new(FailTemplate)
+  WinTemplate2  = Class.new(WinTemplate)
+
+  def set_ivar(obj, name, value)
+    obj.instance_variable_set("@#{name}", value)
+  end
+
+  def clear_ivar(obj, name)
+    ivar = "@#{name}"
+    value = obj.instance_variable_get(ivar)
+  ensure
+    obj.instance_variable_set(ivar, value.dup.clear)
+  end
+
+  setup do
+    # Make sure every test have no mappings.
+    @p = clear_ivar(Tilt, :preferred_mappings)
+    @t = clear_ivar(Tilt, :template_mappings)
+  end
+
+  teardown do
+    set_ivar(Tilt, :preferred_mappings, @p)
+    set_ivar(Tilt, :template_mappings, @t)
+  end
+
+  test "returns nil on unregistered extensions" do
+    template = Tilt["md"]
+    assert_equal nil, template
+  end
+
+  test "returns the last registered template" do
+    Tilt.register("md", WinTemplate)
+    Tilt.register("md", WinTemplate2)
+
+    template = Tilt["md"]
+    assert_equal WinTemplate2, template
+  end
+
+  test "returns the last registered working template" do
+    Tilt.register("md", WinTemplate)
+    Tilt.register("md", FailTemplate)
+
+    template = Tilt["md"]
+    assert_equal WinTemplate, template
+  end
+
+  test "if every template fails, raise the exception from the first template" do
+    Tilt.register("md", FailTemplate)
+    Tilt.register("md", FailTemplate2)
+
+    exc = assert_raise(LoadError) { Tilt["md"] }
+    assert_match /FailTemplate2/, exc.message
+  end
+
+  test ".prefer should also register the template" do
+    Tilt.prefer(WinTemplate, "md")
+    assert Tilt.registered?("md")
+  end
+
+  test ".prefer always win" do
+    Tilt.register("md", FailTemplate)
+    Tilt.register("md", WinTemplate)
+    Tilt.prefer(FailTemplate, "md")
+
+    template = Tilt["md"]
+    assert_equal FailTemplate, template
+  end
+
+  test ".prefer accepts multiple extensions" do
+    extensions = %w[md mkd markdown]
+    Tilt.prefer(FailTemplate, *extensions)
+
+    extensions.each do |ext|
+      template = Tilt[ext]
+      assert_equal FailTemplate, template
+    end
+  end
+
+  test ".prefer with no extension should use already registered extensions" do
+    extensions = %w[md mkd markdown]
+
+    extensions.each do |ext|
+      Tilt.register(ext, FailTemplate)
+      Tilt.register(ext, WinTemplate)
+    end
+
+    Tilt.prefer(FailTemplate)
+
+    extensions.each do |ext|
+      template = Tilt[ext]
+      assert_equal FailTemplate, template
+    end
+  end
+
+  test ".prefer should only override extensions the preferred library is registered for"  do
+    Tilt.register("md", WinTemplate)
+    Tilt.register("mkd", FailTemplate)
+    Tilt.register("mkd", WinTemplate)
+    Tilt.prefer(FailTemplate)
+    assert_equal FailTemplate, Tilt["mkd"]
+    assert_equal WinTemplate, Tilt["md"]
+  end
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_hamltemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_hamltemplate_test.rb
new file mode 100644
index 0000000..8466675
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_hamltemplate_test.rb
@@ -0,0 +1,144 @@
+require 'contest'
+require 'tilt'
+
+begin
+  class ::MockError < NameError
+  end
+
+  require 'haml'
+
+  class HamlTemplateTest < Test::Unit::TestCase
+    test "registered for '.haml' files" do
+      assert_equal Tilt::HamlTemplate, Tilt['test.haml']
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::HamlTemplate.new { |t| "%p Hello World!" }
+      assert_equal "<p>Hello World!</p>\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::HamlTemplate.new { |t| "%p Hello World!" }
+      3.times { assert_equal "<p>Hello World!</p>\n", template.render }
+    end
+
+    test "passing locals" do
+      template = Tilt::HamlTemplate.new { "%p= 'Hey ' + name + '!'" }
+      assert_equal "<p>Hey Joe!</p>\n", template.render(Object.new, :name => 'Joe')
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::HamlTemplate.new { "%p= 'Hey ' + @name + '!'" }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal "<p>Hey Joe!</p>\n", template.render(scope)
+    end
+
+    test "passing a block for yield" do
+      template = Tilt::HamlTemplate.new { "%p= 'Hey ' + yield + '!'" }
+      assert_equal "<p>Hey Joe!</p>\n", template.render { 'Joe' }
+    end
+
+    test "backtrace file and line reporting without locals" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      fail unless data[0] == ?%
+      template = Tilt::HamlTemplate.new('test.haml', 10) { data }
+      begin
+        template.render
+        fail 'should have raised an exception'
+      rescue => boom
+        assert_kind_of NameError, boom
+        line = boom.backtrace.grep(/^test\.haml:/).first
+        assert line, "Backtrace didn't contain test.haml"
+        file, line, meth = line.split(":")
+        assert_equal '12', line
+      end
+    end
+
+    test "backtrace file and line reporting with locals" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      fail unless data[0] == ?%
+      template = Tilt::HamlTemplate.new('test.haml') { data }
+      begin
+        res = template.render(Object.new, :name => 'Joe', :foo => 'bar')
+      rescue => boom
+        assert_kind_of MockError, boom
+        line = boom.backtrace.first
+        file, line, meth = line.split(":")
+        assert_equal 'test.haml', file
+        assert_equal '5', line
+      end
+    end
+  end
+
+  class CompiledHamlTemplateTest < Test::Unit::TestCase
+    class Scope
+    end
+
+    test "compiling template source to a method" do
+      template = Tilt::HamlTemplate.new { |t| "Hello World!" }
+      template.render(Scope.new)
+      method = template.send(:compiled_method, [])
+      assert_kind_of UnboundMethod, method
+    end
+
+    test "passing locals" do
+      template = Tilt::HamlTemplate.new { "%p= 'Hey ' + name + '!'" }
+      assert_equal "<p>Hey Joe!</p>\n", template.render(Scope.new, :name => 'Joe')
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::HamlTemplate.new { "%p= 'Hey ' + @name + '!'" }
+      scope = Scope.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal "<p>Hey Joe!</p>\n", template.render(scope)
+    end
+
+    test "passing a block for yield" do
+      template = Tilt::HamlTemplate.new { "%p= 'Hey ' + yield + '!'" }
+      assert_equal "<p>Hey Joe!</p>\n", template.render(Scope.new) { 'Joe' }
+    end
+
+    test "backtrace file and line reporting without locals" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      fail unless data[0] == ?%
+      template = Tilt::HamlTemplate.new('test.haml', 10) { data }
+      begin
+        template.render(Scope.new)
+        fail 'should have raised an exception'
+      rescue => boom
+        assert_kind_of NameError, boom
+        line = boom.backtrace.grep(/^test\.haml:/).first
+        assert line, "Backtrace didn't contain test.haml"
+        file, line, meth = line.split(":")
+        assert_equal '12', line
+      end
+    end
+
+    test "backtrace file and line reporting with locals" do
+      data = File.read(__FILE__).split("\n__END__\n").last
+      fail unless data[0] == ?%
+      template = Tilt::HamlTemplate.new('test.haml') { data }
+      begin
+        res = template.render(Scope.new, :name => 'Joe', :foo => 'bar')
+      rescue => boom
+        assert_kind_of MockError, boom
+        line = boom.backtrace.first
+        file, line, meth = line.split(":")
+        assert_equal 'test.haml', file
+        assert_equal '5', line
+      end
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::HamlTemplate (disabled)"
+end
+
+__END__
+%html
+  %body
+    %h1= "Hey #{name}"
+
+    = raise MockError
+
+    %p we never get here
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_kramdown_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_kramdown_test.rb
new file mode 100644
index 0000000..c031709
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_kramdown_test.rb
@@ -0,0 +1,42 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'kramdown'
+
+  class MarukuTemplateTest < Test::Unit::TestCase
+    test "registered for '.md' files" do
+      assert Tilt.mappings['md'].include?(Tilt::KramdownTemplate)
+    end
+
+    test "registered for '.mkd' files" do
+      assert Tilt.mappings['mkd'].include?(Tilt::KramdownTemplate)
+    end
+
+    test "registered for '.markdown' files" do
+      assert Tilt.mappings['markdown'].include?(Tilt::KramdownTemplate)
+    end
+
+    test "registered above MarukuTemplate" do
+      %w[md mkd markdown].each do |ext|
+        mappings = Tilt.mappings[ext]
+        kram_idx = mappings.index(Tilt::KramdownTemplate)
+        maru_idx = mappings.index(Tilt::MarukuTemplate)
+        assert kram_idx < maru_idx,
+          "#{kram_idx} should be lower than #{maru_idx}"
+      end
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::KramdownTemplate.new { |t| "# Hello World!" }
+      assert_equal "<h1 id='hello_world'>Hello World!</h1>", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::KramdownTemplate.new { |t| "# Hello World!" }
+      3.times { assert_equal "<h1 id='hello_world'>Hello World!</h1>", template.render }
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::KramdownTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_lesstemplate_test.less b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_lesstemplate_test.less
new file mode 100644
index 0000000..3e1dafa
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_lesstemplate_test.less
@@ -0,0 +1 @@
+ at text-color: #ffc0cb;
\ No newline at end of file
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_lesstemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_lesstemplate_test.rb
new file mode 100644
index 0000000..9b9a3e8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_lesstemplate_test.rb
@@ -0,0 +1,42 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'pathname'
+  require 'less'
+
+  class LessTemplateTest < Test::Unit::TestCase
+    def assert_similar(a, b)
+      assert_equal a.gsub(/\s+/m, ' '), b.gsub(/\s+/m, ' ')
+    end
+
+    test "is registered for '.less' files" do
+      assert_equal Tilt::LessTemplate, Tilt['test.less']
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::LessTemplate.new { |t| ".bg { background-color: #0000ff; } \n#main\n { .bg; }\n" }
+      assert_similar ".bg {\n  background-color: #0000ff;\n}\n#main {\n  background-color: #0000ff;\n}\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::LessTemplate.new { |t| ".bg { background-color: #0000ff; } \n#main\n { .bg; }\n" }
+      3.times { assert_similar ".bg {\n  background-color: #0000ff;\n}\n#main {\n  background-color: #0000ff;\n}\n", template.render }
+    end
+
+    test "can be passed a load path" do
+      template = Tilt::LessTemplate.new({
+        :paths => [Pathname(__FILE__).dirname]
+      }) {
+        <<-EOLESS
+        @import 'tilt_lesstemplate_test.less';
+        .bg {background-color: @text-color;}
+        EOLESS
+      }
+      assert_similar ".bg {\n  background-color: #ffc0cb;\n}\n", template.render
+    end
+  end
+
+rescue LoadError => boom
+  warn "Tilt::LessTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_liquidtemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_liquidtemplate_test.rb
new file mode 100644
index 0000000..13db928
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_liquidtemplate_test.rb
@@ -0,0 +1,78 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'liquid'
+
+  class LiquidTemplateTest < Test::Unit::TestCase
+    test "registered for '.liquid' files" do
+      assert_equal Tilt::LiquidTemplate, Tilt['test.liquid']
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::LiquidTemplate.new { |t| "Hello World!" }
+      assert_equal "Hello World!", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::LiquidTemplate.new { |t| "Hello World!" }
+      3.times { assert_equal "Hello World!", template.render }
+    end
+
+    test "passing locals" do
+      template = Tilt::LiquidTemplate.new { "Hey {{ name }}!" }
+      assert_equal "Hey Joe!", template.render(nil, :name => 'Joe')
+    end
+
+    # Object's passed as "scope" to LiquidTemplate may respond to
+    # #to_h with a Hash. The Hash's contents are merged underneath
+    # Tilt locals.
+    class ExampleLiquidScope
+      def to_h
+        { :beer => 'wet', :whisky => 'wetter' }
+      end
+    end
+
+    test "combining scope and locals when scope responds to #to_h" do
+      template =
+        Tilt::LiquidTemplate.new {
+          'Beer is {{ beer }} but Whisky is {{ whisky }}.'
+        }
+      scope = ExampleLiquidScope.new
+      assert_equal "Beer is wet but Whisky is wetter.", template.render(scope)
+    end
+
+    test "precedence when locals and scope define same variables" do
+      template =
+        Tilt::LiquidTemplate.new {
+          'Beer is {{ beer }} but Whisky is {{ whisky }}.'
+        }
+      scope = ExampleLiquidScope.new
+      assert_equal "Beer is great but Whisky is greater.",
+        template.render(scope, :beer => 'great', :whisky => 'greater')
+    end
+
+    # Object's passed as "scope" to LiquidTemplate that do not
+    # respond to #to_h are silently ignored.
+    class ExampleIgnoredLiquidScope
+    end
+
+    test "handling scopes that do not respond to #to_h" do
+      template = Tilt::LiquidTemplate.new { 'Whisky' }
+      scope = ExampleIgnoredLiquidScope.new
+      assert_equal "Whisky", template.render(scope)
+    end
+
+    test "passing a block for yield" do
+      template =
+        Tilt::LiquidTemplate.new {
+          'Beer is {{ yield }} but Whisky is {{ content }}ter.'
+        }
+      assert_equal "Beer is wet but Whisky is wetter.",
+        template.render({}) { 'wet' }
+    end
+  end
+
+rescue LoadError => boom
+  warn "Tilt::LiquidTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_markaby_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_markaby_test.rb
new file mode 100644
index 0000000..392abac
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_markaby_test.rb
@@ -0,0 +1,88 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'markaby'
+
+  class MarkabyTiltTest <  Test::Unit::TestCase
+    def setup
+      @block = lambda do |t|
+        File.read(File.dirname(__FILE__) + "/#{t.file}")
+      end
+    end
+
+    test "should be able to render a markaby template with static html" do
+      tilt = Tilt::MarkabyTemplate.new("markaby/markaby.mab", &@block)
+      assert_equal "hello from markaby!", tilt.render
+    end
+
+    test "should use the contents of the template" do
+      tilt = ::Tilt::MarkabyTemplate.new("markaby/markaby_other_static.mab", &@block)
+      assert_equal "_why?", tilt.render
+    end
+
+    test "should render from a string (given as data)" do
+      tilt = ::Tilt::MarkabyTemplate.new { "html do; end" }
+      assert_equal "<html></html>", tilt.render
+    end
+
+    test "can be rendered more than once" do
+      tilt = ::Tilt::MarkabyTemplate.new { "html do; end" }
+      3.times { assert_equal "<html></html>", tilt.render }
+    end
+
+    test "should evaluate a template file in the scope given" do
+      scope = Object.new
+      def scope.foo
+        "bar"
+      end
+
+      tilt = ::Tilt::MarkabyTemplate.new("markaby/scope.mab", &@block)
+      assert_equal "<li>bar</li>", tilt.render(scope)
+    end
+
+    test "should pass locals to the template" do
+      tilt = ::Tilt::MarkabyTemplate.new("markaby/locals.mab", &@block)
+      assert_equal "<li>bar</li>", tilt.render(Object.new, { :foo => "bar" })
+    end
+
+    test "should yield to the block given" do
+      tilt = ::Tilt::MarkabyTemplate.new("markaby/yielding.mab", &@block)
+      eval_scope = Markaby::Builder.new
+
+      output = tilt.render(Object.new, {}) do
+        text("Joe")
+      end
+
+      assert_equal "Hey Joe", output
+    end
+
+    test "should be able to render two templates in a row" do
+      tilt = ::Tilt::MarkabyTemplate.new("markaby/render_twice.mab", &@block)
+
+      assert_equal "foo", tilt.render
+      assert_equal "foo", tilt.render
+    end
+
+    test "should retrieve a Tilt::MarkabyTemplate when calling Tilt['hello.mab']" do
+      assert_equal Tilt::MarkabyTemplate, ::Tilt['./markaby/markaby.mab']
+    end
+
+    test "should return a new instance of the implementation class (when calling Tilt.new)" do
+      assert ::Tilt.new(File.dirname(__FILE__) + "/markaby/markaby.mab").kind_of?(Tilt::MarkabyTemplate)
+    end
+
+    test "should be able to evaluate block style templates" do
+      tilt = Tilt::MarkabyTemplate.new { |t| lambda { h1 "Hello World!" }}
+      assert_equal "<h1>Hello World!</h1>", tilt.render
+    end
+
+    test "should pass locals to block style templates" do
+      tilt = Tilt::MarkabyTemplate.new { |t| lambda { h1 "Hello #{name}!" }}
+      assert_equal "<h1>Hello _why!</h1>", tilt.render(nil, :name => "_why")
+    end
+  end
+
+rescue LoadError => boom
+  warn "Tilt::MarkabyTemplate (disabled)"
+end
\ No newline at end of file
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_markdown_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_markdown_test.rb
new file mode 100644
index 0000000..9e864a7
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_markdown_test.rb
@@ -0,0 +1,172 @@
+# coding: UTF-8
+require 'tilt'
+
+begin
+require 'nokogiri'
+
+module MarkdownTests
+  def self.included(mod)
+    class << mod
+      def template(t = nil)
+        t.nil? ? @template : @template = t
+      end
+    end
+  end
+
+  def render(text, options = {})
+    self.class.template.new(options) { text }.render
+  end
+
+  def normalize(html)
+    Nokogiri::HTML.fragment(html).to_s.strip
+  end
+
+  def nrender(text, options = {})
+    html = render(text, options)
+    html.encode!("UTF-8") if html.respond_to?(:encode)
+    normalize(html)
+  end
+
+  def test_escape_html
+    html = nrender "Hello <b>World</b>"
+    assert_equal "<p>Hello <b>World</b></p>", html
+  end
+
+  def test_escape_html_false
+    html = nrender "Hello <b>World</b>", :escape_html => false
+    assert_equal "<p>Hello <b>World</b></p>", html
+  end
+
+  def test_escape_html_true
+    if self.class.template == Tilt::RedcarpetTemplate
+      flunk "redcarpet doesn't support :escape_html yet"
+    end
+    html = nrender "Hello <b>World</b>", :escape_html => true
+    assert_equal "<p>Hello <b>World</b></p>", html
+  end
+
+  def test_smart_quotes
+    html = nrender 'Hello "World"'
+    assert_equal '<p>Hello "World"</p>', html
+  end
+
+  def test_smart_quotes_false
+    html = nrender 'Hello "World"', :smartypants => false
+    assert_equal '<p>Hello "World"</p>', html
+  end
+
+  def test_smart_quotes_true
+    html = nrender 'Hello "World"', :smartypants => true
+    assert_equal '<p>Hello “World”</p>', html
+  end
+
+  def test_smarty_pants
+    html = nrender "Hello ``World'' -- This is --- a test ..."
+    assert_equal "<p>Hello ``World'' -- This is --- a test ...</p>", html
+  end
+
+  def test_smarty_pants_false
+    html = nrender "Hello ``World'' -- This is --- a test ...", :smartypants => false
+    assert_equal "<p>Hello ``World'' -- This is --- a test ...</p>", html
+  end
+
+  def test_smarty_pants_true
+    html = nrender "Hello ``World'' -- This is --- a test ...", :smartypants => true
+    assert_equal "<p>Hello “World” — This is —– a test …</p>", html
+  end
+end
+
+begin
+  require 'rdiscount'
+
+  class MarkdownRDiscountTest < Test::Unit::TestCase
+    include MarkdownTests
+    template Tilt::RDiscountTemplate
+  end
+rescue LoadError => boom
+  # It should already be warned in the main tests
+end
+
+begin
+  require 'redcarpet'
+
+  class MarkdownRedcarpetTest < Test::Unit::TestCase
+    include MarkdownTests
+    template Tilt::RedcarpetTemplate
+    # Doesn't support escaping
+    undef test_escape_html_true
+
+    def test_smarty_pants_true
+      html = nrender "Hello ``World'' -- This is --- a test ...", :smartypants => true
+      assert_equal "<p>Hello “World'' – This is — a test …</p>", html
+    end
+
+    def test_fenced_code_blocks_with_lang
+      code = <<-COD.gsub(/^\s+/,"")
+      ```ruby
+      puts "hello world"
+      ```
+      COD
+
+      html = nrender code, :fenced_code_blocks => true
+      assert_equal %Q{<pre><code class="ruby">puts "hello world"\n</code></pre>}, html
+    end
+  end
+rescue LoadError => boom
+  # It should already be warned in the main tests
+end
+
+begin
+  require 'bluecloth'
+
+  class MarkdownBlueClothTest < Test::Unit::TestCase
+    include MarkdownTests
+    template Tilt::BlueClothTemplate
+  end
+rescue LoadError => boom
+  # It should already be warned in the main tests
+end
+
+begin
+  require 'kramdown'
+
+  class MarkdownKramdownTest < Test::Unit::TestCase
+    include MarkdownTests
+    template Tilt::KramdownTemplate
+    # Doesn't support escaping
+    undef test_escape_html_true
+    # Smarty Pants is *always* on, but doesn't support it fully
+    undef test_smarty_pants
+    undef test_smarty_pants_false
+    undef test_smarty_pants_true
+  end
+rescue LoadError => boom
+  # It should already be warned in the main tests
+end
+
+
+begin
+  require 'maruku'
+
+  class MarkdownMarukuTest < Test::Unit::TestCase
+    include MarkdownTests
+    template Tilt::MarukuTemplate
+    # Doesn't support escaping
+    undef test_escape_html_true
+    # Doesn't support Smarty Pants, and even fails on ``Foobar''
+    undef test_smarty_pants
+    undef test_smarty_pants_false
+    undef test_smarty_pants_true
+    # Smart Quotes is always on
+    undef test_smart_quotes
+    undef test_smart_quotes_false
+  end
+rescue LoadError => boom
+  # It should already be warned in the main tests
+end
+
+rescue LoadError
+  warn "Markdown tests need Nokogiri"
+end
+
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_marukutemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_marukutemplate_test.rb
new file mode 100644
index 0000000..1be67db
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_marukutemplate_test.rb
@@ -0,0 +1,48 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'maruku'
+
+  class MarukuTemplateTest < Test::Unit::TestCase
+    test "registered for '.md' files" do
+      assert Tilt.mappings['md'].include?(Tilt::MarukuTemplate)
+    end
+
+    test "registered for '.mkd' files" do
+      assert Tilt.mappings['mkd'].include?(Tilt::MarukuTemplate)
+    end
+
+    test "registered for '.markdown' files" do
+      assert Tilt.mappings['markdown'].include?(Tilt::MarukuTemplate)
+    end
+
+    test "registered below Kramdown" do
+      %w[md mkd markdown].each do |ext|
+        mappings = Tilt.mappings[ext]
+        kram_idx = mappings.index(Tilt::KramdownTemplate)
+        maru_idx = mappings.index(Tilt::MarukuTemplate)
+        assert maru_idx > kram_idx,
+          "#{maru_idx} should be higher than #{kram_idx}"
+      end
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::MarukuTemplate.new { |t| "# Hello World!" }
+      assert_equal "<h1 id='hello_world'>Hello World!</h1>", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::MarukuTemplate.new { |t| "# Hello World!" }
+      3.times { assert_equal "<h1 id='hello_world'>Hello World!</h1>", template.render }
+    end
+
+    test "removes HTML when :filter_html is set" do
+      template = Tilt::MarukuTemplate.new(:filter_html => true) { |t|
+        "HELLO <blink>WORLD</blink>" }
+      assert_equal "<p>HELLO </p>", template.render
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::MarukuTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_nokogiritemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_nokogiritemplate_test.rb
new file mode 100644
index 0000000..22225e8
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_nokogiritemplate_test.rb
@@ -0,0 +1,87 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'nokogiri'
+  class NokogiriTemplateTest < Test::Unit::TestCase
+    test "registered for '.nokogiri' files" do
+      assert_equal Tilt::NokogiriTemplate, Tilt['test.nokogiri']
+      assert_equal Tilt::NokogiriTemplate, Tilt['test.xml.nokogiri']
+    end
+
+    test "preparing and evaluating the template on #render" do
+      template = Tilt::NokogiriTemplate.new { |t| "xml.em 'Hello World!'" }
+      doc = Nokogiri.XML template.render
+      assert_equal 'Hello World!', doc.root.text
+      assert_equal 'em', doc.root.name
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::NokogiriTemplate.new { |t| "xml.em 'Hello World!'" }
+      3.times do
+        doc = Nokogiri.XML template.render
+        assert_equal 'Hello World!', doc.root.text
+        assert_equal 'em', doc.root.name
+      end
+    end
+
+    test "passing locals" do
+      template = Tilt::NokogiriTemplate.new { "xml.em('Hey ' + name + '!')" }
+      doc = Nokogiri.XML template.render(Object.new, :name => 'Joe')
+      assert_equal 'Hey Joe!', doc.root.text
+      assert_equal 'em', doc.root.name
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::NokogiriTemplate.new { "xml.em('Hey ' + @name + '!')" }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      doc = Nokogiri.XML template.render(scope)
+      assert_equal 'Hey Joe!', doc.root.text
+      assert_equal 'em', doc.root.name
+    end
+
+    test "passing a block for yield" do
+      template = Tilt::NokogiriTemplate.new { "xml.em('Hey ' + yield + '!')" }
+      3.times do
+        doc = Nokogiri.XML template.render { 'Joe' }
+        assert_equal 'Hey Joe!', doc.root.text
+        assert_equal 'em', doc.root.name
+      end
+    end
+
+    test "block style templates" do
+      template =
+        Tilt::NokogiriTemplate.new do |t|
+          lambda { |xml| xml.em('Hey Joe!') }
+        end
+      doc = Nokogiri.XML template.render
+      assert_equal 'Hey Joe!', doc.root.text
+      assert_equal 'em', doc.root.name
+    end
+
+    test "allows nesting raw XML, API-compatible to Builder" do
+      subtemplate = Tilt::NokogiriTemplate.new { "xml.em 'Hello World!'" }
+      template = Tilt::NokogiriTemplate.new { "xml.strong { xml << yield }" }
+      3.times do
+        options = { :xml => Nokogiri::XML::Builder.new }
+        doc = Nokogiri.XML(template.render(options) { subtemplate.render(options) })
+        assert_equal 'Hello World!', doc.root.text.strip
+        assert_equal 'strong', doc.root.name
+      end
+    end
+
+    test "doesn't modify self when template is a string" do
+      template = Tilt::NokogiriTemplate.new { "xml.root { xml.child @hello }" }
+      scope = Object.new
+      scope.instance_variable_set(:@hello, "Hello World!")
+
+      3.times do
+        doc = Nokogiri.XML(template.render(scope))
+        assert_equal "Hello World!", doc.text.strip
+      end
+    end
+  end
+rescue LoadError
+  warn "Tilt::NokogiriTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_radiustemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_radiustemplate_test.rb
new file mode 100644
index 0000000..1db5b4b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_radiustemplate_test.rb
@@ -0,0 +1,75 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'radius'
+
+  # Disable radius tests under Ruby versions >= 1.9.1 since it's still buggy.
+  # Remove when fixed upstream.
+  raise LoadError if RUBY_VERSION >= "1.9.1" and Radius.version < "0.7"
+
+  class RadiusTemplateTest < Test::Unit::TestCase
+    test "registered for '.radius' files" do
+      assert_equal Tilt::RadiusTemplate, Tilt['test.radius']
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::RadiusTemplate.new { |t| "Hello World!" }
+      assert_equal "Hello World!", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::RadiusTemplate.new { |t| "Hello World!" }
+      3.times { assert_equal "Hello World!", template.render }
+    end
+
+    test "passing locals" do
+      template = Tilt::RadiusTemplate.new { "Hey <r:name />!" }
+      assert_equal "Hey Joe!", template.render(nil, :name => 'Joe')
+    end
+
+    class ExampleRadiusScope
+      def beer; 'wet'; end
+      def whisky; 'wetter'; end
+    end
+
+    test "combining scope and locals when scope responds" do
+      template = Tilt::RadiusTemplate.new {
+        'Beer is <r:beer /> but Whisky is <r:whisky />.'
+      }
+      scope = ExampleRadiusScope.new
+      assert_equal "Beer is wet but Whisky is wetter.", template.render(scope)
+    end
+
+    test "precedence when locals and scope define same variables" do
+      template = Tilt::RadiusTemplate.new {
+        'Beer is <r:beer /> but Whisky is <r:whisky />.'
+      }
+      scope = ExampleRadiusScope.new
+      assert_equal "Beer is great but Whisky is greater.",
+        template.render(scope, :beer => 'great', :whisky => 'greater')
+    end
+
+    #test "handles local scope" do
+    #  beer   = 'wet'
+    #  whisky = 'wetter'
+    #
+    #  template = Tilt::RadiusTemplate.new {
+    #    'Beer is <r:beer /> but Whisky is <r:whisky />.'
+    #  }
+    #  assert_equal "Beer is wet but Whisky is wetter.", template.render(self)
+    #end
+
+    test "passing a block for yield" do
+      template = Tilt::RadiusTemplate.new {
+        'Beer is <r:yield /> but Whisky is <r:yield />ter.'
+      }
+      assert_equal "Beer is wet but Whisky is wetter.",
+        template.render({}) { 'wet' }
+    end
+  end
+
+rescue LoadError => boom
+  warn "Tilt::RadiusTemplate (disabled)"
+end
+
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_rdiscounttemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_rdiscounttemplate_test.rb
new file mode 100644
index 0000000..35ccbaf
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_rdiscounttemplate_test.rb
@@ -0,0 +1,55 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'rdiscount'
+
+  class RDiscountTemplateTest < Test::Unit::TestCase
+    test "registered for '.md' files" do
+      assert Tilt.mappings['md'].include?(Tilt::RDiscountTemplate)
+    end
+
+    test "registered for '.mkd' files" do
+      assert Tilt.mappings['mkd'].include?(Tilt::RDiscountTemplate)
+    end
+
+    test "registered for '.markdown' files" do
+      assert Tilt.mappings['markdown'].include?(Tilt::RDiscountTemplate)
+    end
+
+    test "registered above BlueCloth" do
+      %w[md mkd markdown].each do |ext|
+        mappings = Tilt.mappings[ext]
+        blue_idx = mappings.index(Tilt::BlueClothTemplate)
+        rdis_idx = mappings.index(Tilt::RDiscountTemplate)
+        assert rdis_idx < blue_idx,
+          "#{rdis_idx} should be lower than #{blue_idx}"
+      end
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::RDiscountTemplate.new { |t| "# Hello World!" }
+      assert_equal "<h1>Hello World!</h1>\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::RDiscountTemplate.new { |t| "# Hello World!" }
+      3.times { assert_equal "<h1>Hello World!</h1>\n", template.render }
+    end
+
+    test "smartypants when :smart is set" do
+      template = Tilt::RDiscountTemplate.new(:smart => true) { |t|
+        "OKAY -- 'Smarty Pants'" }
+      assert_equal "<p>OKAY — ‘Smarty Pants’</p>\n",
+        template.render
+    end
+
+    test "stripping HTML when :filter_html is set" do
+      template = Tilt::RDiscountTemplate.new(:filter_html => true) { |t|
+        "HELLO <blink>WORLD</blink>" }
+      assert_equal "<p>HELLO <blink>WORLD</blink></p>\n", template.render
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::RDiscountTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_rdoctemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_rdoctemplate_test.rb
new file mode 100644
index 0000000..5a729ea
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_rdoctemplate_test.rb
@@ -0,0 +1,31 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'rdoc'
+  require 'rdoc/markup'
+  require 'rdoc/markup/to_html'
+  class RDocTemplateTest < Test::Unit::TestCase
+    test "is registered for '.rdoc' files" do
+      assert_equal Tilt::RDocTemplate, Tilt['test.rdoc']
+    end
+
+    test "preparing and evaluating the template with #render" do
+      template = Tilt::RDocTemplate.new { |t| "= Hello World!" }
+      result = template.render.strip
+      assert_match /<h1/, result
+      assert_match />Hello World!</, result
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::RDocTemplate.new { |t| "= Hello World!" }
+      3.times do
+        result = template.render.strip
+        assert_match /<h1/, result
+        assert_match />Hello World!</, result
+      end
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::RDocTemplate (disabled) [#{boom}]"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_redcarpettemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_redcarpettemplate_test.rb
new file mode 100644
index 0000000..f675b47
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_redcarpettemplate_test.rb
@@ -0,0 +1,71 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'redcarpet'
+
+  class RedcarpetTemplateTest < Test::Unit::TestCase
+    test "registered for '.md' files" do
+      assert Tilt.mappings['md'].include?(Tilt::RedcarpetTemplate)
+    end
+
+    test "registered for '.mkd' files" do
+      assert Tilt.mappings['mkd'].include?(Tilt::RedcarpetTemplate)
+    end
+
+    test "registered for '.markdown' files" do
+      assert Tilt.mappings['markdown'].include?(Tilt::RedcarpetTemplate)
+    end
+
+    test "registered above BlueCloth" do
+      %w[md mkd markdown].each do |ext|
+        mappings = Tilt.mappings[ext]
+        blue_idx = mappings.index(Tilt::BlueClothTemplate)
+        redc_idx = mappings.index(Tilt::RedcarpetTemplate)
+        assert redc_idx < blue_idx,
+          "#{redc_idx} should be lower than #{blue_idx}"
+      end
+    end
+
+    test "registered above RDiscount" do
+      %w[md mkd markdown].each do |ext|
+        mappings = Tilt.mappings[ext]
+        rdis_idx = mappings.index(Tilt::RDiscountTemplate)
+        redc_idx = mappings.index(Tilt::RedcarpetTemplate)
+        assert redc_idx < rdis_idx,
+          "#{redc_idx} should be lower than #{rdis_idx}"
+      end
+    end
+
+    test "redcarpet2 is our default choice" do
+      template = Tilt::RedcarpetTemplate.new {}
+      assert_equal Tilt::RedcarpetTemplate::Redcarpet2, template.prepare.class
+    end
+
+    test "preparing and evaluating templates on #render" do
+      template = Tilt::RedcarpetTemplate.new { |t| "# Hello World!" }
+      assert_equal "<h1>Hello World!</h1>\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::RedcarpetTemplate.new { |t| "# Hello World!" }
+      3.times { assert_equal "<h1>Hello World!</h1>\n", template.render }
+    end
+
+    test "smartypants when :smart is set" do
+      template = Tilt::RedcarpetTemplate.new(:smartypants => true) { |t|
+        "OKAY -- 'Smarty Pants'" }
+      assert_match /<p>OKAY – 'Smarty Pants'<\/p>/,
+        template.render
+    end
+
+    test "smartypants with a rendererer instance" do
+      template = Tilt::RedcarpetTemplate.new(:renderer => Redcarpet::Render::HTML.new(:hard_wrap => true), :smartypants => true) { |t|
+        "OKAY -- 'Smarty Pants'" }
+      assert_match /<p>OKAY – 'Smarty Pants'<\/p>/,
+        template.render
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::RedcarpetTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_redclothtemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_redclothtemplate_test.rb
new file mode 100644
index 0000000..2d94a4c
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_redclothtemplate_test.rb
@@ -0,0 +1,36 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'redcloth'
+
+  class RedClothTemplateTest < Test::Unit::TestCase
+    test "is registered for '.textile' files" do
+      assert_equal Tilt::RedClothTemplate, Tilt['test.textile']
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::RedClothTemplate.new { |t| "h1. Hello World!" }
+      assert_equal "<h1>Hello World!</h1>", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::RedClothTemplate.new { |t| "h1. Hello World!" }
+      3.times { assert_equal "<h1>Hello World!</h1>", template.render }
+    end
+
+    test "ignores unknown options" do
+      template = Tilt::RedClothTemplate.new(:foo => "bar") { |t| "h1. Hello World!" }
+      3.times { assert_equal "<h1>Hello World!</h1>", template.render }
+    end
+
+    test "passes in RedCloth options" do
+      template = Tilt::RedClothTemplate.new { |t| "Hard breaks are\ninserted by default." }
+      assert_equal "<p>Hard breaks are<br />\ninserted by default.</p>", template.render
+      template = Tilt::RedClothTemplate.new(:hard_breaks => false) { |t| "But they can be\nturned off." }
+      assert_equal "<p>But they can be\nturned off.</p>", template.render
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::RedClothTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_sasstemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_sasstemplate_test.rb
new file mode 100644
index 0000000..be822af
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_sasstemplate_test.rb
@@ -0,0 +1,41 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'sass'
+
+  class SassTemplateTest < Test::Unit::TestCase
+    test "is registered for '.sass' files" do
+      assert_equal Tilt::SassTemplate, Tilt['test.sass']
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::SassTemplate.new { |t| "#main\n  :background-color #0000f1" }
+      assert_equal "#main {\n  background-color: #0000f1; }\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::SassTemplate.new { |t| "#main\n  :background-color #0000f1" }
+      3.times { assert_equal "#main {\n  background-color: #0000f1; }\n", template.render }
+    end
+  end
+
+  class ScssTemplateTest < Test::Unit::TestCase
+    test "is registered for '.scss' files" do
+      assert_equal Tilt::ScssTemplate, Tilt['test.scss']
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::ScssTemplate.new { |t| "#main {\n  background-color: #0000f1;\n}" }
+      assert_equal "#main {\n  background-color: #0000f1; }\n", template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::ScssTemplate.new { |t| "#main {\n  background-color: #0000f1;\n}" }
+      3.times { assert_equal "#main {\n  background-color: #0000f1; }\n", template.render }
+    end
+  end
+
+rescue LoadError => boom
+  warn "Tilt::SassTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_stringtemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_stringtemplate_test.rb
new file mode 100644
index 0000000..f0a8919
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_stringtemplate_test.rb
@@ -0,0 +1,170 @@
+require 'contest'
+require 'tilt'
+
+class StringTemplateTest < Test::Unit::TestCase
+  test "registered for '.str' files" do
+    assert_equal Tilt::StringTemplate, Tilt['test.str']
+  end
+
+  test "loading and evaluating templates on #render" do
+    template = Tilt::StringTemplate.new { |t| "Hello World!" }
+    assert_equal "Hello World!", template.render
+  end
+
+  test "can be rendered more than once" do
+    template = Tilt::StringTemplate.new { |t| "Hello World!" }
+    3.times { assert_equal "Hello World!", template.render }
+  end
+
+  test "passing locals" do
+    template = Tilt::StringTemplate.new { 'Hey #{name}!' }
+    assert_equal "Hey Joe!", template.render(Object.new, :name => 'Joe')
+  end
+
+  test "evaluating in an object scope" do
+    template = Tilt::StringTemplate.new { 'Hey #{@name}!' }
+    scope = Object.new
+    scope.instance_variable_set :@name, 'Joe'
+    assert_equal "Hey Joe!", template.render(scope)
+  end
+
+  test "passing a block for yield" do
+    template = Tilt::StringTemplate.new { 'Hey #{yield}!' }
+    assert_equal "Hey Joe!", template.render { 'Joe' }
+    assert_equal "Hey Moe!", template.render { 'Moe' }
+  end
+
+  test "multiline templates" do
+    template = Tilt::StringTemplate.new { "Hello\nWorld!\n" }
+    assert_equal "Hello\nWorld!\n", template.render
+  end
+
+  test "backtrace file and line reporting without locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::StringTemplate.new('test.str', 11) { data }
+    begin
+      template.render
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of NameError, boom
+      line = boom.backtrace.grep(/^test\.str:/).first
+      assert line, "Backtrace didn't contain test.str"
+      file, line, meth = line.split(":")
+      assert_equal '13', line
+    end
+  end
+
+  test "backtrace file and line reporting with locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::StringTemplate.new('test.str', 1) { data }
+    begin
+      template.render(nil, :name => 'Joe', :foo => 'bar')
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of RuntimeError, boom
+      line = boom.backtrace.first
+      file, line, meth = line.split(":")
+      assert_equal 'test.str', file
+      assert_equal '6', line
+    end
+  end
+end
+
+
+class CompiledStringTemplateTest < Test::Unit::TestCase
+  def teardown
+    GC.start
+  end
+
+  class Scope
+  end
+
+  test "compiling template source to a method" do
+    template = Tilt::StringTemplate.new { |t| "Hello World!" }
+    template.render(Scope.new)
+    method = template.send(:compiled_method, [])
+    assert_kind_of UnboundMethod, method
+  end
+
+  test "loading and evaluating templates on #render" do
+    template = Tilt::StringTemplate.new { |t| "Hello World!" }
+    assert_equal "Hello World!", template.render(Scope.new)
+  end
+
+  test "passing locals" do
+    template = Tilt::StringTemplate.new { 'Hey #{name}!' }
+    assert_equal "Hey Joe!", template.render(Scope.new, :name => 'Joe')
+    assert_equal "Hey Moe!", template.render(Scope.new, :name => 'Moe')
+  end
+
+  test "evaluating in an object scope" do
+    template = Tilt::StringTemplate.new { 'Hey #{@name}!' }
+    scope = Scope.new
+    scope.instance_variable_set :@name, 'Joe'
+    assert_equal "Hey Joe!", template.render(scope)
+    scope.instance_variable_set :@name, 'Moe'
+    assert_equal "Hey Moe!", template.render(scope)
+  end
+
+  test "passing a block for yield" do
+    template = Tilt::StringTemplate.new { 'Hey #{yield}!' }
+    assert_equal "Hey Joe!", template.render(Scope.new) { 'Joe' }
+    assert_equal "Hey Moe!", template.render(Scope.new) { 'Moe' }
+  end
+
+  test "multiline templates" do
+    template = Tilt::StringTemplate.new { "Hello\nWorld!\n" }
+    assert_equal "Hello\nWorld!\n", template.render(Scope.new)
+  end
+
+
+  test "template with '}'" do
+    template = Tilt::StringTemplate.new { "Hello }" }
+    assert_equal "Hello }", template.render
+  end
+
+  test "backtrace file and line reporting without locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::StringTemplate.new('test.str', 11) { data }
+    begin
+      template.render(Scope.new)
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of NameError, boom
+      line = boom.backtrace.first
+      line = boom.backtrace.grep(/^test\.str:/).first
+      assert line, "Backtrace didn't contain test.str"
+      file, line, meth = line.split(":")
+      assert_equal '13', line
+    end
+  end
+
+  test "backtrace file and line reporting with locals" do
+    data = File.read(__FILE__).split("\n__END__\n").last
+    fail unless data[0] == ?<
+    template = Tilt::StringTemplate.new('test.str') { data }
+    begin
+      template.render(Scope.new, :name => 'Joe', :foo => 'bar')
+      fail 'should have raised an exception'
+    rescue => boom
+      assert_kind_of RuntimeError, boom
+      line = boom.backtrace.first
+      file, line, meth = line.split(":")
+      assert_equal 'test.str', file
+      assert_equal '6', line
+    end
+  end
+end
+
+__END__
+<html>
+<body>
+  <h1>Hey #{name}!</h1>
+
+
+  <p>#{fail}</p>
+</body>
+</html>
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_template_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_template_test.rb
new file mode 100644
index 0000000..111a141
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_template_test.rb
@@ -0,0 +1,323 @@
+# coding: utf-8
+require 'contest'
+require 'tilt'
+require 'tempfile'
+
+class TiltTemplateTest < Test::Unit::TestCase
+
+  class MockTemplate < Tilt::Template
+    def prepare
+    end
+  end
+
+  test "needs a file or block" do
+    assert_raise(ArgumentError) { Tilt::Template.new }
+  end
+
+  test "initializing with a file" do
+    inst = MockTemplate.new('foo.erb') {}
+    assert_equal 'foo.erb', inst.file
+  end
+
+  test "initializing with a file and line" do
+    inst = MockTemplate.new('foo.erb', 55) {}
+    assert_equal 'foo.erb', inst.file
+    assert_equal 55, inst.line
+  end
+
+  test "initializing with a tempfile" do
+    tempfile = Tempfile.new('tilt_template_test')
+    inst = MockTemplate.new(tempfile)
+    assert_equal File.basename(tempfile.path), inst.basename
+  end
+
+  class SillyHash < Hash
+    def path(arg)
+    end
+  end
+
+  test "initialize with hash that implements #path" do
+    options = SillyHash[:key => :value]
+    inst = MockTemplate.new(options) {}
+    assert_equal :value, inst.options[:key]
+  end
+
+  test "uses correct eval_file" do
+    inst = MockTemplate.new('foo.erb', 55) {}
+    assert_equal 'foo.erb', inst.eval_file
+  end
+
+  test "uses a default filename for #eval_file when no file provided" do
+    inst = MockTemplate.new { 'Hi' }
+    assert_not_nil inst.eval_file
+    assert !inst.eval_file.include?("\n")
+  end
+
+  test "calculating template's #basename" do
+    inst = MockTemplate.new('/tmp/templates/foo.html.erb') {}
+    assert_equal 'foo.html.erb', inst.basename
+  end
+
+  test "calculating the template's #name" do
+    inst = MockTemplate.new('/tmp/templates/foo.html.erb') {}
+    assert_equal 'foo', inst.name
+  end
+
+  test "initializing with a data loading block" do
+    MockTemplate.new { |template| "Hello World!" }
+  end
+
+  class InitializingMockTemplate < Tilt::Template
+    @@initialized_count = 0
+    def self.initialized_count
+      @@initialized_count
+    end
+
+    def initialize_engine
+      @@initialized_count += 1
+    end
+
+    def prepare
+    end
+  end
+
+  test "one-time template engine initialization" do
+    assert_nil InitializingMockTemplate.engine_initialized
+    assert_equal 0, InitializingMockTemplate.initialized_count
+
+    InitializingMockTemplate.new { "Hello World!" }
+    assert InitializingMockTemplate.engine_initialized
+    assert_equal 1, InitializingMockTemplate.initialized_count
+
+    InitializingMockTemplate.new { "Hello World!" }
+    assert_equal 1, InitializingMockTemplate.initialized_count
+  end
+
+  class PreparingMockTemplate < Tilt::Template
+    include Test::Unit::Assertions
+    def prepare
+      assert !data.nil?
+      @prepared = true
+    end
+    def prepared? ; @prepared ; end
+  end
+
+  test "raises NotImplementedError when #prepare not defined" do
+    assert_raise(NotImplementedError) { Tilt::Template.new { |template| "Hello World!" } }
+  end
+
+  test "raises NotImplementedError when #evaluate or #template_source not defined" do
+    inst = PreparingMockTemplate.new { |t| "Hello World!" }
+    assert_raise(NotImplementedError) { inst.render }
+    assert inst.prepared?
+  end
+
+  class SimpleMockTemplate < PreparingMockTemplate
+    include Test::Unit::Assertions
+    def evaluate(scope, locals, &block)
+      assert prepared?
+      assert !scope.nil?
+      assert !locals.nil?
+      "<em>#{@data}</em>"
+    end
+  end
+
+  test "prepares and evaluates the template on #render" do
+    inst = SimpleMockTemplate.new { |t| "Hello World!" }
+    assert_equal "<em>Hello World!</em>", inst.render
+    assert inst.prepared?
+  end
+
+  class SourceGeneratingMockTemplate < PreparingMockTemplate
+    def precompiled_template(locals)
+      "foo = [] ; foo << %Q{#{data}} ; foo.join"
+    end
+  end
+
+  test "template_source with locals" do
+    inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{name}!' }
+    assert_equal "Hey Joe!", inst.render(Object.new, :name => 'Joe')
+    assert inst.prepared?
+  end
+
+  test "template_source with locals of strings" do
+    inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{name}!' }
+    assert_equal "Hey Joe!", inst.render(Object.new, 'name' => 'Joe')
+    assert inst.prepared?
+  end
+
+  test "template_source with locals having non-variable keys raises error" do
+    inst = SourceGeneratingMockTemplate.new { |t| '1 + 2 = #{_answer}' }
+    err = assert_raise(RuntimeError) { inst.render(Object.new, 'ANSWER' => 3) }
+    assert_equal "invalid locals key: \"ANSWER\" (keys must be variable names)", err.message
+    assert_equal "1 + 2 = 3", inst.render(Object.new, '_answer' => 3)
+  end
+
+  class CustomGeneratingMockTemplate < PreparingMockTemplate
+    def precompiled_template(locals)
+      data
+    end
+
+    def precompiled_preamble(locals)
+      options.fetch(:preamble)
+    end
+
+    def precompiled_postamble(locals)
+      options.fetch(:postamble)
+    end
+  end
+
+  test "supports pre/postamble" do
+    inst = CustomGeneratingMockTemplate.new(
+      :preamble => 'buf = []',
+      :postamble => 'buf.join'
+    ) { 'buf << 1' }
+
+    assert_equal "1", inst.render
+  end
+
+  # Special-case for Haml
+  # https://github.com/rtomayko/tilt/issues/193
+  test "supports Array pre/postambles" do
+    inst = CustomGeneratingMockTemplate.new(
+      :preamble => ['buf = ', '[]'],
+      :postamble => ['buf.', 'join']
+    ) { 'buf << 1' }
+
+    # TODO: Use assert_output when we swicth to MiniTest
+    warns = <<-EOF
+precompiled_preamble should return String (not Array)
+precompiled_postamble should return String (not Array)
+EOF
+
+    begin
+      require 'stringio'
+      $stderr = StringIO.new
+      assert_equal "1", inst.render
+      assert_equal warns, $stderr.string
+    ensure
+      $stderr = STDERR
+    end
+  end
+
+  class Person
+    CONSTANT = "Bob"
+
+    attr_accessor :name
+    def initialize(name)
+      @name = name
+    end
+  end
+
+  test "template_source with an object scope" do
+    inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{@name}!' }
+    scope = Person.new('Joe')
+    assert_equal "Hey Joe!", inst.render(scope)
+  end
+
+  test "template_source with a block for yield" do
+    inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{yield}!' }
+    assert_equal "Hey Joe!", inst.render(Object.new){ 'Joe' }
+  end
+
+  test "template which accesses a constant" do
+    inst = SourceGeneratingMockTemplate.new { |t| 'Hey #{CONSTANT}!' }
+    assert_equal "Hey Bob!", inst.render(Person.new("Joe"))
+  end
+
+  ##
+  # Encodings
+
+  class DynamicMockTemplate < MockTemplate
+    def precompiled_template(locals)
+      options[:code]
+    end
+  end
+
+  class UTF8Template < MockTemplate
+    def default_encoding
+      Encoding::UTF_8
+    end
+  end
+
+  if ''.respond_to?(:encoding)
+    original_encoding = Encoding.default_external
+
+    setup do
+      @file = Tempfile.open('template')
+      @file.puts "stuff"
+      @file.close
+      @template = @file.path
+    end
+
+    teardown do
+      Encoding.default_external = original_encoding
+      Encoding.default_internal = nil
+      @file.delete
+    end
+
+    test "reading from file assumes default external encoding" do
+      Encoding.default_external = 'Big5'
+      inst = MockTemplate.new(@template)
+      assert_equal 'Big5', inst.data.encoding.to_s
+    end
+
+    test "reading from file with a :default_encoding overrides default external" do
+      Encoding.default_external = 'Big5'
+      inst = MockTemplate.new(@template, :default_encoding => 'GBK')
+      assert_equal 'GBK', inst.data.encoding.to_s
+    end
+
+    test "reading from file with default_internal set does no transcoding" do
+      Encoding.default_internal = 'utf-8'
+      Encoding.default_external = 'Big5'
+      inst = MockTemplate.new(@template)
+      assert_equal 'Big5', inst.data.encoding.to_s
+    end
+
+    test "using provided template data verbatim when given as string" do
+      Encoding.default_internal = 'Big5'
+      inst = MockTemplate.new(@template) { "blah".force_encoding('GBK') }
+      assert_equal 'GBK', inst.data.encoding.to_s
+    end
+
+    test "uses the template from the generated source code" do
+      tmpl = "ふが"
+      code = tmpl.inspect.encode('Shift_JIS')
+      inst = DynamicMockTemplate.new(:code => code) { '' }
+      res = inst.render
+      assert_equal 'Shift_JIS', res.encoding.to_s
+      assert_equal tmpl, res.encode(tmpl.encoding)
+    end
+
+    test "uses the magic comment from the generated source code" do
+      tmpl = "ふが"
+      code = ("# coding: Shift_JIS\n" + tmpl.inspect).encode('Shift_JIS')
+      # Set it to an incorrect encoding
+      code.force_encoding('UTF-8')
+
+      inst = DynamicMockTemplate.new(:code => code) { '' }
+      res = inst.render
+      assert_equal 'Shift_JIS', res.encoding.to_s
+      assert_equal tmpl, res.encode(tmpl.encoding)
+    end
+
+    test "uses #default_encoding instead of default_external" do
+      Encoding.default_external = 'Big5'
+      inst = UTF8Template.new(@template)
+      assert_equal 'UTF-8', inst.data.encoding.to_s
+    end
+
+    test "uses #default_encoding instead of current encoding" do
+      tmpl = "".force_encoding('Big5')
+      inst = UTF8Template.new(@template) { tmpl }
+      assert_equal 'UTF-8', inst.data.encoding.to_s
+    end
+
+    test "raises error if the encoding is not valid" do
+      assert_raises(Encoding::InvalidByteSequenceError) do
+        UTF8Template.new(@template) { "\xe4" }
+      end
+    end
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_test.rb
new file mode 100644
index 0000000..f12dacb
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_test.rb
@@ -0,0 +1,65 @@
+require 'contest'
+require 'tilt'
+
+class TiltTest < Test::Unit::TestCase
+  class MockTemplate
+    attr_reader :args, :block
+    def initialize(*args, &block)
+      @args = args
+      @block = block
+    end
+  end
+
+  test "registering template implementation classes by file extension" do
+    Tilt.register('mock', MockTemplate)
+  end
+
+  test "an extension is registered if explicit handle is found" do
+    Tilt.register('mock', MockTemplate)
+    assert Tilt.registered?('mock')
+  end
+
+  test "registering template classes by symbol file extension" do
+    Tilt.register(:mock, MockTemplate)
+  end
+
+  test "looking up template classes by exact file extension" do
+    Tilt.register('mock', MockTemplate)
+    impl = Tilt['mock']
+    assert_equal MockTemplate, impl
+  end
+
+  test "looking up template classes by implicit file extension" do
+    Tilt.register('mock', MockTemplate)
+    impl = Tilt['.mock']
+    assert_equal MockTemplate, impl
+  end
+
+  test "looking up template classes with multiple file extensions" do
+    Tilt.register('mock', MockTemplate)
+    impl = Tilt['index.html.mock']
+    assert_equal MockTemplate, impl
+  end
+
+  test "looking up template classes by file name" do
+    Tilt.register('mock', MockTemplate)
+    impl = Tilt['templates/test.mock']
+    assert_equal MockTemplate, impl
+  end
+
+  test "looking up non-existant template class" do
+    assert_nil Tilt['none']
+  end
+
+  test "accessing template class mappings at Tilt::mappings" do
+    assert Tilt.respond_to?(:mappings)
+    assert Tilt.mappings.respond_to?(:[])
+  end
+
+  test "creating new template instance with a filename" do
+    Tilt.register('mock', MockTemplate)
+    template = Tilt.new('foo.mock', 1, :key => 'val') { 'Hello World!' }
+    assert_equal ['foo.mock', 1, {:key => 'val'}], template.args
+    assert_equal 'Hello World!', template.block.call
+  end
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_wikiclothtemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_wikiclothtemplate_test.rb
new file mode 100644
index 0000000..fd52de9
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_wikiclothtemplate_test.rb
@@ -0,0 +1,32 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'wikicloth'
+
+  class WikiClothTemplateTest < Test::Unit::TestCase
+    test "is registered for '.mediawiki' files" do
+      assert_equal Tilt::WikiClothTemplate, Tilt['test.mediawiki']
+    end
+
+    test "is registered for '.mw' files" do
+      assert_equal Tilt::WikiClothTemplate, Tilt['test.mw']
+    end
+
+    test "is registered for '.wiki' files" do
+      assert_equal Tilt::WikiClothTemplate, Tilt['test.wiki']
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::WikiClothTemplate.new { |t| "= Hello World! =" }
+      assert_match /<h1>.*Hello World!.*<\/h1>/, template.render
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::WikiClothTemplate.new { |t| "= Hello World! =" }
+      3.times { assert_match /<h1>.*Hello World!.*<\/h1>/, template.render }
+    end
+  end
+rescue LoadError => boom
+  warn "Tilt::WikiClothTemplate (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_yajltemplate_test.rb b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_yajltemplate_test.rb
new file mode 100644
index 0000000..48ef1d1
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/test/tilt_yajltemplate_test.rb
@@ -0,0 +1,101 @@
+require 'contest'
+require 'tilt'
+
+begin
+  require 'yajl'
+
+  class YajlTemplateTest < Test::Unit::TestCase
+    test "is registered for '.yajl' files" do
+      assert_equal Tilt::YajlTemplate, Tilt['test.yajl']
+    end
+
+    test "compiles and evaluates the template on #render" do
+      template = Tilt::YajlTemplate.new { "json = { :integer => 3, :string => 'hello' }" }
+      output = template.render
+      result = Yajl::Parser.parse(output)
+      expect = {"integer" => 3,"string" => "hello"}
+      assert_equal expect, result
+    end
+
+    test "can be rendered more than once" do
+      template = Tilt::YajlTemplate.new { "json = { :integer => 3, :string => 'hello' }" }
+      expect = {"integer" => 3,"string" => "hello"}
+      3.times do
+        output = template.render
+        result = Yajl::Parser.parse(output)
+        assert_equal expect, result
+      end
+    end
+
+    test "evaluating ruby code" do
+      template = Tilt::YajlTemplate.new { "json = { :integer => (3 * 2) }" }
+      assert_equal '{"integer":6}', template.render
+    end
+
+    test "evaluating in an object scope" do
+      template = Tilt::YajlTemplate.new { "json = { :string => 'Hey ' + @name + '!' }" }
+      scope = Object.new
+      scope.instance_variable_set :@name, 'Joe'
+      assert_equal '{"string":"Hey Joe!"}', template.render(scope)
+    end
+
+    test "passing locals" do
+      template = Tilt::YajlTemplate.new { "json = { :string => 'Hey ' + name + '!' }" }
+      assert_equal '{"string":"Hey Joe!"}', template.render(Object.new, :name => 'Joe')
+    end
+
+    test "passing a block for yield" do
+      template = Tilt::YajlTemplate.new { "json = { :string => 'Hey ' + yield + '!' }" }
+      assert_equal '{"string":"Hey Joe!"}', template.render { 'Joe' }
+      assert_equal '{"string":"Hey Moe!"}', template.render { 'Moe' }
+    end
+
+    test "template multiline" do
+      template = Tilt::YajlTemplate.new { %Q{
+        json = {
+          :string   => "hello"
+        }
+      } }
+      assert_equal '{"string":"hello"}', template.render
+    end
+
+    test "template can reuse existing json buffer" do
+      template = Tilt::YajlTemplate.new { "json.merge! :string => 'hello'" }
+      assert_equal '{"string":"hello"}', template.render
+    end
+
+    test "template can end with any statement" do
+      template = Tilt::YajlTemplate.new { %Q{
+        json = {
+          :string   => "hello"
+        }
+        four = 2 * 2
+        json[:integer] = four
+        nil
+      } }
+      result = template.render
+      assert( (result == '{"string":"hello","integer":4}') || (result == '{"integer":4,"string":"hello"}') )
+    end
+
+    test "option callback" do
+      options = { :callback => 'foo' }
+      template = Tilt::YajlTemplate.new(nil, options) { "json = { :string => 'hello' }" }
+      assert_equal 'foo({"string":"hello"});', template.render
+    end
+
+    test "option variable" do
+      options = { :variable => 'output' }
+      template = Tilt::YajlTemplate.new(nil, options) { "json = { :string => 'hello' }" }
+      assert_equal 'var output = {"string":"hello"};', template.render
+    end
+
+    test "option callback and variable" do
+      options = { :callback => 'foo', :variable => 'output' }
+      template = Tilt::YajlTemplate.new(nil, options) { "json = { :string => 'hello' }" }
+      assert_equal 'var output = {"string":"hello"}; foo(output);', template.render
+    end
+
+  end
+rescue LoadError
+  warn "Tilt::YajlTemplateTest (disabled)"
+end
diff --git a/.bundle/ruby/2.0.0/gems/tilt-1.4.1/tilt.gemspec b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/tilt.gemspec
new file mode 100644
index 0000000..00f49f4
--- /dev/null
+++ b/.bundle/ruby/2.0.0/gems/tilt-1.4.1/tilt.gemspec
@@ -0,0 +1,120 @@
+Gem::Specification.new do |s|
+  s.specification_version = 2 if s.respond_to? :specification_version=
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+
+  s.name = 'tilt'
+  s.version = '1.4.1'
+  s.date = '2013-05-08'
+
+  s.description = "Generic interface to multiple Ruby template engines"
+  s.summary     = s.description
+  s.license     = "MIT"
+
+  s.authors = ["Ryan Tomayko"]
+  s.email = "r at tomayko.com"
+
+  # = MANIFEST =
+  s.files = %w[
+    CHANGELOG.md
+    COPYING
+    Gemfile
+    HACKING
+    README.md
+    Rakefile
+    TEMPLATES.md
+    bin/tilt
+    lib/tilt.rb
+    lib/tilt/asciidoc.rb
+    lib/tilt/builder.rb
+    lib/tilt/coffee.rb
+    lib/tilt/css.rb
+    lib/tilt/csv.rb
+    lib/tilt/erb.rb
+    lib/tilt/etanni.rb
+    lib/tilt/haml.rb
+    lib/tilt/liquid.rb
+    lib/tilt/markaby.rb
+    lib/tilt/markdown.rb
+    lib/tilt/nokogiri.rb
+    lib/tilt/plain.rb
+    lib/tilt/radius.rb
+    lib/tilt/rdoc.rb
+    lib/tilt/string.rb
+    lib/tilt/template.rb
+    lib/tilt/textile.rb
+    lib/tilt/wiki.rb
+    lib/tilt/yajl.rb
+    test/contest.rb
+    test/markaby/locals.mab
+    test/markaby/markaby.mab
+    test/markaby/markaby_other_static.mab
+    test/markaby/render_twice.mab
+    test/markaby/scope.mab
+    test/markaby/yielding.mab
+    test/tilt_asciidoctor_test.rb
+    test/tilt_blueclothtemplate_test.rb
+    test/tilt_buildertemplate_test.rb
+    test/tilt_cache_test.rb
+    test/tilt_coffeescripttemplate_test.rb
+    test/tilt_compilesite_test.rb
+    test/tilt_creoletemplate_test.rb
+    test/tilt_csv_test.rb
+    test/tilt_erbtemplate_test.rb
+    test/tilt_erubistemplate_test.rb
+    test/tilt_etannitemplate_test.rb
+    test/tilt_fallback_test.rb
+    test/tilt_hamltemplate_test.rb
+    test/tilt_kramdown_test.rb
+    test/tilt_lesstemplate_test.less
+    test/tilt_lesstemplate_test.rb
+    test/tilt_liquidtemplate_test.rb
+    test/tilt_markaby_test.rb
+    test/tilt_markdown_test.rb
+    test/tilt_marukutemplate_test.rb
+    test/tilt_nokogiritemplate_test.rb
+    test/tilt_radiustemplate_test.rb
+    test/tilt_rdiscounttemplate_test.rb
+    test/tilt_rdoctemplate_test.rb
+    test/tilt_redcarpettemplate_test.rb
+    test/tilt_redclothtemplate_test.rb
+    test/tilt_sasstemplate_test.rb
+    test/tilt_stringtemplate_test.rb
+    test/tilt_template_test.rb
+    test/tilt_test.rb
+    test/tilt_wikiclothtemplate_test.rb
+    test/tilt_yajltemplate_test.rb
+    tilt.gemspec
+  ]
+  # = MANIFEST =
+
+  s.executables = ['tilt']
+  s.test_files = s.files.select {|path| path =~ /^test\/.*_test.rb/}
+  s.add_development_dependency 'asciidoctor', '>= 0.1.0'
+  s.add_development_dependency 'RedCloth'
+  s.add_development_dependency 'bluecloth'
+  s.add_development_dependency 'builder'
+  s.add_development_dependency 'coffee-script'
+  s.add_development_dependency 'contest'
+  s.add_development_dependency 'creole'
+  s.add_development_dependency 'erubis'
+  s.add_development_dependency 'haml', '>= 2.2.11'
+  s.add_development_dependency 'kramdown'
+  s.add_development_dependency 'less'
+  s.add_development_dependency 'liquid'
+  s.add_development_dependency 'markaby'
+  s.add_development_dependency 'maruku'
+  s.add_development_dependency 'nokogiri'
+  s.add_development_dependency 'radius'
+  s.add_development_dependency 'rdiscount'
+  s.add_development_dependency 'rdoc'
+  s.add_development_dependency 'redcarpet'
+  s.add_development_dependency 'sass'
+  s.add_development_dependency 'wikicloth'
+  s.add_development_dependency 'yajl-ruby'
+  s.add_development_dependency 'rdoc'
+
+  s.homepage = "http://github.com/rtomayko/tilt/"
+  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Tilt", "--main", "Tilt"]
+  s.require_paths = %w[lib]
+  s.rubygems_version = '1.1.1'
+end
diff --git a/.bundle/ruby/2.0.0/specifications/fastimage-1.5.0.gemspec b/.bundle/ruby/2.0.0/specifications/fastimage-1.5.0.gemspec
new file mode 100644
index 0000000..d893af2
--- /dev/null
+++ b/.bundle/ruby/2.0.0/specifications/fastimage-1.5.0.gemspec
@@ -0,0 +1,20 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "fastimage"
+  s.version = "1.5.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Stephen Sykes"]
+  s.date = "2013-07-02"
+  s.description = "FastImage finds the size or type of an image given its uri by fetching as little as needed."
+  s.email = "sdsykes at gmail.com"
+  s.extra_rdoc_files = ["README.textile"]
+  s.files = ["README.textile"]
+  s.homepage = "http://github.com/sdsykes/fastimage"
+  s.licenses = ["MIT"]
+  s.rdoc_options = ["--charset=UTF-8"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "2.0.3"
+  s.summary = "FastImage - Image info fast"
+end
diff --git a/.bundle/ruby/2.0.0/specifications/hike-1.2.3.gemspec b/.bundle/ruby/2.0.0/specifications/hike-1.2.3.gemspec
new file mode 100644
index 0000000..4e70db1
--- /dev/null
+++ b/.bundle/ruby/2.0.0/specifications/hike-1.2.3.gemspec
@@ -0,0 +1,29 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "hike"
+  s.version = "1.2.3"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Sam Stephenson"]
+  s.date = "2013-06-04"
+  s.description = "A Ruby library for finding files in a set of paths."
+  s.email = ["sstephenson at gmail.com"]
+  s.homepage = "http://github.com/sstephenson/hike"
+  s.licenses = ["MIT"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "2.0.3"
+  s.summary = "Find files in a set of paths"
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<rake>, [">= 0"])
+    else
+      s.add_dependency(%q<rake>, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<rake>, [">= 0"])
+  end
+end
diff --git a/.bundle/ruby/2.0.0/specifications/hikidoc-0.0.6.gemspec b/.bundle/ruby/2.0.0/specifications/hikidoc-0.0.6.gemspec
new file mode 100644
index 0000000..2069c58
--- /dev/null
+++ b/.bundle/ruby/2.0.0/specifications/hikidoc-0.0.6.gemspec
@@ -0,0 +1,34 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "hikidoc"
+  s.version = "0.0.6"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Kazuhiko", "SHIBATA Hiroshi"]
+  s.date = "2013-02-26"
+  s.description = "'HikiDoc' is a text-to-HTML conversion tool for web writers."
+  s.email = ["kazuhiko at fdiary.net", "shibata.hiroshi at gmail.com"]
+  s.executables = ["hikidoc"]
+  s.files = ["bin/hikidoc"]
+  s.homepage = "https://github.com/hiki/hikidoc"
+  s.licenses = ["MIT"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "2.0.3"
+  s.summary = "'HikiDoc' is a text-to-HTML conversion tool for web writers. HikiDoc allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid HTML (or XHTML)."
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<bundler>, [">= 0"])
+      s.add_development_dependency(%q<rake>, [">= 0"])
+    else
+      s.add_dependency(%q<bundler>, [">= 0"])
+      s.add_dependency(%q<rake>, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<bundler>, [">= 0"])
+    s.add_dependency(%q<rake>, [">= 0"])
+  end
+end
diff --git a/.bundle/ruby/2.0.0/specifications/multi_json-1.7.7.gemspec b/.bundle/ruby/2.0.0/specifications/multi_json-1.7.7.gemspec
new file mode 100644
index 0000000..2349486
--- /dev/null
+++ b/.bundle/ruby/2.0.0/specifications/multi_json-1.7.7.gemspec
@@ -0,0 +1,30 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "multi_json"
+  s.version = "1.7.7"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 1.3.5") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Michael Bleigh", "Josh Kalderimis", "Erik Michaels-Ober", "Pavel Pravosud"]
+  s.cert_chain = ["-----BEGIN CERTIFICATE-----\nMIIDLjCCAhagAwIBAgIBADANBgkqhkiG9w0BAQUFADA9MQ8wDQYDVQQDDAZzZmVy\naWsxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2NvbTAe\nFw0xMzAyMDMxMDAyMjdaFw0xNDAyMDMxMDAyMjdaMD0xDzANBgNVBAMMBnNmZXJp\nazEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29tMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl0x5dx8uKxi7TkrIuyBUTJVB\nv1o93nUB9j/y4M96gV2rYwAci1JPBseNd6Fybzjo3YGuHl7EQHuSHNaf1p2lxew/\ny60JXIJBBgPcDK/KCP4NUHofm0jfoYD+H5uNJfHCNq7/ZsTx [...]
+  s.date = "2013-06-14"
+  s.description = "A common interface to multiple JSON libraries, including Oj, Yajl, the JSON gem (with C-extensions), the pure-Ruby JSON gem, NSJSONSerialization, gson.rb, JrJackson, and OkJson."
+  s.email = ["michael at intridea.com", "josh.kalderimis at gmail.com", "sferik at gmail.com"]
+  s.homepage = "http://github.com/intridea/multi_json"
+  s.licenses = ["MIT"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "2.0.3"
+  s.summary = "A common interface to multiple JSON libraries."
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<bundler>, ["~> 1.0"])
+    else
+      s.add_dependency(%q<bundler>, ["~> 1.0"])
+    end
+  else
+    s.add_dependency(%q<bundler>, ["~> 1.0"])
+  end
+end
diff --git a/.bundle/ruby/2.0.0/specifications/rack-1.5.2.gemspec b/.bundle/ruby/2.0.0/specifications/rack-1.5.2.gemspec
new file mode 100644
index 0000000..62ab17d
--- /dev/null
+++ b/.bundle/ruby/2.0.0/specifications/rack-1.5.2.gemspec
@@ -0,0 +1,36 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "rack"
+  s.version = "1.5.2"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Christian Neukirchen"]
+  s.date = "2013-02-08"
+  s.description = "Rack provides a minimal, modular and adaptable interface for developing\nweb applications in Ruby.  By wrapping HTTP requests and responses in\nthe simplest way possible, it unifies and distills the API for web\nservers, web frameworks, and software in between (the so-called\nmiddleware) into a single method call.\n\nAlso see http://rack.github.com/.\n"
+  s.email = "chneukirchen at gmail.com"
+  s.executables = ["rackup"]
+  s.extra_rdoc_files = ["README.rdoc", "KNOWN-ISSUES"]
+  s.files = ["bin/rackup", "README.rdoc", "KNOWN-ISSUES"]
+  s.homepage = "http://rack.github.com/"
+  s.licenses = ["MIT"]
+  s.require_paths = ["lib"]
+  s.rubyforge_project = "rack"
+  s.rubygems_version = "2.0.3"
+  s.summary = "a modular Ruby webserver interface"
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<bacon>, [">= 0"])
+      s.add_development_dependency(%q<rake>, [">= 0"])
+    else
+      s.add_dependency(%q<bacon>, [">= 0"])
+      s.add_dependency(%q<rake>, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<bacon>, [">= 0"])
+    s.add_dependency(%q<rake>, [">= 0"])
+  end
+end
diff --git a/.bundle/ruby/2.0.0/specifications/rdtool-0.6.38.gemspec b/.bundle/ruby/2.0.0/specifications/rdtool-0.6.38.gemspec
new file mode 100644
index 0000000..34b0165
--- /dev/null
+++ b/.bundle/ruby/2.0.0/specifications/rdtool-0.6.38.gemspec
@@ -0,0 +1,34 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "rdtool"
+  s.version = "0.6.38"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Youhei SASAKI"]
+  s.date = "2012-11-27"
+  s.description = "RD is multipurpose documentation format created for documentating Ruby and output of Ruby world. You can embed RD into Ruby script. And RD have neat syntax which help you to read document in Ruby script. On the other hand, RD have a feature for class reference."
+  s.email = "uwabami at gfd-dennou.org"
+  s.executables = ["rd2", "rdswap.rb"]
+  s.files = ["bin/rd2", "bin/rdswap.rb"]
+  s.homepage = "http://github.com/uwabami/rdtool"
+  s.licenses = ["GPL-2+", "Ruby"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "2.0.3"
+  s.summary = "RDtool is formatter for RD."
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<racc>, ["~> 1.4.6"])
+      s.add_development_dependency(%q<rake>, [">= 0"])
+    else
+      s.add_dependency(%q<racc>, ["~> 1.4.6"])
+      s.add_dependency(%q<rake>, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<racc>, ["~> 1.4.6"])
+    s.add_dependency(%q<rake>, [">= 0"])
+  end
+end
diff --git a/.bundle/ruby/2.0.0/specifications/sprockets-2.10.0.gemspec b/.bundle/ruby/2.0.0/specifications/sprockets-2.10.0.gemspec
new file mode 100644
index 0000000..1ab8c3b
--- /dev/null
+++ b/.bundle/ruby/2.0.0/specifications/sprockets-2.10.0.gemspec
@@ -0,0 +1,77 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "sprockets"
+  s.version = "2.10.0"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Sam Stephenson", "Joshua Peek"]
+  s.date = "2013-05-24"
+  s.description = "Sprockets is a Rack-based asset packaging system that concatenates and serves JavaScript, CoffeeScript, CSS, LESS, Sass, and SCSS."
+  s.email = ["sstephenson at gmail.com", "josh at joshpeek.com"]
+  s.executables = ["sprockets"]
+  s.files = ["bin/sprockets"]
+  s.homepage = "http://getsprockets.org/"
+  s.licenses = ["MIT"]
+  s.require_paths = ["lib"]
+  s.rubyforge_project = "sprockets"
+  s.rubygems_version = "2.0.3"
+  s.summary = "Rack-based asset packaging system"
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 4
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_runtime_dependency(%q<hike>, ["~> 1.2"])
+      s.add_runtime_dependency(%q<multi_json>, ["~> 1.0"])
+      s.add_runtime_dependency(%q<rack>, ["~> 1.0"])
+      s.add_runtime_dependency(%q<tilt>, ["!= 1.3.0", "~> 1.1"])
+      s.add_development_dependency(%q<closure-compiler>, [">= 0"])
+      s.add_development_dependency(%q<coffee-script>, ["~> 2.0"])
+      s.add_development_dependency(%q<coffee-script-source>, ["~> 1.2"])
+      s.add_development_dependency(%q<eco>, ["~> 1.0"])
+      s.add_development_dependency(%q<ejs>, ["~> 1.0"])
+      s.add_development_dependency(%q<execjs>, ["~> 1.0"])
+      s.add_development_dependency(%q<json>, [">= 0"])
+      s.add_development_dependency(%q<rack-test>, [">= 0"])
+      s.add_development_dependency(%q<rake>, [">= 0"])
+      s.add_development_dependency(%q<sass>, ["~> 3.1"])
+      s.add_development_dependency(%q<uglifier>, [">= 0"])
+      s.add_development_dependency(%q<yui-compressor>, [">= 0"])
+    else
+      s.add_dependency(%q<hike>, ["~> 1.2"])
+      s.add_dependency(%q<multi_json>, ["~> 1.0"])
+      s.add_dependency(%q<rack>, ["~> 1.0"])
+      s.add_dependency(%q<tilt>, ["!= 1.3.0", "~> 1.1"])
+      s.add_dependency(%q<closure-compiler>, [">= 0"])
+      s.add_dependency(%q<coffee-script>, ["~> 2.0"])
+      s.add_dependency(%q<coffee-script-source>, ["~> 1.2"])
+      s.add_dependency(%q<eco>, ["~> 1.0"])
+      s.add_dependency(%q<ejs>, ["~> 1.0"])
+      s.add_dependency(%q<execjs>, ["~> 1.0"])
+      s.add_dependency(%q<json>, [">= 0"])
+      s.add_dependency(%q<rack-test>, [">= 0"])
+      s.add_dependency(%q<rake>, [">= 0"])
+      s.add_dependency(%q<sass>, ["~> 3.1"])
+      s.add_dependency(%q<uglifier>, [">= 0"])
+      s.add_dependency(%q<yui-compressor>, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<hike>, ["~> 1.2"])
+    s.add_dependency(%q<multi_json>, ["~> 1.0"])
+    s.add_dependency(%q<rack>, ["~> 1.0"])
+    s.add_dependency(%q<tilt>, ["!= 1.3.0", "~> 1.1"])
+    s.add_dependency(%q<closure-compiler>, [">= 0"])
+    s.add_dependency(%q<coffee-script>, ["~> 2.0"])
+    s.add_dependency(%q<coffee-script-source>, ["~> 1.2"])
+    s.add_dependency(%q<eco>, ["~> 1.0"])
+    s.add_dependency(%q<ejs>, ["~> 1.0"])
+    s.add_dependency(%q<execjs>, ["~> 1.0"])
+    s.add_dependency(%q<json>, [">= 0"])
+    s.add_dependency(%q<rack-test>, [">= 0"])
+    s.add_dependency(%q<rake>, [">= 0"])
+    s.add_dependency(%q<sass>, ["~> 3.1"])
+    s.add_dependency(%q<uglifier>, [">= 0"])
+    s.add_dependency(%q<yui-compressor>, [">= 0"])
+  end
+end
diff --git a/.bundle/ruby/2.0.0/specifications/thor-0.18.1.gemspec b/.bundle/ruby/2.0.0/specifications/thor-0.18.1.gemspec
new file mode 100644
index 0000000..ded7bf6
--- /dev/null
+++ b/.bundle/ruby/2.0.0/specifications/thor-0.18.1.gemspec
@@ -0,0 +1,31 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "thor"
+  s.version = "0.18.1"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Yehuda Katz", "Jos\u{e9} Valim"]
+  s.date = "2013-03-30"
+  s.description = "A scripting framework that replaces rake, sake and rubigen"
+  s.email = "ruby-thor at googlegroups.com"
+  s.executables = ["thor"]
+  s.files = ["bin/thor"]
+  s.homepage = "http://whatisthor.com/"
+  s.licenses = ["MIT"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "2.0.3"
+  s.summary = "A scripting framework that replaces rake, sake and rubigen"
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 3
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<bundler>, ["~> 1.0"])
+    else
+      s.add_dependency(%q<bundler>, ["~> 1.0"])
+    end
+  else
+    s.add_dependency(%q<bundler>, ["~> 1.0"])
+  end
+end
diff --git a/.bundle/ruby/2.0.0/specifications/tilt-1.4.1.gemspec b/.bundle/ruby/2.0.0/specifications/tilt-1.4.1.gemspec
new file mode 100644
index 0000000..23afc29
--- /dev/null
+++ b/.bundle/ruby/2.0.0/specifications/tilt-1.4.1.gemspec
@@ -0,0 +1,98 @@
+# -*- encoding: utf-8 -*-
+
+Gem::Specification.new do |s|
+  s.name = "tilt"
+  s.version = "1.4.1"
+
+  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
+  s.authors = ["Ryan Tomayko"]
+  s.date = "2013-05-08"
+  s.description = "Generic interface to multiple Ruby template engines"
+  s.email = "r at tomayko.com"
+  s.executables = ["tilt"]
+  s.files = ["bin/tilt"]
+  s.homepage = "http://github.com/rtomayko/tilt/"
+  s.licenses = ["MIT"]
+  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Tilt", "--main", "Tilt"]
+  s.require_paths = ["lib"]
+  s.rubygems_version = "2.0.3"
+  s.summary = "Generic interface to multiple Ruby template engines"
+
+  if s.respond_to? :specification_version then
+    s.specification_version = 2
+
+    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+      s.add_development_dependency(%q<asciidoctor>, [">= 0.1.0"])
+      s.add_development_dependency(%q<RedCloth>, [">= 0"])
+      s.add_development_dependency(%q<bluecloth>, [">= 0"])
+      s.add_development_dependency(%q<builder>, [">= 0"])
+      s.add_development_dependency(%q<coffee-script>, [">= 0"])
+      s.add_development_dependency(%q<contest>, [">= 0"])
+      s.add_development_dependency(%q<creole>, [">= 0"])
+      s.add_development_dependency(%q<erubis>, [">= 0"])
+      s.add_development_dependency(%q<haml>, [">= 2.2.11"])
+      s.add_development_dependency(%q<kramdown>, [">= 0"])
+      s.add_development_dependency(%q<less>, [">= 0"])
+      s.add_development_dependency(%q<liquid>, [">= 0"])
+      s.add_development_dependency(%q<markaby>, [">= 0"])
+      s.add_development_dependency(%q<maruku>, [">= 0"])
+      s.add_development_dependency(%q<nokogiri>, [">= 0"])
+      s.add_development_dependency(%q<radius>, [">= 0"])
+      s.add_development_dependency(%q<rdiscount>, [">= 0"])
+      s.add_development_dependency(%q<rdoc>, [">= 0"])
+      s.add_development_dependency(%q<redcarpet>, [">= 0"])
+      s.add_development_dependency(%q<sass>, [">= 0"])
+      s.add_development_dependency(%q<wikicloth>, [">= 0"])
+      s.add_development_dependency(%q<yajl-ruby>, [">= 0"])
+      s.add_development_dependency(%q<rdoc>, [">= 0"])
+    else
+      s.add_dependency(%q<asciidoctor>, [">= 0.1.0"])
+      s.add_dependency(%q<RedCloth>, [">= 0"])
+      s.add_dependency(%q<bluecloth>, [">= 0"])
+      s.add_dependency(%q<builder>, [">= 0"])
+      s.add_dependency(%q<coffee-script>, [">= 0"])
+      s.add_dependency(%q<contest>, [">= 0"])
+      s.add_dependency(%q<creole>, [">= 0"])
+      s.add_dependency(%q<erubis>, [">= 0"])
+      s.add_dependency(%q<haml>, [">= 2.2.11"])
+      s.add_dependency(%q<kramdown>, [">= 0"])
+      s.add_dependency(%q<less>, [">= 0"])
+      s.add_dependency(%q<liquid>, [">= 0"])
+      s.add_dependency(%q<markaby>, [">= 0"])
+      s.add_dependency(%q<maruku>, [">= 0"])
+      s.add_dependency(%q<nokogiri>, [">= 0"])
+      s.add_dependency(%q<radius>, [">= 0"])
+      s.add_dependency(%q<rdiscount>, [">= 0"])
+      s.add_dependency(%q<rdoc>, [">= 0"])
+      s.add_dependency(%q<redcarpet>, [">= 0"])
+      s.add_dependency(%q<sass>, [">= 0"])
+      s.add_dependency(%q<wikicloth>, [">= 0"])
+      s.add_dependency(%q<yajl-ruby>, [">= 0"])
+      s.add_dependency(%q<rdoc>, [">= 0"])
+    end
+  else
+    s.add_dependency(%q<asciidoctor>, [">= 0.1.0"])
+    s.add_dependency(%q<RedCloth>, [">= 0"])
+    s.add_dependency(%q<bluecloth>, [">= 0"])
+    s.add_dependency(%q<builder>, [">= 0"])
+    s.add_dependency(%q<coffee-script>, [">= 0"])
+    s.add_dependency(%q<contest>, [">= 0"])
+    s.add_dependency(%q<creole>, [">= 0"])
+    s.add_dependency(%q<erubis>, [">= 0"])
+    s.add_dependency(%q<haml>, [">= 2.2.11"])
+    s.add_dependency(%q<kramdown>, [">= 0"])
+    s.add_dependency(%q<less>, [">= 0"])
+    s.add_dependency(%q<liquid>, [">= 0"])
+    s.add_dependency(%q<markaby>, [">= 0"])
+    s.add_dependency(%q<maruku>, [">= 0"])
+    s.add_dependency(%q<nokogiri>, [">= 0"])
+    s.add_dependency(%q<radius>, [">= 0"])
+    s.add_dependency(%q<rdiscount>, [">= 0"])
+    s.add_dependency(%q<rdoc>, [">= 0"])
+    s.add_dependency(%q<redcarpet>, [">= 0"])
+    s.add_dependency(%q<sass>, [">= 0"])
+    s.add_dependency(%q<wikicloth>, [">= 0"])
+    s.add_dependency(%q<yajl-ruby>, [">= 0"])
+    s.add_dependency(%q<rdoc>, [">= 0"])
+  end
+end
diff --git a/.gitignore b/.gitignore
index 4ec83f9..1bcdc57 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@ coverage.*
 data/*
 !data/.htaccess
 log
+pkg
 tmp
 rdoc
 index.rdf
diff --git a/.travis.yml b/.travis.yml
index 57a615d..a333345 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,71 +1,29 @@
 services: memcache
 
-bundler_args: --without development
-
 rvm:
-  - 1.8.7
   - 1.9.3
   - 2.0.0
 
+before_install:
+  - "export DISPLAY=:99.0"
+  - "sh -e /etc/init.d/xvfb start"
+
 before_script:
-  - export DISPLAY=:99.0
-  - sh -e /etc/init.d/xvfb start
   - DAEMON=1 bundle exec rake server
 
-script: bundle exec rake spec spec:acceptance:rdb test
+script: if [ $TEST_MODE = "gem" ] ; then bundle exec tdiary test ; else bundle exec rake spec spec:acceptance:rdb jasmine:ci test ; fi
 
 env:
   - TEST_MODE=rack
   - TEST_MODE=rdb
   - TEST_MODE=webrick
   - TEST_MODE=secure
-
-gemfile:
-  - Gemfile
-  - misc/gemfiles/ruby18.gemfile
+  - TEST_MODE=gem
 
 notifications:
   irc: "irc.freenode.org#tdiary"
 
 matrix:
-  exclude:
-    # too bad exclude otpions.
-    - rvm: 1.8.7
-      env: TEST_MODE=rack
-      gemfile: Gemfile
-    - rvm: 1.8.7
-      env: TEST_MODE=rdb
-      gemfile: Gemfile
-    - rvm: 1.8.7
-      env: TEST_MODE=webrick
-      gemfile: Gemfile
-    - rvm: 1.8.7
-      env: TEST_MODE=secure
-      gemfile: Gemfile
-    - rvm: 1.9.3
-      env: TEST_MODE=rack
-      gemfile: misc/gemfiles/ruby18.gemfile
-    - rvm: 1.9.3
-      env: TEST_MODE=rdb
-      gemfile: misc/gemfiles/ruby18.gemfile
-    - rvm: 1.9.3
-      env: TEST_MODE=webrick
-      gemfile: misc/gemfiles/ruby18.gemfile
-    - rvm: 1.9.3
-      env: TEST_MODE=secure
-      gemfile: misc/gemfiles/ruby18.gemfile
-    - rvm: 2.0.0
-      env: TEST_MODE=rack
-      gemfile: misc/gemfiles/ruby18.gemfile
-    - rvm: 2.0.0
-      env: TEST_MODE=rdb
-      gemfile: misc/gemfiles/ruby18.gemfile
-    - rvm: 2.0.0
-      env: TEST_MODE=webrick
-      gemfile: misc/gemfiles/ruby18.gemfile
-    - rvm: 2.0.0
-      env: TEST_MODE=secure
-      gemfile: misc/gemfiles/ruby18.gemfile
   allow_failures:
     # webrick mode is unstable results...
     - env: TEST_MODE=webrick
diff --git a/Capfile b/Capfile
deleted file mode 100644
index 6b69b0d..0000000
--- a/Capfile
+++ /dev/null
@@ -1,2 +0,0 @@
-load 'deploy' if respond_to?(:namespace) # cap2 differentiator
-load 'tdiary/deploy'
diff --git a/Gemfile b/Gemfile
index f60dd4c..9aab054 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,40 +1,61 @@
 source 'https://rubygems.org'
 
-gem 'rake'
+if File.exist?(File.expand_path('../tdiary.gemspec', __FILE__))
+	# directly installed (e.g. git clone, archive file)
+	gemspec
+else
+	# installed by gem
+	gem 'tdiary'
+
+	# use edge tDiary
+	# gem 'tdiary', :git => 'git at github.com:tdiary/tdiary-core.git'
+end
+
+# if you use tdiary-contrib gem, uncomment this line.
+# gem 'tdiary-contrib'
+# use edge tDiary contrib
+# gem 'tdiary-contrib', :git => 'git at github.com:tdiary/tdiary-contrib.git'
 
 gem 'rack'
 gem 'sprockets'
-gem 'coffee-script'
+gem 'hikidoc'
+gem 'rdtool'
+gem 'fastimage'
 
-gem 'omniauth'
-gem 'omniauth-twitter'
-gem 'omniauth-github'
-
-gem 'dalli'
-gem 'redis'
-gem 'redis-namespace'
+group :coffee do
+  gem 'coffee-script'
+  gem 'therubyracer'
+end
 
-platforms :mri do
-  gem 'thin'
+group :memcached do
+  gem 'dalli'
+end
 
-  # if you don't have JavaScript processor, uncomment this line.
-  # gem 'therubyracer'
+group :redis do
+  gem 'redis'
+  gem 'redis-namespace'
+end
 
+group :gfm do
   gem 'redcarpet'
   gem 'pygments.rb'
   gem 'twitter-text', :require => false
 end
 
-platforms :jruby do
-  gem 'trinidad'
+group :server do
+  platforms :mri do
+    gem 'thin'
+  end
+
+  platforms :jruby do
+    gem 'trinidad'
+  end
 end
 
 group :development do
-  gem 'capistrano', :require => false
-  gem 'capistrano_colors', :require => false
-  gem 'rvm-capistrano', :require => false
   gem 'pit', :require => false
   gem 'racksh', :require => false
+  gem 'rake'
 
   group :test do
     gem 'pry'
@@ -48,8 +69,6 @@ group :development do
     gem 'sqlite3'
     gem 'jasmine'
     gem 'simplecov', :require => false
-    gem 'simplecov-rcov', :require => false
     gem 'coveralls', :require => false
-    gem 'ci_reporter'
   end
 end
diff --git a/Gemfile.lock b/Gemfile.lock
index 96b30ca..7d34090 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,15 +1,14 @@
+PATH
+  remote: .
+  specs:
+    tdiary (4.0.0)
+      bundler (~> 1.3)
+      thor (~> 0.18)
+
 GEM
   remote: https://rubygems.org/
   specs:
-    addressable (2.3.4)
-    builder (3.2.0)
-    capistrano (2.14.2)
-      highline
-      net-scp (>= 1.0.0)
-      net-sftp (>= 2.0.0)
-      net-ssh (>= 2.0.14)
-      net-ssh-gateway (>= 1.1.0)
-    capistrano_colors (0.5.5)
+    addressable (2.3.5)
     capybara (2.1.0)
       mime-types (>= 1.16)
       nokogiri (>= 1.3.3)
@@ -18,84 +17,50 @@ GEM
       xpath (~> 2.0)
     childprocess (0.3.9)
       ffi (~> 1.0, >= 1.0.11)
-    ci_reporter (1.8.4)
-      builder (>= 2.1.2)
     coderay (1.0.9)
     coffee-script (2.2.0)
       coffee-script-source
       execjs
-    coffee-script-source (1.6.2)
+    coffee-script-source (1.6.3)
     colorize (0.5.8)
-    coveralls (0.6.6)
+    coveralls (0.6.7)
       colorize
       multi_json (~> 1.3)
       rest-client
       simplecov (>= 0.7)
       thor
     daemons (1.1.9)
-    dalli (2.6.2)
+    dalli (2.6.4)
     diff-lcs (1.2.4)
     eventmachine (1.0.3)
     execjs (1.4.0)
       multi_json (~> 1.0)
-    faraday (0.8.7)
-      multipart-post (~> 1.1)
-    ffi (1.7.0)
-    hashie (2.0.3)
-    highline (1.6.18)
-    hike (1.2.2)
-    httpauth (0.2.0)
+    fastimage (1.5.0)
+    ffi (1.9.0)
+    hike (1.2.3)
+    hikidoc (0.0.6)
     jasmine (1.3.2)
       jasmine-core (~> 1.3.1)
       rack (~> 1.0)
       rspec (>= 1.3.1)
       selenium-webdriver (>= 0.1.3)
     jasmine-core (1.3.1)
-    jwt (0.1.8)
-      multi_json (>= 1.5)
     launchy (2.3.0)
       addressable (~> 2.3)
+    libv8 (3.11.8.17)
     method_source (0.8.1)
-    mime-types (1.22)
-    multi_json (1.7.2)
-    multipart-post (1.2.0)
-    net-scp (1.1.0)
-      net-ssh (>= 2.6.5)
-    net-sftp (2.1.1)
-      net-ssh (>= 2.6.5)
-    net-ssh (2.6.7)
-    net-ssh-gateway (1.2.0)
-      net-ssh (>= 2.6.5)
-    nokogiri (1.5.9)
-    oauth (0.4.7)
-    oauth2 (0.8.1)
-      faraday (~> 0.8)
-      httpauth (~> 0.1)
-      jwt (~> 0.1.4)
-      multi_json (~> 1.0)
-      rack (~> 1.2)
-    omniauth (1.1.4)
-      hashie (>= 1.2, < 3)
-      rack
-    omniauth-github (1.1.0)
-      omniauth (~> 1.0)
-      omniauth-oauth2 (~> 1.1)
-    omniauth-oauth (1.0.1)
-      oauth
-      omniauth (~> 1.0)
-    omniauth-oauth2 (1.1.1)
-      oauth2 (~> 0.8.0)
-      omniauth (~> 1.0)
-    omniauth-twitter (0.0.16)
-      multi_json (~> 1.3)
-      omniauth-oauth (~> 1.0)
+    mime-types (1.23)
+    mini_portile (0.5.1)
+    multi_json (1.7.7)
+    nokogiri (1.6.0)
+      mini_portile (~> 0.5.0)
     pit (0.0.7)
     posix-spawn (0.3.6)
-    pry (0.9.12)
+    pry (0.9.12.2)
       coderay (~> 1.0.5)
       method_source (~> 0.8)
       slop (~> 3.4)
-    pygments.rb (0.5.0)
+    pygments.rb (0.5.2)
       posix-spawn (~> 0.3.6)
       yajl-ruby (~> 1.1.0)
     rack (1.5.2)
@@ -104,38 +69,36 @@ GEM
     racksh (1.0.0)
       rack (>= 1.0)
       rack-test (>= 0.5)
-    rake (10.0.4)
-    redcarpet (2.2.2)
-    redis (3.0.3)
-    redis-namespace (1.2.1)
+    rake (10.1.0)
+    rdtool (0.6.38)
+    redcarpet (3.0.0)
+    redis (3.0.4)
+    redis-namespace (1.3.0)
       redis (~> 3.0.0)
+    ref (1.0.5)
     rest-client (1.6.7)
       mime-types (>= 1.16)
-    rspec (2.13.0)
-      rspec-core (~> 2.13.0)
-      rspec-expectations (~> 2.13.0)
-      rspec-mocks (~> 2.13.0)
-    rspec-core (2.13.1)
-    rspec-expectations (2.13.0)
+    rspec (2.14.1)
+      rspec-core (~> 2.14.0)
+      rspec-expectations (~> 2.14.0)
+      rspec-mocks (~> 2.14.0)
+    rspec-core (2.14.4)
+    rspec-expectations (2.14.0)
       diff-lcs (>= 1.1.3, < 2.0)
-    rspec-mocks (2.13.1)
+    rspec-mocks (2.14.1)
     rubyzip (0.9.9)
-    rvm-capistrano (1.3.0)
-      capistrano (>= 2.0.0)
-    selenium-webdriver (2.32.1)
+    selenium-webdriver (2.33.0)
       childprocess (>= 0.2.5)
       multi_json (~> 1.0)
       rubyzip
       websocket (~> 1.0.4)
-    sequel (3.46.0)
+    sequel (4.0.0)
     simplecov (0.7.1)
       multi_json (~> 1.0)
       simplecov-html (~> 0.7.1)
     simplecov-html (0.7.1)
-    simplecov-rcov (0.2.3)
-      simplecov (>= 0.4.1)
-    slop (3.4.4)
-    sprockets (2.9.3)
+    slop (3.4.6)
+    sprockets (2.10.0)
       hike (~> 1.2)
       multi_json (~> 1.0)
       rack (~> 1.0)
@@ -143,13 +106,16 @@ GEM
     sqlite3 (1.3.7)
     tapp (1.4.0)
       thor
-    test-unit (2.5.4)
+    test-unit (2.5.5)
+    therubyracer (0.11.4)
+      libv8 (~> 3.11.8.12)
+      ref
     thin (1.5.1)
       daemons (>= 1.0.9)
       eventmachine (>= 0.12.6)
       rack (>= 1.0.0)
     thor (0.18.1)
-    tilt (1.3.7)
+    tilt (1.4.1)
     twitter-text (1.6.1)
       unf (~> 0.0.5)
     unf (0.0.5)
@@ -164,37 +130,34 @@ PLATFORMS
   ruby
 
 DEPENDENCIES
-  capistrano
-  capistrano_colors
   capybara
-  ci_reporter
   coffee-script
   coveralls
   dalli
+  fastimage
+  hikidoc
   jasmine
   launchy
-  omniauth
-  omniauth-github
-  omniauth-twitter
   pit
   pry
   pygments.rb
   rack
   racksh
   rake
+  rdtool
   redcarpet
   redis
   redis-namespace
   rspec
-  rvm-capistrano
   selenium-webdriver
   sequel
   simplecov
-  simplecov-rcov
   sprockets
   sqlite3
   tapp
+  tdiary!
   test-unit
+  therubyracer
   thin
   trinidad
   twitter-text
diff --git a/README.md b/README.md
index 2d7787c..a340566 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@ tDiaryには以下のような特徴があります。
 
 ### レンタルサーバーユーザにやさしい
 
-必要なのはRuby(1.8.5ないしは1.9.2以降に対応)だけ。単独でCGIとして動作し、基本機能はデータベースや追加のライブラリを必要としません。
+必要なのはRuby(1.9.2ないしは2.0.0以降に対応)だけ。単独でCGIとして動作し、基本機能はデータベースや追加のライブラリを必要としません。
 
 ### プラグインで拡張できます
 
@@ -30,4 +30,4 @@ tDiaryには以下のような特徴があります。
 
 ### その他
 
-インストールにはドキュメント(doc/INSTALL.html)を参照して下さい。動作にはruby(1.8.5以降または1.9.2以降)と、CGIをサポートするWebサーバが必要ですが、通常のレンタルサーバーであればたいていはこの環境があるはずです。
+インストールにはドキュメント(doc/INSTALL.html)を参照して下さい。動作にはruby(1.9.2以降または2.0.0以降)と、CGIをサポートするWebサーバが必要です。
diff --git a/Rakefile b/Rakefile
index 1f225a9..6c3fe03 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,9 +1,13 @@
 # -*- coding: utf-8 -*-
 
-require File.expand_path('../tdiary/environment', __FILE__)
+$LOAD_PATH.unshift '.'
+
+require 'tdiary/environment'
+require 'tdiary/tasks'
 
 require 'rake'
 require 'rake/clean'
+require 'bundler/gem_tasks' if File.exists?('tdiary.gemspec')
 
 CLEAN.include(
 	"tmp",
@@ -15,8 +19,6 @@ CLOBBER.include(
 	"coverage"
 )
 
-Dir['tdiary/tasks/**/*.rake'].each {|f| load f}
-
 # Local Variables:
 # mode: ruby
 # indent-tabs-mode: t
diff --git a/bin/tdiary b/bin/tdiary
new file mode 100644
index 0000000..ccecff4
--- /dev/null
+++ b/bin/tdiary
@@ -0,0 +1,7 @@
+#!/usr/bin/env ruby
+lib = File.expand_path('../../', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+
+require 'tdiary/cli'
+
+TDiary::CLI.start
diff --git a/config.ru b/config.ru
index ddf857d..aac46ff 100644
--- a/config.ru
+++ b/config.ru
@@ -1,61 +1,7 @@
 $:.unshift( File::dirname( __FILE__ ).untaint )
 require 'tdiary/environment'
-require 'tdiary'
-require 'tdiary/rack/html_anchor'
-require 'tdiary/rack/valid_request_path'
-require 'tdiary/rack/auth/basic'
-require 'omniauth'
-require 'tdiary/rack/auth/omniauth'
+require 'tdiary/application'
 
-use Rack::Reloader unless ENV['RACK_ENV'] == 'production'
-
-base_dir = ''
-
-# OmniAuth settings
-use Rack::Session::Pool, :expire_after => 2592000
-use OmniAuth::Builder do
-	configure {|conf| conf.path_prefix = "#{base_dir}/auth" }
-	# provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET']
-	# provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET']
-end
-map "#{base_dir}/auth" do
-	run TDiary::Rack::Auth::OmniAuth::CallbackHandler.new
-end
-
-map "#{base_dir}/update.rb" do
-	# Basic Auth
-	use TDiary::Rack::Auth::Basic, '.htpasswd'
-
-	# OAuth
-	# use TDiary::Rack::Auth::OmniAuth, :twitter do |auth|
-	#		auth.info.nickname == 'your_twitter_screen_name'
-	# end
-
-	run TDiary::Application.new(:update)
-end
-
-map "#{base_dir}/assets" do
-	environment = Sprockets::Environment.new
-	%w(js theme).each {|path| environment.append_path path }
-
-	# if you need to auto compilation for CoffeeScript
-	# require 'tdiary/rack/assets/precompile'
-	# use TDiary::Rack::Assets::Precompile, environment
-
-	run environment
-end
-
-map "#{base_dir}/" do
-	use TDiary::Rack::HtmlAnchor
-	run Rack::Cascade.new([
-		Rack::File.new("./public/"),
-		TDiary::Rack::ValidRequestPath.new(TDiary::Application.new(:index))
-	])
-end
-
-# Local Variables:
-# mode: ruby
-# indent-tabs-mode: t
-# tab-width: 3
-# ruby-indent-level: 3
-# End:
+use ::Rack::Reloader unless ENV['RACK_ENV'] == 'production'
+base_dir = '/'
+run TDiary::Application.new( base_dir )
diff --git a/doc/HOWTO-testing-tDiary.html b/doc/HOWTO-testing-tDiary.html
index bc1328a..ffa30b7 100644
--- a/doc/HOWTO-testing-tDiary.html
+++ b/doc/HOWTO-testing-tDiary.html
@@ -25,7 +25,7 @@
 <p>tDiary でテストを実行するためには以下の環境を用意する必要があります。</p>
 
 <ul>
-<li>Ruby 1.8.7 以降または Ruby 1.9.2 以降</li>
+<li>Ruby 1.9.2 以降または Ruby 2.0.0 以降</li>
 <li>RubyGems 1.3.7 以降</li>
 <li>Bundler 1.0.0 以降</li>
 </ul>
diff --git a/doc/HOWTO-testing-tDiary.md b/doc/HOWTO-testing-tDiary.md
index 9eaa627..fff22a5 100644
--- a/doc/HOWTO-testing-tDiary.md
+++ b/doc/HOWTO-testing-tDiary.md
@@ -18,7 +18,7 @@ tDiary-3.0.1.20101011 以降のバージョンでは tDiary を test するた
 
 tDiary でテストを実行するためには以下の環境を用意する必要があります。
 
-  - Ruby 1.8.7 以降または Ruby 1.9.2 以降
+  - Ruby 1.9.2 以降または Ruby 2.0.0 以降
   - RubyGems 1.3.7 以降
   - Bundler 1.0.0 以降
 
diff --git a/doc/INSTALL-cgi.html b/doc/INSTALL-cgi.html
new file mode 100644
index 0000000..ee2dd0c
--- /dev/null
+++ b/doc/INSTALL-cgi.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="ja-JP">
+<head>
+<title>INSTALL-cgi</title>
+<link href="doc.css" media="screen" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<h1>tDiaryのインストール (CGI環境)</h1>
+
+<p>一般的なCGIの実行を許可しているISPやレンタルサーバ上で利用する場合を想定し、以下のような環境を例に説明します。</p>
+
+<ul>
+<li>WWWサーバ: Apache 1.3.x</li>
+<li>ユーザ名: foo</li>
+<li>日記のURL: http://www.hoge.example.org/~foo/diary/</li>
+<li>上記URLのパス: /home/foo/public_html/diary</li>
+</ul>
+
+<h2>tDiaryの取得</h2>
+
+<p>tDiaryのダウンロードサイトから、配布アーカイブを取得します。</p>
+
+<ul>
+<li><a href="http://www.tdiary.org/20021112.html">tDiary.org - ダウンロード</a></li>
+</ul>
+
+<h3>【補足】 tDiaryをGitHubから取得する場合</h3>
+
+<p>開発版を使いたい、更新を楽にしたいという理由でtDiaryをGitHubから取得して利用する場合は、外部ライブラリ (hikidocなど) を手動でインストールする必要があります。以降の手順に沿って、ライブラリをインストールしてください。</p>
+
+<p>配布アーカイブから取得する場合は、外部ライブラリは同梱されているため、この手順は不要です。</p>
+
+<p>まず、外部ライブラリの取得に必要となるBundlerインストールします。</p>
+
+<pre><code>% gem install bundler
+</code></pre>
+
+<p>次に、gitコマンドでtDiaryのソースコードを取得した後に、 <code>bundle install</code> コマンドを実行して外部ライブラリをインストールします。</p>
+
+<pre><code>% git clone git://github.com/tdiary/tdiary-core.git tdiary
+% cd tdiary
+% bundle install --without coffee:memcached:redis:gfm:server:development:test
+</code></pre>
+
+<p>上記の例では tDiary を動作させるのに最低限必要なライブラリのみインストールしています。もし、memcached にキャッシュを保存したり、GFM スタイルを使用する場合は --without オプションから該当ライブラリの文字列を削除して実行してください。</p>
+
+<h2>CGIスクリプトの設定</h2>
+
+<p>配布アーカイブを展開し、中身をすべて/home/foo/public_html/diaryにコピーします。以下の2つのファイルがCGIスクリプト本体なので、WWWサーバの権限で実行可能なようにパーミッションを設定してください。</p>
+
+<ul>
+<li>index.rb</li>
+<li>update.rb</li>
+</ul>
+
+<p>また、/usr/bin/envを使った起動ができない環境では、各ファイルの先頭を、rubyのパスに書き換える必要があるでしょう。ISPのホームディレクトリにこっそりRubyを入れたような場合を除き、通常はあまり気にしなくても良いはずです。</p>
+
+<h2>.htaccessの作成</h2>
+
+<p>続いて、CGIの実行環境を整えます。dot.htaccessを.htaccessにリネームして、環境に合わせて書き換えます。添付のサンプルは以下のようになっています。</p>
+
+<pre><code>Options +ExecCGI
+AddHandler cgi-script .rb
+DirectoryIndex index.rb
+
+<Files "*.rhtml">
+   deny from all
+</Files>
+
+<Files "tdiary.*">
+   deny from all
+</Files>
+
+<Files update.rb>
+AuthName      tDiary
+AuthType      Basic
+AuthUserFile  /home/foo/.htpasswd
+Require user  foo
+</Files>
+</code></pre>
+
+<p>ここでは、</p>
+
+<ul>
+<li>CGIの実行を可能にし、</li>
+<li>サフィックス「.rb」のファイルをCGIと認識させ、</li>
+<li>index.rbをデフォルトのファイルに設定し、</li>
+<li><em>.rhtmlとtdiary.</em>のファイルの参照を禁止して、</li>
+<li>update.rbへのアクセスにはユーザ認証が必要</li>
+</ul>
+
+<p>という設定になっています。とりあえず書き換えが必要なのは、AuthUserFileとRequire userでしょう。意味はWebででも調べて下さい。AuthUseFileは、あらかじめhtpasswdコマンドで作成しておく必要があります(これもWebで調べればわかります)。</p>
+
+<p>また、利用するWWWサーバの設定が、CGIの実行ファイルのサフィックスを固定(例:.cgi)にしている場合があります。この場合、AddHandlerやDirectoryIndexも変更する必要があるでしょう。これに応じて、index.rbやupdate.rbのファイル名も変更する必要があります。</p>
+</body>
+</html>
diff --git a/doc/INSTALL-cgi.md b/doc/INSTALL-cgi.md
new file mode 100644
index 0000000..65bcb49
--- /dev/null
+++ b/doc/INSTALL-cgi.md
@@ -0,0 +1,83 @@
+tDiaryのインストール (CGI環境)
+==============================
+
+一般的なCGIの実行を許可しているISPやレンタルサーバ上で利用する場合を想定し、以下のような環境を例に説明します。
+
+  - WWWサーバ: Apache 1.3.x
+  - ユーザ名: foo
+  - 日記のURL: http://www.hoge.example.org/~foo/diary/
+  - 上記URLのパス: /home/foo/public\_html/diary
+
+## tDiaryの取得
+
+tDiaryのダウンロードサイトから、配布アーカイブを取得します。
+  
+ - [tDiary.org - ダウンロード](http://www.tdiary.org/20021112.html)
+
+### 【補足】 tDiaryをGitHubから取得する場合
+
+開発版を使いたい、更新を楽にしたいという理由でtDiaryをGitHubから取得して利用する場合は、外部ライブラリ (hikidocなど) を手動でインストールする必要があります。以降の手順に沿って、ライブラリをインストールしてください。
+
+配布アーカイブから取得する場合は、外部ライブラリは同梱されているため、この手順は不要です。
+
+まず、外部ライブラリの取得に必要となるBundlerインストールします。
+
+```
+% gem install bundler
+```
+
+次に、gitコマンドでtDiaryのソースコードを取得した後に、 `bundle install` コマンドを実行して外部ライブラリをインストールします。
+
+```
+% git clone git://github.com/tdiary/tdiary-core.git tdiary
+% cd tdiary
+% bundle install --without coffee:memcached:redis:gfm:server:development:test
+```
+
+上記の例では tDiary を動作させるのに最低限必要なライブラリのみインストールしています。もし、memcached にキャッシュを保存したり、GFM スタイルを使用する場合は --without オプションから該当ライブラリの文字列を削除して実行してください。
+
+## CGIスクリプトの設定
+
+配布アーカイブを展開し、中身をすべて/home/foo/public\_html/diaryにコピーします。以下の2つのファイルがCGIスクリプト本体なので、WWWサーバの権限で実行可能なようにパーミッションを設定してください。
+
+  - index.rb
+  - update.rb
+
+また、/usr/bin/envを使った起動ができない環境では、各ファイルの先頭を、rubyのパスに書き換える必要があるでしょう。ISPのホームディレクトリにこっそりRubyを入れたような場合を除き、通常はあまり気にしなくても良いはずです。
+
+## .htaccessの作成
+
+続いて、CGIの実行環境を整えます。dot.htaccessを.htaccessにリネームして、環境に合わせて書き換えます。添付のサンプルは以下のようになっています。
+
+```
+Options +ExecCGI
+AddHandler cgi-script .rb
+DirectoryIndex index.rb
+
+<Files "*.rhtml">
+   deny from all
+</Files>
+
+<Files "tdiary.*">
+   deny from all
+</Files>
+
+<Files update.rb>
+AuthName      tDiary
+AuthType      Basic
+AuthUserFile  /home/foo/.htpasswd
+Require user  foo
+</Files>
+```
+
+ここでは、
+
+  - CGIの実行を可能にし、
+  - サフィックス「.rb」のファイルをCGIと認識させ、
+  - index.rbをデフォルトのファイルに設定し、
+  - *.rhtmlとtdiary.*のファイルの参照を禁止して、
+  - update.rbへのアクセスにはユーザ認証が必要
+
+という設定になっています。とりあえず書き換えが必要なのは、AuthUserFileとRequire userでしょう。意味はWebででも調べて下さい。AuthUseFileは、あらかじめhtpasswdコマンドで作成しておく必要があります(これもWebで調べればわかります)。
+
+また、利用するWWWサーバの設定が、CGIの実行ファイルのサフィックスを固定(例:.cgi)にしている場合があります。この場合、AddHandlerやDirectoryIndexも変更する必要があるでしょう。これに応じて、index.rbやupdate.rbのファイル名も変更する必要があります。
diff --git a/doc/INSTALL-paas.html b/doc/INSTALL-paas.html
index a7e5e63..f99a60c 100644
--- a/doc/INSTALL-paas.html
+++ b/doc/INSTALL-paas.html
@@ -17,7 +17,7 @@
 
 <ul>
 <li><a href="http://git-scm.com">git</a></li>
-<li>Ruby 1.8.7 以降</li>
+<li>Ruby 1.9.2 以降</li>
 <li>RubyGems 1.3.7 以降</li>
 <li>Bundler 1.0.0 以降</li>
 </ul>
diff --git a/doc/INSTALL-paas.md b/doc/INSTALL-paas.md
index f3b562f..6033058 100644
--- a/doc/INSTALL-paas.md
+++ b/doc/INSTALL-paas.md
@@ -12,7 +12,7 @@ tDiary-3.1.3 以降のバージョンでは tDiary を [Heroku](http://www.herok
 tDiary を PaaS で動作させるためには以下のツールが必要となります。
 
   - [git](http://git-scm.com)
-  - Ruby 1.8.7 以降
+  - Ruby 1.9.2 以降
   - RubyGems 1.3.7 以降
   - Bundler 1.0.0 以降
 
diff --git a/doc/INSTALL-rack.html b/doc/INSTALL-rack.html
new file mode 100644
index 0000000..385ae4a
--- /dev/null
+++ b/doc/INSTALL-rack.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html lang="ja-JP">
+<head>
+<title>INSTALL-rack</title>
+<link href="doc.css" media="screen" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<h1>tDiaryのインストール (Rack環境)</h1>
+
+<h2>概要</h2>
+
+<p>tDiary-4.0 以降のバージョンは gem に対応しているので、簡単に tDiary を設置出来ます。</p>
+
+<h2>tDiary の取得</h2>
+
+<p>gem コマンドで tDiary をインストールします。</p>
+
+<pre><code>% gem install tdiary
+</code></pre>
+
+<p>インストールすると、 tdiary コマンドが使えるようになります。ちゃんとインストールできているか、確認してみましょう。以下のようにバージョン番号が表示されればインストール成功です(表示される番号はバージョンにより異なります)。</p>
+
+<pre><code>% tdiary version
+4.0.0
+</code></pre>
+
+<p>rbenv を使っている場合は忘れずに rehash を実行しておきましょう。</p>
+
+<pre><code>% rbenv rehash
+</code></pre>
+
+<h2>tDiary の設置</h2>
+
+<p>newコマンドを実行してtdiaryを設置します。インストール先のディレクトリ名を指定します。以下の例では diary ディレクトリにインストールします。</p>
+
+<pre><code>% tdiary new diary
+      create  diary
+      create  diary/public
+      (中略)
+      create  diary/tdiary.conf
+         run  bundle install --without test development from "./diary"
+Resolving dependencies...
+Using rake (10.1.0)
+Using bundler (1.3.5)
+(中略)
+Using twitter-text (1.6.1)
+Your bundle is complete!
+Gems in the groups test and development were not installed.
+Use `bundle show [gemname]` to see where a bundled gem is installed.
+         run  bundle exec tdiary htpasswd from "./diary"
+Input your username/password
+</code></pre>
+
+<p>インストール途中で「Input your username/password」と表示され、
+更新画面のユーザ認証のために、IDとパスワードを入力します。</p>
+
+<pre><code>Username: machu
+New password:
+Re-type new password:
+install finished
+run `tdiary server` in diary directory to start server
+</code></pre>
+
+<h2>tDiary の起動と終了</h2>
+
+<p>インストール先のディレクトリに移動して、serverコマンドを実行するとtDiaryサーバが起動します。</p>
+
+<pre><code>% cd diary
+% bundle exec tdiary server
+>> Thin web server (v1.5.1 codename Straight Razor)
+>> Maximum connections set to 1024
+>> Listening on 0.0.0.0:19292, CTRL+C to stop
+</code></pre>
+
+<p>Webブラウザで http://localhost:19292/ にアクセスすると、tDiaryの画面が表示されます。</p>
+
+<p>CTRL+CコマンドでtDiaryサーバを終了します。</p>
+
+<pre><code>>> Stopping ...
+</code></pre>
+
+<h2>tDiary の更新</h2>
+
+<p>tDiaryのアップデートもgemコマンドを使います。</p>
+
+<pre><code>$ gem update tdiary
+</code></pre>
+
+<p>tDiaryの設置ディレクトリに展開されたファイルは、 tdiary updateコマンドを使って更新できます。</p>
+
+<pre><code>$ cd [tDiaryの設置ディレクトリ]
+$ tdiary update
+$ bundle install
+</code></pre>
+</body>
+</html>
diff --git a/doc/INSTALL-rack.md b/doc/INSTALL-rack.md
new file mode 100644
index 0000000..0e96e34
--- /dev/null
+++ b/doc/INSTALL-rack.md
@@ -0,0 +1,97 @@
+tDiaryのインストール (Rack環境)
+============================
+
+## 概要
+
+tDiary-4.0 以降のバージョンは gem に対応しているので、簡単に tDiary を設置出来ます。
+
+## tDiary の取得
+
+gem コマンドで tDiary をインストールします。
+
+```
+% gem install tdiary
+```
+
+インストールすると、 tdiary コマンドが使えるようになります。ちゃんとインストールできているか、確認してみましょう。以下のようにバージョン番号が表示されればインストール成功です(表示される番号はバージョンにより異なります)。
+
+```
+% tdiary version
+4.0.0
+```
+
+rbenv を使っている場合は忘れずに rehash を実行しておきましょう。
+
+```
+% rbenv rehash
+```
+
+## tDiary の設置
+
+newコマンドを実行してtdiaryを設置します。インストール先のディレクトリ名を指定します。以下の例では diary ディレクトリにインストールします。
+
+```
+% tdiary new diary
+      create  diary
+      create  diary/public
+      (中略)
+      create  diary/tdiary.conf
+         run  bundle install --without test development from "./diary"
+Resolving dependencies...
+Using rake (10.1.0)
+Using bundler (1.3.5)
+(中略)
+Using twitter-text (1.6.1)
+Your bundle is complete!
+Gems in the groups test and development were not installed.
+Use `bundle show [gemname]` to see where a bundled gem is installed.
+         run  bundle exec tdiary htpasswd from "./diary"
+Input your username/password
+```
+
+インストール途中で「Input your username/password」と表示され、
+更新画面のユーザ認証のために、IDとパスワードを入力します。
+
+```
+Username: machu
+New password:
+Re-type new password:
+install finished
+run `tdiary server` in diary directory to start server
+```
+
+## tDiary の起動と終了
+
+インストール先のディレクトリに移動して、serverコマンドを実行するとtDiaryサーバが起動します。
+
+```
+% cd diary
+% bundle exec tdiary server
+>> Thin web server (v1.5.1 codename Straight Razor)
+>> Maximum connections set to 1024
+>> Listening on 0.0.0.0:19292, CTRL+C to stop
+```
+
+Webブラウザで http://localhost:19292/ にアクセスすると、tDiaryの画面が表示されます。
+
+CTRL+CコマンドでtDiaryサーバを終了します。
+
+```
+>> Stopping ...
+```
+
+## tDiary の更新
+
+tDiaryのアップデートもgemコマンドを使います。
+
+```
+$ gem update tdiary
+```
+
+tDiaryの設置ディレクトリに展開されたファイルは、 tdiary updateコマンドを使って更新できます。
+
+```
+$ cd [tDiaryの設置ディレクトリ]
+$ tdiary update
+$ bundle install
+```
diff --git a/doc/INSTALL.html b/doc/INSTALL.html
index 49a1c65..99a395c 100644
--- a/doc/INSTALL.html
+++ b/doc/INSTALL.html
@@ -7,69 +7,21 @@
 <body>
 <h1>インストールマニュアル</h1>
 
-<h2>tDiaryのインストールと設定</h2>
+<h2>tDiaryの設置</h2>
 
-<p>一般的なCGIの実行を許可しているISPやレンタルサーバ上で利用する場合を想定し、以下のような環境を例に説明します。</p>
+<p>tDiaryは様々な環境で動作します。それぞれの環境にあわせた設置手順を参照してください。</p>
 
 <ul>
-<li>WWWサーバ: Apache 1.3.x</li>
-<li>ユーザ名: foo</li>
-<li>日記のURL: http://www.hoge.example.org/~foo/diary/</li>
-<li>上記URLのパス: /home/foo/public_html/diary</li>
+<li>独自サーバ、VPSサーバなどのRack環境 … <a href="INSTALL-rack.html">INSTALL-rack.html</a></li>
+<li>Heroku、SqaleなどのPaaS環境 … <a href="INSTALL-paas.html">INSTALL-paas.html</a></li>
+<li>レンタルサーバなどのCGI環境 … <a href="INSTALL-cgi.html">INSTALL-cgi.html</a></li>
 </ul>
 
-<h3>CGIスクリプトの設定</h3>
-
-<p>配布アーカイブを展開し、中身をすべて/home/foo/public_html/diaryにコピーします。以下の2つのファイルがCGIスクリプト本体なので、WWWサーバの権限で実行可能なようにパーミッションを設定してください。</p>
-
-<ul>
-<li>index.rb</li>
-<li>update.rb</li>
-</ul>
-
-<p>また、/usr/bin/envを使った起動ができない環境では、各ファイルの先頭を、rubyのパスに書き換える必要があるでしょう。ISPのホームディレクトリにこっそりRubyを入れたような場合を除き、通常はあまり気にしなくても良いはずです。</p>
-
-<h3>.htaccessの作成</h3>
-
-<p>続いて、CGIの実行環境を整えます。dot.htaccessを.htaccessにリネームして、環境に合わせて書き換えます。添付のサンプルは以下のようになっています。</p>
-
-<pre><code>Options +ExecCGI
-AddHandler cgi-script .rb
-DirectoryIndex index.rb
-
-<Files "*.rhtml">
-   deny from all
-</Files>
-
-<Files "tdiary.*">
-   deny from all
-</Files>
-
-<Files update.rb>
-AuthName      tDiary
-AuthType      Basic
-AuthUserFile  /home/foo/.htpasswd
-Require user  foo
-</Files>
-</code></pre>
-
-<p>ここでは、</p>
-
-<ul>
-<li>CGIの実行を可能にし、</li>
-<li>サフィックス「.rb」のファイルをCGIと認識させ、</li>
-<li>index.rbをデフォルトのファイルに設定し、</li>
-<li><em>.rhtmlとtdiary.</em>のファイルの参照を禁止して、</li>
-<li>update.rbへのアクセスにはユーザ認証が必要</li>
-</ul>
-
-<p>という設定になっています。とりあえず書き換えが必要なのは、AuthUserFileとRequire userでしょう。意味はWebででも調べて下さい。AuthUseFileは、あらかじめhtpasswdコマンドで作成しておく必要があります(これもWebで調べればわかります)。</p>
-
-<p>また、利用するWWWサーバの設定が、CGIの実行ファイルのサフィックスを固定(例:.cgi)にしている場合があります。この場合、AddHandlerやDirectoryIndexも変更する必要があるでしょう。これに応じて、index.rbやupdate.rbのファイル名も変更する必要があります。</p>
+<h2>tDiaryの設定</h2>
 
 <h3>tdiary.confの作成</h3>
 
-<p>次に、tDiaryの設定ファイルであるtdiary.confを作ります。</p>
+<p>tDiaryの設定ファイルであるtdiary.confを作ります。</p>
 
 <p>初めてtDiaryをインストールする人には、付属のtdiary.conf.beginnerを使うのがオススメです。最初に使えるようにしておくと良いプラグインがあらかじめONになっていたり、spamフィルタにある程度の設定がされているなど、インストールしてすぐに使いやすい状態になっています。</p>
 
@@ -82,6 +34,24 @@ Require user  foo
 
 <p>tdiary.confには、他にもいろいろな設定項目を記述できます。これらの項目には以下の3つの種類があります。</p>
 
+<p>tDiary は日記データのキャッシュを PStore ファイルとして保存しますが、設定を変えることによりより高速な memcached を使用することも可能です。memcached をキャッシュの保存先として使用する場合は tdiary.conf を以下のように変更します。</p>
+
+<pre><code># 以下の行をコメントアウト
+# require 'tdiary/io/cache/file'
+require 'tdiary/io/cache/memcached'
+require 'tdiary/io/default'
+ at io_class = DefaultIO
+</code></pre>
+
+<p>同様に redis を使用する場合は tdiary.conf を以下のように変更します。</p>
+
+<pre><code># 以下の行をコメントアウト
+# require 'tdiary/io/cache/file'
+require 'tdiary/io/cache/redis'
+require 'tdiary/io/default'
+ at io_class = DefaultIO
+</code></pre>
+
 <h4>CGIで設定できない項目</h4>
 
 <p>@data_pathのように、CGIでは設定できない項目です。これらの項目は、tdiary.confファイルを直接編集して変更しなければいけません。</p>
diff --git a/doc/INSTALL.md b/doc/INSTALL.md
index 7b9ab2b..a269d41 100644
--- a/doc/INSTALL.md
+++ b/doc/INSTALL.md
@@ -1,65 +1,21 @@
 インストールマニュアル
-===========
+======================
 
-tDiaryのインストールと設定
-----------------
+tDiaryの設置
+------------
 
-一般的なCGIの実行を許可しているISPやレンタルサーバ上で利用する場合を想定し、以下のような環境を例に説明します。
+tDiaryは様々な環境で動作します。それぞれの環境にあわせた設置手順を参照してください。
 
-  - WWWサーバ: Apache 1.3.x
-  - ユーザ名: foo
-  - 日記のURL: http://www.hoge.example.org/~foo/diary/
-  - 上記URLのパス: /home/foo/public\_html/diary
+ - 独自サーバ、VPSサーバなどのRack環境 … [INSTALL-rack.html](INSTALL-rack.html)
+ - Heroku、SqaleなどのPaaS環境 … [INSTALL-paas.html](INSTALL-paas.html)
+ - レンタルサーバなどのCGI環境 … [INSTALL-cgi.html](INSTALL-cgi.html)
 
-### CGIスクリプトの設定
-
-配布アーカイブを展開し、中身をすべて/home/foo/public\_html/diaryにコピーします。以下の2つのファイルがCGIスクリプト本体なので、WWWサーバの権限で実行可能なようにパーミッションを設定してください。
-
-  - index.rb
-  - update.rb
-
-また、/usr/bin/envを使った起動ができない環境では、各ファイルの先頭を、rubyのパスに書き換える必要があるでしょう。ISPのホームディレクトリにこっそりRubyを入れたような場合を除き、通常はあまり気にしなくても良いはずです。
-
-### .htaccessの作成
-
-続いて、CGIの実行環境を整えます。dot.htaccessを.htaccessにリネームして、環境に合わせて書き換えます。添付のサンプルは以下のようになっています。
-
-```
-Options +ExecCGI
-AddHandler cgi-script .rb
-DirectoryIndex index.rb
-
-<Files "*.rhtml">
-   deny from all
-</Files>
-
-<Files "tdiary.*">
-   deny from all
-</Files>
-
-<Files update.rb>
-AuthName      tDiary
-AuthType      Basic
-AuthUserFile  /home/foo/.htpasswd
-Require user  foo
-</Files>
-```
-
-ここでは、
-
-  - CGIの実行を可能にし、
-  - サフィックス「.rb」のファイルをCGIと認識させ、
-  - index.rbをデフォルトのファイルに設定し、
-  - *.rhtmlとtdiary.*のファイルの参照を禁止して、
-  - update.rbへのアクセスにはユーザ認証が必要
-
-という設定になっています。とりあえず書き換えが必要なのは、AuthUserFileとRequire userでしょう。意味はWebででも調べて下さい。AuthUseFileは、あらかじめhtpasswdコマンドで作成しておく必要があります(これもWebで調べればわかります)。
-
-また、利用するWWWサーバの設定が、CGIの実行ファイルのサフィックスを固定(例:.cgi)にしている場合があります。この場合、AddHandlerやDirectoryIndexも変更する必要があるでしょう。これに応じて、index.rbやupdate.rbのファイル名も変更する必要があります。
+tDiaryの設定
+------------
 
 ### tdiary.confの作成
 
-次に、tDiaryの設定ファイルであるtdiary.confを作ります。
+tDiaryの設定ファイルであるtdiary.confを作ります。
 
 初めてtDiaryをインストールする人には、付属のtdiary.conf.beginnerを使うのがオススメです。最初に使えるようにしておくと良いプラグインがあらかじめONになっていたり、spamフィルタにある程度の設定がされているなど、インストールしてすぐに使いやすい状態になっています。
 
@@ -73,6 +29,26 @@ tdiary.conf.beginnerをtdiary.confにリネームして、内容を書き換え
 
 tdiary.confには、他にもいろいろな設定項目を記述できます。これらの項目には以下の3つの種類があります。
 
+tDiary は日記データのキャッシュを PStore ファイルとして保存しますが、設定を変えることによりより高速な memcached を使用することも可能です。memcached をキャッシュの保存先として使用する場合は tdiary.conf を以下のように変更します。
+
+```
+# 以下の行をコメントアウト
+# require 'tdiary/io/cache/file'
+require 'tdiary/io/cache/memcached'
+require 'tdiary/io/default'
+ at io_class = DefaultIO
+```
+
+同様に redis を使用する場合は tdiary.conf を以下のように変更します。
+
+```
+# 以下の行をコメントアウト
+# require 'tdiary/io/cache/file'
+require 'tdiary/io/cache/redis'
+require 'tdiary/io/default'
+ at io_class = DefaultIO
+```
+
 #### CGIで設定できない項目
 
 @data\_pathのように、CGIでは設定できない項目です。これらの項目は、tdiary.confファイルを直接編集して変更しなければいけません。
@@ -111,7 +87,7 @@ load\_cgi\_confはその位置でCGIによる設定を読み込む指令です
 なお、両者の指定位置は独立しているので、両者の位置を組み合わせることで様々な設定を行うことが可能です。また、@secureを指定しない場合のデフォルト値はtrueです。
 
 tDiaryの実行
----------
+------------
 
 ### 日記の更新
 
@@ -150,7 +126,7 @@ tDiaryにはプラグインと呼ばれる機能があります。プラグイ
 日記をつけ続けるだけです(これが一番難しい:-)。Have fun!!
 
 著作権、サポートなど
-----------
+--------------------
 
 tDiary本体は、原作者であるただただし(t at tdtds.jp)が、GPL2の元で配布、改変を許可するフリーソフトウェアです。
 
diff --git a/doc/README.en.html b/doc/README.en.html
index 0dd30c9..05de039 100644
--- a/doc/README.en.html
+++ b/doc/README.en.html
@@ -41,7 +41,7 @@
 
 <h3>Written in Ruby</h3>
 
-<p>Important :-). tDiary requires Ruby-1.8.2 or later.</p>
+<p>Important :-). tDiary requires Ruby-1.9.2 or later.</p>
 
 <h3>Others</h3>
 
diff --git a/doc/README.en.md b/doc/README.en.md
index d3f0220..4774614 100644
--- a/doc/README.en.md
+++ b/doc/README.en.md
@@ -36,7 +36,7 @@ You can choice a grammar of writing your diary by 'Style' feature. Some style fi
 
 ### Written in Ruby
 
-Important :-). tDiary requires Ruby-1.8.2 or later.
+Important :-). tDiary requires Ruby-1.9.2 or later.
 
 ### Others
 
diff --git a/doc/README.html b/doc/README.html
index 48d650b..0e3130a 100644
--- a/doc/README.html
+++ b/doc/README.html
@@ -41,7 +41,7 @@
 
 <h3>Rubyで書かれている</h3>
 
-<p>重要なポイントでしょう:-)??実行にはruby 1.9.1-p378またはruby 1.8.7-p249以上が必要です。</p>
+<p>重要なポイントでしょう:-)??実行にはruby 1.9.2またはruby 2.0.0以上が必要です。</p>
 
 <p>セクション(段落)アンカーや過去の日記の参照など、一般的なWeb日記システムの持つ機能は基本的にサポートしています。</p>
 
diff --git a/doc/README.md b/doc/README.md
index 8e77803..2530760 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -36,7 +36,7 @@ iモードに限らず、ほとんどの携帯電話やPalm・ザウルスなど
 
 ### Rubyで書かれている
 
-重要なポイントでしょう:-)??実行にはruby 1.9.1-p378またはruby 1.8.7-p249以上が必要です。
+重要なポイントでしょう:-)??実行にはruby 1.9.2またはruby 2.0.0以上が必要です。
 
 セクション(段落)アンカーや過去の日記の参照など、一般的なWeb日記システムの持つ機能は基本的にサポートしています。
 
diff --git a/index.rb b/index.rb
index 86d1fa6..3ad313d 100755
--- a/index.rb
+++ b/index.rb
@@ -27,12 +27,12 @@ begin
 		@cgi = CGI::new(:accept_charset => 'shift_jis')
 		@cgi.params = cgi.params
 	end
+
 	request = TDiary::Request.new( ENV, @cgi )
 	status, headers, body = TDiary::Dispatcher.index.dispatch_cgi( request, @cgi )
-	headers['type'] = headers.delete('Content-Type')
-	TDiary::Dispatcher.send_headers( status, headers )
-	TDiary::Dispatcher.send_body( body )
 
+	TDiary::Dispatcher.send_headers( status, headers )
+	::Rack::Handler::CGI.send_body(body)
 rescue Exception
 	if @cgi then
 		print @cgi.header( 'status' => CGI::HTTP_STATUS['SERVER_ERROR'], 'type' => 'text/html' )
diff --git a/js/comment_emoji_autocomplete.js b/js/comment_emoji_autocomplete.js
new file mode 100644
index 0000000..4ea5a6c
--- /dev/null
+++ b/js/comment_emoji_autocomplete.js
@@ -0,0 +1,139 @@
+/*
+ * emoji_autocomplete.js : Support the automatic input of the emoji,
+ *                         using jQuery UI autocomplete.
+ *
+ * Copyright (C) 2013 by tamoot <tamoot+tdiary at gmail.com>
+ * You can distribute it under GPL.
+ */
+
+$(function() {
+   var config = new Object();
+   config.candidates = [":blush:",":scream:",":smirk:",":smiley:",":stuck_out_tongue_closed_eyes:",":stuck_out_tongue_winking_eye:",":rage:",":disappointed:",":sob:",":kissing_heart:",":wink:",":pensive:",":confounded:",":flushed:",":relaxed:",":mask:",":heart:",":broken_heart:",":sunny:",":umbrella:",":cloud:",":snowflake:",":snowman:",":zap:",":cyclone:",":foggy:",":ocean:",":cat:",":dog:",":mouse:",":hamster:",":rabbit:",":wolf:",":frog:",":tiger:",":koala:",":bear:",":pig:",":pig_nos [...]
+   var regrep  = ":.+$";
+   
+   function widgetPosition(){
+      var caretPosition = Measurement.caretPos($("textarea[name=body]"));
+      return {
+         left: caretPosition.left + "px",
+         top:  caretPosition.top + 20 + "px",
+         width: "auto"
+      };
+      
+   }
+   
+   function matchedEmoji(val){
+      terms = val.split("\n");
+      term  = terms[ terms.length - 1];
+      
+      var matched = term.match(regrep);
+      
+      if( matched == null ){
+         return false;
+         
+      }
+      
+      return true;
+      
+   }
+  
+   function typedEmoji( term ) {
+      var array = term.split(":");
+      return array[ array.length - 1 ];
+   }
+  
+   $( "textarea[name=body]" )
+      .bind( "keydown", function( event ) {
+         if ( event.keyCode === $.ui.keyCode.TAB &&
+            $( this ).data( "autocomplete" ).menu.active ) {
+            event.preventDefault();
+            
+         }
+      })
+      .autocomplete({
+         delay: 500,
+         
+         //filtering
+         source: function( request, response ) {
+            if(matchedEmoji(request.term)){
+               response( $.ui.autocomplete.filter(
+                  config.candidates, typedEmoji( request.term ) ) );
+            }
+         },
+         
+         // prevent value inserted on focus
+         focus: function() {
+            return false;
+         },
+         
+         // replace textarea
+         select: function( event, ui ) {
+            // no match data ...
+            if (ui.item.value == null){
+               return false;
+            }
+            
+            var terms = this.value.split(":");
+            // remove the current typed emoji
+            terms.pop();
+            // add the selected item
+            terms.push( ui.item.value.replace(/:/g, "") );
+            this.value = terms.join( ":" ) + ":";
+            
+            return false;
+         },
+         
+         // re-positioning supports excluding IE. 
+         open: function(){
+            if (! document.uniqueID) {
+               $(".ui-autocomplete").css(widgetPosition())
+               
+            }
+         }
+
+   })
+
+   // customize autocomplate item
+   $.ui.autocomplete.prototype._renderItem = function( ul, item ) {
+      var icon_img = null;
+      
+      if (item.value != null){
+         png_basename = item.value.replace(/:/g, "");
+         
+         if (png_basename == '+1'){ png_basename = 'plus1' }
+         
+         icon_img = $("<img>").attr('src', 'http://www.emoji-cheat-sheet.com/graphics/emojis/' + png_basename + '.png')
+         .css('width', '20').css('height', '20');
+         
+      }
+      
+      var label_a  = $("<a></a>")
+         .append(icon_img)
+         .append(item.label)
+      
+      return $( "<li></li>" )
+         .data( "item.autocomplete", item )
+         .append(label_a)
+         .appendTo( ul );
+   };
+   
+   // customize filter and result
+   $.ui.autocomplete.filter = function(array, term) {
+      var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
+      
+      var aryMatches = $.grep( array, function(value) {
+         return matcher.test(value.label || value.value || value);
+
+      });
+      
+      if (aryMatches.length == 0){
+         aryMatches.push({
+            label: '<span class="info" style="font-style: italic;">no match found</span>',
+            value: null
+         });
+
+      }
+      
+      return aryMatches;
+   };
+});
+
diff --git a/misc/gemfiles/ruby18.gemfile b/misc/gemfiles/ruby18.gemfile
deleted file mode 100644
index 3a972b2..0000000
--- a/misc/gemfiles/ruby18.gemfile
+++ /dev/null
@@ -1,35 +0,0 @@
-source 'https://rubygems.org'
-
-gem 'rake'
-
-gem 'rack'
-gem 'sprockets'
-gem 'coffee-script'
-
-gem 'omniauth'
-gem 'omniauth-twitter'
-gem 'omniauth-github'
-
-gem 'dalli'
-gem 'redis'
-gem 'redis-namespace'
-
-gem 'redcarpet'
-gem 'twitter-text', :require => false
-gem 'pygments.rb'
-
-group :development, :test do
-  gem 'pry'
-  gem 'tapp'
-  gem 'test-unit', :require => 'test/unit'
-  gem 'rspec'
-  gem 'ffi'
-  gem 'capybara', '< 2', :require => 'capybara/rspec'
-  gem 'launchy'
-  gem 'sequel'
-  gem 'sqlite3'
-  gem 'rcov'
-  gem 'ci_reporter'
-  gem 'json' # broken jasmine-1.3.x dependency with ruby1.8
-  gem 'jasmine'
-end
diff --git a/misc/gemfiles/ruby18.gemfile.lock b/misc/gemfiles/ruby18.gemfile.lock
deleted file mode 100644
index 2f65b0e..0000000
--- a/misc/gemfiles/ruby18.gemfile.lock
+++ /dev/null
@@ -1,153 +0,0 @@
-GEM
-  remote: https://rubygems.org/
-  specs:
-    addressable (2.3.4)
-    builder (3.2.0)
-    capybara (1.1.4)
-      mime-types (>= 1.16)
-      nokogiri (>= 1.3.3)
-      rack (>= 1.0.0)
-      rack-test (>= 0.5.4)
-      selenium-webdriver (~> 2.0)
-      xpath (~> 0.1.4)
-    childprocess (0.3.9)
-      ffi (~> 1.0, >= 1.0.11)
-    ci_reporter (1.8.4)
-      builder (>= 2.1.2)
-    coderay (1.0.9)
-    coffee-script (2.2.0)
-      coffee-script-source
-      execjs
-    coffee-script-source (1.6.2)
-    dalli (2.6.2)
-    diff-lcs (1.2.4)
-    execjs (1.4.0)
-      multi_json (~> 1.0)
-    faraday (0.8.7)
-      multipart-post (~> 1.1)
-    ffi (1.7.0)
-    hashie (2.0.3)
-    hike (1.2.2)
-    httpauth (0.2.0)
-    jasmine (1.3.2)
-      jasmine-core (~> 1.3.1)
-      rack (~> 1.0)
-      rspec (>= 1.3.1)
-      selenium-webdriver (>= 0.1.3)
-    jasmine-core (1.3.1)
-    json (1.7.7)
-    jwt (0.1.8)
-      multi_json (>= 1.5)
-    launchy (2.3.0)
-      addressable (~> 2.3)
-    method_source (0.8.1)
-    mime-types (1.23)
-    multi_json (1.7.2)
-    multipart-post (1.2.0)
-    nokogiri (1.5.9)
-    oauth (0.4.7)
-    oauth2 (0.8.1)
-      faraday (~> 0.8)
-      httpauth (~> 0.1)
-      jwt (~> 0.1.4)
-      multi_json (~> 1.0)
-      rack (~> 1.2)
-    omniauth (1.1.4)
-      hashie (>= 1.2, < 3)
-      rack
-    omniauth-github (1.1.0)
-      omniauth (~> 1.0)
-      omniauth-oauth2 (~> 1.1)
-    omniauth-oauth (1.0.1)
-      oauth
-      omniauth (~> 1.0)
-    omniauth-oauth2 (1.1.1)
-      oauth2 (~> 0.8.0)
-      omniauth (~> 1.0)
-    omniauth-twitter (0.0.16)
-      multi_json (~> 1.3)
-      omniauth-oauth (~> 1.0)
-    posix-spawn (0.3.6)
-    pry (0.9.12)
-      coderay (~> 1.0.5)
-      method_source (~> 0.8)
-      slop (~> 3.4)
-    pygments.rb (0.5.0)
-      posix-spawn (~> 0.3.6)
-      yajl-ruby (~> 1.1.0)
-    rack (1.5.2)
-    rack-test (0.6.2)
-      rack (>= 1.0)
-    rake (10.0.4)
-    rcov (1.0.0)
-    redcarpet (2.2.2)
-    redis (3.0.3)
-    redis-namespace (1.2.1)
-      redis (~> 3.0.0)
-    rspec (2.13.0)
-      rspec-core (~> 2.13.0)
-      rspec-expectations (~> 2.13.0)
-      rspec-mocks (~> 2.13.0)
-    rspec-core (2.13.1)
-    rspec-expectations (2.13.0)
-      diff-lcs (>= 1.1.3, < 2.0)
-    rspec-mocks (2.13.1)
-    rubyzip (0.9.9)
-    selenium-webdriver (2.32.1)
-      childprocess (>= 0.2.5)
-      multi_json (~> 1.0)
-      rubyzip
-      websocket (~> 1.0.4)
-    sequel (3.46.0)
-    slop (3.4.4)
-    sprockets (2.9.3)
-      hike (~> 1.2)
-      multi_json (~> 1.0)
-      rack (~> 1.0)
-      tilt (~> 1.1, != 1.3.0)
-    sqlite3 (1.3.7)
-    tapp (1.4.0)
-      thor
-    test-unit (2.5.4)
-    thor (0.18.1)
-    tilt (1.3.7)
-    twitter-text (1.6.1)
-      unf (~> 0.0.5)
-    unf (0.0.5)
-      unf_ext
-    unf_ext (0.0.6)
-    websocket (1.0.7)
-    xpath (0.1.4)
-      nokogiri (~> 1.3)
-    yajl-ruby (1.1.0)
-
-PLATFORMS
-  ruby
-
-DEPENDENCIES
-  capybara (< 2)
-  ci_reporter
-  coffee-script
-  dalli
-  ffi
-  jasmine
-  json
-  launchy
-  omniauth
-  omniauth-github
-  omniauth-twitter
-  pry
-  pygments.rb
-  rack
-  rake
-  rcov
-  redcarpet
-  redis
-  redis-namespace
-  rspec
-  sequel
-  sprockets
-  sqlite3
-  tapp
-  test-unit
-  twitter-text
diff --git a/misc/lib/bundler-1.3.5/.gitignore b/misc/lib/bundler-1.3.5/.gitignore
new file mode 100644
index 0000000..874a3b8
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/.gitignore
@@ -0,0 +1,25 @@
+# Please do not submit patches for including directives to ignore IDE/editor
+# generated files. Use a global gitignore as described in
+# https://help.github.com/articles/ignoring-files and find useful gitignore
+# samples at https://github.com/github/gitignore
+
+# system crap
+.DS_Store
+.*.swp
+
+# files created by running the specs
+tmp/
+
+# built gems
+pkg/
+*.gem
+
+# rubinius bytecode
+*.rbc
+.rbx/
+
+# output from ronn
+lib/bundler/man/
+
+# output from ci_reporter
+spec/reports/
diff --git a/misc/lib/bundler-1.3.5/.rspec b/misc/lib/bundler-1.3.5/.rspec
new file mode 100644
index 0000000..8c18f1a
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/.rspec
@@ -0,0 +1,2 @@
+--format documentation
+--color
diff --git a/misc/lib/bundler-1.3.5/.travis.yml b/misc/lib/bundler-1.3.5/.travis.yml
new file mode 100644
index 0000000..842d42b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/.travis.yml
@@ -0,0 +1,72 @@
+language: ruby
+script: rake spec:travis
+before_script: rake spec:travis:deps
+branches:
+  only:
+    - master
+    - 1-3-stable
+    - 1-2-stable
+    - 1-1-stable
+    - 1-0-stable
+notifications:
+  email:
+    - mail at arko.net
+    - hone02 at gmail.com
+  irc:
+    on_success: change
+    on_failure: always
+    channels:
+      - "irc.freenode.org#bundler"
+  campfire:
+    on_success: change
+    on_failure: always
+    rooms:
+      - secure: "geau3P+A9ZJHkA/OHN5v9Mcb8hAti1PllXw5DsHNJfLAWBAw5ReGGMA8Xfpf\nLdT7ktIUlQwzw94cKQ6sRZk8szXTiHncf3bxXTACJf2RpiKmbkoQU51TmCDq\nYSMuY1FIryk/3t9aZCrarufbIDI3DBscDEe4Bj9bERl+TJ8ArBY="
+rvm:
+  - 2.0.0
+  - 1.9.3
+# Rubygems versions MUST be available as rake tasks
+# see Rakefile:66 for the list of possible RGV values
+env:
+  # we need to know if changes to rubygems will break bundler on release
+  - RGV=master
+  # test the latest rubygems release with all of our supported rubies
+  - RGV=v2.0.2
+matrix:
+  allow_failures:
+    # we want to know how we're doing with head, but not fail the build
+    - rvm: ruby-head
+    - env: RGV=master
+    # 1.9.2 is simply too slow. it sometimes exceeds the 25m hard limit.
+    - rvm: 1.9.2
+  include:
+    # riding the edge
+    - rvm: ruby-head
+      env: RGV=master
+    # Rubygems goes down to 1.5.3 on Ruby 1.9.3
+    - rvm: 1.9.3
+      env: RGV=v1.8.25
+    - rvm: 1.9.3
+      env: RGV=v1.7.2
+    - rvm: 1.9.3
+      env: RGV=v1.6.2
+    - rvm: 1.9.3
+      env: RGV=v1.5.3
+    # We only want an overview of how 1.9.2 is doing
+    - rvm: 1.9.2
+      env: RGV=v1.8.25
+    # Rubygems goes down to 1.3.6 on Ruby 1.8.7
+    - rvm: 1.8.7
+      env: RGV=v1.8.25
+    - rvm: 1.8.7
+      env: RGV=v1.7.2
+    - rvm: 1.8.7
+      env: RGV=v1.6.2
+    - rvm: 1.8.7
+      env: RGV=v1.5.3
+    - rvm: 1.8.7
+      env: RGV=v1.4.2
+    - rvm: 1.8.7
+      env: RGV=v1.3.7
+    - rvm: 1.8.7
+      env: RGV=v1.3.6
diff --git a/misc/lib/bundler-1.3.5/CHANGELOG.md b/misc/lib/bundler-1.3.5/CHANGELOG.md
new file mode 100644
index 0000000..a6be094
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/CHANGELOG.md
@@ -0,0 +1,1428 @@
+## 1.3.5 (3 April 2013)
+
+Features:
+
+  - progress indicator while resolver is running (@chief)
+
+Bugfixes:
+
+  - update local overrides with orphaned revisions (@jamesferguson)
+  - revert to working quoting of RUBYOPT on Windows (@ogra)
+  - use basic auth even when SSL is not available (@jayniz)
+  - installing git gems without dependencies in deployment now works
+
+## 1.3.4 (15 March 2103)
+
+Bugfixes:
+
+  - load YAML on Rubygems versions that define module YAML
+  - fix regression that broke --without on ruby 1.8.7
+
+## 1.3.3 (13 March 2013)
+
+Features:
+
+  - compatible with Rubygems 2.0.2 (higher and lower already work)
+  - mention skipped groups in bundle install and bundle update output (@simi)
+  - `gem` creates rake tasks for minitest (@coop) and rspec
+
+Bugfixes:
+
+  - require rbconfig for standalone mode
+
+## 1.3.2 (7 March 2013)
+
+Features:
+
+  - include rubygems.org CA chain
+
+Bugfixes:
+
+  - don't store --dry-run as a Bundler setting
+
+## 1.3.1 (3 March 2013)
+
+Bugfixes:
+
+  - include manpages in gem, restoring many help pages
+  - handle more SSL certificate verification failures
+  - check for the full version of SSL, which we need (@alup)
+  - gem rake task 'install' now depends on task 'build' (@sunaku)
+
+## 1.3.0 (24 February 2013)
+
+Features:
+
+  - raise a useful error when the lockfile contains a merge conflict (@zofrex)
+  - ensure `rake release` checks for uncommitted as well as unstaged (@benmoss)
+  - allow environment variables to be negated with 'false' and '0' (@brettporter)
+  - set $MANPATH inside `exec` for gems with man pages (@sunaku)
+  - partial gem names for `open` and `update` now return a list (@takkanm)
+
+Bugfixes:
+
+  - `update` now (again) finds gems that aren't listed in the Gemfile
+  - `install` now (again) updates cached gems that aren't in the Gemfile
+  - install Gemfiles with HTTP sources even without OpenSSL present
+  - display CerficateFailureError message in full
+
+## 1.3.0.pre.8 (12 February 2013)
+
+Security:
+
+  - validate SSL certificate chain during HTTPS network requests
+  - don't send HTTP Basic Auth creds when redirected to other hosts (@perplexes)
+  - add `--trust-policy` to `install`, like `gem install -P` (@CosmicCat, #2293)
+
+Features:
+
+  - optimize resolver when too new of a gem is already activated (@rykov, #2248)
+  - update Net::HTTP::Persistent for SSL cert validation and no_proxy ENV
+  - explain SSL cert validation failures
+  - generate gemspecs when installing git repos, removing shellouts
+  - add pager selection (@csgui)
+  - add `licenses` command (@bryanwoods, #1898)
+  - sort output from `outdated` (@richardkmichael, #1896)
+  - add a .travis.yml to `gem -t` (@ndbroadbent, #2143)
+  - inform users when the resolver starts
+  - disable reverse DNS to speed up API requests (@raggi)
+
+Bugfixes:
+
+  - raise errors while requiring dashed gems (#1807)
+  - quote the Bundler path on Windows (@jgeiger, #1862, #1856)
+  - load gemspecs containing unicode (@gaffneyc, #2301)
+  - support any ruby version in --standalone
+  - resolve some ruby -w warnings (@chastell, #2193)
+  - don't scare users with an error message during API fallback
+  - `install --binstubs` is back to overwriting. thanks, SemVer.
+
+## 1.3.0.pre.7 (22 January 2013)
+
+Bugfixes:
+
+  - stubs for gems with dev deps no longer cause exceptions (#2272)
+  - don't suggest binstubs to --binstubs users
+
+## 1.3.0.pre.6 (22 January 2013)
+
+Features:
+
+  - `binstubs` lists child gem bins if a gem has no binstubs
+  - `bundle gem --edit` will open the new gemspec (@ndbroadbent)
+  - `bundle gem --test rspec` now makes working tests (@tricknotes)
+  - add `BUNDLE_IGNORE_CONFIG` environment variable support (@richo)
+
+Bugfixes:
+
+  - don't overwrite custom binstubs during `install --binstubs`
+  - don't throw an exception if `binstubs` gem doesn't exist
+  - `bundle config` now works in directories without a Gemfile
+
+## 1.3.0.pre.5 (Jan 9, 2013)
+
+Features:
+
+  - make `--standalone` require lines ruby engine/version agnostic
+  - add `--dry-run` to `bundle clean` (@wfarr, #2237)
+
+Bugfixes:
+
+  - don't skip writing binstubs when doing `bundle install`
+  - distinguish between ruby 1.9/2.0 when using :platforms (@spastorino)
+
+## 1.3.0.pre.4 (Jan 3, 2013)
+
+Features:
+
+  - `bundle binstubs <gem>` to setup individual binstubs
+  - `bundle install --binstubs ""` will remove binstubs option
+  - `bundle clean --dry-run` will print out gems instead of removing them
+
+Bugfixes:
+
+  - Avoid stack traces when Ctrl+C during bundle command (@mitchellh)
+  - fix YAML parsing in in ruby-preview2
+
+## 1.3.0.pre.3 (Dec 21, 2012)
+
+Features:
+
+  - pushing gems during `rake release` can be disabled (@trans)
+  - installing gems with `rake install` is much faster (@utkarshkukreti)
+  - added platforms :ruby_20 and :mri_20, since the ABI has changed
+  - added '--edit' option to open generated gemspec in editor
+
+Bugfixes:
+
+  - :git gems with extensions now work with Rubygems >= 2.0 (@jeremy)
+  - revert SemVer breaking change to :github
+  - `outdated` exits non-zero if outdated gems found (@rohit, #2021)
+  - https Gist URLs for compatibility with Gist 2.0 (@NARKOZ)
+  - namespaced gems no longer generate a superfluous directory (@banyan)
+
+## 1.3.0.pre.2 (Dec 9, 2012)
+
+Features:
+
+  - `config` expands local overrides like `local.rack .` (@gkop, #2205)
+  - `gem` generates files correctly for names like `jquery-rails` (@banyan, #2201)
+  - use gems from gists with the :gist option in the Gemfile (@jgaskins)
+
+Bugfixes:
+
+  - Gemfile sources other than rubygems.org work even when .gemrc contains sources
+  - caching git gems now caches specs, fixing e.g. git ls-files (@bison, #2039)
+  - `show GEM` now warns if the directory has been deleted (@rohit, #2070)
+  - git output hidden when running in --quiet mode (@rohit)
+
+## 1.3.0.pre (Nov 29, 2012)
+
+Features:
+
+  - compatibile with Ruby 2.0.0-preview2
+  - compatibile with Rubygems 2.0.0.preview2 (@drbrain, @evanphx)
+  - ruby 2.0 added to the `:ruby19` ABI-compatible platform
+  - lazy load YAML, allowing Psych to be specified in the Gemfile
+  - significant performance improvements (@cheald, #2181)
+  - `inject` command for scripted Gemfile additions (Engine Yard)
+  - :github option uses slashless arguements as repo owner (@rking)
+  - `open` suggests gem names for typos (@jdelStrother)
+  - `update` reports non-existent gems (@jdelStrother)
+  - `gem` option --test can generate rspec stubs (@MafcoCinco)
+  - `gem` option --test can generate minitest stubs (@kcurtin)
+  - `gem` command generates MIT license (@BrentWheeldon)
+  - gem rake task 'release' resuses existing tags (@shtirlic)
+
+Bugfixes:
+
+  - JRuby new works with HTTPS gem sources (@davidcelis)
+  - `install` installs both rake rake-built gems at once (@crowbot, #2107)
+  - handle Errno::ETIMEDOUT errors (@jmoses)
+  - handle Errno::EAGAIN errors on JRuby
+  - disable ANSI coloring when output is redirected (@tomykaira)
+  - raise LoadErrors correctly during Bundler.require (@Empact)
+  - do not swallow --verbose on `bundle exec` (@sol, #2102)
+  - `gem` generates gemspecs that block double-requires
+  - `gem` generates gemspecs that admit they depend on rake
+
+## 1.2.5 (Feb 24, 2013)
+
+Bugfixes:
+
+  - install Gemfiles with HTTP sources even without OpenSSL present
+  - display CerficateFailureError message in full
+
+## 1.2.4 (Feb 12, 2013)
+
+Features:
+
+  - warn about Ruby 2.0 and Rubygems 2.0
+  - inform users when the resolver starts
+  - disable reverse DNS to speed up API requests (@raggi)
+
+Bugfixes:
+
+  - don't send user/pass when redirected to another host (@perplexes)
+  - load gemspecs containing unicode (@gaffneyc, #2301)
+  - support any ruby version in --standalone
+  - resolve some ruby -w warnings (@chastell, #2193)
+  - don't scare users with an error message during API fallback
+
+## 1.2.3 (Nov 29, 2012)
+
+Bugfixes:
+
+  - fix exceptions while loading some gemspecs
+
+## 1.2.2 (Nov 14, 2012)
+
+Bugfixes:
+
+  - support new Psych::SyntaxError for Ruby 2.0.0 (@tenderlove, @sol)
+  - `bundle viz` works with git gems again (@hirochachacha)
+  - recognize more cases when OpenSSL is not present
+
+## 1.2.1 (Sep 19, 2012)
+
+Bugfixes:
+
+  - `bundle clean` now works with BUNDLE_WITHOUT groups again
+  - have a net/http read timeout around the Gemcutter API Endpoint
+
+## 1.2.0 (Aug 30, 2012)
+
+Bugfixes:
+
+  - raise original error message from LoadError's
+
+Documentation:
+
+  - `platform` man pages
+
+## 1.2.0.rc.2 (Aug 8, 2012)
+
+Bugfixes:
+
+  - `clean` doesn't remove gems that are included in the lockfile
+
+## 1.2.0.rc (Jul 17, 2012)
+
+Features:
+
+  - `check` now has a `--dry-run` option (@svenfuchs, #1811)
+  - loosen ruby directive for engines
+  - prune git/path directories inside vendor/cache (@josevalim, #1988)
+  - update vendored thor to 0.15.2 (@sferik)
+  - add .txt to LICENSE (@postmodern, #2001)
+  - add `config disable_local_branch_check` (@josevalim, #1985)
+  - fall back on the full index when experiencing syck errors (#1419)
+  - handle syntax errors in Ruby gemspecs (#1974)
+
+Bugfixes:
+
+  - fix `pack`/`cache` with `--all` (@josevalim, #1989)
+  - don't display warning message when `cache_all` is set
+  - check for `nil` PATH (#2006)
+  - Always try to keep original GEM_PATH (@drogus, #1920)
+
+## 1.2.0.pre.1 (May 27, 2012)
+
+Features:
+
+  - Git gems import submodules of submodules recursively (@nwwatson, #1935)
+
+Bugfixes:
+
+  - Exit from `check` with a non-zero status when frozen with no lock
+  - Use `latest_release` in Capistrano and Vlad integration (#1264)
+  - Work around a Ruby 1.9.3p194 bug in Psych when config files are empty
+
+Documentation:
+
+  - Add instructions for local git repos to the `config` manpage
+  - Update the `Gemfile` manpage to include ruby versions (@stevenh512)
+  - When OpenSSL is missing, provide instructions for fixing (#1776 etc.)
+  - Unknown exceptions now link to ISSUES for help instead of a new ticket
+  - Correct inline help for `clean --force` (@dougbarth, #1911)
+
+## 1.2.0.pre (May 4, 2012)
+
+Features:
+
+  - bundle package now accepts --all to package git and path dependencies
+  - bundle config now accepts --local, --global and --delete options
+  - It is possible to override a git repository via configuration.
+    For instance, if you have a git dependency on rack, you can force
+    it to use a local repo with `bundle config local.rack ~/path/to/rack`
+  - Cache gemspec loads for performance (@dekellum, #1635)
+  - add --full-index flag to `bundle update` (@fluxx, #1829)
+  - add --quiet flag to `bundle update` (@nashby, #1654)
+  - Add Bundler::GemHelper.gemspec (@knu, #1637)
+  - Graceful handling of Gemfile syntax errors (@koraktor, #1661)
+  - `bundle platform` command
+  - add ruby to DSL, to specify version of ruby
+  - error out if the ruby version doesn't match
+
+Performance:
+
+  - bundle exec shouldn't run Bundler.setup just setting the right rubyopts options is enough (@spastorino, #1598)
+
+Bugfixes:
+
+  - Avoid passing RUBYOPT changes in with_clean_env block (@eric1234, #1604)
+  - Use the same ruby to run subprocesses as is running rake (@brixen)
+
+Documentation:
+
+  - Add :github documentation in DSL (@zofrex, #1848, #1851, #1852)
+  - Add docs for the --no-cache option (@fluxx, #1796)
+  - Add basic documentation for bin_path and bundle_path (@radar)
+  - Add documentation for the run method in Bundler::Installer
+
+## 1.1.5 (Jul 17, 2012)
+
+Features:
+
+  - Special case `ruby` directive from 1.2.0, so you can install Gemfiles that use it
+
+## 1.1.4 (May 27, 2012)
+
+Bugfixes:
+
+  - Use `latest_release` in Capistrano and Vlad integration (#1264)
+  - Unknown exceptions now link to ISSUES for help instead of a new ticket
+  - When OpenSSL is missing, provide instructions for fixing (#1776 etc.)
+  - Correct inline help for `clean --force` (@dougbarth, #1911)
+  - Work around a Ruby 1.9.3p194 bug in Psych when config files are empty
+
+## 1.1.3 (March 23, 2012)
+
+Bugfixes:
+
+  - escape the bundler root path (@tenderlove, #1789)
+
+## 1.1.2 (March 20, 2012)
+
+Bugfixes:
+
+  - Fix --deployment for multiple PATH sections of the same source (#1782)
+
+## 1.1.1 (March 14, 2012)
+
+Bugfixes:
+
+  - Rescue EAGAIN so the fetcher works on JRuby on Windows
+  - Stop asking users to report gem installation errors
+  - Clarify "no sources" message
+  - Use $\ so `bundle gem` gemspecs work on Windows (@postmodern)
+  - URI-encode gem names for dependency API (@rohit, #1672)
+  - Fix `cache` edge case in rubygems 1.3.7 (#1202)
+
+Performance:
+
+  - Reduce invocation of git ls-files in `bundle gem` gemspecs (@knu)
+
+## 1.1.0 (Mar 7, 2012)
+
+Bugfixes:
+
+  - Clean up corrupted lockfiles on bundle installs
+  - Prevent duplicate GIT sources
+  - Fix post_install_message when uing the endpoint API
+
+## 1.1.rc.8 (Mar 3, 2012)
+
+Performance:
+
+  - don't resolve if the Gemfile.lock and Gemfile haven't changed
+
+Bugfixes:
+
+  - Load gemspecs from git even when a released gem has the same version (#1609)
+  - Declare an accurate Ruby version requirement of 1.8.7 or newer (#1619)
+  - handle gemspec development dependencies correctly (@raggi, #1639)
+  - Avoid passing RUBYOPT changes in with_clean_env block. (eric1234, #1604)
+
+## 1.1.rc.7 (Dec 29, 2011)
+
+Bugfixes:
+
+  - Fix bug where `clean` would break when using :path with no gemspec
+
+## 1.1.rc.6 (Dec 22, 2011)
+
+Bugfixes:
+
+  - Fix performance regression from 1.0 (@spastorino, #1511, #1591, #1592)
+  - Load gems correctly when GEM_HOME is blank
+  - Refresh gems so Bundler works from inside a bundle
+  - Handle empty .bundle/config files without an error
+
+## 1.1.rc.5 (Dec 14, 2011)
+
+Bugfixes:
+
+  - Fix ASCII encoding errors with gem (rerelease with ruby 1.8)
+
+## 1.1.rc.4 (Dec 14, 2011)
+
+Features:
+
+  - `bundle viz` has the option to output a DOT file instead of a PNG (@hirochachacha, #683)
+
+Bugfixes:
+
+  - Ensure binstubs generated when using --standalone point to the standalonde bundle (@cowboyd, #1588)
+  - fix `bundle viz` (@hirochachacha, #1586)
+
+## 1.1.rc.3 (Dec 8, 2011)
+
+Bugfixes:
+
+  - fix relative_path so it checks Bundler.root is actually in the beginning of the path (#1582)
+  - fix bundle outdated doesn't list all gems (@joelmoss, #1521)
+
+## 1.1.rc.2 (Dec 6, 2011)
+
+Features:
+
+  - Added README.md to `newgem` (@ognevsky, #1574)
+  - Added LICENSE (MIT) to newgem (@ognevsky, #1571)
+
+Bugfixes:
+
+  - only auto-namespace requires for implied requires (#1531)
+  - fix bundle clean output for git repos (#1473)
+  - use Gem.bindir for bundle clean (#1544, #1532)
+  - use `Gem.load_env_plugins` instead of `Gem.load_env_plugins` (#1500, #1543)
+  - differentiate Ruby 2.0 (trunk) from Ruby 1.9 (@tenderlove, #1539)
+  - `bundle clean` handles 7 length git hash for bundle clean (#1490, #1491)
+  - fix Psych loading issues
+  - Search $PATH for a binary rather than shelling out to `which` (@tenderlove, #1573)
+  - do not clear RG cache unless we actually modify GEM_PATH and GEM_HOME- use `Gem.load_env_plugins` instead of `Gem.load_env_plugins` (#1500, #1543)
+  - `newgem` now uses https://rubygems.org (#1562)
+  - `bundle init` now uses https://rubygems.org (@jjb, #1522)
+  - `bundle install/update` does not autoclean when using --path for semver
+
+Documentation:
+
+  - added documentation for --shebang option for `bundle install` (@lunks, #1475, #1558)
+
+## 1.1.rc (Oct 3, 2011)
+
+Features:
+
+  - add `--shebang` option to bundle install (@bensie, #1467)
+  - build passes on ruby 1.9.3rc1 (#1458, #1469)
+  - hide basic auth credentials for custom sources (#1440, #1463)
+
+Bugfixes:
+
+  - fix index search result caching (#1446, #1466)
+  - fix fetcher prints multiple times during install (#1445, #1462)
+  - don't mention API errors from non-rubygems.org sources
+  - fix autoclean so it doesn't remove bins that are used (#1459, #1460)
+
+Documentation:
+
+  - add :require => [...] to the gemfile(5) manpage (@nono, #1468)
+
+## 1.1.pre.10 (Sep 27, 2011)
+
+Features:
+
+  - `config system_bindir foo` added, works like "-n foo" in your .gemrc file
+
+## 1.1.pre.9 (Sep 18, 2011)
+
+Features:
+
+  - `clean` will now clean up all old .gem and .gemspec files, cleaning up older pres
+  - `clean` will be automatically run after bundle install and update when using `--path` (#1420, #1425)
+  - `clean` now takes a `--force` option (#1247, #1426)
+  - `clean` will clean up cached git dirs in bundle clean (#1390)
+  - remove deprecations from DSL (#1119)
+  - autorequire tries directories for gems with dashed names (#1205)
+  - adds a `--paths` flag to `bundle show` to list all the paths of bundled gems (@tiegz, #1360)
+  - load rubygems plugins in the bundle binary (@tpope, #1364)
+  - make `--standalone` respect `--path` (@cowboyd, #1361)
+
+Bugfixes:
+
+  - Fix `clean` to handle nested gems in a git repo (#1329)
+  - Fix conflict from revert of benchmark tool (@boffbowsh, #1355)
+  - Fix fatal error when unable to connect to gem source (#1269)
+  - Fix `outdated` to find pre-release gems that are installed. (#1359)
+  - Fix color for ui. (#1374)
+  - Fix installing to user-owned system gems on OS X
+  - Fix caching issue in the resolver (#1353, #1421)
+  - Fix :github DSL option
+
+## 1.1.pre.8 (Aug 13, 2011)
+
+Bugfixes:
+
+  - Fix `bundle check` to not print fatal error message (@cldwalker, #1347)
+  - Fix require_sudo when Gem.bindir isn't writeable (#1352)
+  - Fix not asking Gemcutter API for dependency chain of git gems in --deployment (#1254)
+  - Fix `install --binstubs` when using --path (#1332)
+
+## 1.1.pre.7 (Aug 8, 2011)
+
+Bugfixes:
+
+  - Fixed invalid byte sequence error while installing gem on Ruby 1.9 (#1341)
+  - Fixed exception when sudo was needed to install gems (@spastorino)
+
+## 1.1.pre.6 (Aug 8, 2011)
+
+Bugfixes:
+
+  - Fix cross repository dependencies (#1138)
+  - Fix git dependency fetching from API endpoint (#1254)
+  - Fixes for bundle outdated (@joelmoss, #1238)
+  - Fix bundle standalone when using the endpoint (#1240)
+
+Features:
+
+  - Implement `to_ary` to avoid calls to method_missing (@tenderlove, #1274)
+  - bundle clean removes old .gem files (@cldwalker, #1293)
+  - Correcly identify missing child dependency in error message
+  - Run pre-install, post-build, and post-install gem hooks for git gems (@warhammerkid, #1120)
+  - create Gemfile.lock for empty Gemfile (#1218)
+
+## 1.1.pre.5 (June 11, 2011)
+
+Bugfixes:
+
+  - Fix LazySpecification on Ruby 1.9 (@dpiddy, #1232)
+  - Fix HTTP proxy support (@leobessa, #878)
+
+Features:
+
+  - Speed up `install --deployment` by using the API endpoint
+  - Support Basic HTTP Auth for the API endpoint (@dpiddy, #1229)
+  - Add `install --full-index` to disable the API endpoint, just in case
+  - Significantly speed up install by removing unneeded gemspec fetches
+  - `outdated` command shows outdated gems (@joelmoss, #1130)
+  - Print gem post install messages (@csquared, #1155)
+  - Reduce memory use by removing Specification.new inside method_missing (@tenderlove, #1222)
+  - Allow `check --path`
+
+## 1.1.pre.4 (May 5, 2011)
+
+Bugfixes:
+
+  - Fix bug that could prevent installing new gems
+
+## 1.1.pre.3 (May 4, 2011)
+
+Features:
+
+  - Add `bundle outdated` to show outdated gems (@joelmoss)
+  - Remove BUNDLE_* from `Bundler.with_clean_env` (@wuputah)
+  - Add Bundler.clean_system, and clean_exec (@wuputah)
+  - Use git config for gem author name and email (@krekoten)
+
+Bugfixes:
+
+  - Fix error calling Bundler.rubygems.gem_path
+  - Fix error when Gem.path returns Gem::FS instead of String
+
+## 1.1.pre.2 (April 28, 2011)
+
+Features:
+
+  - Add :github option to Gemfile DSL for easy git repos
+  - Merge all fixes from 1.0.12 and 1.0.13
+
+## 1.1.pre.1 (February 2, 2011)
+
+Bugfixes:
+
+  - Compatibility with changes made by Rubygems 1.5
+
+## 1.1.pre (January 21, 2011)
+
+Features:
+
+  - Add bundle clean. Removes unused gems from --path directory
+  - Initial Gemcutter Endpoint API work, BAI Fetching source index
+  - Added bundle install --standalone
+  - Ignore Gemfile.lock when buliding new gems
+  - Make it possible to override a .gemspec dependency's source in the
+    Gemfile
+
+Removed:
+
+  - Removed bundle lock
+  - Removed bundle install <path>
+  - Removed bundle install --production
+  - Removed bundle install --disable-shared-gems
+
+## 1.0.21 (September 30, 2011)
+
+  - No changes from RC
+
+## 1.0.21.rc (September 29, 2011)
+
+Bugfixes:
+
+  - Load Psych unless Syck is defined, because 1.9.2 defines YAML
+
+## 1.0.20 (September 27, 2011)
+
+Features:
+
+  - Add platform :maglev (@timfel, #1444)
+
+Bugfixes:
+
+  - Ensure YAML is required even if Psych is found
+  - Handle directory names that contain invalid regex characters
+
+## 1.0.20.rc (September 18, 2011)
+
+Features:
+
+  - Rescue interrupts to `bundle` while loading bundler.rb (#1395)
+  - Allow clearing without groups by passing `--without ''` (#1259)
+
+Bugfixes:
+
+  - Manually sort requirements in the lockfile (#1375)
+  - Remove several warnings generated by ruby -w (@stephencelis)
+  - Handle trailing slashes on names passed to `gem` (#1372)
+  - Name modules for gems like 'test-foo_bar' correctly (#1303)
+  - Don't require Psych if Syck is already loaded (#1239)
+
+## 1.0.19.rc (September 13, 2011)
+
+Features:
+
+  - Compatability with Rubygems 1.8.10 installer changes
+  - Report gem installation failures clearly (@rwilcox, #1380)
+  - Useful error for cap and vlad on first deploy (@nexmat, @kirs)
+
+Bugfixes:
+
+  - `exec` now works when the command contains 'exec'
+  - Only touch lock after changes on Windows (@robertwahler, #1358)
+  - Keep load paths when #setup is called multiple times (@radsaq, #1379)
+
+## 1.0.18 (August 16, 2011)
+
+Bugfixes:
+
+  - Fix typo in DEBUG_RESOLVER (@geemus)
+  - Fixes rake 0.9.x warning (@mtylty, #1333)
+  - Fix `bundle cache` again for rubygems 1.3.x
+
+Features:
+
+  - Run the bundle install earlier in a Capistrano deployment (@cgriego, #1300)
+  - Support hidden gemspec (@trans, @cldwalker, #827)
+  - Make fetch_specs faster (@zeha, #1294)
+  - Allow overriding development deps loaded by #gemspec (@lgierth, #1245)
+
+## 1.0.17 (August 8, 2011)
+
+Bugfixes:
+
+  - Fix rake issues with rubygems 1.3.x (#1342)
+  - Fixed invalid byte sequence error while installing gem on Ruby 1.9 (#1341)
+
+## 1.0.16 (August 8, 2011)
+
+Features:
+
+  - Performance fix for MRI 1.9 (@efficientcloud, #1288)
+  - Shortcuts (like `bundle i`) for all commands (@amatsuda)
+  - Correcly identify missing child dependency in error message
+
+Bugfixes:
+
+  - Allow Windows network share paths with forward slashes (@mtscout6, #1253)
+  - Check for rubygems.org credentials so `rake release` doesn't hang (#980)
+  - Find cached prerelease gems on rubygems 1.3.x (@dburt, #1202)
+  - Fix `bundle install --without` on kiji (@tmm1, #1287)
+  - Get rid of warning in ruby 1.9.3 (@smartinez87, #1231)
+
+Documentation:
+
+  - Documentation for `gem ..., :require => false` (@kmayer, #1292)
+  - Gems provide "executables", they are rarely also binaries (@fxn, #1242)
+
+## 1.0.15 (June 9, 2011)
+
+Features:
+
+  - Improved Rubygems integration, removed many deprecation notices
+
+Bugfixes:
+
+  - Escape URL arguments to git correctly on Windows (1.0.14 regression)
+
+## 1.0.14 (May 27, 2011)
+
+Features:
+
+  - Rubinius platform :rbx (@rkbodenner)
+  - Include gem rake tasks with "require 'bundler/gem_tasks" (@indirect)
+  - Include user name and email from git config in new gemspec (@ognevsky)
+
+Bugfixes:
+
+  - Set file permissions after checking out git repos (@tissak)
+  - Remove deprecated call to Gem::SourceIndex#all_gems (@mpj)
+  - Require the version file in new gemspecs (@rubiii)
+  - Allow relative paths from the Gemfile in gems with no gemspec (@mbirk)
+  - Install gems that contain 'bundler', e.g. guard-bundler (@hone)
+  - Display installed path correctly on Windows (@tadman)
+  - Escape quotes in git URIs (@mheffner)
+  - Improve Rake 0.9 support (@quix)
+  - Handle certain directories already existing (@raggi)
+  - Escape filenames containing regex characters (@indirect)
+
+## 1.0.13 (May 4, 2011)
+
+Features:
+
+  - Compatibility with Rubygems master (soon to be v1.8) (@evanphx)
+  - Informative error when --path points to a broken symlink
+  - Support Rake 0.9 and greater (@e2)
+  - Output full errors for non-TTYs e.g. pow (@josh)
+
+Bugfixes:
+
+  - Allow spaces in gem path names for gem tasks (@rslifka)
+  - Have cap run bundle install from release_path (@martinjagusch)
+  - Quote git refspec so zsh doesn't expand it (@goneflyin)
+
+## 1.0.12 (April 8, 2011)
+
+Features:
+
+  - Add --no-deployment option to `install` for disabling it on dev machines
+  - Better error message when git fails and cache is present (@parndt)
+  - Honor :bundle_cmd in cap `rake` command (@voidlock, @cgriego)
+
+Bugfixes:
+
+  - Compatibility with Rubygems 1.7 and Rails 2.3 and vendored gems (@evanphx)
+  - Fix changing gem order in lock (@gucki)
+  - Remove color escape sequences when displaying man pages (@bgreenlee)
+  - Fix creating GEM_HOME on both JRuby 1.5 and 1.6 (@nickseiger)
+  - Fix gems without a gemspec and directories in bin/ (@epall)
+  - Fix --no-prune option for `bundle install` (@cmeiklejohn)
+
+## 1.0.11 (April 1, 2011)
+
+Features:
+
+  - Compatibility with Rubygems 1.6 and 1.7
+  - Better error messages when a git command fails
+
+Bugfixes:
+
+  - Don't always update gemspec gems (@carllerche)
+  - Remove ivar warnings (@jackdempsey)
+  - Fix occasional git failures in zsh (@jonah-carbonfive)
+  - Consistent lock for gems with double deps like Cap (@akahn)
+
+## 1.0.10 (February 1, 2011)
+
+Bugfixes:
+
+  - Fix a regression loading YAML gemspecs from :git and :path gems
+  - Requires, namespaces, etc. to work with changes in Rubygems 1.5
+
+## 1.0.9 (January 19, 2011)
+
+Bugfixes:
+
+  - Fix a bug where Bundler.require could remove gems from the load
+    path. In Rails apps with a default application.rb, this removed
+    all gems in groups other than :default and Rails.env
+
+## 1.0.8 (January 18, 2011)
+
+Features:
+
+  - Allow overriding gemspec() deps with :git deps
+  - Add --local option to `bundle update`
+  - Ignore Gemfile.lock in newly generated gems
+  - Use `less` as help pager instead of `more`
+  - Run `bundle exec rake` instead of `rake` in Capistrano tasks
+
+Bugfixes:
+
+  - Fix --no-cache option for `bundle install`
+  - Allow Vlad deploys to work without Capistrano gem installed
+  - Fix group arguments to `bundle console`
+  - Allow groups to be loaded even if other groups were loaded
+  - Evaluate gemspec() gemspecs in their directory not the cwd
+  - Count on Rake to chdir to the right place in GemHelper
+  - Change Pathnames to Strings for MacRuby
+  - Check git process exit status correctly
+  - Fix some warnings in 1.9.3-trunk (thanks tenderlove)
+
+## 1.0.7 (November 17, 2010)
+
+Bugfixes:
+
+  - Remove Bundler version from the lockfile because it broke
+    backwards compatibility with 1.0.0-1.0.5. Sorry. :(
+
+## 1.0.6 (November 16, 2010)
+
+Bugfixes:
+
+  - Fix regression in `update` that caused long/wrong results
+  - Allow git gems on other platforms while installing (#579)
+
+Features:
+
+  - Speed up `install` command using various optimizations
+  - Significantly increase performance of resolver
+  - Use upcoming Rubygems performance improvements (@tmm1)
+  - Warn if the lockfile was generated by a newer version
+  - Set generated gems' homepage to "", so Rubygems will warn
+
+## 1.0.5 (November 13, 2010)
+
+Bugfixes:
+
+  - Fix regression disabling all operations that employ sudo
+
+## 1.0.4 (November 12, 2010)
+
+Bugfixes:
+
+  - Expand relative :paths from Bundler.root (eg ./foogem)
+  - Allow git gems in --without groups while --frozen
+  - Allow gem :ref to be a symbol as well as a string
+  - Fix exception when Gemfile needs a newer Bundler version
+  - Explanation when the current Bundler version conflicts
+  - Explicit error message if Gemfile needs newer Bundler
+  - Ignore an empty string BUNDLE_GEMFILE
+  - Skeleton gemspec now works with older versions of git
+  - Fix shell quoting and ref fetching in GemHelper
+  - Disable colored output in --deployment
+  - Preserve line endings in lock file
+
+Features:
+
+  - Add support for 'mingw32' platform (aka RubyInstaller)
+  - Large speed increase when Gemfile.lock is already present
+  - Huge speed increase when many (100+) system gems are present
+  - Significant expansion of ISSUES, man pages, and docs site
+  - Remove Open3 from GemHelper (now it works on Windows™®©)
+  - Allow setting roles in built-in cap and vlad tasks
+
+## 1.0.3 (October 15, 2010)
+
+Bugfixes:
+
+  - Use bitwise or in #hash to reduce the chance of overflow
+  - `bundle update` now works with :git + :tag updates
+  - Record relative :path options in the Gemfile.lock
+  - :groups option on gem method in Gemfile now works
+  - Add #platform method and :platform option to Gemfile DSL
+  - --without now accepts a quoted, space-separated list
+  - Installing after --deployment with no lock is now possible
+  - Binstubs can now be symlinked
+  - Print warning if cache for --local install is missing gems
+  - Improve output when installing to a path
+  - The tests all pass! Yay!
+
+## 1.0.2 (October 2, 2010)
+
+Bugfix:
+
+  - Actually include the man pages in the gem, so help works
+
+## 1.0.1 (October 1, 2010)
+
+Features:
+
+  - Vlad deployment recipe, `require 'bundler/vlad'`
+  - Prettier bundle graphs
+  - Improved gem skeleton for `bundle gem`
+  - Prompt on file clashes when generating a gem
+  - Option to generate binary with gem skeleton
+  - Allow subclassing of GemHelper for custom tasks
+  - Chdir to gem directory during `bundle open`
+
+Bugfixes:
+
+  - Allow gemspec requirements with a list of versions
+  - Accept lockfiles with windows line endings
+  - Respect BUNDLE_WITHOUT env var
+  - Allow `gem "foo", :platform => :jruby`
+  - Specify loaded_from path in fake gemspec
+  - Flesh out gem_helper tasks, raise errors correctly
+  - Respect RBConfig::CONFIG['ruby_install_name'] in binstubs
+
+## 1.0.0 (August 29, 2010)
+
+Features:
+
+  - You can now define `:bundle_cmd` in the capistrano task
+
+Bugfixes:
+
+  - Various bugfixes to the built-in rake helpers
+  - Fix a bug where shortrefs weren't unique enough and were
+    therfore colliding
+  - Fix a small bug involving checking whether a local git
+    clone is up to date
+  - Correctly handle explicit '=' dependencies with gems
+    pinned to a git source
+  - Fix an issue with Windows-generated lockfiles by reading
+    and writing the lockfile in binary mode
+  - Fix an issue with shelling out to git in Windows by
+    using double quotes around paths
+  - Detect new Rubygems sources in the Gemfile and update
+    the lockfile
+
+## 1.0.0.rc.6 (August 23, 2010)
+
+Features:
+
+  - Much better documentation for most of the commands and Gemfile
+    format
+
+Bugfixes:
+
+  - Don't attempt to create directories if they already exist
+  - Fix the capistrano task so that it actually runs
+  - Update the Gemfile template to reference rubygems.org instead
+    of :gemcutter
+  - bundle exec should exit with a non zero exit code when the gem
+    binary does not exist or the file is not executable.
+  - Expand paths in Gemfile relative to the Gemfile and not the current
+    working directory.
+
+## 1.0.0.rc.5 (August 10, 2010)
+
+Features:
+
+  - Make the Capistrano task more concise.
+
+Bugfixes:
+
+  - Fix a regression with determining whether or not to use sudo
+  - Allow using the --gemfile flag with the --deployment flag
+
+## 1.0.0.rc.4 (August 9, 2010)
+
+Features:
+
+  - `bundle gem NAME` command to generate a new gem with Gemfile
+  - Bundle config file location can be specified by BUNDLE_APP_CONFIG
+  - Add --frozen to disable updating the Gemfile.lock at runtime
+    (default with --deployment)
+  - Basic Capistrano task now added as 'bundler/capistrano'
+
+Bugfixes:
+
+  - Multiple bundler process no longer share a tmp directory
+  - `bundle update GEM` always updates dependencies of GEM as well
+  - Deleting the cache directory no longer causes errors
+  - Moving the bundle after installation no longer causes git errors
+  - Bundle path is now correctly remembered on a read-only filesystem
+  - Gem binaries are installed to Gem.bindir, not #{Gem.dir}/bin
+  - Fetch gems from vendor/cache, even without --local
+  - Sort lockfile by platform as well as spec
+
+## 1.0.0.rc.3 (August 3, 2010)
+
+Features:
+
+  - Deprecate --production flag for --deployment, since the former
+    was causing confusion with the :production group
+  - Add --gemfile option to `bundle check`
+  - Reduce memory usage of `bundle install` by 2-4x
+  - Improve message from `bundle check` under various conditions
+  - Better error when a changed Gemfile conflicts with Gemfile.lock
+
+Bugfixes:
+
+  - Create bin/ directory if it is missing, then install binstubs
+  - Error nicely on the edge case of a pinned gem with no spec
+  - Do not require gems for other platforms
+  - Update git sources along with the gems they contain
+
+## 1.0.0.rc.2 (July 29, 2010)
+
+  - `bundle install path` was causing confusion, so we now print
+    a clarifying warning. The preferred way to install to a path
+    (which will not print the warning) is
+    `bundle install --path path/to/install`.
+  - `bundle install --system` installs to the default system
+    location ($BUNDLE_PATH or $GEM_HOME) even if you previously
+    used `bundle install --path`
+  - completely remove `--disable-shared-gems`. If you install to
+    system, you will not be isolated, while if you install to
+    another path, you will be isolated from gems installed to
+    the system. This was mostly an internal option whose naming
+    and semantics were extremely confusing.
+  - Add a `--production` option to `bundle install`:
+    - by default, installs to `vendor/bundle`. This can be
+      overridden with the `--path` option
+    - uses `--local` if `vendor/cache` is found. This will
+      guarantee that Bundler does not attempt to connect to
+      Rubygems and will use the gems cached in `vendor/cache`
+      instead
+    - Raises an exception if a Gemfile.lock is not found
+    - Raises an exception if you modify your Gemfile in development
+      but do not check in an updated Gemfile.lock
+  - Fixes a bug where switching a source from Rubygems to git
+    would always say "the git source is not checked out" when
+    running `bundle install`
+
+NOTE: We received several reports of "the git source has not
+been checked out. Please run bundle install". As far as we
+can tell, these problems have two possible causes:
+
+1. `bundle install ~/.bundle` in one user, but actually running
+   the application as another user. Never install gems to a
+   directory scoped to a user (`~` or `$HOME`) in deployment.
+2. A bug that happened when changing a gem to a git source.
+
+To mitigate several common causes of `(1)`, please use the
+new `--production` flag. This flag is simply a roll-up of
+the best practices we have been encouraging people to use
+for deployment.
+
+If you want to share gems across deployments, and you use
+Capistrano, symlink release_path/current/vendor/bundle to
+release_path/shared/bundle. This will keep deployments
+snappy while maintaining the benefits of clean, deploy-time
+isolation.
+
+## 1.0.0.rc.1 (July 26, 2010)
+
+  - Fixed a bug with `bundle install` on multiple machines and git
+
+## 1.0.0.beta.10 (July 25, 2010)
+
+  - Last release before 1.0.0.rc.1
+  - Added :mri as a valid platform (platforms :mri { gem "ruby-debug" })
+  - Fix `bundle install` immediately after modifying the :submodule option
+  - Don't write to Gemfile.lock if nothing has changed, fixing situations
+    where bundle install was run with a different user than the app
+    itself
+  - Fix a bug where other platforms were being wiped on `bundle update`
+  - Don't ask for root password on `bundle install` if not needed
+  - Avoid setting `$GEM_HOME` where not needed
+  - First solid pass of `bundle config`
+  - Add build options
+    - `bundle config build.mysql --with-mysql-config=/path/to/config`
+
+## 1.0.0.beta.9 (July 21, 2010)
+
+  - Fix install failure when switching from a path to git source
+  - Fix `bundle exec bundle *` in a bundle with --disable-shared-gems
+  - Fix `bundle *` from inside a bundle with --disable-shared-gem
+  - Shim Gem.refresh. This is used by Unicorn
+  - Fix install failure when a path's dependencies changed
+
+## 1.0.0.beta.8 (July 20, 2010)
+
+  - Fix a Beta 7 bug involving Ruby 1.9
+
+## 1.0.0.beta.7 (July 20, 2010, yanked)
+
+  - Running `bundle install` twice in a row with a git source always crashed
+
+## 1.0.0.beta.6 (July 20, 2010, yanked)
+
+  - Create executables with bundle install --binstubs
+  - You can customize the location (default is app/bin) with --binstubs other/location
+  - Fix a bug where the Gemfile.lock would be deleted even if the update was exited
+  - Fix a bug where cached gems for other platforms were sometimes deleted
+  - Clean up output when nothing was deleted from cache (it previously said
+    "Removing outdated gems ...")
+  - Improve performance of bundle install if the git gem was already checked out,
+    and the revision being used already exists locally
+  - Fix bundle show bundler in some cases
+  - Fix bugs with bundle update
+  - Don't ever run git commands at runtime (fixes a number of common passenger issues)
+  - Fixes an obscure bug where switching the source of a gem could fail to correctly
+    change the source of its dependencies
+  - Support multiple version dependencies in the Gemfile
+    (gem "rails", ">= 3.0.0.beta1", "<= 3.0.0")
+  - Raise an exception for ambiguous uses of multiple declarations of the same gem
+    (for instance, with different versions or sources).
+  - Fix cases where the same dependency appeared several times in the Gemfile.lock
+  - Fix a bug where require errors were being swallowed during Bundler.require
+
+## 1.0.0.beta.1
+
+  - No `bundle lock` command. Locking happens automatically on install or update
+  - No .bundle/environment.rb. Require 'bundler/setup' instead.
+  - $BUNDLE_HOME defaults to $GEM_HOME instead of ~/.bundle
+  - Remove lockfiles generated by 0.9
+
+## 0.9.26
+
+Features:
+
+  - error nicely on incompatible 0.10 lockfiles
+
+## 0.9.25 (May 3, 2010)
+
+Bugfixes:
+
+  - explicitly coerce Pathname objects to Strings for Ruby 1.9
+  - fix some newline weirdness in output from install command
+
+## 0.9.24 (April 22, 2010)
+
+Features:
+
+  - fetch submodules for git sources
+  - limit the bundled version of bundler to the same as the one installing
+  - force relative paths in git gemspecs to avoid raising Gem::NameTooLong
+  - serialize GemCache sources correctly, so locking works
+  - raise Bundler::GemNotFound instead of calling exit! inside library code
+  - Rubygems 1.3.5 compatibility for the adventurous, not supported by me :)
+
+Bugfixes:
+
+  - don't try to regenerate environment.rb if it is read-only
+  - prune outdated gems with the platform "ruby"
+  - prune cache without errors when there are directories or non-gem files
+  - don't re-write environment.rb if running after it has been loaded
+  - do not monkeypatch Specification#load_paths twice when inside a bundle
+
+## 0.9.23 (April 20, 2010)
+
+Bugfixes:
+
+  - cache command no longer prunes gems created by an older rubygems version
+  - cache command no longer prunes gems that are for other platforms
+
+## 0.9.22 (April 20, 2010)
+
+Features:
+
+  - cache command now prunes stale .gem files from vendor/cache
+  - init --gemspec command now generates development dependencies
+  - handle Polyglot's changes to Kernel#require with Bundler::ENV_LOADED (#287)
+  - remove .gem files generated after installing a gem from a :path (#286)
+  - improve install/lock messaging (#284)
+
+Bugfixes:
+
+  - ignore cached gems that are for another platform (#288)
+  - install Windows gems that have no architecture set, like rcov (#277)
+  - exec command while locked now includes the bundler lib in $LOAD_PATH (#293)
+  - fix the `rake install` task
+  - add GemspecError so it can be raised without (further) error (#292)
+  - create a parent directory before cloning for git 1.5 compatibility (#285)
+
+## 0.9.21 (April 16, 2010)
+
+Bugfixes:
+
+  - don't raise 'omg wtf' when lockfile is outdated
+
+## 0.9.20 (April 15, 2010)
+
+Features:
+
+  - load YAML format gemspecs
+  - no backtraces when calling Bundler.setup if gems are missing
+  - no backtraces when trying to exec a file without the executable bit
+
+Bugfixes:
+
+  - fix infinite recursion in Bundler.setup after loading a bundled Bundler gem
+  - request install instead of lock when env.rb is out of sync with Gemfile.lock
+
+## 0.9.19 (April 12, 2010)
+
+Features:
+
+  - suggest `bundle install --relock` when the Gemfile has changed (#272)
+  - source support for Rubygems servers without prerelease gem indexes (#262)
+
+Bugfixes:
+
+  - don't set up all groups every time Bundler.setup is called while locked (#263)
+  - fix #full_gem_path for git gems while locked (#268)
+  - eval gemspecs at the top level, not inside the Bundler class (#269)
+
+
+## 0.9.18 (April 8, 2010)
+
+Features:
+
+  - console command that runs irb with bundle (and optional group) already loaded
+
+Bugfixes:
+
+  - Bundler.setup now fully disables system gems, even when unlocked (#266, #246)
+    - fixes Yard, which found plugins in Gem.source_index that it could not load
+    - makes behaviour of `Bundler.require` consistent between locked and unlocked loads
+
+## 0.9.17 (April 7, 2010)
+
+Features:
+
+  - Bundler.require now calls Bundler.setup automatically
+  - Gem::Specification#add_bundler_dependencies added for gemspecs
+
+Bugfixes:
+
+  - Gem paths are not longer duplicated while loading bundler
+  - exec no longer duplicates RUBYOPT if it is already set correctly
+
+## 0.9.16 (April 3, 2010)
+
+Features:
+
+  - exit gracefully on INT signal
+  - resolver output now indicates whether remote sources were checked
+  - print error instead of backtrace when exec cannot find a binary (#241)
+
+Bugfixes:
+
+  - show, check, and open commands work again while locked (oops)
+  - show command for git gems
+    - outputs branch names other than master
+    - gets the correct sha from the checkout
+    - doesn't print sha twice if :ref is set
+  - report errors from bundler/setup.rb without backtraces (#243)
+  - fix Gem::Spec#git_version to not error on unloaded specs
+  - improve deprecation, Gemfile, and command error messages (#242)
+
+## 0.9.15 (April 1, 2010)
+
+Features:
+
+  - use the env_file if possible instead of doing a runtime resolve
+     - huge speedup when calling Bundler.setup while locked
+     - ensures bundle exec is fast while locked
+     - regenerates env_file if it was generated by an older version
+  - update cached/packed gems when you update gems via bundle install
+
+Bugfixes:
+
+  - prep for Rubygems 1.3.7 changes
+  - install command now pulls git branches correctly (#211)
+  - raise errors on invalid options in the Gemfile
+
+## 0.9.14 (March 30, 2010)
+
+Features:
+
+  - install command output vastly improved
+    - installation message now accurate, with 'using' and 'installing'
+    - bundler gems no longer listed as 'system gems'
+  - show command output now includes sha and branch name for git gems
+  - init command now takes --gemspec option for bootstrapping gem Gemfiles
+  - Bundler.with_clean_env for shelling out to ruby scripts
+  - show command now aliased as 'list'
+  - VISUAL env var respected for GUI editors
+
+Bugfixes:
+
+  - exec command now finds binaries from gems with no gemspec
+  - note source of Gemfile resolver errors
+  - don't blow up if git urls are changed
+
+## 0.9.13 (March 23, 2010)
+
+Bugfixes:
+
+  - exec command now finds binaries from gems installed via :path
+  - gem dependencies are pulled in even if their type is nil
+  - paths with spaces have double-quotes to work on Windows
+  - set GEM_PATH in environment.rb so generators work with Rails 2
+
+## 0.9.12 (March 17, 2010)
+
+  - refactoring, internal cleanup, more solid specs
+
+Features:
+
+  - check command takes a --without option
+  - check command exits 1 if the check fails
+
+Bugfixes:
+
+  - perform a topological sort on resolved gems (#191)
+  - gems from git work even when paths or repos have spaces (#196)
+  - Specification#loaded_from returns a String, like Gem::Specification (#197)
+  - specs eval from inside the gem directory, even when locked
+  - virtual gemspecs are now saved in environment.rb for use when loading
+  - unify the Installer's local index and the runtime index (#204)
+
+## 0.9.11 (March 9, 2010)
+
+  - added roadmap with future development plans
+
+Features:
+
+  - install command can take the path to the gemfile with --gemfile (#125)
+  - unknown command line options are now rejected (#163)
+  - exec command hugely sped up while locked (#177)
+  - show command prints the install path if you pass it a gem name (#148)
+  - open command edits an installed gem with $EDITOR (#148)
+  - Gemfile allows assigning an array of groups to a gem (#114)
+  - Gemfile allows :tag option on :git sources
+  - improve backtraces when a gemspec is invalid
+  - improve performance by installing gems from the cache if present
+
+Bugfixes:
+
+  - normalize parameters to Bundler.require (#153)
+  - check now checks installed gems rather than cached gems (#162)
+  - don't update the gem index when installing after locking (#169)
+  - bundle parenthesises arguments for 1.8.6 (#179)
+  - gems can now be assigned to multiple groups without problems (#135)
+  - fix the warning when building extensions for a gem from git with Rubygems 1.3.6
+  - fix a Dependency.to_yaml error due to accidentally including sources and groups
+  - don't reinstall packed gems
+  - fix gems with git sources that are private repositories
+
+## 0.9.10 (March 1, 2010)
+
+  - depends on Rubygems 1.3.6
+
+Bugfixes:
+
+  - support locking after install --without
+  - don't reinstall gems from the cache if they're already in the bundle
+  - fixes for Ruby 1.8.7 and 1.9
+
+## 0.9.9 (February 25, 2010)
+
+Bugfixes:
+
+  - don't die if GEM_HOME is an empty string
+  - fixes for Ruby 1.8.6 and 1.9
+
+## 0.9.8 (February 23, 2010)
+
+Features:
+
+  - pack command which both caches and locks
+  - descriptive error if a cached gem is missing
+  - remember the --without option after installing
+  - expand paths given in the Gemfile via the :path option
+  - add block syntax to the git and group options in the Gemfile
+  - support gems with extensions that don't admit they depend on rake
+  - generate gems using gem build gemspec so git gems can have native extensions
+  - print a useful warning if building a gem fails
+  - allow manual configuration via BUNDLE_PATH
+
+Bugfixes:
+
+  - eval gemspecs in the gem directory so relative paths work
+  - make default spec for git sources valid
+  - don't reinstall gems that are already packed
+
+## 0.9.7 (February 17, 2010)
+
+Bugfixes:
+
+  - don't say that a gem from an excluded group is "installing"
+  - improve crippling rubygems in locked scenarios
+
+## 0.9.6 (February 16, 2010)
+
+Features:
+
+  - allow String group names
+  - a number of improvements in the documentation and error messages
+
+Bugfixes:
+
+  - set SourceIndex#spec_dirs to solve a problem involving Rails 2.3 in unlocked mode
+  - ensure Rubygems is fully loaded in Ruby 1.9 before patching it
+  - fix `bundle install` for a locked app without a .bundle directory
+  - require gems in the order that the resolver determines
+  - make the tests platform agnostic so we can confirm that they're green on JRuby
+  - fixes for Ruby 1.9
+
+## 0.9.5 (Feburary 12, 2010)
+
+Features:
+
+  - added support for :path => "relative/path"
+  - added support for older versions of git
+  - added `bundle install --disable-shared-gems`
+  - Bundler.require fails silently if a library does not have a file on the load path with its name
+  - Basic support for multiple rubies by namespacing the default bundle path using the version and engine
+
+Bugfixes:
+
+  - if the bundle is locked and .bundle/environment.rb is not present when Bundler.setup is called, generate it
+  - same if it's not present with `bundle check`
+  - same if it's not present with `bundle install`
diff --git a/misc/lib/bundler-1.3.5/CONTRIBUTE.md b/misc/lib/bundler-1.3.5/CONTRIBUTE.md
new file mode 100644
index 0000000..a12d541
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/CONTRIBUTE.md
@@ -0,0 +1,96 @@
+Great to have you here! Here are a few ways you can help out with [Bundler](http://github.com/carlhuda/bundler).
+
+# Learn & listen
+
+You can start learning about Bundler by reading [the documentation](http://gembundler.com). If you want, you can also read a (lengthy) explanation of [why Bundler exists and what it does](http://gembundler.com/v1.2/rationale.html). You can also check out discussions about Bundler on the [Bundler mailing list](https://groups.google.com/group/ruby-bundler) and in the [Bundler IRC channel](irc://irc.freenode.net/#bundler), which is #bundler on Freenode.
+
+## Core Team
+
+The Bundler core team consists of André Arko ([@indirect](http://github.com/indirect)), Terence Lee ([@hone](http://github.com/hone)), and Jessica Lynn Suttles ([@jlsuttles](http://github.com/jlsuttles)), with support and advice from original Bundler author Yehuda Katz ([@wycats](http://github.com/wycats)).
+
+# Adding new features
+
+When adding a new feature to Bundler, please follow these steps:
+
+  1. [Create an issue](https://github.com/carlhuda/bundler/issues/new) to discuss your feature.
+  2. Base your commits on the master branch, since we follow [SemVer](http://semver.org) and don't add new features to old releases.
+  3. Commit the code and at least one test covering your changes to a feature branch in your fork.
+  4. Put a line in the [CHANGELOG](https://github.com/carlhuda/bundler/blob/master/CHANGELOG.md) summarizing your changes under the next release under the "Features" heading.
+  5. Send us a [pull request](https://help.github.com/articles/using-pull-requests) from your feature branch.
+
+If you don't hear back immediately, don’t get discouraged! We all have day jobs, but we respond to most tickets within a day or two.
+
+# Bug triage
+
+Triage is the work of processing tickets that have been opened into actionable issues, feature requests, or bug reports. That includes verifying bugs, categorizing the ticket, and ensuring there's enough information to reproduce the bug for anyone who wants to try to fix it.
+
+We've created an [issues guide](https://github.com/carlhuda/bundler/blob/master/ISSUES.md) to walk Bundler users through the process of troubleshooting issues and reporting bugs.
+
+If you'd like to help, awesome! You can [report a new bug](https://github.com/carlhuda/bundler/issues/new) or browse our [existing open tickets](https://github.com/carlhuda/bundler/issues).
+
+Not every ticket will point to a bug in Bundler's code, but open tickets usually mean that there is something we could improve to help that user. Sometimes that means writing additional documentation, sometimes that means making error messages clearer, and sometimes that means explaining to a user that they need to install git to use git gems.
+
+When you're looking at a ticket, here are the main questions to ask:
+
+  * Can I reproduce this bug myself?
+  * Are the steps to reproduce clearly stated in the ticket?
+  * Which versions of Bundler (1.1.x, 1.2.x, git, etc.) manifest this bug?
+  * Which operating systems (OS X, Windows, Ubuntu, CentOS, etc.) manifest this bug?
+  * Which rubies (MRI, JRuby, Rubinius, etc.) and which versions (1.8.7, 1.9.3, etc.) have this bug?
+
+If you can't reproduce an issue, chances are good that the bug has been fixed (hurrah!). That's a good time to post to the ticket explaining what you did and how it worked.
+
+If you can reproduce an issue, you're well on your way to fixing it. :) Fixing issues is similar to adding new features:
+
+  1. Discuss the fix on the existing issue. Coordinating with everyone else saves duplicate work and serves as a great way to get suggestions and ideas if you need any.
+  2. Base your commits on the correct branch. Bugfixes for 1.x versions of Bundler should be based on the matching 1-x-stable branch.
+  3. Commit the code and at least one test covering your changes to a named branch in your fork.
+  4. Put a line in the [CHANGELOG](https://github.com/carlhuda/bundler/blob/master/CHANGELOG.md) summarizing your changes under the next release under the “Bugfixes” heading.
+  5. Send us a [pull request](https://help.github.com/articles/using-pull-requests) from your bugfix branch.
+
+Finally, the ticket may be a duplicate of another older ticket. If you notice a ticket is a duplicate, simply comment on the ticket noting the original ticket’s number. For example, you could say “This is a duplicate of issue #42, and can be closed”.
+
+
+# Beta testing
+
+Early releases require heavy testing, especially across various system setups. We :heart: testers, and are big fans of anyone who can run `gem install bundler --pre` and try out upcoming releases in their development and staging environments.
+
+As of September 3 2012, there is no current prerelease or beta version of Bundler. That said, you are always welcome to try checking out master and building a gem yourself if you want to try out the latest changes.
+
+
+# Translations
+
+We don't currently have any translations, but please reach out to us if you would like to help get this going.
+
+
+# Documentation
+
+Code needs explanation, and sometimes those who know the code well have trouble explaining it to someone just getting into it. Because of that, we welcome documentation suggestions and patches from everyone, especially if they are brand new to using Bundler.
+
+Bundler has two main sources of documentation: the built-in help (including usage information and man pages) and the [Bundler documentation site](http://gembundler.com).
+
+If you’d like to submit a patch to the man pages, follow the steps for adding a feature above. All of the man pages are located in the `man` directory. Just use the “Documentation” heading when you describe what you did in the changelog.
+
+If you have a suggestion or proposed change for [gembundler.com](http://gembundler.com), please open an issue or send a pull request to the [bundler-site-middleman](https://github.com/bundler/bundler-site-middleman) repository.
+
+
+# Community
+
+Community is an important part of all we do. If you’d like to be part of the Bundler community, you can jump right in and start helping make Bundler better for everyone who uses it.
+
+It would be tremendously helpful to have more people answering questions about Bundler (and often simply about Rubygems or Ruby itself) in our [issue tracker](https://github.com/carlhuda/bundler/issues) or on [Stack Overflow](http://stackoverflow.com/questions/tagged/bundler).
+
+Additional documentation and explanation is always helpful, too. If you have any suggestions for the Bundler website [gembundler.com](http://www.gembundler.com), we would absolutely love it if you opened an issue or pull request on the [bundler-site-middleman](https://github.com/bundler/bundler-site-middleman) repository.
+
+Finally, sharing your experiences and discoveries by writing them up is a valuable way to help others who have similar problems or experiences in the future. You can write a blog post, create an example and commit it to Github, take screenshots, or make videos.
+
+Examples of how Bundler is used help everyone, and we’ve discovered that people already use it in ways that we never imagined when we were writing it. If you’re still not sure what to write about, there are also several projects doing interesting things based on Bundler. They could probably use publicity too.
+
+If you let someone on the core team know you wrote about Bundler, we will add your post to the list of Bundler resources on the Github project wiki.
+
+
+# Your first bugfix
+
+If you’re interested in contributing to Bundler, that’s awesome! We’d love your help.
+
+If you have any questions after reading this page, please feel free to contact either [@indirect](http://github.com/indirect) or [@hone](http://github.com/hone). They are both happy to provide help working through your first bugfix or thinking through the problem you’re trying to resolve.
diff --git a/misc/lib/bundler-1.3.5/CONTRIBUTING.md b/misc/lib/bundler-1.3.5/CONTRIBUTING.md
new file mode 100644
index 0000000..759b2de
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/CONTRIBUTING.md
@@ -0,0 +1,13 @@
+# Creating Issues
+
+If you're having a problem, please see [ISSUES](https://github.com/carlhuda/bundler/blob/master/ISSUES.md) for troubleshooting steps and a guide for how to submit a ticket that will help us solve the problem you are having as quickly as possible.
+
+# Discussing Bundler
+
+If you'd like to discuss features, ask questions, or just engage in general Bundler-focused discussion, please see the [#bundler](irc://irc.freenode.net/#bundler) IRC channel on Freenode, and the [Bundler mailing list](http://groups.google.com/group/ruby-bundler) on Google Groups.
+
+# Helping Out
+
+If you'd like to help make Bundler better, you totally rock! Please check out the [CONTRIBUTE](https://github.com/carlhuda/bundler/blob/master/CONTRIBUTE.md) file for an introduction to the project, guidelines for contributing, and suggestions for things anyone can do that would be helpful.
+
+Thanks for helping us make Bundler better.
diff --git a/misc/lib/bundler-1.3.5/ISSUES.md b/misc/lib/bundler-1.3.5/ISSUES.md
new file mode 100644
index 0000000..f1b297a
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/ISSUES.md
@@ -0,0 +1,83 @@
+# Bundler Issues
+
+So! You're having problems with Bundler. This file is here to help. If you're running into an error, try reading the rest of this file for help. If you can't figure out how to solve your problem, there are also instructions on how to report a bug.
+
+## Documentation
+
+Instructions for common Bundler uses can be found on the [Bundler documentation site](http://gembundler.com/).
+
+Detailed information about each Bundler command, including help with common problems, can be found in the [Bundler man pages](http://gembundler.com/man/bundle.1.html).
+
+## Troubleshooting
+
+### Heroku errors
+
+Please open a ticket with Heroku if you're having trouble deploying. They have a professional support team who can help you resolve Heroku issues far better than the Bundler team can. If the problem that you are having turns out to be a bug in Bundler itself, Heroku support can get the exact details to us.
+
+### Other problems
+
+First, figure out exactly what it is that you're trying to do. Then, go to the [Bundler documentation website](http://gembundler.com) and see if we have instructions on how to do that.
+
+Second, check [the compatibility
+list](http://gembundler.com/compatibility.html), and make sure that the version of Bundler that you are
+using works with the versions of Ruby and Rubygems that you are using.
+
+If the instructions don't work, or you can't find any instructions, you can try these troubleshooting steps:
+
+    # remove user-specific gems and git repos
+    rm -rf ~/.bundle/ ~/.gem/bundler/ ~/.gems/cache/bundler/
+
+    # remove system-wide git repos and git checkouts
+    rm -rf $GEM_HOME/bundler/ $GEM_HOME/cache/bundler/
+
+    # remove project-specific settings
+    rm -rf .bundle/
+
+    # remove project-specific cached gems and repos
+    rm -rf vendor/cache/
+
+    # remove the saved resolve of the Gemfile
+    rm -rf Gemfile.lock
+
+    # uninstall the rubygems-bundler and open_gem gems
+    rvm gemset use global # if using rvm
+    gem uninstall rubygems-bundler open_gem
+
+    # try to install one more time
+    bundle install
+
+## Reporting unresolved problems
+
+Hopefully the troubleshooting steps above resolved your problem. If things still aren't working the way you expect them to, please let us know so that we can diagnose and hopefully fix the problem you're having. When you report a problem, please include the following information:
+
+  - What you're trying to accomplish
+  - The command you ran
+  - What you expected to happen
+  - What actually happened
+  - The exception backtrace(s), if any
+  - Everything output by running `bundle env`
+
+If your version of Bundler does not have the `bundle env` command, then please include:
+
+  - Your Gemfile
+  - Your Gemfile.lock
+  - Your Bundler configuration settings (run `bundle config`)
+  - What version of bundler you are using (run `bundle -v`)
+  - What version of Ruby you are using (run `ruby -v`)
+  - What version of Rubygems you are using (run `gem -v`)
+  - Whether you are using RVM, and if so what version (run `rvm -v`)
+  - Whether you have the `rubygems-bundler` gem, which can break gem executables (run `gem list rubygems-bundler`)
+  - Whether you have the `open_gem` gem, which can cause rake activation conflicts (run `gem list open_gem`)
+
+If you are using Rails 2.3, please also include:
+
+  - Your boot.rb file
+  - Your preinitializer.rb file
+  - Your environment.rb file
+
+
+If you have either `rubygems-bundler` or `open_gem` installed, please try removing them and then following the troublshooting steps above before opening a new ticket.
+
+[Create a gist](https://gist.github.com) containing all of that information, then visit the [Bundler issue tracker](https://github.com/carlhuda/bundler/issues) and [create a ticket](https://github.com/carlhuda/bundler/issues/new) describing your problem and linking to your gist.
+
+Thanks for reporting issues and helping make Bundler better!
diff --git a/misc/lib/bundler-1.3.5/LICENSE.md b/misc/lib/bundler-1.3.5/LICENSE.md
new file mode 100644
index 0000000..5e89f93
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/LICENSE.md
@@ -0,0 +1,23 @@
+Portions copyright (c) 2010 Andre Arko
+Portions copyright (c) 2009 Engine Yard
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/misc/lib/bundler-1.3.5/README.md b/misc/lib/bundler-1.3.5/README.md
new file mode 100644
index 0000000..70e5271
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/README.md
@@ -0,0 +1,35 @@
+# Bundler: a gem to bundle gems [![Build Status](https://secure.travis-ci.org/carlhuda/bundler.png?branch=1-3-stable)](http://travis-ci.org/carlhuda/bundler)
+
+Bundler keeps ruby applications running the same code on every machine.
+
+It does this by managing the gems that the application depends on. Given a list of gems, it can automatically download and install those gems, as well as any other gems needed by the gems that are listed. Before installing gems, it checks the versions of every gem to make sure that they are compatible, and can all be loaded at the same time. After the gems have been installed, Bundler can help you update some or all of them when new versions become available. Finally, it records the exac [...]
+
+### Installation and usage
+
+```
+gem install bundler
+bundle init
+echo "gem 'rails'" >> Gemfile
+bundle install
+bundle exec rails new myapp
+```
+
+See [gembundler.com](http://gembundler.com) for the full documentation.
+
+### Troubleshooting
+
+For help with common problems, see [ISSUES](https://github.com/carlhuda/bundler/blob/master/ISSUES.md).
+
+### Contributing
+
+If you'd like to contribute to Bundler, that's awesome, and we <3 you. There's a guide to contributing to Bundler (both code and general help) over in [CONTRIBUTE](https://github.com/carlhuda/bundler/blob/master/CONTRIBUTE.md)
+
+### Development
+
+To see what has changed in recent versions of Bundler, see the [CHANGELOG](https://github.com/carlhuda/bundler/blob/master/CHANGELOG.md).
+
+The `master` branch contains our current progress towards version 1.3. Versions 1.0 to 1.2 each have their own stable branches. Please submit bugfixes as pull requests to the stable branch for the version you would like to fix.
+
+### Other questions
+
+Feel free to chat with the Bundler core team (and many other users) on IRC in the  [#bundler](irc://irc.freenode.net/bundler) channel on Freenode, or via email on the [Bundler mailing list](http://groups.google.com/group/ruby-bundler).
diff --git a/misc/lib/bundler-1.3.5/Rakefile b/misc/lib/bundler-1.3.5/Rakefile
new file mode 100644
index 0000000..232988c
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/Rakefile
@@ -0,0 +1,236 @@
+# -*- encoding: utf-8 -*-
+$:.unshift File.expand_path("../lib", __FILE__)
+require 'bundler/gem_tasks'
+require 'rubygems'
+require 'shellwords'
+require 'benchmark'
+
+def safe_task(&block)
+  yield
+  true
+rescue
+  false
+end
+
+# Benchmark task execution
+module Rake
+  class Task
+    alias_method :real_invoke, :invoke
+
+    def invoke(*args)
+      time = Benchmark.measure(@name) do
+        real_invoke(*args)
+      end
+      puts "#{@name} ran for #{time}"
+    end
+  end
+end
+
+namespace :spec do
+  desc "Ensure spec dependencies are installed"
+  task :deps do
+    {"rdiscount" => "~> 1.6", "ronn" => "~> 0.7.3", "rspec" => "~> 2.13"}.each do |name, version|
+      sh "#{Gem.ruby} -S gem list #{name} -v '#{version}' | grep '#{name}' -q || " \
+         "#{Gem.ruby} -S gem install #{name} -v '#{version}' --no-ri --no-rdoc"
+    end
+  end
+
+  namespace :travis do
+    task :deps do
+      # Give the travis user a name so that git won't fatally error
+      system("sudo sed -i 's/1000::/1000:Travis:/g' /etc/passwd")
+      # Strip secure_path so that RVM paths transmit through sudo -E
+      system("sudo sed -i '/secure_path/d' /etc/sudoers")
+      # Install groff for the ronn gem
+      system("sudo apt-get install groff -y")
+      # Install the other gem deps, etc.
+      Rake::Task["spec:deps"].invoke
+    end
+  end
+end
+
+begin
+  # running the specs needs both rspec and ronn
+  require 'rspec/core/rake_task'
+  require 'ronn'
+
+  desc "Run specs"
+  RSpec::Core::RakeTask.new do |t|
+    t.rspec_opts = %w(-fs --color)
+    t.ruby_opts  = %w(-w)
+  end
+  task :spec => "man:build"
+
+  namespace :spec do
+    task :clean do
+      rm_rf 'tmp'
+    end
+
+    desc "Run the real-world spec suite (requires internet)"
+    task :realworld => ["set_realworld", "spec"]
+
+    task :set_realworld do
+      ENV['BUNDLER_REALWORLD_TESTS'] = '1'
+    end
+
+    desc "Run the spec suite with the sudo tests"
+    task :sudo => ["set_sudo", "spec", "clean_sudo"]
+
+    task :set_sudo do
+      ENV['BUNDLER_SUDO_TESTS'] = '1'
+    end
+
+    task :clean_sudo do
+      puts "Cleaning up sudo test files..."
+      system "sudo rm -rf #{File.expand_path('../tmp/sudo_gem_home', __FILE__)}"
+    end
+
+    namespace :rubygems do
+      # Rubygems specs by version
+      rubyopt = ENV["RUBYOPT"]
+      %w(master v1.3.6 v1.3.7 v1.4.2 v1.5.3 v1.6.2 v1.7.2 v1.8.25 v2.0.2).each do |rg|
+        desc "Run specs with Rubygems #{rg}"
+        RSpec::Core::RakeTask.new(rg) do |t|
+          t.rspec_opts = %w(-fs --color)
+          t.ruby_opts  = %w(-w)
+        end
+
+        # Create tasks like spec:rubygems:v1.8.3:sudo to run the sudo specs
+        namespace rg do
+          task :sudo => ["set_sudo", rg, "clean_sudo"]
+          task :realworld => ["set_realworld", rg]
+        end
+
+        task "clone_rubygems_#{rg}" do
+          unless File.directory?("tmp/rubygems")
+            system("git clone git://github.com/rubygems/rubygems.git tmp/rubygems")
+          end
+          hash = nil
+
+          Dir.chdir("tmp/rubygems") do
+            system("git remote update")
+            if rg == "master"
+              system("git checkout origin/master")
+            else
+              system("git checkout #{rg}")
+            end
+            hash = `git rev-parse HEAD`.chomp
+          end
+
+          puts "Checked out rubygems '#{rg}' at #{hash}"
+          ENV["RUBYOPT"] = "-I#{File.expand_path("tmp/rubygems/lib")} #{rubyopt}"
+          puts "RUBYOPT=#{ENV['RUBYOPT']}"
+        end
+
+        task rg => ["clone_rubygems_#{rg}", "man:build"]
+        task "rubygems:all" => rg
+      end
+
+      desc "Run specs under a Rubygems checkout (set RG=path)"
+      RSpec::Core::RakeTask.new("co") do |t|
+        t.rspec_opts = %w(-fs --color)
+        t.ruby_opts  = %w(-w)
+      end
+
+      task "setup_co" do
+        ENV["RUBYOPT"] = "-I#{File.expand_path ENV['RG']} #{rubyopt}"
+      end
+
+      task "co" => "setup_co"
+      task "rubygems:all" => "co"
+    end
+
+    desc "Run the tests on Travis CI against a rubygem version (using ENV['RGV'])"
+    task :travis do
+      rg = ENV['RGV'] || 'v1.8.24'
+
+      puts "\n\e[1;33m[Travis CI] Running bundler specs against rubygems #{rg}\e[m\n\n"
+      specs = safe_task { Rake::Task["spec:rubygems:#{rg}"].invoke }
+
+      Rake::Task["spec:rubygems:#{rg}"].reenable
+
+      puts "\n\e[1;33m[Travis CI] Running bundler sudo specs against rubygems #{rg}\e[m\n\n"
+      sudos = system("sudo -E rake spec:rubygems:#{rg}:sudo")
+      # clean up by chowning the newly root-owned tmp directory back to the travis user
+      system("sudo chown -R #{ENV['USER']} #{File.join(File.dirname(__FILE__), 'tmp')}")
+
+      Rake::Task["spec:rubygems:#{rg}"].reenable
+
+      puts "\n\e[1;33m[Travis CI] Running bundler real world specs against rubygems #{rg}\e[m\n\n"
+      realworld = safe_task { Rake::Task["spec:rubygems:#{rg}:realworld"].invoke }
+
+      {"specs" => specs, "sudo" => sudos, "realworld" => realworld}.each do |name, passed|
+        if passed
+          puts "\e[0;32m[Travis CI] #{name} passed\e[m"
+        else
+          puts "\e[0;31m[Travis CI] #{name} failed\e[m"
+        end
+      end
+
+      unless specs && sudos && realworld
+        fail "Spec run failed, please review the log for more information"
+      end
+    end
+  end
+
+rescue LoadError
+  task :spec do
+    abort "Run `rake spec:deps` to be able to run the specs"
+  end
+end
+
+begin
+  require 'ronn'
+
+  namespace :man do
+    directory "lib/bundler/man"
+
+    Dir["man/*.ronn"].each do |ronn|
+      basename = File.basename(ronn, ".ronn")
+      roff = "lib/bundler/man/#{basename}"
+
+      file roff => ["lib/bundler/man", ronn] do
+        sh "#{Gem.ruby} -S ronn --roff --pipe #{ronn} > #{roff}"
+      end
+
+      file "#{roff}.txt" => roff do
+        sh "groff -Wall -mtty-char -mandoc -Tascii #{roff} | col -b > #{roff}.txt"
+      end
+
+      task :build_all_pages => "#{roff}.txt"
+    end
+
+    desc "Build the man pages"
+    task :build => "man:build_all_pages"
+
+    desc "Clean up from the built man pages"
+    task :clean do
+      rm_rf "lib/bundler/man"
+    end
+  end
+
+rescue LoadError
+  namespace :man do
+    task(:build) { abort "Install the ronn gem to be able to release!" }
+    task(:clean) { abort "Install the ronn gem to be able to release!" }
+  end
+end
+
+task :build => ["man:clean", "man:build"]
+task :release => ["man:clean", "man:build"]
+
+namespace :vendor do
+  desc "Build the vendor dir"
+  task :build => :clean do
+    sh "git clone git://github.com/wycats/thor.git lib/bundler/vendor/tmp"
+    sh "mv lib/bundler/vendor/tmp/lib/* lib/bundler/vendor/"
+    rm_rf "lib/bundler/vendor/tmp"
+  end
+
+  desc "Clean the vendor dir"
+  task :clean do
+    rm_rf "lib/bundler/vendor"
+  end
+end
+
+task :default => :spec
diff --git a/misc/lib/bundler-1.3.5/UPGRADING.md b/misc/lib/bundler-1.3.5/UPGRADING.md
new file mode 100644
index 0000000..3cce388
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/UPGRADING.md
@@ -0,0 +1,103 @@
+## Bundler 0.9 to 1.0 and above
+
+Upgrading from Bundler 0.9 to 1.0 is relatively painless. The
+Gemfile API is the same, so your old Gemfiles should continue
+to work.
+
+The "env" file that 0.9 created at `.bundle/environment.rb` has been
+removed. As a side effect of this, Passenger will only find your
+bundled gems if you install with `bundle install --deployment`.
+Alternatively, you can tell Passenger where you gems are installed,
+[something like this](http://andre.arko.net/2010/08/16/using-passengerpane-with-gem_home-set/).
+
+The `bundle lock` command is no longer needed, as the
+Gemfile.lock file is now automatically generated by `bundle install`.
+If you have not yet done so, add your Gemfile.lock to source control
+and check it in.
+
+Running `bundle install` no longer updates the versions of your gems.
+If you need to update just one gem, run `bundle update GEMNAME`. To
+update all gems to the newest versions possible, run `bundle update`.
+
+Bundler now supports multiple platforms, using a block syntax to
+declare platform-specific gems:
+
+    platform :jruby do
+      gem "jruby-maven-plugins"
+    end
+
+Deploying using Bundler is even easier than it was before, as Bundler
+now includes a Capistrano recipe. Simply add this line to the top of
+your deploy.rb file to run Bundler automatically as part of deploying:
+
+    require 'bundler/capistrano'
+
+For more details on deploying using bundler, see the documentation
+for the bundler cap task, and the [documentation on deploying](http://gembundler.com/deploying.html).
+
+
+## Bundler 0.8 to 0.9 and above
+
+Upgrading to Bundler 0.9 from Bundler 0.8 requires upgrading several
+API calls in your Gemfile, and some workarounds if you are using Rails 2.3.
+
+### Gemfile Removals
+
+Bundler 0.9 removes the following Bundler 0.8 Gemfile APIs:
+
+1. `disable_system_gems`: This is now the default (and only) option
+   for bundler. Bundler uses the system gems you have specified
+   in the Gemfile, and only the system gems you have specified
+   (and their dependencies)
+2. `disable_rubygems`: This is no longer supported. We are looking
+   into ways to get the fastest performance out of each supported
+   scenario, and we will make speed the default where possible.
+3. `clear_sources`: Bundler now defaults to an empty source
+   list. If you want to include Rubygems, you can add the source
+   via source "http://gemcutter.org". If you use bundle init, this
+   source will be automatically added for you in the generated
+   Gemfile
+4. `bundle_path`: You can specify this setting when installing
+   via `bundle install /path/to/bundle`. Bundler will remember
+   where you installed the dependencies to on a particular
+   machine for future installs, loads, setups, etc.
+5. `bin_path`: Bundler no longer generates executables in the root
+   of your app. You should use `bundle exec` to execute executables
+   in the current context.
+
+### Gemfile Changes
+
+Bundler 0.9 changes the following Bundler 0.8 Gemfile APIs:
+
+1. Bundler 0.8 supported :only and :except as APIs for describing
+   groups of gems. Bundler 0.9 supports a single `group` method,
+   which you can use to group gems together. See the above "Group"
+   section for more information.
+
+   This means that `gem "foo", :only => :production` becomes
+   `gem "foo", :group => :production`, and
+   `only :production { gem "foo" }` becomes
+   `group :production { gem "foo" }`
+
+   The short version is: group your gems together logically, and
+   use the available commands to make use of the groups you've
+   created.
+
+2. `:require_as` becomes `:require`
+
+3. `:vendored_at` is fully removed; you should use `:path`
+
+### API Changes
+
+1. `Bundler.require_env(:environment)` becomes
+   `Bundler.require(:multiple, :groups)`. You must
+   now specify the default group (the default group is the
+   group made up of the gems not assigned to any group)
+   explicitly. So `Bundler.require_env(:test)` becomes
+   `Bundler.require(:default, :test)`
+
+2. `require 'vendor/gems/environment'`: In unlocked
+   mode, where using system gems, this becomes
+   `Bundler.setup(:multiple, :groups)`. If you don't
+   specify any groups, this puts all groups on the load
+   path. In locked mode, it becomes `require '.bundle/environment'`
diff --git a/misc/lib/bundler-1.3.5/bin/bundle b/misc/lib/bundler-1.3.5/bin/bundle
new file mode 100755
index 0000000..d2c6204
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/bin/bundle
@@ -0,0 +1,20 @@
+#!/usr/bin/env ruby
+
+# Trap interrupts to quit cleanly. See
+# https://twitter.com/mitchellh/status/283014103189053442
+Signal.trap("INT") { exit 1 }
+
+require 'bundler'
+# Check if an older version of bundler is installed
+$:.each do |path|
+  if path =~ %r'/bundler-0.(\d+)' && $1.to_i < 9
+    err = "Looks like you have a version of bundler that's older than 0.9.\n"
+    err << "Please remove your old versions.\n"
+    err << "An easy way to do this is by running `gem cleanup bundler`."
+    abort(err)
+  end
+end
+
+require 'bundler/cli'
+require 'bundler/friendly_errors'
+Bundler.with_friendly_errors { Bundler::CLI.start }
diff --git a/misc/lib/bundler-1.3.5/bin/bundle_ruby b/misc/lib/bundler-1.3.5/bin/bundle_ruby
new file mode 100755
index 0000000..1e02c57
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/bin/bundle_ruby
@@ -0,0 +1,56 @@
+#!/usr/bin/env ruby
+
+Signal.trap("INT") { exit 1 }
+
+require 'bundler/ruby_version'
+require 'bundler/ruby_dsl'
+require 'bundler/shared_helpers'
+
+module Bundler
+  class GemfileError < RuntimeError; end
+  class Dsl
+    include RubyDsl
+
+    attr_accessor :ruby_version
+
+    def initialize
+      @ruby_version = nil
+    end
+
+    def eval_gemfile(gemfile, contents = nil)
+      contents ||= File.open(gemfile, "rb") { |f| f.read }
+      instance_eval(contents, gemfile.to_s, 1)
+    rescue SyntaxError => e
+      bt = e.message.split("\n")[1..-1]
+      raise GemfileError, ["Gemfile syntax error:", *bt].join("\n")
+    rescue ScriptError, RegexpError, NameError, ArgumentError => e
+      e.backtrace[0] = "#{e.backtrace[0]}: #{e.message} (#{e.class})"
+      STDERR.puts e.backtrace.join("\n       ")
+      raise GemfileError, "There was an error in your Gemfile," \
+        " and Bundler cannot continue."
+    end
+
+    def source(source, options = {})
+    end
+
+    def gem(name, *args)
+    end
+
+    def group(*args, &blk)
+    end
+  end
+end
+
+dsl = Bundler::Dsl.new
+begin
+  dsl.eval_gemfile(Bundler::SharedHelpers.default_gemfile)
+  ruby_version = dsl.ruby_version
+  if ruby_version
+    puts ruby_version
+  else
+    puts "No ruby version specified"
+  end
+rescue Bundler::GemfileError => e
+  puts e.message
+  exit(-1)
+end
diff --git a/misc/lib/bundler-1.3.5/bundler.gemspec b/misc/lib/bundler-1.3.5/bundler.gemspec
new file mode 100644
index 0000000..fda1c74
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/bundler.gemspec
@@ -0,0 +1,28 @@
+# coding: utf-8
+lib = File.expand_path('../lib/', __FILE__)
+$:.unshift lib unless $:.include?(lib)
+require 'bundler/version'
+
+Gem::Specification.new do |spec|
+  spec.name        = 'bundler'
+  spec.version     = Bundler::VERSION
+  spec.licenses    = ['MIT']
+  spec.authors     = ["André Arko", "Terence Lee", "Carl Lerche", "Yehuda Katz"]
+  spec.email       = ["andre at arko.net"]
+  spec.homepage    = "http://gembundler.com"
+  spec.summary     = %q{The best way to manage your application's dependencies}
+  spec.description = %q{Bundler manages an application's dependencies through its entire life, across many machines, systematically and repeatably}
+
+  spec.required_ruby_version     = '>= 1.8.7'
+  spec.required_rubygems_version = '>= 1.3.6'
+
+  spec.add_development_dependency 'ronn', '~> 0.7.3'
+  spec.add_development_dependency 'rspec', '~> 2.11'
+
+  spec.files       = `git ls-files`.split($/)
+  spec.files      += Dir.glob('lib/bundler/man/**/*') # man/ is ignored by git
+  spec.test_files  = spec.files.grep(%r{^spec/})
+
+  spec.executables   = %w(bundle)
+  spec.require_paths = ["lib"]
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler.rb b/misc/lib/bundler-1.3.5/lib/bundler.rb
new file mode 100644
index 0000000..ff0f646
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler.rb
@@ -0,0 +1,391 @@
+require 'fileutils'
+require 'pathname'
+require 'rbconfig'
+require 'bundler/gem_path_manipulation'
+require 'bundler/rubygems_ext'
+require 'bundler/rubygems_integration'
+require 'bundler/version'
+
+module Bundler
+  preserve_gem_path
+  ORIGINAL_ENV = ENV.to_hash
+
+  autoload :Definition,            'bundler/definition'
+  autoload :Dependency,            'bundler/dependency'
+  autoload :DepProxy,              'bundler/dep_proxy'
+  autoload :Deprecate,             'bundler/deprecate'
+  autoload :Dsl,                   'bundler/dsl'
+  autoload :EndpointSpecification, 'bundler/endpoint_specification'
+  autoload :Environment,           'bundler/environment'
+  autoload :Env,                   'bundler/env'
+  autoload :Fetcher,               'bundler/fetcher'
+  autoload :GemHelper,             'bundler/gem_helper'
+  autoload :GemHelpers,            'bundler/gem_helpers'
+  autoload :GemInstaller,          'bundler/gem_installer'
+  autoload :Graph,                 'bundler/graph'
+  autoload :Index,                 'bundler/index'
+  autoload :Installer,             'bundler/installer'
+  autoload :Injector,              'bundler/injector'
+  autoload :LazySpecification,     'bundler/lazy_specification'
+  autoload :LockfileParser,        'bundler/lockfile_parser'
+  autoload :MatchPlatform,         'bundler/match_platform'
+  autoload :RemoteSpecification,   'bundler/remote_specification'
+  autoload :Resolver,              'bundler/resolver'
+  autoload :RubyVersion,           'bundler/ruby_version'
+  autoload :RubyDsl,               'bundler/ruby_dsl'
+  autoload :Runtime,               'bundler/runtime'
+  autoload :Settings,              'bundler/settings'
+  autoload :SharedHelpers,         'bundler/shared_helpers'
+  autoload :SpecSet,               'bundler/spec_set'
+  autoload :Source,                'bundler/source'
+  autoload :Specification,         'bundler/shared_helpers'
+  autoload :SystemRubyVersion,     'bundler/ruby_version'
+  autoload :UI,                    'bundler/ui'
+
+  class BundlerError < StandardError
+    def self.status_code(code)
+      define_method(:status_code) { code }
+    end
+  end
+
+  class GemfileNotFound     < BundlerError; status_code(10) ; end
+  class GemNotFound         < BundlerError; status_code(7)  ; end
+  class GemfileError        < BundlerError; status_code(4)  ; end
+  class InstallError        < BundlerError; status_code(5)  ; end
+  class InstallHookError    < BundlerError; status_code(6)  ; end
+  class PathError           < BundlerError; status_code(13) ; end
+  class GitError            < BundlerError; status_code(11) ; end
+  class DeprecatedError     < BundlerError; status_code(12) ; end
+  class GemspecError        < BundlerError; status_code(14) ; end
+  class InvalidOption       < BundlerError; status_code(15) ; end
+  class ProductionError     < BundlerError; status_code(16) ; end
+  class HTTPError           < BundlerError; status_code(17) ; end
+  class RubyVersionMismatch < BundlerError; status_code(18) ; end
+  class SecurityError       < BundlerError; status_code(19) ; end
+  class LockfileError       < BundlerError; status_code(20) ; end
+
+  WINDOWS = RbConfig::CONFIG["host_os"] =~ %r!(msdos|mswin|djgpp|mingw)!
+  FREEBSD = RbConfig::CONFIG["host_os"] =~ /bsd/
+  NULL    = WINDOWS ? "NUL" : "/dev/null"
+
+  # Internal errors, should be rescued
+  class VersionConflict  < BundlerError
+    attr_reader :conflicts
+
+    def initialize(conflicts, msg = nil)
+      super(msg)
+      @conflicts = conflicts
+    end
+
+    status_code(6)
+  end
+
+  class InvalidSpecSet < StandardError; end
+  class MarshalError   < StandardError; end
+
+  class << self
+    attr_writer :ui, :bundle_path
+
+    def configure
+      @configured ||= configure_gem_home_and_path
+    end
+
+    def ui
+      @ui ||= UI.new
+    end
+
+    # Returns absolute path of where gems are installed on the filesystem.
+    def bundle_path
+      @bundle_path ||= Pathname.new(settings.path).expand_path(root)
+    end
+
+    # Returns absolute location of where binstubs are installed to.
+    def bin_path
+      @bin_path ||= begin
+        path = settings[:bin] || "bin"
+        path = Pathname.new(path).expand_path(root).expand_path
+        FileUtils.mkdir_p(path)
+        path
+      end
+    end
+
+    def setup(*groups)
+      # Just return if all groups are already loaded
+      return @setup if defined?(@setup)
+
+      definition.validate_ruby!
+
+      if groups.empty?
+        # Load all groups, but only once
+        @setup = load.setup
+      else
+        @completed_groups ||= []
+        # Figure out which groups haven't been loaded yet
+        unloaded = groups - @completed_groups
+        # Record groups that are now loaded
+        @completed_groups = groups
+        unloaded.any? ? load.setup(*groups) : load
+      end
+    end
+
+    def require(*groups)
+      setup(*groups).require(*groups)
+    end
+
+    def load
+      @load ||= Runtime.new(root, definition)
+    end
+
+    def environment
+      Bundler::Environment.new(root, definition)
+    end
+
+    def definition(unlock = nil)
+      @definition = nil if unlock
+      @definition ||= begin
+        configure
+        upgrade_lockfile
+        Definition.build(default_gemfile, default_lockfile, unlock)
+      end
+    end
+
+    def ruby_scope
+      "#{Bundler.rubygems.ruby_engine}/#{Gem::ConfigMap[:ruby_version]}"
+    end
+
+    def user_bundle_path
+      Pathname.new(Bundler.rubygems.user_home).join(".bundler")
+    end
+
+    def home
+      bundle_path.join("bundler")
+    end
+
+    def install_path
+      home.join("gems")
+    end
+
+    def specs_path
+      bundle_path.join("specifications")
+    end
+
+    def cache
+      bundle_path.join("cache/bundler")
+    end
+
+    def root
+      default_gemfile.dirname.expand_path
+    end
+
+    def app_config_path
+      ENV['BUNDLE_APP_CONFIG'] ?
+        Pathname.new(ENV['BUNDLE_APP_CONFIG']).expand_path(root) :
+        root.join('.bundle')
+    end
+
+    def app_cache
+      root.join("vendor/cache")
+    end
+
+    def tmp
+      user_bundle_path.join("tmp", Process.pid.to_s)
+    end
+
+    def settings
+      @settings ||= begin
+        Settings.new(app_config_path)
+      rescue GemfileNotFound
+        Settings.new
+      end
+    end
+
+    def with_original_env
+      bundled_env = ENV.to_hash
+      ENV.replace(ORIGINAL_ENV)
+      yield
+    ensure
+      ENV.replace(bundled_env.to_hash)
+    end
+
+    def with_clean_env
+      with_original_env do
+        ENV['MANPATH'] = ENV['BUNDLE_ORIG_MANPATH']
+        ENV.delete_if { |k,_| k[0,7] == 'BUNDLE_' }
+        if ENV.has_key? 'RUBYOPT'
+          ENV['RUBYOPT'] = ENV['RUBYOPT'].sub '-rbundler/setup', ''
+          ENV['RUBYOPT'] = ENV['RUBYOPT'].sub "-I#{File.expand_path('..', __FILE__)}", ''
+        end
+        yield
+      end
+    end
+
+    def clean_system(*args)
+      with_clean_env { Kernel.system(*args) }
+    end
+
+    def clean_exec(*args)
+      with_clean_env { Kernel.exec(*args) }
+    end
+
+    def default_gemfile
+      SharedHelpers.default_gemfile
+    end
+
+    def default_lockfile
+      SharedHelpers.default_lockfile
+    end
+
+    def system_bindir
+      # Gem.bindir doesn't always return the location that Rubygems will install
+      # system binaries. If you put '-n foo' in your .gemrc, Rubygems will
+      # install binstubs there instead. Unfortunately, Rubygems doesn't expose
+      # that directory at all, so rather than parse .gemrc ourselves, we allow
+      # the directory to be set as well, via `bundle config bindir foo`.
+      Bundler.settings[:system_bindir] || Bundler.rubygems.gem_bindir
+    end
+
+    def requires_sudo?
+      return @requires_sudo if defined?(@requires_sudo_ran)
+
+      if settings.allow_sudo?
+        sudo_present = which "sudo"
+      end
+
+      if sudo_present
+        # the bundle path and subdirectories need to be writable for Rubygems
+        # to be able to unpack and install gems without exploding
+        path = bundle_path
+        path = path.parent until path.exist?
+
+        # bins are written to a different location on OS X
+        bin_dir = Pathname.new(Bundler.system_bindir)
+        bin_dir = bin_dir.parent until bin_dir.exist?
+
+        # if any directory is not writable, we need sudo
+        dirs = [path, bin_dir] | Dir[path.join('*')]
+        sudo_needed = dirs.find{|d| !File.writable?(d) }
+      end
+
+      @requires_sudo_ran = true
+      @requires_sudo = settings.allow_sudo? && sudo_present && sudo_needed
+    end
+
+    def mkdir_p(path)
+      if requires_sudo?
+        sudo "mkdir -p '#{path}'" unless File.exist?(path)
+      else
+        FileUtils.mkdir_p(path)
+      end
+    end
+
+    def which(executable)
+      if File.executable?(executable)
+        executable
+      elsif ENV['PATH']
+        path = ENV['PATH'].split(File::PATH_SEPARATOR).find do |p|
+          File.executable?(File.join(p, executable))
+        end
+        path && File.expand_path(executable, path)
+      end
+    end
+
+    def sudo(str)
+      `sudo -p 'Enter your password to install the bundled RubyGems to your system: ' #{str}`
+    end
+
+    def read_file(file)
+      File.open(file, "rb") { |f| f.read }
+    end
+
+    def load_marshal(data)
+      Marshal.load(data)
+    rescue => e
+      raise MarshalError, "#{e.class}: #{e.message}"
+    end
+
+    def load_gemspec(file)
+      @gemspec_cache ||= {}
+      key = File.expand_path(file)
+      spec = ( @gemspec_cache[key] ||= load_gemspec_uncached(file) )
+      # Protect against caching side-effected gemspecs by returning a
+      # new instance each time.
+      spec.dup if spec
+    end
+
+    def load_gemspec_uncached(file)
+      path = Pathname.new(file)
+      # Eval the gemspec from its parent directory, because some gemspecs
+      # depend on "./" relative paths.
+      Dir.chdir(path.dirname.to_s) do
+        contents = path.read
+        if contents[0..2] == "---" # YAML header
+          eval_yaml_gemspec(path, contents)
+        else
+          eval_gemspec(path, contents)
+        end
+      end
+    end
+
+    def clear_gemspec_cache
+      @gemspec_cache = {}
+    end
+
+  private
+
+    def eval_yaml_gemspec(path, contents)
+      # If the YAML is invalid, Syck raises an ArgumentError, and Psych
+      # raises a Psych::SyntaxError. See psyched_yaml.rb for more info.
+      Gem::Specification.from_yaml(contents)
+    rescue YamlSyntaxError, ArgumentError, Gem::EndOfYAMLException, Gem::Exception
+      eval_gemspec(path, contents)
+    end
+
+    def eval_gemspec(path, contents)
+      eval(contents, TOPLEVEL_BINDING, path.expand_path.to_s)
+    rescue ScriptError, StandardError => e
+      original_line = e.backtrace.find { |line| line.include?(path.to_s) }
+      msg  = "There was a #{e.class} while loading #{path.basename}: \n#{e.message}"
+      msg << " from\n  #{original_line}" if original_line
+      msg << "\n"
+
+      if e.is_a?(LoadError) && RUBY_VERSION >= "1.9"
+        msg << "\nDoes it try to require a relative path? That's been removed in Ruby 1.9."
+      end
+
+      raise GemspecError, msg
+    end
+
+    def configure_gem_home_and_path
+      blank_home = ENV['GEM_HOME'].nil? || ENV['GEM_HOME'].empty?
+      if settings[:disable_shared_gems]
+        ENV['GEM_PATH'] = ''
+        configure_gem_home
+      elsif blank_home || Bundler.rubygems.gem_dir != bundle_path.to_s
+        possibles = [Bundler.rubygems.gem_dir, Bundler.rubygems.gem_path]
+        paths = possibles.flatten.compact.uniq.reject { |p| p.empty? }
+        ENV["GEM_PATH"] = paths.join(File::PATH_SEPARATOR)
+        configure_gem_home
+      end
+
+      Bundler.rubygems.refresh
+      bundle_path
+    end
+
+    def configure_gem_home
+      # TODO: This mkdir_p is only needed for JRuby <= 1.5 and should go away (GH #602)
+      FileUtils.mkdir_p bundle_path.to_s rescue nil
+
+      ENV['GEM_HOME'] = File.expand_path(bundle_path, root)
+      Bundler.rubygems.clear_paths
+    end
+
+    def upgrade_lockfile
+      lockfile = default_lockfile
+      if lockfile.exist? && lockfile.read(3) == "---"
+        Bundler.ui.warn "Detected Gemfile.lock generated by 0.9, deleting..."
+        lockfile.rmtree
+      end
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/capistrano.rb b/misc/lib/bundler-1.3.5/lib/bundler/capistrano.rb
new file mode 100644
index 0000000..e37703d
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/capistrano.rb
@@ -0,0 +1,11 @@
+# Capistrano task for Bundler.
+#
+# Just add "require 'bundler/capistrano'" in your Capistrano deploy.rb, and
+# Bundler will be activated after each new deployment.
+require 'bundler/deployment'
+
+Capistrano::Configuration.instance(:must_exist).load do
+  before "deploy:finalize_update", "bundle:install"
+  Bundler::Deployment.define_task(self, :task, :except => { :no_release => true })
+  set :rake, lambda { "#{fetch(:bundle_cmd, "bundle")} exec rake" }
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/cli.rb b/misc/lib/bundler-1.3.5/lib/bundler/cli.rb
new file mode 100644
index 0000000..a1f7202
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/cli.rb
@@ -0,0 +1,878 @@
+require 'bundler'
+require 'bundler/similarity_detector'
+require 'bundler/vendored_thor'
+
+module Bundler
+  class CLI < Thor
+    include Thor::Actions
+
+    def initialize(*)
+      super
+      Bundler.rubygems.ui = UI::RGProxy.new(Bundler.ui)
+    rescue UnknownArgumentError => e
+      raise InvalidOption, e.message
+    ensure
+      Bundler.ui = UI::Shell.new(options)
+      Bundler.ui.level = "debug" if options["verbose"]
+    end
+
+    check_unknown_options!(:except => [:config, :exec])
+    stop_on_unknown_option! :exec
+
+    default_task :install
+    class_option "no-color", :type => :boolean, :banner => "Disable colorization in output"
+    class_option "verbose",  :type => :boolean, :banner => "Enable verbose output mode", :aliases => "-V"
+
+    def help(cli = nil)
+      case cli
+      when "gemfile" then command = "gemfile.5"
+      when nil       then command = "bundle"
+      else command = "bundle-#{cli}"
+      end
+
+      manpages = %w(
+          bundle
+          bundle-config
+          bundle-exec
+          bundle-install
+          bundle-package
+          bundle-update
+          bundle-platform
+          gemfile.5)
+
+      if manpages.include?(command)
+        root = File.expand_path("../man", __FILE__)
+
+        if Bundler.which("groff") && root !~ %r{^file:/.+!/META-INF/jruby.home/.+}
+          groff = "groff -Wall -mtty-char -mandoc -Tascii"
+          pager = pager_system
+
+          Kernel.exec "#{groff} #{root}/#{command} | #{pager}"
+        else
+          puts File.read("#{root}/#{command}.txt")
+        end
+      else
+        super
+      end
+    end
+
+    desc "init", "Generates a Gemfile into the current working directory"
+    long_desc <<-D
+      Init generates a default Gemfile in the current working directory. When adding a
+      Gemfile to a gem with a gemspec, the --gemspec option will automatically add each
+      dependency listed in the gemspec file to the newly created Gemfile.
+    D
+    method_option "gemspec", :type => :string, :banner => "Use the specified .gemspec to create the Gemfile"
+    def init
+      opts = options.dup
+      if File.exist?("Gemfile")
+        Bundler.ui.error "Gemfile already exists at #{Dir.pwd}/Gemfile"
+        exit 1
+      end
+
+      if opts[:gemspec]
+        gemspec = File.expand_path(opts[:gemspec])
+        unless File.exist?(gemspec)
+          Bundler.ui.error "Gem specification #{gemspec} doesn't exist"
+          exit 1
+        end
+        spec = Gem::Specification.load(gemspec)
+        puts "Writing new Gemfile to #{Dir.pwd}/Gemfile"
+        File.open('Gemfile', 'wb') do |file|
+          file << "# Generated from #{gemspec}\n"
+          file << spec.to_gemfile
+        end
+      else
+        puts "Writing new Gemfile to #{Dir.pwd}/Gemfile"
+        FileUtils.cp(File.expand_path('../templates/Gemfile', __FILE__), 'Gemfile')
+      end
+    end
+
+    desc "check", "Checks if the dependencies listed in Gemfile are satisfied by currently installed gems"
+    long_desc <<-D
+      Check searches the local machine for each of the gems requested in the Gemfile. If
+      all gems are found, Bundler prints a success message and exits with a status of 0.
+      If not, the first missing gem is listed and Bundler exits status 1.
+    D
+    method_option "gemfile", :type => :string, :banner =>
+      "Use the specified gemfile instead of Gemfile"
+    method_option "path", :type => :string, :banner =>
+      "Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME). Bundler will remember this value for future installs on this machine"
+    method_option "dry-run", :type => :boolean, :default => false, :banner =>
+      "Lock the Gemfile"
+    def check
+      ENV['BUNDLE_GEMFILE'] = File.expand_path(options[:gemfile]) if options[:gemfile]
+
+      Bundler.settings[:path] = File.expand_path(options[:path]) if options[:path]
+      begin
+        definition = Bundler.definition
+        definition.validate_ruby!
+        not_installed = definition.missing_specs
+      rescue GemNotFound, VersionConflict
+        Bundler.ui.error "Bundler can't satisfy your Gemfile's dependencies."
+        Bundler.ui.warn  "Install missing gems with `bundle install`."
+        exit 1
+      end
+
+      if not_installed.any?
+        Bundler.ui.error "The following gems are missing"
+        not_installed.each { |s| Bundler.ui.error " * #{s.name} (#{s.version})" }
+        Bundler.ui.warn "Install missing gems with `bundle install`"
+        exit 1
+      elsif !Bundler.default_lockfile.exist? && Bundler.settings[:frozen]
+        Bundler.ui.error "This bundle has been frozen, but there is no Gemfile.lock present"
+        exit 1
+      else
+        Bundler.load.lock unless options[:"dry-run"]
+        Bundler.ui.info "The Gemfile's dependencies are satisfied"
+      end
+    end
+
+    desc "install", "Install the current environment to the system"
+    long_desc <<-D
+      Install will install all of the gems in the current bundle, making them available
+      for use. In a freshly checked out repository, this command will give you the same
+      gem versions as the last person who updated the Gemfile and ran `bundle update`.
+
+      Passing [DIR] to install (e.g. vendor) will cause the unpacked gems to be installed
+      into the [DIR] directory rather than into system gems.
+
+      If the bundle has already been installed, bundler will tell you so and then exit.
+    D
+    method_option "without", :type => :array, :banner =>
+      "Exclude gems that are part of the specified named group."
+    method_option "gemfile", :type => :string, :banner =>
+      "Use the specified gemfile instead of Gemfile"
+    method_option "no-prune", :type => :boolean, :banner =>
+      "Don't remove stale gems from the cache."
+    method_option "no-cache", :type => :boolean, :banner =>
+      "Don't update the existing gem cache."
+    method_option "quiet", :type => :boolean, :banner =>
+      "Only output warnings and errors."
+    method_option "local", :type => :boolean, :banner =>
+      "Do not attempt to fetch gems remotely and use the gem cache instead"
+    method_option "binstubs", :type => :string, :lazy_default => "bin", :banner =>
+      "Generate bin stubs for bundled gems to ./bin"
+    method_option "shebang", :type => :string, :banner =>
+      "Specify a different shebang executable name than the default (usually 'ruby')"
+    method_option "path", :type => :string, :banner =>
+      "Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME). Bundler will remember this value for future installs on this machine"
+    method_option "system", :type => :boolean, :banner =>
+      "Install to the system location ($BUNDLE_PATH or $GEM_HOME) even if the bundle was previously installed somewhere else for this application"
+    method_option "frozen", :type => :boolean, :banner =>
+      "Do not allow the Gemfile.lock to be updated after this install"
+    method_option "deployment", :type => :boolean, :banner =>
+      "Install using defaults tuned for deployment environments"
+    method_option "standalone", :type => :array, :lazy_default => [], :banner =>
+      "Make a bundle that can work without the Bundler runtime"
+    method_option "full-index", :type => :boolean, :banner =>
+      "Use the rubygems modern index instead of the API endpoint"
+    method_option "clean", :type => :boolean, :banner =>
+      "Run bundle clean automatically after install"
+    method_option "trust-policy", :alias => "P", :type => :string, :banner =>
+      "Gem trust policy (like gem install -P). Must be one of " +
+        Bundler.rubygems.security_policies.keys.join('|') unless
+        Bundler.rubygems.security_policies.empty?
+    def install
+      opts = options.dup
+      if opts[:without]
+        opts[:without] = opts[:without].map{|g| g.tr(' ', ':') }
+      end
+
+      # Can't use Bundler.settings for this because settings needs gemfile.dirname
+      ENV['BUNDLE_GEMFILE'] = File.expand_path(opts[:gemfile]) if opts[:gemfile]
+      ENV['RB_USER_INSTALL'] = '1' if Bundler::FREEBSD
+
+      # Just disable color in deployment mode
+      Bundler.ui.shell = Thor::Shell::Basic.new if opts[:deployment]
+
+      if (opts[:path] || opts[:deployment]) && opts[:system]
+        Bundler.ui.error "You have specified both a path to install your gems to, \n" \
+                         "as well as --system. Please choose."
+        exit 1
+      end
+
+      if (opts["trust-policy"])
+        unless (Bundler.rubygems.security_policies.keys.include?(opts["trust-policy"]))
+          Bundler.ui.error "Rubygems doesn't know about trust policy '#{opts["trust-policy"]}'. " \
+            "The known policies are: #{Bundler.rubygems.security_policies.keys.join(', ')}."
+          exit 1
+        end
+        Bundler.settings["trust-policy"] = opts["trust-policy"]
+      else
+        Bundler.settings["trust-policy"] = nil if Bundler.settings["trust-policy"]
+      end
+
+      if opts[:deployment] || opts[:frozen]
+        unless Bundler.default_lockfile.exist?
+          flag = opts[:deployment] ? '--deployment' : '--frozen'
+          raise ProductionError, "The #{flag} flag requires a Gemfile.lock. Please make " \
+                                 "sure you have checked your Gemfile.lock into version control " \
+                                 "before deploying."
+        end
+
+        if Bundler.root.join("vendor/cache").exist?
+          opts[:local] = true
+        end
+
+        Bundler.settings[:frozen] = '1'
+      end
+
+      # When install is called with --no-deployment, disable deployment mode
+      if opts[:deployment] == false
+        Bundler.settings.delete(:frozen)
+        opts[:system] = true
+      end
+
+      # Can't use Bundler.settings for this because settings needs gemfile.dirname
+      Bundler.settings[:path]     = nil if opts[:system]
+      Bundler.settings[:path]     = "vendor/bundle" if opts[:deployment]
+      Bundler.settings[:path]     = opts[:path] if opts[:path]
+      Bundler.settings[:path]     ||= "bundle" if opts[:standalone]
+      Bundler.settings[:bin]      = opts["binstubs"] if opts["binstubs"]
+      Bundler.settings[:bin]      = nil if opts["binstubs"] && opts["binstubs"].empty?
+      Bundler.settings[:shebang]  = opts["shebang"] if opts[:shebang]
+      Bundler.settings[:no_prune] = true if opts["no-prune"]
+      Bundler.settings[:clean]    = opts[:clean] if opts[:clean]
+      Bundler.settings.without    = opts[:without]
+      Bundler.ui.level            = "warn" if opts[:quiet]
+      Bundler::Fetcher.disable_endpoint = opts["full-index"]
+      Bundler.settings[:disable_shared_gems] = Bundler.settings[:path] ? '1' : nil
+
+      # rubygems plugins sometimes hook into the gem install process
+      Gem.load_env_plugins if Gem.respond_to?(:load_env_plugins)
+
+      definition = Bundler.definition
+      definition.validate_ruby!
+      Installer.install(Bundler.root, definition, opts)
+      Bundler.load.cache if Bundler.root.join("vendor/cache").exist? && !options["no-cache"]
+
+      if Bundler.settings[:path]
+        absolute_path = File.expand_path(Bundler.settings[:path])
+        relative_path = absolute_path.sub(File.expand_path('.'), '.')
+        Bundler.ui.confirm "Your bundle is complete!"
+        Bundler.ui.confirm without_groups_message if Bundler.settings.without.any?
+        Bundler.ui.confirm "It was installed into #{relative_path}"
+      else
+        Bundler.ui.confirm "Your bundle is complete!"
+        Bundler.ui.confirm without_groups_message if Bundler.settings.without.any?
+        Bundler.ui.confirm "Use `bundle show [gemname]` to see where a bundled gem is installed."
+      end
+      Installer.post_install_messages.to_a.each do |name, msg|
+        Bundler.ui.confirm "Post-install message from #{name}:"
+        Bundler.ui.info msg
+      end
+
+      clean if Bundler.settings[:clean] && Bundler.settings[:path]
+    rescue GemNotFound, VersionConflict => e
+      if opts[:local] && Bundler.app_cache.exist?
+        Bundler.ui.warn "Some gems seem to be missing from your vendor/cache directory."
+      end
+
+      if Bundler.definition.rubygems_remotes.empty?
+        Bundler.ui.warn <<-WARN, :wrap => true
+          Your Gemfile has no gem server sources. If you need gems that are \
+          not already on your machine, add a line like this to your Gemfile:
+          source 'https://rubygems.org'
+        WARN
+      end
+      raise e
+    end
+
+    desc "update", "update the current environment"
+    long_desc <<-D
+      Update will install the newest versions of the gems listed in the Gemfile. Use
+      update when you have changed the Gemfile, or if you want to get the newest
+      possible versions of the gems in the bundle.
+    D
+    method_option "source", :type => :array, :banner => "Update a specific source (and all gems associated with it)"
+    method_option "local", :type => :boolean, :banner =>
+      "Do not attempt to fetch gems remotely and use the gem cache instead"
+    method_option "quiet", :type => :boolean, :banner =>
+      "Only output warnings and errors."
+    method_option "full-index", :type => :boolean, :banner =>
+        "Use the rubygems modern index instead of the API endpoint"
+    def update(*gems)
+      sources = Array(options[:source])
+      Bundler.ui.level = "warn" if options[:quiet]
+
+      if gems.empty? && sources.empty?
+        # We're doing a full update
+        Bundler.definition(true)
+      else
+        # cycle through the requested gems, just to make sure they exist
+        lock = Bundler.read_file(Bundler.default_lockfile)
+        names = LockfileParser.new(lock).specs.map{ |s| s.name }
+        gems.each do |g|
+          next if names.include?(g)
+          raise GemNotFound, not_found_message(g, names)
+        end
+        Bundler.definition(:gems => gems, :sources => sources)
+      end
+
+      Bundler::Fetcher.disable_endpoint = options["full-index"]
+
+      opts = {"update" => true, "local" => options[:local]}
+      # rubygems plugins sometimes hook into the gem install process
+      Gem.load_env_plugins if Gem.respond_to?(:load_env_plugins)
+
+      Bundler.definition.validate_ruby!
+      Installer.install Bundler.root, Bundler.definition, opts
+      Bundler.load.cache if Bundler.root.join("vendor/cache").exist?
+      clean if Bundler.settings[:clean] && Bundler.settings[:path]
+      Bundler.ui.confirm "Your bundle is updated!"
+      Bundler.ui.confirm without_groups_message if Bundler.settings.without.any?
+    end
+
+    desc "show [GEM]", "Shows all gems that are part of the bundle, or the path to a given gem"
+    long_desc <<-D
+      Show lists the names and versions of all gems that are required by your Gemfile.
+      Calling show with [GEM] will list the exact location of that gem on your machine.
+    D
+    method_option "paths", :type => :boolean,
+      :banner => "List the paths of all gems that are required by your Gemfile."
+    def show(gem_name = nil)
+      Bundler.ui.silence do
+        Bundler.definition.validate_ruby!
+        Bundler.load.lock
+      end
+
+      if gem_name
+        if gem_name == "bundler"
+          path = File.expand_path("../../..", __FILE__)
+        else
+          spec = select_spec(gem_name, :regex_match)
+          return unless spec
+          path = spec.full_gem_path
+          if !File.directory?(path)
+            Bundler.ui.warn "The gem #{gem_name} has been deleted. It was installed at:"
+          end
+        end
+        return Bundler.ui.info(path)
+      end
+
+      if options[:paths]
+        Bundler.load.specs.sort_by { |s| s.name }.map do |s|
+          Bundler.ui.info s.full_gem_path
+        end
+      else
+        Bundler.ui.info "Gems included by the bundle:"
+        Bundler.load.specs.sort_by { |s| s.name }.each do |s|
+          Bundler.ui.info "  * #{s.name} (#{s.version}#{s.git_version})"
+        end
+      end
+    end
+    map %w(list) => "show"
+
+    desc "binstubs [GEM]", "install the binstubs of the listed gem"
+    long_desc <<-D
+      Generate binstubs for executables in [GEM]. Binstubs are put into bin,
+      or the --binstubs directory if one has been set.
+    D
+    method_option "path", :type => :string, :lazy_default => "bin", :banner =>
+      "binstub destination directory (default bin)"
+    method_option "force", :type => :boolean, :default => false, :banner =>
+      "overwrite existing binstubs if they exist"
+    def binstubs(gem_name)
+      Bundler.definition.validate_ruby!
+      Bundler.settings[:bin] = options["path"] if options["path"]
+      Bundler.settings[:bin] = nil if options["path"] && options["path"].empty?
+      installer = Installer.new(Bundler.root, Bundler.definition)
+      spec      = installer.specs.find{|s| s.name == gem_name }
+      raise GemNotFound, not_found_message(gem_name, Bundler.definition.specs) unless spec
+
+      if spec.name == "bundler"
+        Bundler.ui.warn "Sorry, Bundler can only be run via Rubygems."
+      else
+        installer.generate_bundler_executable_stubs(spec, :force => options[:force], :binstubs_cmd => true)
+      end
+    end
+
+    desc "outdated [GEM]", "list installed gems with newer versions available"
+    long_desc <<-D
+      Outdated lists the names and versions of gems that have a newer version available
+      in the given source. Calling outdated with [GEM [GEM]] will only check for newer
+      versions of the given gems. Prerelease gems are ignored by default. If your gems
+      are up to date, Bundler will exit with a status of 0. Otherwise, it will exit 1.
+    D
+    method_option "pre", :type => :boolean, :banner => "Check for newer pre-release gems"
+    method_option "source", :type => :array, :banner => "Check against a specific source"
+    method_option "local", :type => :boolean, :banner =>
+      "Do not attempt to fetch gems remotely and use the gem cache instead"
+    def outdated(*gems)
+      sources = Array(options[:source])
+      Bundler.definition.validate_ruby!
+
+      current_specs = Bundler.ui.silence { Bundler.load.specs }
+
+      if gems.empty? && sources.empty?
+        # We're doing a full update
+        definition = Bundler.definition(true)
+      else
+        definition = Bundler.definition(:gems => gems, :sources => sources)
+      end
+      options["local"] ? definition.resolve_with_cache! : definition.resolve_remotely!
+
+      Bundler.ui.info ""
+
+      out_count = 0
+      # Loop through the current specs
+      current_specs.sort_by { |s| s.name }.each do |current_spec|
+        next if !gems.empty? && !gems.include?(current_spec.name)
+
+        active_spec = definition.index[current_spec.name].sort_by { |b| b.version }
+
+        if !current_spec.version.prerelease? && !options[:pre] && active_spec.size > 1
+          active_spec = active_spec.delete_if { |b| b.respond_to?(:version) && b.version.prerelease? }
+        end
+
+        active_spec = active_spec.last
+        next if active_spec.nil?
+
+        gem_outdated = Gem::Version.new(active_spec.version) > Gem::Version.new(current_spec.version)
+        git_outdated = current_spec.git_version != active_spec.git_version
+        if gem_outdated || git_outdated
+          if out_count == 0
+            if options["pre"]
+              Bundler.ui.info "Outdated gems included in the bundle (including pre-releases):"
+            else
+              Bundler.ui.info "Outdated gems included in the bundle:"
+            end
+          end
+
+          spec_version    = "#{active_spec.version}#{active_spec.git_version}"
+          current_version = "#{current_spec.version}#{current_spec.git_version}"
+          Bundler.ui.info "  * #{active_spec.name} (#{spec_version} > #{current_version})"
+          out_count += 1
+        end
+        Bundler.ui.debug "from #{active_spec.loaded_from}"
+      end
+
+      if out_count.zero?
+        Bundler.ui.info "Your bundle is up to date!\n"
+      else
+        exit 1
+      end
+    end
+
+    desc "cache", "Cache all the gems to vendor/cache", :hide => true
+    method_option "no-prune",  :type => :boolean, :banner => "Don't remove stale gems from the cache."
+    method_option "all",  :type => :boolean, :banner => "Include all sources (including path and git)."
+    def cache
+      Bundler.definition.validate_ruby!
+      Bundler.definition.resolve_with_cache!
+      setup_cache_all
+      Bundler.load.cache
+      Bundler.settings[:no_prune] = true if options["no-prune"]
+      Bundler.load.lock
+    rescue GemNotFound => e
+      Bundler.ui.error(e.message)
+      Bundler.ui.warn "Run `bundle install` to install missing gems."
+      exit 1
+    end
+
+    desc "package", "Locks and then caches all of the gems into vendor/cache"
+    method_option "no-prune",  :type => :boolean, :banner => "Don't remove stale gems from the cache."
+    method_option "all",  :type => :boolean, :banner => "Include all sources (including path and git)."
+    long_desc <<-D
+      The package command will copy the .gem files for every gem in the bundle into the
+      directory ./vendor/cache. If you then check that directory into your source
+      control repository, others who check out your source will be able to install the
+      bundle without having to download any additional gems.
+    D
+    def package
+      setup_cache_all
+      install
+      # TODO: move cache contents here now that all bundles are locked
+      Bundler.load.cache
+    end
+    map %w(pack) => :package
+
+    desc "exec", "Run the command in context of the bundle"
+    long_desc <<-D
+      Exec runs a command, providing it access to the gems in the bundle. While using
+      bundle exec you can require and call the bundled gems as if they were installed
+      into the systemwide Rubygems repository.
+    D
+    def exec(*args)
+      Bundler.definition.validate_ruby!
+      Bundler.load.setup_environment
+
+      begin
+        # Run
+        Kernel.exec(*args)
+      rescue Errno::EACCES
+        Bundler.ui.error "bundler: not executable: #{args.first}"
+        exit 126
+      rescue Errno::ENOENT
+        Bundler.ui.error "bundler: command not found: #{args.first}"
+        Bundler.ui.warn  "Install missing gem executables with `bundle install`"
+        exit 127
+      rescue ArgumentError
+        Bundler.ui.error "bundler: exec needs a command to run"
+        exit 128
+      end
+    end
+
+    desc "config NAME [VALUE]", "retrieve or set a configuration value"
+    long_desc <<-D
+      Retrieves or sets a configuration value. If only one parameter is provided, retrieve the value. If two parameters are provided, replace the
+      existing value with the newly provided one.
+
+      By default, setting a configuration value sets it for all projects
+      on the machine.
+
+      If a global setting is superceded by local configuration, this command
+      will show the current value, as well as any superceded values and
+      where they were specified.
+    D
+    def config(*args)
+      peek = args.shift
+
+      if peek && peek =~ /^\-\-/
+        name, scope = args.shift, $'
+      else
+        name, scope = peek, "global"
+      end
+
+      unless name
+        Bundler.ui.confirm "Settings are listed in order of priority. The top value will be used.\n"
+
+        Bundler.settings.all.each do |setting|
+          Bundler.ui.confirm "#{setting}"
+          with_padding do
+            Bundler.settings.pretty_values_for(setting).each do |line|
+              Bundler.ui.info line
+            end
+          end
+          Bundler.ui.confirm ""
+        end
+        return
+      end
+
+      case scope
+      when "delete"
+        Bundler.settings.set_local(name, nil)
+        Bundler.settings.set_global(name, nil)
+      when "local", "global"
+        if args.empty?
+          Bundler.ui.confirm "Settings for `#{name}` in order of priority. The top value will be used"
+          with_padding do
+            Bundler.settings.pretty_values_for(name).each { |line| Bundler.ui.info line }
+          end
+          return
+        end
+
+        locations = Bundler.settings.locations(name)
+
+        if scope == "global"
+          if local = locations[:local]
+            Bundler.ui.info "Your application has set #{name} to #{local.inspect}. This will override the " \
+              "global value you are currently setting"
+          end
+
+          if env = locations[:env]
+            Bundler.ui.info "You have a bundler environment variable for #{name} set to #{env.inspect}. " \
+              "This will take precedence over the global value you are setting"
+          end
+
+          if global = locations[:global]
+            Bundler.ui.info "You are replacing the current global value of #{name}, which is currently #{global.inspect}"
+          end
+        end
+
+        if scope == "local" && local = locations[:local]
+          Bundler.ui.info "You are replacing the current local value of #{name}, which is currently #{local.inspect}"
+        end
+
+        if name.match(/\Alocal\./)
+          pathname = Pathname.new(args.join(" "))
+          args = [pathname.expand_path.to_s] if pathname.directory?
+        end
+
+        Bundler.settings.send("set_#{scope}", name, args.join(" "))
+      else
+        Bundler.ui.error "Invalid scope --#{scope} given. Please use --local or --global."
+        exit 1
+      end
+    end
+
+    desc "open GEM", "Opens the source directory of the given bundled gem"
+    def open(name)
+      editor = [ENV['BUNDLER_EDITOR'], ENV['VISUAL'], ENV['EDITOR']].find{|e| !e.nil? && !e.empty? }
+      return Bundler.ui.info("To open a bundled gem, set $EDITOR or $BUNDLER_EDITOR") unless editor
+      spec = select_spec(name, :regex_match)
+      return unless spec
+      Dir.chdir(spec.full_gem_path) do
+        command = "#{editor} #{spec.full_gem_path}"
+        success = system(command)
+        Bundler.ui.info "Could not run '#{command}'" unless success
+      end
+    end
+
+    desc "console [GROUP]", "Opens an IRB session with the bundle pre-loaded"
+    def console(group = nil)
+      group ? Bundler.require(:default, *(group.split.map! {|g| g.to_sym })) : Bundler.require
+      ARGV.clear
+
+      require 'irb'
+      IRB.start
+    end
+
+    desc "version", "Prints the bundler's version information"
+    def version
+      Bundler.ui.info "Bundler version #{Bundler::VERSION}"
+    end
+    map %w(-v --version) => :version
+
+    desc "licenses", "Prints the license of all gems in the bundle"
+    def licenses
+      Bundler.load.specs.sort_by { |s| s.license.to_s }.reverse.each do |s|
+        gem_name = s.name
+        license  = s.license || s.licenses
+
+        if license.empty?
+          Bundler.ui.warn "#{gem_name}: Unknown"
+        else
+          Bundler.ui.info "#{gem_name}: #{license}"
+        end
+      end
+    end
+
+    desc 'viz', "Generates a visual dependency graph"
+    long_desc <<-D
+      Viz generates a PNG file of the current Gemfile as a dependency graph.
+      Viz requires the ruby-graphviz gem (and its dependencies).
+      The associated gems must also be installed via 'bundle install'.
+    D
+    method_option :file, :type => :string, :default => 'gem_graph', :aliases => '-f', :banner => "The name to use for the generated file. see format option"
+    method_option :version, :type => :boolean, :default => false, :aliases => '-v', :banner => "Set to show each gem version."
+    method_option :requirements, :type => :boolean, :default => false, :aliases => '-r', :banner => "Set to show the version of each required dependency."
+    method_option :format, :type => :string, :default => "png", :aliases => '-F', :banner => "This is output format option. Supported format is png, jpg, svg, dot ..."
+    def viz
+      require 'graphviz'
+
+      output_file = File.expand_path(options[:file])
+      graph = Graph.new(Bundler.load, output_file, options[:version], options[:requirements], options[:format])
+
+      begin
+        graph.viz
+      rescue LoadError => e
+        Bundler.ui.error e.inspect
+        Bundler.ui.warn "Make sure you have the graphviz ruby gem. You can install it with:"
+        Bundler.ui.warn "`gem install ruby-graphviz`"
+      rescue StandardError => e
+        if e.message =~ /GraphViz not installed or dot not in PATH/
+          Bundler.ui.error e.message
+          Bundler.ui.warn "The ruby graphviz gem requires GraphViz to be installed"
+        else
+          raise
+        end
+      end
+    end
+
+    desc "gem GEM", "Creates a skeleton for creating a rubygem"
+    method_option :bin, :type => :boolean, :default => false, :aliases => '-b', :banner => "Generate a binary for your library."
+    method_option :test, :type => :string, :lazy_default => 'rspec', :aliases => '-t', :banner => "Generate a test directory for your library: 'rspec' is the default, but 'minitest' is also supported."
+    method_option :edit, :type => :string, :aliases => "-e",
+                  :lazy_default => [ENV['BUNDLER_EDITOR'], ENV['VISUAL'], ENV['EDITOR']].find{|e| !e.nil? && !e.empty? },
+                  :required => false, :banner => "/path/to/your/editor",
+                  :desc => "Open generated gemspec in the specified editor (defaults to $EDITOR or $BUNDLER_EDITOR)"
+
+    def gem(name)
+      name = name.chomp("/") # remove trailing slash if present
+      namespaced_path = name.tr('-', '/')
+      target = File.join(Dir.pwd, name)
+      constant_name = name.split('_').map{|p| p[0..0].upcase + p[1..-1] }.join
+      constant_name = constant_name.split('-').map{|q| q[0..0].upcase + q[1..-1] }.join('::') if constant_name =~ /-/
+      constant_array = constant_name.split('::')
+      git_user_name = `git config user.name`.chomp
+      git_user_email = `git config user.email`.chomp
+      opts = {
+        :name            => name,
+        :namespaced_path => namespaced_path,
+        :constant_name   => constant_name,
+        :constant_array  => constant_array,
+        :author          => git_user_name.empty? ? "TODO: Write your name" : git_user_name,
+        :email           => git_user_email.empty? ? "TODO: Write your email address" : git_user_email,
+        :test            => options[:test]
+      }
+      gemspec_dest = File.join(target, "#{name}.gemspec")
+      template(File.join("newgem/Gemfile.tt"),               File.join(target, "Gemfile"),                             opts)
+      template(File.join("newgem/Rakefile.tt"),              File.join(target, "Rakefile"),                            opts)
+      template(File.join("newgem/LICENSE.txt.tt"),           File.join(target, "LICENSE.txt"),                         opts)
+      template(File.join("newgem/README.md.tt"),             File.join(target, "README.md"),                           opts)
+      template(File.join("newgem/gitignore.tt"),             File.join(target, ".gitignore"),                          opts)
+      template(File.join("newgem/newgem.gemspec.tt"),        gemspec_dest,                                             opts)
+      template(File.join("newgem/lib/newgem.rb.tt"),         File.join(target, "lib/#{namespaced_path}.rb"),           opts)
+      template(File.join("newgem/lib/newgem/version.rb.tt"), File.join(target, "lib/#{namespaced_path}/version.rb"),   opts)
+      if options[:bin]
+        template(File.join("newgem/bin/newgem.tt"),          File.join(target, 'bin', name),                           opts)
+      end
+      case options[:test]
+      when 'rspec'
+        template(File.join("newgem/rspec.tt"),               File.join(target, ".rspec"),                              opts)
+        template(File.join("newgem/spec/spec_helper.rb.tt"), File.join(target, "spec/spec_helper.rb"),                 opts)
+        template(File.join("newgem/spec/newgem_spec.rb.tt"), File.join(target, "spec/#{namespaced_path}_spec.rb"),     opts)
+      when 'minitest'
+        template(File.join("newgem/test/minitest_helper.rb.tt"), File.join(target, "test/minitest_helper.rb"),         opts)
+        template(File.join("newgem/test/test_newgem.rb.tt"),     File.join(target, "test/test_#{namespaced_path}.rb"), opts)
+      end
+      if options[:test]
+        template(File.join("newgem/.travis.yml.tt"),         File.join(target, ".travis.yml"),            opts)
+      end
+      Bundler.ui.info "Initializating git repo in #{target}"
+      Dir.chdir(target) { `git init`; `git add .` }
+
+      if options[:edit]
+        run("#{options["edit"]} \"#{gemspec_dest}\"")  # Open gemspec in editor
+      end
+    end
+
+    def self.source_root
+      File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
+    end
+
+    desc "clean", "Cleans up unused gems in your bundler directory"
+    method_option "dry-run", :type => :boolean, :default => false, :banner =>
+      "only print out changes, do not actually clean gems"
+    method_option "force", :type => :boolean, :default => false, :banner =>
+      "forces clean even if --path is not set"
+    def clean
+      if Bundler.settings[:path] || options[:force]
+        Bundler.load.clean(options[:"dry-run"])
+      else
+        Bundler.ui.error "Can only use bundle clean when --path is set or --force is set"
+        exit 1
+      end
+    end
+
+    desc "platform", "Displays platform compatibility information"
+    method_option "ruby", :type => :boolean, :default => false, :banner =>
+      "only display ruby related platform information"
+    def platform
+      platforms, ruby_version = Bundler.ui.silence do
+        [ Bundler.definition.platforms.map {|p| "* #{p}" },
+          Bundler.definition.ruby_version ]
+      end
+      output = []
+
+      if options[:ruby]
+        if ruby_version
+          output << ruby_version
+        else
+          output << "No ruby version specified"
+        end
+      else
+        output << "Your platform is: #{RUBY_PLATFORM}"
+        output << "Your app has gems that work on these platforms:\n#{platforms.join("\n")}"
+
+        if ruby_version
+          output << "Your Gemfile specifies a Ruby version requirement:\n* #{ruby_version}"
+
+          begin
+            Bundler.definition.validate_ruby!
+            output << "Your current platform satisfies the Ruby version requirement."
+          rescue RubyVersionMismatch => e
+            output << e.message
+          end
+        else
+          output << "Your Gemfile does not specify a Ruby version requirement."
+        end
+      end
+
+      Bundler.ui.info output.join("\n\n")
+    end
+
+    desc "inject GEM VERSION ...", "Add the named gem(s), with version requirements, to the resolved Gemfile"
+    def inject(name, version, *gems)
+      # The required arguments allow Thor to give useful feedback when the arguments
+      # are incorrect. This adds those first two arguments onto the list as a whole.
+      gems.unshift(version).unshift(name)
+
+      # Build an array of Dependency objects out of the arguments
+      deps = []
+      gems.each_slice(2) do |gem_name, gem_version|
+        deps << Bundler::Dependency.new(gem_name, gem_version)
+      end
+
+      added = Injector.inject(deps)
+
+      if added.any?
+        Bundler.ui.confirm "Added to Gemfile:"
+        Bundler.ui.confirm added.map{ |g| "  #{g}" }.join("\n")
+      else
+        Bundler.ui.confirm "All injected gems were already present in the Gemfile"
+      end
+    end
+
+    desc "env", "Print information about the environment Bundler is running under"
+    def env
+      Env.new.write($stdout)
+    end
+
+  private
+
+    def setup_cache_all
+      Bundler.settings[:cache_all] = options[:all] if options.key?("all")
+
+      if Bundler.definition.sources.any? { |s| !s.is_a?(Source::Rubygems) } && !Bundler.settings[:cache_all]
+        Bundler.ui.warn "Your Gemfile contains path and git dependencies. If you want "    \
+          "to package them as well, please pass the --all flag. This will be the default " \
+          "on Bundler 2.0."
+      end
+    end
+
+    def select_spec(name, regex_match = nil)
+      specs = []
+      regexp = Regexp.new(name) if regex_match
+
+      Bundler.definition.specs.each do |spec|
+        return spec if spec.name == name
+        specs << spec if regexp && spec.name =~ regexp
+      end
+
+      case specs.count
+      when 0
+        raise GemNotFound, not_found_message(name, Bundler.definition.dependencies)
+      when 1
+        specs.first
+      else
+        specs.each_with_index do |spec, index|
+          Bundler.ui.info "#{index.succ} : #{spec.name}", true
+        end
+        Bundler.ui.info '0 : - exit -', true
+
+        input = Bundler.ui.ask('> ')
+        (num = input.to_i) > 0 ? specs[num - 1] : nil
+      end
+    end
+
+    def not_found_message(missing_gem_name, alternatives)
+      message = "Could not find gem '#{missing_gem_name}'."
+
+      # This is called as the result of a GemNotFound, let's see if
+      # there's any similarly named ones we can propose instead
+      alternate_names = alternatives.map { |a| a.respond_to?(:name) ? a.name : a }
+      suggestions = SimilarityDetector.new(alternate_names).similar_word_list(missing_gem_name)
+      message += "\nDid you mean #{suggestions}?" if suggestions
+      message
+    end
+
+    def pager_system
+      pager = ENV['PAGER'] || ENV['MANPAGER']
+      pager ||= 'less -R' if Bundler.which("less")
+      pager ||= 'more' if Bundler.which("more")
+      pager ||= 'cat'
+    end
+
+    def without_groups_message
+      groups = Bundler.settings.without
+      group_list = [groups[0...-1].join(", "), groups[-1..-1]].
+        reject{|s| s.to_s.empty? }.join(" and ")
+      group_str = (groups.size == 1) ? "group" : "groups"
+      "Gems in the #{group_str} #{group_list} were not installed."
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/definition.rb b/misc/lib/bundler-1.3.5/lib/bundler/definition.rb
new file mode 100644
index 0000000..bbee37e
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/definition.rb
@@ -0,0 +1,575 @@
+require "digest/sha1"
+require "set"
+
+module Bundler
+  class Definition
+    include GemHelpers
+
+    attr_reader :dependencies, :platforms, :sources, :ruby_version,
+      :locked_deps
+
+    def self.build(gemfile, lockfile, unlock)
+      unlock ||= {}
+      gemfile = Pathname.new(gemfile).expand_path
+
+      unless gemfile.file?
+        raise GemfileNotFound, "#{gemfile} not found"
+      end
+
+      Dsl.evaluate(gemfile, lockfile, unlock)
+    end
+
+=begin
+    How does the new system work?
+    ===
+    * Load information from Gemfile and Lockfile
+    * Invalidate stale locked specs
+      * All specs from stale source are stale
+      * All specs that are reachable only through a stale
+        dependency are stale.
+    * If all fresh dependencies are satisfied by the locked
+      specs, then we can try to resolve locally.
+=end
+
+    def initialize(lockfile, dependencies, sources, unlock, ruby_version = nil)
+      @unlocking = unlock == true || !unlock.empty?
+
+      @dependencies, @sources, @unlock = dependencies, sources, unlock
+      @remote            = false
+      @specs             = nil
+      @lockfile_contents = ""
+      @ruby_version      = ruby_version
+
+      if lockfile && File.exists?(lockfile)
+        @lockfile_contents = Bundler.read_file(lockfile)
+        locked = LockfileParser.new(@lockfile_contents)
+        @platforms      = locked.platforms
+
+        if unlock != true
+          @locked_deps    = locked.dependencies
+          @locked_specs   = SpecSet.new(locked.specs)
+          @locked_sources = locked.sources
+        else
+          @unlock         = {}
+          @locked_deps    = []
+          @locked_specs   = SpecSet.new([])
+          @locked_sources = []
+        end
+      else
+        @unlock         = {}
+        @platforms      = []
+        @locked_deps    = []
+        @locked_specs   = SpecSet.new([])
+        @locked_sources = []
+      end
+
+      @unlock[:gems] ||= []
+      @unlock[:sources] ||= []
+
+      current_platform = Bundler.rubygems.platforms.map { |p| generic(p) }.compact.last
+      @new_platform = !@platforms.include?(current_platform)
+      @platforms |= [current_platform]
+
+      @path_changes = converge_paths
+      eager_unlock = expand_dependencies(@unlock[:gems])
+      @unlock[:gems] = @locked_specs.for(eager_unlock).map { |s| s.name }
+
+      @source_changes = converge_sources
+      @dependency_changes = converge_dependencies
+      @local_changes = converge_locals
+
+      fixup_dependency_types!
+    end
+
+    def fixup_dependency_types!
+      # XXX This is a temporary workaround for a bug when using rubygems 1.8.15
+      # where Gem::Dependency#== matches Gem::Dependency#type. As the lockfile
+      # doesn't carry a notion of the dependency type, if you use
+      # add_development_dependency in a gemspec that's loaded with the gemspec
+      # directive, the lockfile dependencies and resolved dependencies end up
+      # with a mismatch on #type.
+      # Test coverage to catch a regression on this is in gemspec_spec.rb
+      @dependencies.each do |d|
+        if ld = @locked_deps.find { |l| l.name == d.name }
+          ld.instance_variable_set(:@type, d.type)
+        end
+      end
+    end
+
+    def resolve_with_cache!
+      raise "Specs already loaded" if @specs
+      @sources.each { |s| s.cached! }
+      specs
+    end
+
+    def resolve_remotely!
+      raise "Specs already loaded" if @specs
+      @remote = true
+      @sources.each { |s| s.remote! }
+      specs
+    end
+
+    def specs
+      @specs ||= begin
+        specs = resolve.materialize(requested_dependencies)
+
+        unless specs["bundler"].any?
+          local = Bundler.settings[:frozen] ? rubygems_index : index
+          bundler = local.search(Gem::Dependency.new('bundler', VERSION)).last
+          specs["bundler"] = bundler if bundler
+        end
+
+        specs
+      end
+    end
+
+    def new_specs
+      specs - @locked_specs
+    end
+
+    def removed_specs
+      @locked_specs - specs
+    end
+
+    def new_platform?
+      @new_platform
+    end
+
+    def missing_specs
+      missing = []
+      resolve.materialize(requested_dependencies, missing)
+      missing
+    end
+
+    def requested_specs
+      @requested_specs ||= begin
+        groups = self.groups - Bundler.settings.without
+        groups.map! { |g| g.to_sym }
+        specs_for(groups)
+      end
+    end
+
+    def current_dependencies
+      dependencies.reject { |d| !d.should_include? }
+    end
+
+    def specs_for(groups)
+      deps = dependencies.select { |d| (d.groups & groups).any? }
+      deps.delete_if { |d| !d.should_include? }
+      specs.for(expand_dependencies(deps))
+    end
+
+    def resolve
+      @resolve ||= begin
+        if Bundler.settings[:frozen] || (!@unlocking && nothing_changed?)
+          @locked_specs
+        else
+          last_resolve = converge_locked_specs
+
+          # Record the specs available in each gem's source, so that those
+          # specs will be available later when the resolver knows where to
+          # look for that gemspec (or its dependencies)
+          source_requirements = {}
+          dependencies.each do |dep|
+            next unless dep.source
+            source_requirements[dep.name] = dep.source.specs
+          end
+
+          # Run a resolve against the locally available gems
+          last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, last_resolve)
+        end
+      end
+    end
+
+    def index
+      @index ||= Index.build do |idx|
+        dependency_names = @dependencies.dup || []
+        dependency_names.map! {|d| d.name }
+
+        @sources.each do |s|
+          if s.is_a?(Bundler::Source::Rubygems)
+            s.dependency_names = dependency_names.uniq
+            idx.add_source s.specs
+          else
+            source_index = s.specs
+            dependency_names += source_index.unmet_dependency_names
+            idx.add_source source_index
+          end
+        end
+      end
+    end
+
+    # used when frozen is enabled so we can find the bundler
+    # spec, even if (say) a git gem is not checked out.
+    def rubygems_index
+      @rubygems_index ||= Index.build do |idx|
+        rubygems = @sources.find{|s| s.is_a?(Source::Rubygems) }
+        idx.add_source rubygems.specs
+      end
+    end
+
+    def rubygems_remotes
+      @sources.select{|s| s.is_a?(Source::Rubygems) }.map{|s| s.remotes }.flatten
+    end
+
+    def groups
+      dependencies.map { |d| d.groups }.flatten.uniq
+    end
+
+    def lock(file)
+      contents = to_lock
+
+      # Convert to \r\n if the existing lock has them
+      # i.e., Windows with `git config core.autocrlf=true`
+      contents.gsub!(/\n/, "\r\n") if @lockfile_contents.match("\r\n")
+
+      return if @lockfile_contents == contents
+
+      if Bundler.settings[:frozen]
+        Bundler.ui.error "Cannot write a changed lockfile while frozen."
+        return
+      end
+
+      File.open(file, 'wb'){|f| f.puts(contents) }
+    rescue Errno::EACCES
+      raise Bundler::InstallError,
+        "There was an error while trying to write to Gemfile.lock. It is likely that \n" \
+        "you need to allow write permissions for the file at path: \n" \
+        "#{File.expand_path(file)}"
+    end
+
+    def to_lock
+      out = ""
+
+      sorted_sources.each do |source|
+        # Add the source header
+        out << source.to_lock
+        # Find all specs for this source
+        resolve.
+          select  { |s| s.source == source }.
+          # This needs to be sorted by full name so that
+          # gems with the same name, but different platform
+          # are ordered consistantly
+          sort_by { |s| s.full_name }.
+          each do |spec|
+            next if spec.name == 'bundler'
+            out << spec.to_lock
+        end
+        out << "\n"
+      end
+
+      out << "PLATFORMS\n"
+
+      platforms.map { |p| p.to_s }.sort.each do |p|
+        out << "  #{p}\n"
+      end
+
+      out << "\n"
+      out << "DEPENDENCIES\n"
+
+      handled = []
+      dependencies.
+        sort_by { |d| d.to_s }.
+        each do |dep|
+          next if handled.include?(dep.name)
+          out << dep.to_lock
+          handled << dep.name
+      end
+
+      out
+    end
+
+    def ensure_equivalent_gemfile_and_lockfile(explicit_flag = false)
+      changes = false
+
+      msg = "You are trying to install in deployment mode after changing\n" \
+            "your Gemfile. Run `bundle install` elsewhere and add the\n" \
+            "updated Gemfile.lock to version control."
+
+      unless explicit_flag
+        msg += "\n\nIf this is a development machine, remove the Gemfile " \
+               "freeze \nby running `bundle install --no-deployment`."
+      end
+
+      added =   []
+      deleted = []
+      changed = []
+
+      if @locked_sources != @sources
+        new_sources = @sources - @locked_sources
+        deleted_sources = @locked_sources - @sources
+
+        if new_sources.any?
+          added.concat new_sources.map { |source| "* source: #{source}" }
+        end
+
+        if deleted_sources.any?
+          deleted.concat deleted_sources.map { |source| "* source: #{source}" }
+        end
+
+        changes = true
+      end
+
+      both_sources = Hash.new { |h,k| h[k] = ["no specified source", "no specified source"] }
+      @dependencies.each { |d| both_sources[d.name][0] = d.source if d.source }
+      @locked_deps.each  { |d| both_sources[d.name][1] = d.source if d.source }
+      both_sources.delete_if { |k,v| v[0] == v[1] }
+
+      if @dependencies != @locked_deps
+        new_deps = @dependencies - @locked_deps
+        deleted_deps = @locked_deps - @dependencies
+
+        if new_deps.any?
+          added.concat new_deps.map { |d| "* #{pretty_dep(d)}" }
+        end
+
+        if deleted_deps.any?
+          deleted.concat deleted_deps.map { |d| "* #{pretty_dep(d)}" }
+        end
+
+        both_sources.each do |name, sources|
+          changed << "* #{name} from `#{sources[0]}` to `#{sources[1]}`"
+        end
+
+        changes = true
+      end
+
+      msg << "\n\nYou have added to the Gemfile:\n"     << added.join("\n") if added.any?
+      msg << "\n\nYou have deleted from the Gemfile:\n" << deleted.join("\n") if deleted.any?
+      msg << "\n\nYou have changed in the Gemfile:\n"   << changed.join("\n") if changed.any?
+      msg << "\n"
+
+      raise ProductionError, msg if added.any? || deleted.any? || changed.any?
+    end
+
+    def validate_ruby!
+      return unless ruby_version
+
+      system_ruby_version = Bundler::SystemRubyVersion.new
+      if diff = ruby_version.diff(system_ruby_version)
+        problem, expected, actual = diff
+
+        msg = case problem
+        when :engine
+          "Your Ruby engine is #{actual}, but your Gemfile specified #{expected}"
+        when :version
+          "Your Ruby version is #{actual}, but your Gemfile specified #{expected}"
+        when :engine_version
+          "Your #{system_ruby_version.engine} version is #{actual}, but your Gemfile specified #{ruby_version.engine} #{expected}"
+        end
+
+        raise RubyVersionMismatch, msg
+      end
+    end
+
+  private
+
+    def nothing_changed?
+      !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes
+    end
+
+    def pretty_dep(dep, source = false)
+      msg  = "#{dep.name}"
+      msg << " (#{dep.requirement})" unless dep.requirement == Gem::Requirement.default
+      msg << " from the `#{dep.source}` source" if source && dep.source
+      msg
+    end
+
+    # Check if the specs of the given source changed
+    # according to the locked source. A block should be
+    # in order to specify how the locked version of
+    # the source should be found.
+    def specs_changed?(source, &block)
+      locked = @locked_sources.find(&block)
+
+      if locked
+        unlocking = locked.specs.any? do |spec|
+          @locked_specs.any? do |locked_spec|
+            locked_spec.source != locked
+          end
+        end
+      end
+
+      !locked || unlocking || source.specs != locked.specs
+    end
+
+    # Get all locals and override their matching sources.
+    # Return true if any of the locals changed (for example,
+    # they point to a new revision) or depend on new specs.
+    def converge_locals
+      locals = []
+
+      Bundler.settings.local_overrides.map do |k,v|
+        spec   = @dependencies.find { |s| s.name == k }
+        source = spec && spec.source
+        if source && source.respond_to?(:local_override!)
+          source.unlock! if @unlock[:gems].include?(spec.name)
+          locals << [ source, source.local_override!(v) ]
+        end
+      end
+
+      locals.any? do |source, changed|
+        changed || specs_changed?(source) { |o| source.class === o.class && source.uri == o.uri }
+      end
+    end
+
+    def converge_paths
+      @sources.any? do |source|
+        next unless source.instance_of?(Source::Path)
+        specs_changed?(source) do |ls|
+          ls.class == source.class && ls.path == source.path
+        end
+      end
+    end
+
+    def converge_sources
+      changes = false
+
+      # Get the Rubygems source from the Gemfile.lock
+      locked_gem = @locked_sources.find { |s| Source::Rubygems === s }
+
+      # Get the Rubygems source from the Gemfile
+      actual_gem = @sources.find { |s| Source::Rubygems === s }
+
+      # If there is a Rubygems source in both
+      if locked_gem && actual_gem
+        # Merge the remotes from the Gemfile into the Gemfile.lock
+        changes = changes | locked_gem.replace_remotes(actual_gem)
+      end
+
+      # Replace the sources from the Gemfile with the sources from the Gemfile.lock,
+      # if they exist in the Gemfile.lock and are `==`. If you can't find an equivalent
+      # source in the Gemfile.lock, use the one from the Gemfile.
+      @sources.map! do |source|
+        @locked_sources.find { |s| s == source } || source
+      end
+      changes = changes | (Set.new(@sources) != Set.new(@locked_sources))
+
+      @sources.each do |source|
+        # If the source is unlockable and the current command allows an unlock of
+        # the source (for example, you are doing a `bundle update <foo>` of a git-pinned
+        # gem), unlock it. For git sources, this means to unlock the revision, which
+        # will cause the `ref` used to be the most recent for the branch (or master) if
+        # an explicit `ref` is not used.
+        if source.respond_to?(:unlock!) && @unlock[:sources].include?(source.name)
+          source.unlock!
+          changes = true
+        end
+      end
+
+      changes
+    end
+
+    def converge_dependencies
+      (@dependencies + @locked_deps).each do |dep|
+        if dep.source
+          dep.source = @sources.find { |s| dep.source == s }
+        end
+      end
+      Set.new(@dependencies) != Set.new(@locked_deps)
+    end
+
+    # Remove elements from the locked specs that are expired. This will most
+    # commonly happen if the Gemfile has changed since the lockfile was last
+    # generated
+    def converge_locked_specs
+      deps = []
+
+      # Build a list of dependencies that are the same in the Gemfile
+      # and Gemfile.lock. If the Gemfile modified a dependency, but
+      # the gem in the Gemfile.lock still satisfies it, this is fine
+      # too.
+      @dependencies.each do |dep|
+        locked_dep = @locked_deps.find { |d| dep == d }
+
+        if in_locked_deps?(dep, locked_dep) || satisfies_locked_spec?(dep)
+          deps << dep
+        elsif dep.source.is_a?(Source::Path) && dep.current_platform? && (!locked_dep || dep.source != locked_dep.source)
+          @locked_specs.each do |s|
+            @unlock[:gems] << s.name if s.source == dep.source
+          end
+
+          dep.source.unlock! if dep.source.respond_to?(:unlock!)
+          dep.source.specs.each { |s| @unlock[:gems] << s.name }
+        end
+      end
+
+      converged = []
+      @locked_specs.each do |s|
+        s.source = @sources.find { |src| s.source == src }
+
+        # Don't add a spec to the list if its source is expired. For example,
+        # if you change a Git gem to Rubygems.
+        next if s.source.nil? || @unlock[:sources].include?(s.name)
+        # If the spec is from a path source and it doesn't exist anymore
+        # then we just unlock it.
+
+        # Path sources have special logic
+        if s.source.instance_of?(Source::Path)
+          other = s.source.specs[s].first
+
+          # If the spec is no longer in the path source, unlock it. This
+          # commonly happens if the version changed in the gemspec
+          next unless other
+
+          deps2 = other.dependencies.select { |d| d.type != :development }
+          # If the dependencies of the path source have changed, unlock it
+          next unless s.dependencies.sort == deps2.sort
+        end
+
+        converged << s
+      end
+
+      resolve = SpecSet.new(converged)
+      resolve = resolve.for(expand_dependencies(deps, true), @unlock[:gems])
+      diff    = @locked_specs.to_a - resolve.to_a
+
+      # Now, we unlock any sources that do not have anymore gems pinned to it
+      @sources.each do |source|
+        next unless source.respond_to?(:unlock!)
+
+        unless resolve.any? { |s| s.source == source }
+          source.unlock! if !diff.empty? && diff.any? { |s| s.source == source }
+        end
+      end
+
+      resolve
+    end
+
+    def in_locked_deps?(dep, d)
+      d && dep.source == d.source
+    end
+
+    def satisfies_locked_spec?(dep)
+      @locked_specs.any? { |s| s.satisfies?(dep) && (!dep.source || s.source == dep.source) }
+    end
+
+    def expanded_dependencies
+      @expanded_dependencies ||= expand_dependencies(dependencies, @remote)
+    end
+
+    def expand_dependencies(dependencies, remote = false)
+      deps = []
+      dependencies.each do |dep|
+        dep = Dependency.new(dep, ">= 0") unless dep.respond_to?(:name)
+        dep.gem_platforms(@platforms).each do |p|
+          deps << DepProxy.new(dep, p) if remote || p == generic(Gem::Platform.local)
+        end
+      end
+      deps
+    end
+
+    def sorted_sources
+      @sources.sort_by do |s|
+        # Place GEM at the top
+        [ s.is_a?(Source::Rubygems) ? 1 : 0, s.to_s ]
+      end
+    end
+
+    def requested_dependencies
+      groups = self.groups - Bundler.settings.without
+      groups.map! { |g| g.to_sym }
+      dependencies.reject { |d| !d.should_include? || (d.groups & groups).empty? }
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/dep_proxy.rb b/misc/lib/bundler-1.3.5/lib/bundler/dep_proxy.rb
new file mode 100644
index 0000000..bc810dc
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/dep_proxy.rb
@@ -0,0 +1,43 @@
+module Bundler
+  class DepProxy
+
+    attr_reader :required_by, :__platform, :dep
+
+    def initialize(dep, platform)
+      @dep, @__platform, @required_by = dep, platform, []
+    end
+
+    def hash
+      @hash ||= dep.hash
+    end
+
+    def ==(o)
+      dep == o.dep && __platform == o.__platform
+    end
+
+    alias eql? ==
+
+    def type
+      @dep.type
+    end
+
+    def name
+      @dep.name
+    end
+
+    def requirement
+      @dep.requirement
+    end
+
+    def to_s
+      "#{name} (#{requirement}) #{__platform}"
+    end
+
+  private
+
+    def method_missing(*args)
+      @dep.send(*args)
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/dependency.rb b/misc/lib/bundler-1.3.5/lib/bundler/dependency.rb
new file mode 100644
index 0000000..7f153f2
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/dependency.rb
@@ -0,0 +1,162 @@
+require 'rubygems/dependency'
+require 'bundler/shared_helpers'
+require 'bundler/rubygems_ext'
+
+module Bundler
+  class Dependency < Gem::Dependency
+    attr_reader :autorequire
+    attr_reader :groups
+    attr_reader :platforms
+
+    PLATFORM_MAP = {
+      :ruby     => Gem::Platform::RUBY,
+      :ruby_18  => Gem::Platform::RUBY,
+      :ruby_19  => Gem::Platform::RUBY,
+      :ruby_20  => Gem::Platform::RUBY,
+      :mri      => Gem::Platform::RUBY,
+      :mri_18   => Gem::Platform::RUBY,
+      :mri_19   => Gem::Platform::RUBY,
+      :mri_20   => Gem::Platform::RUBY,
+      :rbx      => Gem::Platform::RUBY,
+      :jruby    => Gem::Platform::JAVA,
+      :mswin    => Gem::Platform::MSWIN,
+      :mingw    => Gem::Platform::MINGW,
+      :mingw_18 => Gem::Platform::MINGW,
+      :mingw_19 => Gem::Platform::MINGW,
+      :mingw_20 => Gem::Platform::MINGW
+    }.freeze
+
+    def initialize(name, version, options = {}, &blk)
+      type = options["type"] || :runtime
+      super(name, version, type)
+
+      @autorequire = nil
+      @groups      = Array(options["group"] || :default).map { |g| g.to_sym }
+      @source      = options["source"]
+      @platforms   = Array(options["platforms"])
+      @env         = options["env"]
+
+      if options.key?('require')
+        @autorequire = Array(options['require'] || [])
+      end
+    end
+
+    def gem_platforms(valid_platforms)
+      return valid_platforms if @platforms.empty?
+
+      platforms = []
+      @platforms.each do |p|
+        platform = PLATFORM_MAP[p]
+        next unless valid_platforms.include?(platform)
+        platforms |= [platform]
+      end
+      platforms
+    end
+
+    def should_include?
+      current_env? && current_platform?
+    end
+
+    def current_env?
+      return true unless @env
+      if Hash === @env
+        @env.all? do |key, val|
+          ENV[key.to_s] && (String === val ? ENV[key.to_s] == val : ENV[key.to_s] =~ val)
+        end
+      else
+        ENV[@env.to_s]
+      end
+    end
+
+    def current_platform?
+      return true if @platforms.empty?
+      @platforms.any? { |p| send("#{p}?") }
+    end
+
+    def to_lock
+      out = super
+      out << '!' if source
+      out << "\n"
+    end
+
+  private
+
+    def on_18?
+      RUBY_VERSION =~ /^1\.8/
+    end
+
+    def on_19?
+      RUBY_VERSION =~ /^1\.9/
+    end
+
+    def on_20?
+      RUBY_VERSION =~ /^2\.0/
+    end
+
+    def ruby?
+      !mswin? && (!defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby" || RUBY_ENGINE == "rbx" || RUBY_ENGINE == "maglev")
+    end
+
+    def ruby_18?
+      ruby? && on_18?
+    end
+
+    def ruby_19?
+      ruby? && on_19?
+    end
+
+    def ruby_20?
+      ruby? && on_20?
+    end
+
+    def mri?
+      !mswin? && (!defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby")
+    end
+
+    def mri_18?
+      mri? && on_18?
+    end
+
+    def mri_19?
+      mri? && on_19?
+    end
+
+
+    def mri_20?
+      mri? && on_20?
+    end
+
+    def rbx?
+      ruby? && defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx"
+    end
+
+    def jruby?
+      defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
+    end
+
+    def maglev?
+      defined?(RUBY_ENGINE) && RUBY_ENGINE == "maglev"
+    end
+
+    def mswin?
+      Bundler::WINDOWS
+    end
+
+    def mingw?
+      Bundler::WINDOWS && Gem::Platform.local.os == "mingw32"
+    end
+
+    def mingw_18?
+      mingw? && on_18?
+    end
+
+    def mingw_19?
+      mingw? && on_19?
+    end
+
+    def mingw_20?
+      mingw? && on_20?
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/deployment.rb b/misc/lib/bundler-1.3.5/lib/bundler/deployment.rb
new file mode 100644
index 0000000..1a82514
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/deployment.rb
@@ -0,0 +1,59 @@
+module Bundler
+  class Deployment
+    def self.define_task(context, task_method = :task, opts = {})
+      if defined?(Capistrano) && context.is_a?(Capistrano::Configuration)
+        context_name = "capistrano"
+        role_default = "{:except => {:no_release => true}}"
+        error_type = ::Capistrano::CommandError
+      else
+        context_name = "vlad"
+        role_default = "[:app]"
+        error_type = ::Rake::CommandFailedError
+      end
+
+      roles = context.fetch(:bundle_roles, false)
+      opts[:roles] = roles if roles
+
+      context.send :namespace, :bundle do
+        send :desc, <<-DESC
+          Install the current Bundler environment. By default, gems will be \
+          installed to the shared/bundle path. Gems in the development and \
+          test group will not be installed. The install command is executed \
+          with the --deployment and --quiet flags. If the bundle cmd cannot \
+          be found then you can override the bundle_cmd variable to specifiy \
+          which one it should use. The base path to the app is fetched from \
+          the :latest_release variable. Set it for custom deploy layouts.
+
+          You can override any of these defaults by setting the variables shown below.
+
+          N.B. bundle_roles must be defined before you require 'bundler/#{context_name}' \
+          in your deploy.rb file.
+
+            set :bundle_gemfile,  "Gemfile"
+            set :bundle_dir,      File.join(fetch(:shared_path), 'bundle')
+            set :bundle_flags,    "--deployment --quiet"
+            set :bundle_without,  [:development, :test]
+            set :bundle_cmd,      "bundle" # e.g. "/opt/ruby/bin/bundle"
+            set :bundle_roles,    #{role_default} # e.g. [:app, :batch]
+        DESC
+        send task_method, :install, opts do
+          bundle_cmd     = context.fetch(:bundle_cmd, "bundle")
+          bundle_flags   = context.fetch(:bundle_flags, "--deployment --quiet")
+          bundle_dir     = context.fetch(:bundle_dir, File.join(context.fetch(:shared_path), 'bundle'))
+          bundle_gemfile = context.fetch(:bundle_gemfile, "Gemfile")
+          bundle_without = [*context.fetch(:bundle_without, [:development, :test])].compact
+          app_path = context.fetch(:latest_release)
+          if app_path.to_s.empty?
+            raise error_type.new("Cannot detect current release path - make sure you have deployed at least once.")
+          end
+          args = ["--gemfile #{File.join(app_path, bundle_gemfile)}"]
+          args << "--path #{bundle_dir}" unless bundle_dir.to_s.empty?
+          args << bundle_flags.to_s
+          args << "--without #{bundle_without.join(" ")}" unless bundle_without.empty?
+
+          run "cd #{app_path} && #{bundle_cmd} install #{args.join(' ')}"
+        end
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/deprecate.rb b/misc/lib/bundler-1.3.5/lib/bundler/deprecate.rb
new file mode 100644
index 0000000..e6e15b6
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/deprecate.rb
@@ -0,0 +1,15 @@
+module Bundler
+
+  if defined? ::Deprecate
+    Deprecate = ::Deprecate
+  elsif defined? Gem::Deprecate
+    Deprecate = Gem::Deprecate
+  else
+    class Deprecate; end
+  end
+
+  unless Deprecate.respond_to?(:skip_during)
+    def Deprecate.skip_during; yield; end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/dsl.rb b/misc/lib/bundler-1.3.5/lib/bundler/dsl.rb
new file mode 100644
index 0000000..1de9fb7
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/dsl.rb
@@ -0,0 +1,258 @@
+require 'bundler/dependency'
+
+module Bundler
+  class Dsl
+    include RubyDsl
+
+    def self.evaluate(gemfile, lockfile, unlock)
+      builder = new
+      builder.eval_gemfile(gemfile)
+      builder.to_definition(lockfile, unlock)
+    end
+
+    VALID_PLATFORMS = Bundler::Dependency::PLATFORM_MAP.keys.freeze
+
+    attr_accessor :dependencies
+
+    def initialize
+      @rubygems_source = Source::Rubygems.new
+      @source          = nil
+      @sources         = []
+      @dependencies    = []
+      @groups          = []
+      @platforms       = []
+      @env             = nil
+      @ruby_version    = nil
+    end
+
+    def eval_gemfile(gemfile, contents = nil)
+      contents ||= Bundler.read_file(gemfile.to_s)
+      instance_eval(contents, gemfile.to_s, 1)
+    rescue SyntaxError => e
+      bt = e.message.split("\n")[1..-1]
+      raise GemfileError, ["Gemfile syntax error:", *bt].join("\n")
+    rescue ScriptError, RegexpError, NameError, ArgumentError => e
+      e.backtrace[0] = "#{e.backtrace[0]}: #{e.message} (#{e.class})"
+      Bundler.ui.warn e.backtrace.join("\n       ")
+      raise GemfileError, "There was an error in your Gemfile," \
+        " and Bundler cannot continue."
+    end
+
+    def gemspec(opts = nil)
+      path              = opts && opts[:path] || '.'
+      name              = opts && opts[:name] || '{,*}'
+      development_group = opts && opts[:development_group] || :development
+      path              = File.expand_path(path, Bundler.default_gemfile.dirname)
+      gemspecs = Dir[File.join(path, "#{name}.gemspec")]
+
+      case gemspecs.size
+      when 1
+        spec = Bundler.load_gemspec(gemspecs.first)
+        raise InvalidOption, "There was an error loading the gemspec at #{gemspecs.first}." unless spec
+        gem spec.name, :path => path
+        group(development_group) do
+          spec.development_dependencies.each do |dep|
+            gem dep.name, *(dep.requirement.as_list + [:type => :development])
+          end
+        end
+      when 0
+        raise InvalidOption, "There are no gemspecs at #{path}."
+      else
+        raise InvalidOption, "There are multiple gemspecs at #{path}. Please use the :name option to specify which one."
+      end
+    end
+
+    def gem(name, *args)
+      if name.is_a?(Symbol)
+        raise GemfileError, %{You need to specify gem names as Strings. Use 'gem "#{name.to_s}"' instead.}
+      end
+
+      options = Hash === args.last ? args.pop : {}
+      version = args
+
+      _normalize_options(name, version, options)
+
+      dep = Dependency.new(name, version, options)
+
+      # if there's already a dependency with this name we try to prefer one
+      if current = @dependencies.find { |d| d.name == dep.name }
+        if current.requirement != dep.requirement
+          if current.type == :development
+            @dependencies.delete current
+          elsif dep.type == :development
+            return
+          else
+            raise GemfileError, "You cannot specify the same gem twice with different version requirements. \n" \
+                            "You specified: #{current.name} (#{current.requirement}) and " \
+                            "#{dep.name} (#{dep.requirement})\n"
+          end
+        end
+
+        if current.source != dep.source
+          if current.type == :development
+            @dependencies.delete current
+          elsif dep.type == :development
+            return
+          else
+            raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \
+                            "You specified that #{dep.name} (#{dep.requirement}) should come from " \
+                            "#{current.source || 'an unspecified source'} and #{dep.source}\n"
+          end
+        end
+      end
+
+      @dependencies << dep
+    end
+
+    def source(source, options = {})
+      case source
+      when :gemcutter, :rubygems, :rubyforge then
+        Bundler.ui.warn "The source :#{source} is deprecated because HTTP " \
+          "requests are insecure.\nPlease change your source to 'https://" \
+          "rubygems.org' if possible, or 'http://rubygems.org' if not."
+        @rubygems_source.add_remote "http://rubygems.org"
+        return
+      when String
+        @rubygems_source.add_remote source
+        return
+      else
+        @source = source
+        if options[:prepend]
+          @sources = [@source] | @sources
+        else
+          @sources = @sources | [@source]
+        end
+
+        yield if block_given?
+        return @source
+      end
+    ensure
+      @source = nil
+    end
+
+    def path(path, options = {}, source_options = {}, &blk)
+      source Source::Path.new(_normalize_hash(options).merge("path" => Pathname.new(path))), source_options, &blk
+    end
+
+    def git(uri, options = {}, source_options = {}, &blk)
+      unless block_given?
+        msg = "You can no longer specify a git source by itself. Instead, \n" \
+              "either use the :git option on a gem, or specify the gems that \n" \
+              "bundler should find in the git source by passing a block to \n" \
+              "the git method, like: \n\n" \
+              "  git 'git://github.com/rails/rails.git' do\n" \
+              "    gem 'rails'\n" \
+              "  end"
+        raise DeprecatedError, msg
+      end
+
+      source Source::Git.new(_normalize_hash(options).merge("uri" => uri)), source_options, &blk
+    end
+
+    def to_definition(lockfile, unlock)
+      @sources << @rubygems_source unless @sources.include?(@rubygems_source)
+      Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version)
+    end
+
+    def group(*args, &blk)
+      @groups.concat args
+      yield
+    ensure
+      args.each { @groups.pop }
+    end
+
+    def platforms(*platforms)
+      @platforms.concat platforms
+      yield
+    ensure
+      platforms.each { @platforms.pop }
+    end
+    alias_method :platform, :platforms
+
+    def env(name)
+      @env, old = name, @env
+      yield
+    ensure
+      @env = old
+    end
+
+    def method_missing(name, *args)
+      location = caller[0].split(':')[0..1].join(':')
+      raise GemfileError, "Undefined local variable or method `#{name}' for Gemfile\n" \
+        "        from #{location}"
+    end
+
+  private
+
+    def _normalize_hash(opts)
+      # Cannot modify a hash during an iteration in 1.9
+      opts.keys.each do |k|
+        next if String === k
+        v = opts[k]
+        opts.delete(k)
+        opts[k.to_s] = v
+      end
+      opts
+    end
+
+    def _normalize_options(name, version, opts)
+      _normalize_hash(opts)
+
+      valid_keys = %w(group groups git gist github path name branch ref tag require submodules platform platforms type)
+      invalid_keys = opts.keys - valid_keys
+      if invalid_keys.any?
+        plural = invalid_keys.size > 1
+        message = "You passed #{invalid_keys.map{|k| ':'+k }.join(", ")} "
+        if plural
+          message << "as options for gem '#{name}', but they are invalid."
+        else
+          message << "as an option for gem '#{name}', but it is invalid."
+        end
+
+        message << " Valid options are: #{valid_keys.join(", ")}"
+        raise InvalidOption, message
+      end
+
+      groups = @groups.dup
+      opts["group"] = opts.delete("groups") || opts["group"]
+      groups.concat Array(opts.delete("group"))
+      groups = [:default] if groups.empty?
+
+      platforms = @platforms.dup
+      opts["platforms"] = opts["platform"] || opts["platforms"]
+      platforms.concat Array(opts.delete("platforms"))
+      platforms.map! { |p| p.to_sym }
+      platforms.each do |p|
+        next if VALID_PLATFORMS.include?(p)
+        raise GemfileError, "`#{p}` is not a valid platform. The available options are: #{VALID_PLATFORMS.inspect}"
+      end
+
+      if github = opts.delete("github")
+        github = "#{github}/#{github}" unless github.include?("/")
+        opts["git"] = "git://github.com/#{github}.git"
+      end
+
+      if gist = opts.delete("gist")
+        opts["git"] = "https://gist.github.com/#{gist}.git"
+      end
+
+      ["git", "path"].each do |type|
+        if param = opts[type]
+          if version.first && version.first =~ /^\s*=?\s*(\d[^\s]*)\s*$/
+            options = opts.merge("name" => name, "version" => $1)
+          else
+            options = opts.dup
+          end
+          source = send(type, param, options, :prepend => true) {}
+          opts["source"] = source
+        end
+      end
+
+      opts["source"]  ||= @source
+      opts["env"]     ||= @env
+      opts["platforms"] = platforms.dup
+      opts["group"]     = groups
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/endpoint_specification.rb b/misc/lib/bundler-1.3.5/lib/bundler/endpoint_specification.rb
new file mode 100644
index 0000000..c88d341
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/endpoint_specification.rb
@@ -0,0 +1,78 @@
+require 'uri'
+
+module Bundler
+  # used for Creating Specifications from the Gemcutter Endpoint
+  class EndpointSpecification < Gem::Specification
+    include MatchPlatform
+
+    attr_reader :name, :version, :platform, :dependencies
+    attr_accessor :source
+
+    def initialize(name, version, platform, dependencies)
+      @name         = name
+      @version      = version
+      @platform     = platform
+      @dependencies = dependencies
+    end
+
+    def fetch_platform
+      @platform
+    end
+
+    # needed for standalone, load required_paths from local gemspec
+    # after the gem in installed
+    def require_paths
+      if @remote_specification
+        @remote_specification.require_paths
+      elsif _local_specification
+        _local_specification.require_paths
+      else
+        super
+      end
+    end
+
+    # needed for binstubs
+    def executables
+      if @remote_specification
+        @remote_specification.executables
+      elsif _local_specification
+        _local_specification.executables
+      else
+        super
+      end
+    end
+
+    # needed for bundle clean
+    def bindir
+      if @remote_specification
+        @remote_specification.bindir
+      elsif _local_specification
+        _local_specification.bindir
+      else
+        super
+      end
+    end
+
+    # needed for post_install_messages during install
+    def post_install_message
+      if @remote_specification
+        @remote_specification.post_install_message
+      elsif _local_specification
+        _local_specification.post_install_message
+      end
+    end
+
+    def _local_specification
+      eval(File.read(local_specification_path)) if @loaded_from && File.exists?(local_specification_path)
+    end
+
+    def __swap__(spec)
+      @remote_specification = spec
+    end
+
+    private
+    def local_specification_path
+      "#{base_dir}/specifications/#{full_name}.gemspec"
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/env.rb b/misc/lib/bundler-1.3.5/lib/bundler/env.rb
new file mode 100644
index 0000000..0f6f315
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/env.rb
@@ -0,0 +1,56 @@
+module Bundler
+  class Env
+
+    def write(io)
+      io.write(report)
+    end
+
+    def report
+      out = "Bundler #{Bundler::VERSION}\n"
+
+      out << "Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}"
+      out << " patchlevel #{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
+      out << ") [#{RUBY_PLATFORM}]\n"
+
+      out << "Rubygems #{Gem::VERSION}\n"
+
+      out << "rvm #{ENV['rvm_version']}\n" if ENV['rvm_version']
+
+      out << "GEM_HOME #{ENV['GEM_HOME']}\n"
+
+      out << "GEM_PATH #{ENV['GEM_PATH']}\n" unless ENV['GEM_PATH'] == ENV['GEM_HOME']
+
+      %w(rubygems-bundler open_gem).each do |name|
+        specs = Gem::Specification.find_all{|s| s.name == name }
+        out << "#{name} (#{specs.map(&:version).join(',')})\n" unless specs.empty?
+      end
+
+      out << "\nBundler settings\n" unless Bundler.settings.all.empty?
+      Bundler.settings.all.each do |setting|
+        out << "  #{setting}\n"
+        Bundler.settings.pretty_values_for(setting).each do |line|
+          out << "    " << line << "\n"
+        end
+      end
+
+      out << "\n\n" << "Gemfile\n"
+      out << read_file("Gemfile") << "\n"
+
+      out << "\n\n" << "Gemfile.lock\n"
+      out << read_file("Gemfile.lock") << "\n"
+
+      out
+    end
+
+  private
+
+    def read_file(filename)
+      File.read(filename).strip
+    rescue Errno::ENOENT
+      "<No #{filename} found>"
+    rescue => e
+      "#{e.class}: #{e.message}"
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/environment.rb b/misc/lib/bundler-1.3.5/lib/bundler/environment.rb
new file mode 100644
index 0000000..76e2636
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/environment.rb
@@ -0,0 +1,42 @@
+module Bundler
+  class Environment
+    attr_reader :root
+
+    def initialize(root, definition)
+      @root = root
+      @definition = definition
+
+      env_file = Bundler.app_config_path.join('environment.rb')
+      env_file.rmtree if env_file.exist?
+    end
+
+    def inspect
+      @definition.to_lock.inspect
+    end
+
+    def requested_specs
+      @definition.requested_specs
+    end
+
+    def specs
+      @definition.specs
+    end
+
+    def dependencies
+      @definition.dependencies
+    end
+
+    def current_dependencies
+      @definition.current_dependencies
+    end
+
+    def lock
+      @definition.lock(Bundler.default_lockfile)
+    end
+
+    def update(*gems)
+      # Nothing
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/fetcher.rb b/misc/lib/bundler-1.3.5/lib/bundler/fetcher.rb
new file mode 100644
index 0000000..f5ad034
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/fetcher.rb
@@ -0,0 +1,301 @@
+require 'bundler/vendored_persistent'
+
+module Bundler
+
+  # Handles all the fetching with the rubygems server
+  class Fetcher
+    # How many redirects to allew in one request
+    REDIRECT_LIMIT = 5
+    # how long to wait for each gemcutter API call
+    API_TIMEOUT = 10
+
+    # This error is raised if the API returns a 413 (only printed in verbose)
+    class FallbackError < HTTPError; end
+    # This is the error raised if OpenSSL fails the cert verification
+    class CertificateFailureError < HTTPError
+      def initialize(remote_uri)
+        super "Could not verify the SSL certificate for #{remote_uri}.\nThere" \
+          " is a chance you are experiencing a man-in-the-middle attack, but" \
+          " most likely your system doesn't have the CA certificates needed" \
+          " for verification. For information about OpenSSL certificates, see" \
+          " bit.ly/ruby-ssl. To connect without using SSL, edit your Gemfile" \
+          " sources and change 'https' to 'http'."
+      end
+    end
+    # This is the error raised when a source is HTTPS and OpenSSL didn't load
+    class SSLError < HTTPError
+      def initialize(msg = nil)
+        super msg || "Could not load OpenSSL.\n" \
+            "You must recompile Ruby with OpenSSL support or change the sources in your " \
+            "Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL " \
+            "using RVM are available at rvm.io/packages/openssl."
+      end
+    end
+
+    class << self
+      attr_accessor :disable_endpoint
+
+      @@spec_fetch_map ||= {}
+
+      def fetch(spec)
+        spec, uri = @@spec_fetch_map[spec.full_name]
+        if spec
+          path = download_gem_from_uri(spec, uri)
+          s = Bundler.rubygems.spec_from_gem(path, Bundler.settings["trust-policy"])
+          spec.__swap__(s)
+        end
+      end
+
+      def download_gem_from_uri(spec, uri)
+        spec.fetch_platform
+
+        download_path = Bundler.requires_sudo? ? Bundler.tmp : Bundler.rubygems.gem_dir
+        gem_path = "#{Bundler.rubygems.gem_dir}/cache/#{spec.full_name}.gem"
+
+        FileUtils.mkdir_p("#{download_path}/cache")
+        Bundler.rubygems.download_gem(spec, uri, download_path)
+
+        if Bundler.requires_sudo?
+          Bundler.mkdir_p "#{Bundler.rubygems.gem_dir}/cache"
+          Bundler.sudo "mv #{Bundler.tmp}/cache/#{spec.full_name}.gem #{gem_path}"
+        end
+
+        gem_path
+      end
+    end
+
+    def initialize(remote_uri)
+      @remote_uri = remote_uri
+      @public_uri = remote_uri.dup
+      @public_uri.user, @public_uri.password = nil, nil # don't print these
+      if defined?(Net::HTTP::Persistent)
+        @connection = Net::HTTP::Persistent.new 'bundler', :ENV
+        @connection.verify_mode = (Bundler.settings[:ssl_verify_mode] ||
+          OpenSSL::SSL::VERIFY_PEER)
+        @connection.cert_store = bundler_cert_store
+      else
+        raise SSLError if @remote_uri.scheme == "https"
+        @connection = Net::HTTP.new(@remote_uri.host, @remote_uri.port)
+      end
+      @connection.read_timeout = API_TIMEOUT
+
+      Socket.do_not_reverse_lookup = true
+    end
+
+    # fetch a gem specification
+    def fetch_spec(spec)
+      spec = spec - [nil, 'ruby', '']
+      spec_file_name = "#{spec.join '-'}.gemspec.rz"
+
+      uri = URI.parse("#{@remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}")
+
+      spec_rz = (uri.scheme == "file") ? Gem.read_binary(uri.path) : fetch(uri)
+      Bundler.load_marshal Gem.inflate(spec_rz)
+    rescue MarshalError => e
+      raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \
+        "Your network or your gem server is probably having issues right now."
+    end
+
+    # return the specs in the bundler format as an index
+    def specs(gem_names, source)
+      index = Index.new
+      use_full_source_index = !gem_names || @remote_uri.scheme == "file" || Bundler::Fetcher.disable_endpoint
+
+      if gem_names && use_api
+        Bundler.ui.info "Fetching gem metadata from #{@public_uri}", Bundler.ui.debug?
+        specs = fetch_remote_specs(gem_names)
+        # new line now that the dots are over
+        Bundler.ui.info "" if specs && !Bundler.ui.debug?
+      end
+
+      if specs.nil?
+        # API errors mean we should treat this as a non-API source
+        @use_api = false
+
+        Bundler.ui.info "Fetching source index from #{@public_uri}"
+        specs = fetch_all_remote_specs
+      end
+
+      specs[@remote_uri].each do |name, version, platform, dependencies|
+        next if name == 'bundler'
+        spec = nil
+        if dependencies
+          spec = EndpointSpecification.new(name, version, platform, dependencies)
+        else
+          spec = RemoteSpecification.new(name, version, platform, self)
+        end
+        spec.source = source
+        @@spec_fetch_map[spec.full_name] = [spec, @remote_uri]
+        index << spec
+      end
+
+      index
+    rescue CertificateFailureError => e
+      Bundler.ui.info "" if gem_names && use_api # newline after dots
+      raise e
+    end
+
+    # fetch index
+    def fetch_remote_specs(gem_names, full_dependency_list = [], last_spec_list = [])
+      query_list = gem_names - full_dependency_list
+
+      # only display the message on the first run
+      if Bundler.ui.debug?
+        Bundler.ui.debug "Query List: #{query_list.inspect}"
+      else
+        Bundler.ui.info ".", false
+      end
+
+      return {@remote_uri => last_spec_list} if query_list.empty?
+
+      spec_list, deps_list = fetch_dependency_remote_specs(query_list)
+      returned_gems = spec_list.map {|spec| spec.first }.uniq
+
+      fetch_remote_specs(deps_list, full_dependency_list + returned_gems, spec_list + last_spec_list)
+    # fall back to the legacy index in the following cases
+    # 1. Gemcutter Endpoint doesn't return a 200
+    # 2. Marshal blob doesn't load properly
+    # 3. One of the YAML gemspecs has the Syck::DefaultKey problem
+    rescue HTTPError, MarshalError, GemspecError => e
+      @use_api = false
+
+      # new line now that the dots are over
+      Bundler.ui.info "" unless Bundler.ui.debug?
+
+      Bundler.ui.debug "Error during API request. #{e.class}: #{e.message}"
+      Bundler.ui.debug e.backtrace.join("  ")
+
+      return nil
+    end
+
+    def use_api
+      return @use_api if defined?(@use_api)
+
+      if @remote_uri.scheme == "file" || Bundler::Fetcher.disable_endpoint
+        @use_api = false
+      elsif fetch(dependency_api_uri)
+        @use_api = true
+      end
+    rescue HTTPError
+      @use_api = false
+    end
+
+    def inspect
+      "#<#{self.class}:0x#{object_id} uri=#{@public_uri.to_s}>"
+    end
+
+  private
+
+    HTTP_ERRORS = [
+      Timeout::Error, EOFError, SocketError,
+      Errno::EINVAL, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::EAGAIN,
+      Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError
+    ]
+    HTTP_ERRORS << Net::HTTP::Persistent::Error if defined?(Net::HTTP::Persistent)
+
+    def fetch(uri, counter = 0)
+      raise HTTPError, "Too many redirects" if counter >= REDIRECT_LIMIT
+
+      begin
+        Bundler.ui.debug "Fetching from: #{uri}"
+        if defined?(Net::HTTP::Persistent)
+          response = @connection.request(uri)
+        else
+          req = Net::HTTP::Get.new uri.request_uri
+          req.basic_auth(uri.user, uri.password) if uri.user && uri.password
+          response = @connection.request(req)
+        end
+      rescue OpenSSL::SSL::SSLError
+        raise CertificateFailureError.new(@public_uri)
+      rescue *HTTP_ERRORS
+        raise HTTPError, "Network error while fetching #{uri}"
+      end
+
+      case response
+      when Net::HTTPRedirection
+        Bundler.ui.debug("HTTP Redirection")
+        new_uri = URI.parse(response["location"])
+        if new_uri.host == uri.host
+          new_uri.user = uri.user
+          new_uri.password = uri.password
+        end
+        fetch(new_uri, counter + 1)
+      when Net::HTTPSuccess
+        Bundler.ui.debug("HTTP Success")
+        response.body
+      when Net::HTTPRequestEntityTooLarge
+        raise FallbackError, response.body
+      else
+        raise HTTPError, "#{response.class}: #{response.body}"
+      end
+    end
+
+    def dependency_api_uri(gem_names = [])
+      url = "#{@remote_uri}api/v1/dependencies"
+      url << "?gems=#{URI.encode(gem_names.join(","))}" if gem_names.any?
+      URI.parse(url)
+    end
+
+    # fetch from Gemcutter Dependency Endpoint API
+    def fetch_dependency_remote_specs(gem_names)
+      Bundler.ui.debug "Query Gemcutter Dependency Endpoint API: #{gem_names.join(',')}"
+      marshalled_deps = fetch dependency_api_uri(gem_names)
+      gem_list = Bundler.load_marshal(marshalled_deps)
+      deps_list = []
+
+      spec_list = gem_list.map do |s|
+        dependencies = s[:dependencies].map do |name, requirement|
+          dep = well_formed_dependency(name, requirement.split(", "))
+          deps_list << dep.name
+          dep
+        end
+
+        [s[:name], Gem::Version.new(s[:number]), s[:platform], dependencies]
+      end
+
+      [spec_list, deps_list.uniq]
+    end
+
+    # fetch from modern index: specs.4.8.gz
+    def fetch_all_remote_specs
+      Bundler.rubygems.sources = ["#{@remote_uri}"]
+      Bundler.rubygems.fetch_all_remote_specs
+    rescue Gem::RemoteFetcher::FetchError, OpenSSL::SSL::SSLError => e
+      if e.message.match("certificate verify failed")
+        raise CertificateFailureError.new(@public_uri)
+      else
+        Bundler.ui.trace e
+        raise HTTPError, "Could not fetch specs from #{@public_uri}"
+      end
+    end
+
+    def well_formed_dependency(name, *requirements)
+      Gem::Dependency.new(name, *requirements)
+    rescue ArgumentError => e
+      illformed = 'Ill-formed requirement ["#<YAML::Syck::DefaultKey'
+      raise e unless e.message.include?(illformed)
+      puts # we shouldn't print the error message on the "fetching info" status line
+      raise GemspecError,
+        "Unfortunately, the gem #{s[:name]} (#{s[:number]}) has an invalid " \
+        "gemspec. \nPlease ask the gem author to yank the bad version to fix " \
+        "this issue. For more information, see http://bit.ly/syck-defaultkey."
+    end
+
+    def bundler_cert_store
+      store = OpenSSL::X509::Store.new
+      if Bundler.settings[:ssl_ca_cert]
+        if File.directory? Bundler.settings[:ssl_ca_cert]
+          store.add_path Bundler.settings[:ssl_ca_cert]
+        else
+          store.add_file Bundler.settings[:ssl_ca_cert]
+        end
+      else
+        store.set_default_paths
+        certs = File.expand_path("../ssl_certs/*.pem", __FILE__)
+        Dir.glob(certs).each { |c| store.add_file c }
+      end
+      store
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/friendly_errors.rb b/misc/lib/bundler-1.3.5/lib/bundler/friendly_errors.rb
new file mode 100644
index 0000000..1a8b9aa
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/friendly_errors.rb
@@ -0,0 +1,31 @@
+module Bundler
+  def self.with_friendly_errors
+    yield
+  rescue Bundler::BundlerError => e
+    Bundler.ui.error e.message, :wrap => true
+    Bundler.ui.trace e
+    exit e.status_code
+  rescue LoadError => e
+    raise e unless e.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/
+    Bundler.ui.error "\nCould not load OpenSSL."
+    Bundler.ui.warn <<-WARN, :wrap => true
+      You must recompile Ruby with OpenSSL support or change the sources in your \
+      Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL \
+      using RVM are available at rvm.io/packages/openssl.
+    WARN
+    Bundler.ui.trace e
+    exit 1
+  rescue Interrupt => e
+    Bundler.ui.error "\nQuitting..."
+    Bundler.ui.trace e
+    exit 1
+  rescue SystemExit => e
+    exit e.status
+  rescue Exception => e
+    Bundler.ui.error <<-ERR, :wrap => true
+      Unfortunately, a fatal error has occurred. Please see the Bundler \
+      troubleshooting documentation at http://bit.ly/bundler-issues. Thanks!
+    ERR
+    raise e
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/gem_helper.rb b/misc/lib/bundler-1.3.5/lib/bundler/gem_helper.rb
new file mode 100644
index 0000000..dc9897b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/gem_helper.rb
@@ -0,0 +1,170 @@
+$:.unshift File.expand_path('../vendor', __FILE__)
+require 'thor'
+require 'bundler'
+
+module Bundler
+  class GemHelper
+    include Rake::DSL if defined? Rake::DSL
+
+    class << self
+      # set when install'd.
+      attr_accessor :instance
+
+      def install_tasks(opts = {})
+        new(opts[:dir], opts[:name]).install
+      end
+
+      def gemspec(&block)
+        gemspec = instance.gemspec
+        block.call(gemspec) if block
+        gemspec
+      end
+    end
+
+    attr_reader :spec_path, :base, :gemspec
+
+    def initialize(base = nil, name = nil)
+      Bundler.ui = UI::Shell.new
+      @base = (base ||= Dir.pwd)
+      gemspecs = name ? [File.join(base, "#{name}.gemspec")] : Dir[File.join(base, "{,*}.gemspec")]
+      raise "Unable to determine name from existing gemspec. Use :name => 'gemname' in #install_tasks to manually set it." unless gemspecs.size == 1
+      @spec_path = gemspecs.first
+      @gemspec = Bundler.load_gemspec(@spec_path)
+    end
+
+    def install
+      built_gem_path = nil
+
+      desc "Build #{name}-#{version}.gem into the pkg directory."
+      task 'build' do
+        built_gem_path = build_gem
+      end
+
+      desc "Build and install #{name}-#{version}.gem into system gems."
+      task 'install' => 'build' do
+        install_gem(built_gem_path)
+      end
+
+      desc "Create tag #{version_tag} and build and push #{name}-#{version}.gem to Rubygems"
+      task 'release' => 'build' do
+        release_gem(built_gem_path)
+      end
+
+      GemHelper.instance = self
+    end
+
+    def build_gem
+      file_name = nil
+      sh("gem build -V '#{spec_path}'") { |out, code|
+        file_name = File.basename(built_gem_path)
+        FileUtils.mkdir_p(File.join(base, 'pkg'))
+        FileUtils.mv(built_gem_path, 'pkg')
+        Bundler.ui.confirm "#{name} #{version} built to pkg/#{file_name}."
+      }
+      File.join(base, 'pkg', file_name)
+    end
+
+    def install_gem(built_gem_path=nil)
+      built_gem_path ||= build_gem
+      out, _ = sh_with_code("gem install '#{built_gem_path}' --local")
+      raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output" unless out[/Successfully installed/]
+      Bundler.ui.confirm "#{name} (#{version}) installed."
+    end
+
+    def release_gem(built_gem_path=nil)
+      guard_clean
+      built_gem_path ||= build_gem
+      tag_version { git_push } unless already_tagged?
+      rubygem_push(built_gem_path) if gem_push?
+    end
+
+    protected
+    def rubygem_push(path)
+      if Pathname.new("~/.gem/credentials").expand_path.exist?
+        sh("gem push '#{path}'")
+        Bundler.ui.confirm "Pushed #{name} #{version} to rubygems.org."
+      else
+        raise "Your rubygems.org credentials aren't set. Run `gem push` to set them."
+      end
+    end
+
+    def built_gem_path
+      Dir[File.join(base, "#{name}-*.gem")].sort_by{|f| File.mtime(f)}.last
+    end
+
+    def git_push
+      perform_git_push
+      perform_git_push ' --tags'
+      Bundler.ui.confirm "Pushed git commits and tags."
+    end
+
+    def perform_git_push(options = '')
+      cmd = "git push #{options}"
+      out, code = sh_with_code(cmd)
+      raise "Couldn't git push. `#{cmd}' failed with the following output:\n\n#{out}\n" unless code == 0
+    end
+
+    def already_tagged?
+      if sh('git tag').split(/\n/).include?(version_tag)
+        Bundler.ui.confirm "Tag #{version_tag} has already been created."
+        true
+      end
+    end
+
+    def guard_clean
+      clean? && committed? or raise("There are files that need to be committed first.")
+    end
+
+    def clean?
+      sh_with_code("git diff --exit-code")[1] == 0
+    end
+
+    def committed?
+      sh_with_code("git diff-index --quiet --cached HEAD")[1] == 0
+    end
+
+    def tag_version
+      sh "git tag -a -m \"Version #{version}\" #{version_tag}"
+      Bundler.ui.confirm "Tagged #{version_tag}."
+      yield if block_given?
+    rescue
+      Bundler.ui.error "Untagging #{version_tag} due to error."
+      sh_with_code "git tag -d #{version_tag}"
+      raise
+    end
+
+    def version
+      gemspec.version
+    end
+
+    def version_tag
+      "v#{version}"
+    end
+
+    def name
+      gemspec.name
+    end
+
+    def sh(cmd, &block)
+      out, code = sh_with_code(cmd, &block)
+      code == 0 ? out : raise(out.empty? ? "Running `#{cmd}' failed. Run this command directly for more detailed output." : out)
+    end
+
+    def sh_with_code(cmd, &block)
+      cmd << " 2>&1"
+      outbuf = ''
+      Bundler.ui.debug(cmd)
+      Dir.chdir(base) {
+        outbuf = `#{cmd}`
+        if $? == 0
+          block.call(outbuf) if block
+        end
+      }
+      [outbuf, $?]
+    end
+
+    def gem_push?
+      ! %w{n no nil false off 0}.include?(ENV['gem_push'].to_s.downcase)
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/gem_helpers.rb b/misc/lib/bundler-1.3.5/lib/bundler/gem_helpers.rb
new file mode 100644
index 0000000..5eff233
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/gem_helpers.rb
@@ -0,0 +1,23 @@
+module Bundler
+  module GemHelpers
+
+    GENERIC_CACHE = {}
+    GENERICS = [
+      Gem::Platform.new('java'),
+      Gem::Platform.new('mswin32'),
+      Gem::Platform.new('x86-mingw32'),
+      Gem::Platform::RUBY
+    ]
+
+    def generic(p)
+      return p if p == Gem::Platform::RUBY
+
+      GENERIC_CACHE[p] ||= begin
+        found = GENERICS.find do |p2|
+          p2.is_a?(Gem::Platform) && p.os == p2.os
+        end
+        found || Gem::Platform::RUBY
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/gem_installer.rb b/misc/lib/bundler-1.3.5/lib/bundler/gem_installer.rb
new file mode 100644
index 0000000..7d84939
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/gem_installer.rb
@@ -0,0 +1,9 @@
+require 'rubygems/installer'
+
+module Bundler
+  class GemInstaller < Gem::Installer
+    def check_executable_overwrite(filename)
+      # Bundler needs to install gems regardless of binstub overwriting
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/gem_path_manipulation.rb b/misc/lib/bundler-1.3.5/lib/bundler/gem_path_manipulation.rb
new file mode 100644
index 0000000..628d954
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/gem_path_manipulation.rb
@@ -0,0 +1,8 @@
+module Bundler
+  def self.preserve_gem_path
+    original_gem_path = ENV["_ORIGINAL_GEM_PATH"]
+    gem_path          = ENV["GEM_PATH"]
+    ENV["_ORIGINAL_GEM_PATH"] = gem_path          if original_gem_path.nil? || original_gem_path == ""
+    ENV["GEM_PATH"]           = original_gem_path if gem_path.nil? || gem_path == ""
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/gem_tasks.rb b/misc/lib/bundler-1.3.5/lib/bundler/gem_tasks.rb
new file mode 100644
index 0000000..bc75908
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/gem_tasks.rb
@@ -0,0 +1,2 @@
+require 'bundler/gem_helper'
+Bundler::GemHelper.install_tasks
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/graph.rb b/misc/lib/bundler-1.3.5/lib/bundler/graph.rb
new file mode 100644
index 0000000..daf4749
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/graph.rb
@@ -0,0 +1,166 @@
+require 'set'
+module Bundler
+  class Graph
+    GRAPH_NAME = :Gemfile
+
+    def initialize(env, output_file, show_version = false, show_requirements = false, output_format = "png")
+      @env               = env
+      @output_file       = output_file
+      @show_version      = show_version
+      @show_requirements = show_requirements
+      @output_format     = output_format
+
+      @groups            = []
+      @relations         = Hash.new {|h, k| h[k] = Set.new}
+      @node_options      = {}
+      @edge_options      = {}
+
+      _patching_gem_dependency_class
+      _populate_relations
+    end
+
+    attr_reader :groups, :relations, :node_options, :edge_options, :output_file, :output_format
+
+    def viz
+      GraphVizClient.new(self).run
+    end
+
+    private
+
+    def _populate_relations
+      parent_dependencies = _groups.values.to_set.flatten
+      while true
+        if parent_dependencies.empty?
+          break
+        else
+          tmp = Set.new
+          parent_dependencies.each do |dependency|
+            child_dependencies = dependency.to_spec.runtime_dependencies.to_set
+            @relations[dependency.name] += child_dependencies.map(&:name).to_set
+            tmp += child_dependencies
+
+            @node_options[dependency.name] = _make_label(dependency, :node)
+            child_dependencies.each do |c_dependency|
+              @edge_options["#{dependency.name}_#{c_dependency.name}"] = _make_label(c_dependency, :edge)
+            end
+          end
+          parent_dependencies = tmp
+        end
+      end
+    end
+
+    def _groups
+      relations = Hash.new {|h, k| h[k] = Set.new}
+      @env.current_dependencies.each do |dependency|
+        dependency.groups.each do |group|
+          relations[group.to_s].add(dependency)
+          @relations[group.to_s].add(dependency.name)
+
+          @node_options[group.to_s] ||= _make_label(group, :node)
+          @edge_options["#{group}_#{dependency.name}"] = _make_label(dependency, :edge)
+        end
+      end
+      @groups = relations.keys
+      relations
+    end
+
+    def _make_label(symbol_or_string_or_dependency, element_type)
+      case element_type.to_sym
+      when :node
+        if symbol_or_string_or_dependency.is_a?(Gem::Dependency)
+          label = symbol_or_string_or_dependency.name.dup
+          label << "\n#{symbol_or_string_or_dependency.to_spec.version.to_s}" if @show_version
+        else
+          label = symbol_or_string_or_dependency.to_s
+        end
+      when :edge
+        label = nil
+        if symbol_or_string_or_dependency.respond_to?(:requirements_list) && @show_requirements
+          tmp = symbol_or_string_or_dependency.requirements_list.join(", ")
+          label = tmp if tmp != ">= 0"
+        end
+      else
+        raise ArgumentError, "2nd argument is invalid"
+      end
+      label.nil? ? {} : { :label => label }
+    end
+
+    def _patching_gem_dependency_class
+      # method borrow from rubygems/dependency.rb
+      # redefinition of matching_specs will also redefine to_spec and to_specs
+      Gem::Dependency.class_eval do
+        def matching_specs platform_only = false
+          matches = Bundler.load.specs.select { |spec|
+            self.name === spec.name and # TODO: == instead of ===
+              requirement.satisfied_by? spec.version
+          }
+
+          if platform_only
+            matches.reject! { |spec|
+              not Gem::Platform.match spec.platform
+            }
+          end
+
+          matches = matches.sort_by { |s| s.sort_obj } # HACK: shouldn't be needed
+        end
+      end
+    end
+
+    class GraphVizClient
+      def initialize(graph_instance)
+        @graph_name    = graph_instance.class::GRAPH_NAME
+        @groups        = graph_instance.groups
+        @relations     = graph_instance.relations
+        @node_options  = graph_instance.node_options
+        @edge_options  = graph_instance.edge_options
+        @output_file   = graph_instance.output_file
+        @output_format = graph_instance.output_format
+      end
+
+      def g
+        @g ||= ::GraphViz.digraph(@graph_name, {:concentrate => true, :normalize => true, :nodesep => 0.55}) do |g|
+          g.edge[:weight]   = 2
+          g.edge[:fontname] = g.node[:fontname] = 'Arial, Helvetica, SansSerif'
+          g.edge[:fontsize] = 12
+        end
+      end
+
+      def run
+        @groups.each do |group|
+          g.add_nodes(
+            group,
+            {:style     => 'filled',
+             :fillcolor => '#B9B9D5',
+             :shape     => "box3d",
+             :fontsize  => 16}.merge(@node_options[group])
+          )
+        end
+
+        @relations.each do |parent, children|
+          children.each do |child|
+            if @groups.include?(parent)
+              g.add_nodes(child, {:style => 'filled', :fillcolor => '#B9B9D5'}.merge(@node_options[child]))
+              g.add_edges(parent, child, {:constraint => false}.merge(@edge_options["#{parent}_#{child}"]))
+            else
+              g.add_nodes(child, @node_options[child])
+              g.add_edges(parent, child, @edge_options["#{parent}_#{child}"])
+            end
+          end
+        end
+
+        if @output_format.to_s == "debug"
+          $stdout.puts g.output :none => String
+          Bundler.ui.info "debugging bundle viz..."
+        else
+          begin
+            g.output @output_format.to_sym => "#{@output_file}.#{@output_format}"
+            Bundler.ui.info "#{@output_file}.#{@output_format}"
+          rescue ArgumentError => e
+            $stderr.puts "Unsupported output format. See Ruby-Graphviz/lib/graphviz/constants.rb"
+            raise e
+          end
+        end
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/index.rb b/misc/lib/bundler-1.3.5/lib/bundler/index.rb
new file mode 100644
index 0000000..49e8297
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/index.rb
@@ -0,0 +1,187 @@
+require "set"
+
+module Bundler
+  class Index
+    include Enumerable
+
+    def self.build
+      i = new
+      yield i
+      i
+    end
+
+    attr_reader :specs, :sources
+    protected   :specs
+
+    def initialize
+      @sources = []
+      @cache = {}
+      @specs = Hash.new { |h,k| h[k] = [] }
+    end
+
+    def initialize_copy(o)
+      super
+      @sources = @sources.dup
+      @cache = {}
+      @specs = Hash.new { |h,k| h[k] = [] }
+
+      o.specs.each do |name, array|
+        @specs[name] = array.dup
+      end
+    end
+
+    def inspect
+      "#<#{self.class}:0x#{object_id} sources=#{sources.map{|s| s.inspect}} specs.size=#{specs.size}>"
+    end
+
+    def empty?
+      each { return false }
+      true
+    end
+
+    # Search this index's specs, and any source indexes that this index knows
+    # about, returning all of the results.
+    def search(query, base = nil)
+      results = local_search(query, base)
+      seen = Set.new(results.map { |spec| [spec.name, spec.version, spec.platform] })
+
+      @sources.each do |source|
+        source.search(query, base).each do |spec|
+          results << spec unless seen.include?([spec.name, spec.version, spec.platform])
+          seen << [spec.name, spec.version, spec.platform]
+        end
+      end
+
+      results
+    end
+
+    def local_search(query, base = nil)
+      case query
+      when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification then search_by_spec(query)
+      when String then specs_by_name(query)
+      when Gem::Dependency then search_by_dependency(query, base)
+      else
+        raise "You can't search for a #{query.inspect}."
+      end
+    end
+
+    def source_types
+      sources.map{|s| s.class }.uniq
+    end
+
+    alias [] search
+
+    def <<(spec)
+      arr = specs_by_name(spec.name)
+
+      arr.delete_if do |s|
+        same_version?(s.version, spec.version) && s.platform == spec.platform
+      end
+
+      arr << spec
+      spec
+    end
+
+    def each(&blk)
+      specs.values.each do |specs|
+        specs.each(&blk)
+      end
+    end
+
+    # returns a list of the dependencies
+    def unmet_dependency_names
+      dependency_names = specs.values.map do |array_of_s|
+        array_of_s.map do |s|
+          s.dependencies.map{|d| d.name }
+        end
+      end.flatten.uniq
+      dependency_names.select{|name| name != 'bundler' && specs_by_name(name).empty? }
+    end
+
+    def use(other, override_dupes = false)
+      return unless other
+      other.each do |s|
+        if (dupes = search_by_spec(s)) && dupes.any?
+          next unless override_dupes
+          @specs[s.name] -= dupes
+        end
+        @specs[s.name] << s
+      end
+      self
+    end
+
+    def size
+      @sources.inject(@specs.size) do |size, source|
+        size += source.size
+      end
+    end
+
+    def ==(o)
+      all? do |spec|
+        other_spec = o[spec].first
+        (spec.dependencies & other_spec.dependencies).empty? && spec.source == other_spec.source
+      end
+    end
+
+    def add_source(index)
+      if index.is_a?(Index)
+        @sources << index
+        @sources.uniq! # need to use uniq! here instead of checking for the item before adding
+      else
+        raise ArgumentError, "Source must be an index, not #{index.class}"
+      end
+    end
+
+  private
+
+    def specs_by_name(name)
+      @specs[name]
+    end
+
+    def search_by_dependency(dependency, base = nil)
+      @cache[base || false] ||= {}
+      @cache[base || false][dependency] ||= begin
+        specs = specs_by_name(dependency.name) + (base || [])
+        found = specs.select do |spec|
+          if base # allow all platforms when searching from a lockfile
+            dependency.matches_spec?(spec)
+          else
+            dependency.matches_spec?(spec) && Gem::Platform.match(spec.platform)
+          end
+        end
+
+        wants_prerelease = dependency.requirement.prerelease?
+        only_prerelease  = specs.all? {|spec| spec.version.prerelease? }
+
+        unless wants_prerelease || only_prerelease
+          found.reject! { |spec| spec.version.prerelease? }
+        end
+
+        found.sort_by {|s| [s.version, s.platform.to_s == 'ruby' ? "\0" : s.platform.to_s] }
+      end
+    end
+
+    def search_by_spec(spec)
+      specs_by_name(spec.name).select do |s|
+        same_version?(s.version, spec.version) && Gem::Platform.new(s.platform) == Gem::Platform.new(spec.platform)
+      end
+    end
+
+    if RUBY_VERSION < '1.9'
+      def same_version?(a, b)
+        regex = /^(.*?)(?:\.0)*$/
+        a.to_s[regex, 1] == b.to_s[regex, 1]
+      end
+    else
+      def same_version?(a, b)
+        a == b
+      end
+    end
+
+    def spec_satisfies_dependency?(spec, dep)
+      return false unless dep.name === spec.name
+      dep.requirement.satisfied_by?(spec.version)
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/injector.rb b/misc/lib/bundler-1.3.5/lib/bundler/injector.rb
new file mode 100644
index 0000000..79350b5
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/injector.rb
@@ -0,0 +1,64 @@
+module Bundler
+  class Injector
+    def self.inject(new_deps)
+      injector = new(new_deps)
+      injector.inject(Bundler.default_gemfile, Bundler.default_lockfile)
+    end
+
+    def initialize(new_deps)
+      @new_deps = new_deps
+    end
+
+    def inject(gemfile_path, lockfile_path)
+      if Bundler.settings[:frozen]
+        # ensure the lock and Gemfile are synced
+        Bundler.definition.ensure_equivalent_gemfile_and_lockfile(true)
+        # temporarily remove frozen while we inject
+        frozen = Bundler.settings.delete(:frozen)
+      end
+
+      # evaluate the Gemfile we have now
+      builder = Dsl.new
+      builder.eval_gemfile(gemfile_path)
+
+      # don't inject any gems that are already in the Gemfile
+      @new_deps -= builder.dependencies
+
+      # add new deps to the end of the in-memory Gemfile
+      builder.eval_gemfile("injected gems", new_gem_lines) if @new_deps.any?
+
+      # resolve to see if the new deps broke anything
+      definition = builder.to_definition(lockfile_path, {})
+      definition.resolve_remotely!
+
+      # since nothing broke, we can add those gems to the gemfile
+      append_to(gemfile_path) if @new_deps.any?
+
+      # since we resolved successfully, write out the lockfile
+      definition.lock(Bundler.default_lockfile)
+
+      # return an array of the deps that we added
+      return @new_deps
+    ensure
+      Bundler.settings[:frozen] = '1' if frozen
+    end
+
+  private
+
+    def new_gem_lines
+      @new_deps.map do |d|
+        %|gem '#{d.name}', '#{d.requirement}'|
+      end.join("\n")
+    end
+
+    def append_to(gemfile_path)
+      gemfile_path.open("a") do |f|
+        f.puts
+        f.puts "# Added at #{Time.now} by #{`whoami`.chomp}:"
+        f.puts new_gem_lines
+      end
+    end
+
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/installer.rb b/misc/lib/bundler-1.3.5/lib/bundler/installer.rb
new file mode 100644
index 0000000..7f19e94
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/installer.rb
@@ -0,0 +1,240 @@
+require 'erb'
+require 'rubygems/dependency_installer'
+
+module Bundler
+  class Installer < Environment
+    class << self
+      attr_accessor :post_install_messages
+    end
+
+    # Begins the installation process for Bundler.
+    # For more information see the #run method on this class.
+    def self.install(root, definition, options = {})
+      installer = new(root, definition)
+      installer.run(options)
+      installer
+    end
+
+    # Runs the install procedures for a specific Gemfile.
+    #
+    # Firstly, this method will check to see if Bundler.bundle_path exists
+    # and if not then will create it. This is usually the location of gems
+    # on the system, be it RVM or at a system path.
+    #
+    # Secondly, it checks if Bundler has been configured to be "frozen"
+    # Frozen ensures that the Gemfile and the Gemfile.lock file are matching.
+    # This stops a situation where a developer may update the Gemfile but may not run
+    # `bundle install`, which leads to the Gemfile.lock file not being correctly updated.
+    # If this file is not correctly updated then any other developer running
+    # `bundle install` will potentially not install the correct gems.
+    #
+    # Thirdly, Bundler checks if there are any dependencies specified in the Gemfile using
+    # Bundler::Environment#dependencies. If there are no dependencies specified then
+    # Bundler returns a warning message stating so and this method returns.
+    #
+    # Fourthly, Bundler checks if the default lockfile (Gemfile.lock) exists, and if so
+    # then proceeds to set up a defintion based on the default gemfile (Gemfile) and the
+    # default lock file (Gemfile.lock). However, this is not the case if the platform is different
+    # to that which is specified in Gemfile.lock, or if there are any missing specs for the gems.
+    #
+    # Fifthly, Bundler resolves the dependencies either through a cache of gems or by remote.
+    # This then leads into the gems being installed, along with stubs for their executables,
+    # but only if the --binstubs option has been passed or Bundler.options[:bin] has been set
+    # earlier.
+    #
+    # Sixthly, a new Gemfile.lock is created from the installed gems to ensure that the next time
+    # that a user runs `bundle install` they will receive any updates from this process.
+    #
+    # Finally: TODO add documentation for how the standalone process works.
+    def run(options)
+      # Create the BUNDLE_PATH directory
+      begin
+        Bundler.bundle_path.mkpath unless Bundler.bundle_path.exist?
+      rescue Errno::EEXIST
+        raise PathError, "Could not install to path `#{Bundler.settings[:path]}` " +
+          "because of an invalid symlink. Remove the symlink so the directory can be created."
+      end
+
+      if Bundler.settings[:frozen]
+        @definition.ensure_equivalent_gemfile_and_lockfile(options[:deployment])
+      end
+
+      if dependencies.empty?
+        Bundler.ui.warn "The Gemfile specifies no dependencies"
+        lock
+        return
+      end
+
+      if Bundler.default_lockfile.exist? && !options["update"]
+        local = Bundler.ui.silence do
+          begin
+            tmpdef = Definition.build(Bundler.default_gemfile, Bundler.default_lockfile, nil)
+            true unless tmpdef.new_platform? || tmpdef.missing_specs.any?
+          rescue BundlerError
+          end
+        end
+      end
+
+      # Since we are installing, we can resolve the definition
+      # using remote specs
+      unless local
+        options["local"] ?
+          @definition.resolve_with_cache! :
+          @definition.resolve_remotely!
+      end
+
+      # Must install gems in the order that the resolver provides
+      # as dependencies might actually affect the installation of
+      # the gem.
+      Installer.post_install_messages = {}
+      specs.each do |spec|
+        install_gem_from_spec(spec, options[:standalone])
+      end
+
+      lock
+      generate_standalone(options[:standalone]) if options[:standalone]
+    end
+
+    def install_gem_from_spec(spec, standalone = false)
+      # Download the gem to get the spec, because some specs that are returned
+      # by rubygems.org are broken and wrong.
+      Bundler::Fetcher.fetch(spec) if spec.source.is_a?(Bundler::Source::Rubygems)
+
+      # Fetch the build settings, if there are any
+      settings = Bundler.settings["build.#{spec.name}"]
+      Bundler.rubygems.with_build_args [settings] do
+        spec.source.install(spec)
+        Bundler.ui.debug "from #{spec.loaded_from} "
+      end
+
+      # newline comes after installing, some gems say "with native extensions"
+      Bundler.ui.info ""
+      if Bundler.settings[:bin] && standalone
+        generate_standalone_bundler_executable_stubs(spec)
+      elsif Bundler.settings[:bin]
+        generate_bundler_executable_stubs(spec, :force => true)
+      end
+
+      FileUtils.rm_rf(Bundler.tmp)
+    rescue Exception => e
+      # install hook failed
+      raise e if e.is_a?(Bundler::InstallHookError) || e.is_a?(Bundler::SecurityError)
+
+      # other failure, likely a native extension build failure
+      Bundler.ui.info ""
+      Bundler.ui.warn "#{e.class}: #{e.message}"
+      msg = "An error occurred while installing #{spec.name} (#{spec.version}),"
+      msg << " and Bundler cannot continue.\nMake sure that `gem install"
+      msg << " #{spec.name} -v '#{spec.version}'` succeeds before bundling."
+      Bundler.ui.debug e.backtrace.join("\n")
+      raise Bundler::InstallError, msg
+    end
+
+    def generate_bundler_executable_stubs(spec, options = {})
+      if options[:binstubs_cmd] && spec.executables.empty?
+        options = {}
+        spec.runtime_dependencies.each do |dep|
+          bins = Bundler.definition.specs[dep].first.executables
+          options[dep.name] = bins unless bins.empty?
+        end
+        if options.any?
+          Bundler.ui.warn "#{spec.name} has no executables, but you may want " +
+            "one from a gem it depends on."
+          options.each{|name,bins| Bundler.ui.warn "  #{name} has: #{bins.join(', ')}" }
+        else
+          Bundler.ui.warn "There are no executables for the gem #{spec.name}."
+        end
+        return
+      end
+
+      # double-assignment to avoid warnings about variables that will be used by ERB
+      bin_path = bin_path = Bundler.bin_path
+      template = template = File.read(File.expand_path('../templates/Executable', __FILE__))
+      relative_gemfile_path = relative_gemfile_path = Bundler.default_gemfile.relative_path_from(bin_path)
+      ruby_command = ruby_command = Thor::Util.ruby_command
+
+      exists = []
+      spec.executables.each do |executable|
+        next if executable == "bundle"
+
+        binstub_path = "#{bin_path}/#{executable}"
+        if File.exists?(binstub_path) && !options[:force]
+          exists << executable
+          next
+        end
+
+        File.open(binstub_path, 'w', 0755) do |f|
+          f.puts ERB.new(template, nil, '-').result(binding)
+        end
+      end
+
+      if options[:binstubs_cmd] && exists.any?
+        case exists.size
+        when 1
+          Bundler.ui.warn "Skipped #{exists[0]} since it already exists."
+        when 2
+          Bundler.ui.warn "Skipped #{exists.join(' and ')} since they already exist."
+        else
+          items = exists[0...-1].empty? ? nil : exists[0...-1].join(', ')
+          skipped = [items, exists[-1]].compact.join(' and ')
+          Bundler.ui.warn "Skipped #{skipped} since they already exist."
+        end
+        Bundler.ui.warn "If you want to overwrite skipped stubs, use --force."
+      end
+    end
+
+  private
+
+    def generate_standalone_bundler_executable_stubs(spec)
+      # double-assignment to avoid warnings about variables that will be used by ERB
+      bin_path = Bundler.bin_path
+      template = File.read(File.expand_path('../templates/Executable.standalone', __FILE__))
+      ruby_command = ruby_command = Thor::Util.ruby_command
+
+      spec.executables.each do |executable|
+        next if executable == "bundle"
+        standalone_path = standalone_path = Pathname(Bundler.settings[:path]).expand_path.relative_path_from(bin_path)
+        executable_path = executable_path = Pathname(spec.full_gem_path).join(spec.bindir, executable).relative_path_from(bin_path)
+        File.open "#{bin_path}/#{executable}", 'w', 0755 do |f|
+          f.puts ERB.new(template, nil, '-').result(binding)
+        end
+      end
+    end
+
+    def generate_standalone(groups)
+      standalone_path = Bundler.settings[:path]
+      bundler_path = File.join(standalone_path, "bundler")
+      FileUtils.mkdir_p(bundler_path)
+
+      paths = []
+
+      if groups.empty?
+        specs = Bundler.definition.requested_specs
+      else
+        specs = Bundler.definition.specs_for groups.map { |g| g.to_sym }
+      end
+
+      specs.each do |spec|
+        next if spec.name == "bundler"
+
+        spec.require_paths.each do |path|
+          full_path = File.join(spec.full_gem_path, path)
+          gem_path = Pathname.new(full_path).relative_path_from(Bundler.root.join(bundler_path))
+          paths << gem_path.to_s.sub("#{SystemRubyVersion.new.engine}/#{RbConfig::CONFIG['ruby_version']}", '#{ruby_engine}/#{ruby_version}')
+        end
+      end
+
+
+      File.open File.join(bundler_path, "setup.rb"), "w" do |file|
+        file.puts "require 'rbconfig'"
+        file.puts "# ruby 1.8.7 doesn't define RUBY_ENGINE"
+        file.puts "ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby'"
+        file.puts "ruby_version = RbConfig::CONFIG[\"ruby_version\"]"
+        file.puts "path = File.expand_path('..', __FILE__)"
+        paths.each do |path|
+          file.puts %{$:.unshift File.expand_path("\#{path}/#{path}")}
+        end
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/lazy_specification.rb b/misc/lib/bundler-1.3.5/lib/bundler/lazy_specification.rb
new file mode 100644
index 0000000..af9baff
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/lazy_specification.rb
@@ -0,0 +1,82 @@
+require "uri"
+require "rubygems/spec_fetcher"
+
+module Bundler
+  class LazySpecification
+    include MatchPlatform
+
+    attr_reader :name, :version, :dependencies, :platform
+    attr_accessor :source
+
+    def initialize(name, version, platform, source = nil)
+      @name          = name
+      @version       = version
+      @dependencies  = []
+      @platform      = platform
+      @source        = source
+      @specification = nil
+    end
+
+    def full_name
+      if platform == Gem::Platform::RUBY or platform.nil? then
+        "#{@name}-#{@version}"
+      else
+        "#{@name}-#{@version}-#{platform}"
+      end
+    end
+
+    def ==(other)
+      identifier == other.identifier
+    end
+
+    def satisfies?(dependency)
+      @name == dependency.name && dependency.requirement.satisfied_by?(Gem::Version.new(@version))
+    end
+
+    def to_lock
+      if platform == Gem::Platform::RUBY or platform.nil?
+        out = "    #{name} (#{version})\n"
+      else
+        out = "    #{name} (#{version}-#{platform})\n"
+      end
+
+      dependencies.sort_by {|d| d.to_s }.each do |dep|
+        next if dep.type == :development
+        out << "    #{dep.to_lock}\n"
+      end
+
+      out
+    end
+
+    def __materialize__
+      @specification = source.specs.search(Gem::Dependency.new(name, version)).last
+    end
+
+    def respond_to?(*args)
+      super || @specification.respond_to?(*args)
+    end
+
+    def to_s
+      @__to_s ||= "#{name} (#{version})"
+    end
+
+    def identifier
+      @__identifier ||= [name, version, source, platform, dependencies].hash
+    end
+
+  private
+
+    def to_ary
+      nil
+    end
+
+    def method_missing(method, *args, &blk)
+      raise "LazySpecification has not been materialized yet (calling :#{method} #{args.inspect})" unless @specification
+
+      return super unless respond_to?(method)
+
+      @specification.send(method, *args, &blk)
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/lockfile_parser.rb b/misc/lib/bundler-1.3.5/lib/bundler/lockfile_parser.rb
new file mode 100644
index 0000000..01fa863
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/lockfile_parser.rb
@@ -0,0 +1,144 @@
+require "strscan"
+
+# Some versions of the Bundler 1.1 RC series introduced corrupted
+# lockfiles. There were two major problems:
+#
+# * multiple copies of the same GIT section appeared in the lockfile
+# * when this happened, those sections got multiple copies of gems
+#   in those sections.
+#
+# As a result, Bundler 1.1 contains code that fixes the earlier
+# corruption. We will remove this fix-up code in Bundler 1.2.
+
+module Bundler
+  class LockfileParser
+    attr_reader :sources, :dependencies, :specs, :platforms
+
+    DEPENDENCIES = "DEPENDENCIES"
+    PLATFORMS    = "PLATFORMS"
+    GIT          = "GIT"
+    GEM          = "GEM"
+    PATH         = "PATH"
+    SPECS        = "  specs:"
+    OPTIONS      = /^  ([a-z]+): (.*)$/i
+
+    def initialize(lockfile)
+      @platforms    = []
+      @sources      = []
+      @dependencies = []
+      @state        = :source
+      @specs        = {}
+
+      if lockfile.match(/<<<<<<<|=======|>>>>>>>|\|\|\|\|\|\|\|/)
+        raise LockfileError, "Your Gemfile.lock contains merge conflicts.\n" \
+          "Run `git checkout HEAD -- Gemfile.lock` first to get a clean lock."
+      end
+
+      lockfile.split(/(?:\r?\n)+/).each do |line|
+        if line == DEPENDENCIES
+          @state = :dependency
+        elsif line == PLATFORMS
+          @state = :platform
+        else
+          send("parse_#{@state}", line)
+        end
+      end
+      @specs = @specs.values
+    end
+
+  private
+
+    TYPES = {
+      "GIT"  => Bundler::Source::Git,
+      "GEM"  => Bundler::Source::Rubygems,
+      "PATH" => Bundler::Source::Path
+    }
+
+    def parse_source(line)
+      case line
+      when GIT, GEM, PATH
+        @current_source = nil
+        @opts, @type = {}, line
+      when SPECS
+        @current_source = TYPES[@type].from_lock(@opts)
+
+        # Strip out duplicate GIT sections
+        if @sources.include?(@current_source) && @current_source.is_a?(Bundler::Source::Git)
+          @current_source = @sources.find { |s| s == @current_source }
+        end
+
+        @sources << @current_source
+      when OPTIONS
+        value = $2
+        value = true if value == "true"
+        value = false if value == "false"
+
+        key = $1
+
+        if @opts[key]
+          @opts[key] = Array(@opts[key])
+          @opts[key] << value
+        else
+          @opts[key] = value
+        end
+      else
+        parse_spec(line)
+      end
+    end
+
+    NAME_VERSION = '(?! )(.*?)(?: \(([^-]*)(?:-(.*))?\))?'
+    NAME_VERSION_2 = %r{^ {2}#{NAME_VERSION}(!)?$}
+    NAME_VERSION_4 = %r{^ {4}#{NAME_VERSION}$}
+    NAME_VERSION_6 = %r{^ {6}#{NAME_VERSION}$}
+
+    def parse_dependency(line)
+      if line =~ NAME_VERSION_2
+        name, version, pinned = $1, $2, $4
+        version = version.split(",").map { |d| d.strip } if version
+
+        dep = Bundler::Dependency.new(name, version)
+
+        if pinned && dep.name != 'bundler'
+          spec = @specs.find {|k, v| v.name == dep.name }
+          dep.source = spec.last.source if spec
+
+          # Path sources need to know what the default name / version
+          # to use in the case that there are no gemspecs present. A fake
+          # gemspec is created based on the version set on the dependency
+          # TODO: Use the version from the spec instead of from the dependency
+          if version && version.size == 1 && version.first =~ /^\s*= (.+)\s*$/ && dep.source.is_a?(Bundler::Source::Path)
+            dep.source.name    = name
+            dep.source.version = $1
+          end
+        end
+
+        @dependencies << dep
+      end
+    end
+
+    def parse_spec(line)
+      if line =~ NAME_VERSION_4
+        name, version = $1, Gem::Version.new($2)
+        platform = $3 ? Gem::Platform.new($3) : Gem::Platform::RUBY
+        @current_spec = LazySpecification.new(name, version, platform)
+        @current_spec.source = @current_source
+
+        # Avoid introducing multiple copies of the same spec (caused by
+        # duplicate GIT sections)
+        @specs[@current_spec.identifier] ||= @current_spec
+      elsif line =~ NAME_VERSION_6
+        name, version = $1, $2
+        version = version.split(',').map { |d| d.strip } if version
+        dep = Gem::Dependency.new(name, version)
+        @current_spec.dependencies << dep
+      end
+    end
+
+    def parse_platform(line)
+      if line =~ /^  (.*)$/
+        @platforms << Gem::Platform.new($1)
+      end
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle
new file mode 100644
index 0000000..9ce6e4d
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle
@@ -0,0 +1,116 @@
+.\" generated with Ronn/v0.7.3
+.\" http://github.com/rtomayko/ronn/tree/0.7.3
+.
+.TH "BUNDLE" "1" "April 2013" "" ""
+.
+.SH "NAME"
+\fBbundle\fR \- Ruby Dependency Management
+.
+.SH "SYNOPSIS"
+\fBbundle\fR COMMAND [\-\-no\-color] [\-\-verbose] [ARGS]
+.
+.SH "DESCRIPTION"
+Bundler manages an \fBapplication\'s dependencies\fR through its entire life across many machines systematically and repeatably\.
+.
+.P
+See the bundler website \fIhttp://gembundler\.com\fR for information on getting started, and Gemfile(5) for more information on the \fBGemfile\fR format\.
+.
+.SH "OPTIONS"
+.
+.TP
+\fB\-\-no\-color\fR
+Prints all output without color
+.
+.TP
+\fB\-\-verbose\fR
+Prints out additional logging information
+.
+.SH "BUNDLE COMMANDS"
+We divide \fBbundle\fR subcommands into primary commands and utilities\.
+.
+.SH "PRIMARY COMMANDS"
+.
+.TP
+bundle install(1) \fIbundle\-install\.1\.html\fR
+Install the gems specified by the \fBGemfile\fR or \fBGemfile\.lock\fR
+.
+.TP
+bundle update(1) \fIbundle\-update\.1\.html\fR
+Update dependencies to their latest versions
+.
+.TP
+bundle package(1) \fIbundle\-package\.1\.html\fR
+Package the \.gem files required by your application into the \fBvendor/cache\fR directory
+.
+.TP
+bundle exec(1) \fIbundle\-exec\.1\.html\fR
+Execute a script in the context of the current bundle
+.
+.TP
+bundle config(1) \fIbundle\-config\.1\.html\fR
+Specify and read configuration options for bundler
+.
+.TP
+\fBbundle help(1)\fR
+Displays this help page
+.
+.SH "UTILITIES"
+.
+.TP
+\fBbundle check(1)\fR
+Determine whether the requirements for your application are installed and available to bundler
+.
+.TP
+\fBbundle list(1)\fR
+Show all of the gems in the current bundle
+.
+.TP
+\fBbundle show(1)\fR
+Show the source location of a particular gem in the bundle
+.
+.TP
+\fBbundle outdated(1)\fR
+Show all of the outdated gems in the current bundle
+.
+.TP
+\fBbundle console(1)\fR
+Start an IRB session in the context of the current bundle
+.
+.TP
+\fBbundle open(1)\fR
+Open an installed gem in the editor
+.
+.TP
+\fBbundle viz(1)\fR
+Generate a visual representation of your dependencies
+.
+.TP
+\fBbundle init(1)\fR
+Generate a simple \fBGemfile\fR, placed in the current directory
+.
+.TP
+\fBbundle gem(1)\fR
+Create a simple gem, suitable for development with bundler
+.
+.TP
+bundle platform(1) \fIbundle\-platform\.1\.html\fR
+Displays platform compatibility information
+.
+.TP
+\fBbundle clean(1)\fR
+Cleans up unused gems in your bundler directory
+.
+.SH "OBSOLETE"
+These commands are obsolete and should no longer be used
+.
+.IP "\(bu" 4
+\fBbundle lock(1)\fR
+.
+.IP "\(bu" 4
+\fBbundle unlock(1)\fR
+.
+.IP "\(bu" 4
+\fBbundle cache(1)\fR
+.
+.IP "" 0
+
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-config b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-config
new file mode 100644
index 0000000..25e3823
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-config
@@ -0,0 +1,139 @@
+.\" generated with Ronn/v0.7.3
+.\" http://github.com/rtomayko/ronn/tree/0.7.3
+.
+.TH "BUNDLE\-CONFIG" "1" "April 2013" "" ""
+.
+.SH "NAME"
+\fBbundle\-config\fR \- Set bundler configuration options
+.
+.SH "SYNOPSIS"
+\fBbundle config\fR [\fIname\fR [\fIvalue\fR]]
+.
+.SH "DESCRIPTION"
+This command allows you to interact with bundler\'s configuration system\. Bundler retrieves its configuration from the local application (\fBapp/\.bundle/config\fR), environment variables, and the user\'s home directory (\fB~/\.bundle/config\fR), in that order of priority\.
+.
+.P
+Executing \fBbundle config\fR with no parameters will print a list of all bundler configuration for the current bundle, and where that configuration was set\.
+.
+.P
+Executing \fBbundle config <name>\fR will print the value of that configuration setting, and where it was set\.
+.
+.P
+Executing \fBbundle config <name> <value>\fR will set that configuration to the value specified for all bundles executed as the current user\. The configuration will be stored in \fB~/\.bundle/config\fR\. If \fIname\fR already is set, \fIname\fR will be overridden and user will be warned\.
+.
+.P
+Executing \fBbundle config \-\-global <name> <value>\fR works the same as above\.
+.
+.P
+Executing \fBbundle config \-\-local <name> <value>\fR will set that configuration to the local application\. The configuration will be stored in \fBapp/\.bundle/config\fR\.
+.
+.P
+Executing \fBbundle config \-\-delete <name>\fR will delete the configuration in both local and global sources\. Not compatible with \-\-global or \-\-local flag\.
+.
+.P
+Executing bundle with the \fBBUNDLE_IGNORE_CONFIG\fR environment variable set will cause it to ignore all configuration\.
+.
+.SH "BUILD OPTIONS"
+You can use \fBbundle config\fR to give bundler the flags to pass to the gem installer every time bundler tries to install a particular gem\.
+.
+.P
+A very common example, the \fBmysql\fR gem, requires Snow Leopard users to pass configuration flags to \fBgem install\fR to specify where to find the \fBmysql_config\fR executable\.
+.
+.IP "" 4
+.
+.nf
+
+gem install mysql \-\- \-\-with\-mysql\-config=/usr/local/mysql/bin/mysql_config
+.
+.fi
+.
+.IP "" 0
+.
+.P
+Since the specific location of that executable can change from machine to machine, you can specify these flags on a per\-machine basis\.
+.
+.IP "" 4
+.
+.nf
+
+bundle config build\.mysql \-\-with\-mysql\-config=/usr/local/mysql/bin/mysql_config
+.
+.fi
+.
+.IP "" 0
+.
+.P
+After running this command, every time bundler needs to install the \fBmysql\fR gem, it will pass along the flags you specified\.
+.
+.SH "CONFIGURATION KEYS"
+Configuration keys in bundler have two forms: the canonical form and the environment variable form\.
+.
+.P
+For instance, passing the \fB\-\-without\fR flag to bundle install(1) \fIbundle\-install\.1\.html\fR prevents Bundler from installing certain groups specified in the Gemfile(5)\. Bundler persists this value in \fBapp/\.bundle/config\fR so that calls to \fBBundler\.setup\fR do not try to find gems from the \fBGemfile\fR that you didn\'t install\. Additionally, subsequent calls to bundle install(1) \fIbundle\-install\.1\.html\fR remember this setting and skip those groups\.
+.
+.P
+The canonical form of this configuration is \fB"without"\fR\. To convert the canonical form to the environment variable form, capitalize it, and prepend \fBBUNDLE_\fR\. The environment variable form of \fB"without"\fR is \fBBUNDLE_WITHOUT\fR\.
+.
+.SH "LIST OF AVAILABLE KEYS"
+The following is a list of all configuration keys and their purpose\. You can learn more about their operation in bundle install(1) \fIbundle\-install\.1\.html\fR\.
+.
+.TP
+\fBpath\fR (\fBBUNDLE_PATH\fR)
+The location on disk to install gems\. Defaults to \fB$GEM_HOME\fR in development and \fBvendor/bundler\fR when \fB\-\-deployment\fR is used
+.
+.TP
+\fBfrozen\fR (\fBBUNDLE_FROZEN\fR)
+Disallow changes to the \fBGemfile\fR\. Defaults to \fBtrue\fR when \fB\-\-deployment\fR is used\.
+.
+.TP
+\fBwithout\fR (\fBBUNDLE_WITHOUT\fR)
+A \fB:\fR\-separated list of groups whose gems bundler should not install
+.
+.TP
+\fBbin\fR (\fBBUNDLE_BIN\fR)
+Install executables from gems in the bundle to the specified directory\. Defaults to \fBfalse\fR\.
+.
+.TP
+\fBgemfile\fR (\fBBUNDLE_GEMFILE\fR)
+The name of the file that bundler should use as the \fBGemfile\fR\. This location of this file also sets the root of the project, which is used to resolve relative paths in the \fBGemfile\fR, among other things\. By default, bundler will search up from the current working directory until it finds a \fBGemfile\fR\.
+.
+.P
+In general, you should set these settings per\-application by using the applicable flag to the bundle install(1) \fIbundle\-install\.1\.html\fR command\.
+.
+.P
+You can set them globally either via environment variables or \fBbundle config\fR, whichever is preferable for your setup\. If you use both, environment variables will take preference over global settings\.
+.
+.SH "LOCAL GIT REPOS"
+Bundler also allows you to work against a git repository locally instead of using the remote version\. This can be achieved by setting up a local override:
+.
+.IP "" 4
+.
+.nf
+
+bundle config local\.GEM_NAME /path/to/local/git/repository
+.
+.fi
+.
+.IP "" 0
+.
+.P
+For example, in order to use a local Rack repository, a developer could call:
+.
+.IP "" 4
+.
+.nf
+
+bundle config local\.rack ~/Work/git/rack
+.
+.fi
+.
+.IP "" 0
+.
+.P
+Now instead of checking out the remote git repository, the local override will be used\. Similar to a path source, every time the local git repository change, changes will be automatically picked up by Bundler\. This means a commit in the local git repo will update the revision in the \fBGemfile\.lock\fR to the local git repo revision\. This requires the same attention as git submodules\. Before pushing to the remote, you need to ensure the local override was pushed, otherwise you may po [...]
+.
+.P
+Bundler does many checks to ensure a developer won\'t work with invalid references\. Particularly, we force a developer to specify a branch in the \fBGemfile\fR in order to use this feature\. If the branch specified in the \fBGemfile\fR and the current branch in the local git repository do not match, Bundler will abort\. This ensures that a developer is always working against the correct branches, and prevents accidental locking to a different branch\.
+.
+.P
+Finally, Bundler also ensures that the current revision in the \fBGemfile\.lock\fR exists in the local git repository\. By doing this, Bundler forces you to fetch the latest changes in the remotes\.
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-config.txt b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-config.txt
new file mode 100644
index 0000000..8e36522
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-config.txt
@@ -0,0 +1,164 @@
+BUNDLE-CONFIG(1)					      BUNDLE-CONFIG(1)
+
+
+
+NAME
+       bundle-config - Set bundler configuration options
+
+SYNOPSIS
+       bundle config [name [value]]
+
+DESCRIPTION
+       This  command  allows you to interact with bundler's configuration sys-
+       tem. Bundler retrieves its configuration  from  the  local  application
+       (app/.bundle/config), environment variables, and the user's home direc-
+       tory (~/.bundle/config), in that order of priority.
+
+       Executing bundle config with no parameters will print  a  list  of  all
+       bundler configuration for the current bundle, and where that configura-
+       tion was set.
+
+       Executing bundle config <name> will print the value of that  configura-
+       tion setting, and where it was set.
+
+       Executing  bundle  config <name> <value> will set that configuration to
+       the value specified for all bundles executed as the current  user.  The
+       configuration  will  be	stored in ~/.bundle/config. If name already is
+       set, name will be overridden and user will be warned.
+
+       Executing bundle config --global  <name>  <value>  works  the  same  as
+       above.
+
+       Executing bundle config --local <name> <value> will set that configura-
+       tion to the local application. The  configuration  will	be  stored  in
+       app/.bundle/config.
+
+       Executing  bundle  config --delete <name> will delete the configuration
+       in both local and global  sources.  Not	compatible  with  --global  or
+       --local flag.
+
+       Executing bundle with the BUNDLE_IGNORE_CONFIG environment variable set
+       will cause it to ignore all configuration.
+
+BUILD OPTIONS
+       You can use bundle config to give bundler the flags to pass to the  gem
+       installer every time bundler tries to install a particular gem.
+
+       A  very	common	example, the mysql gem, requires Snow Leopard users to
+       pass configuration flags to gem install to specify where  to  find  the
+       mysql_config executable.
+
+
+
+	   gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
+
+
+
+       Since  the specific location of that executable can change from machine
+       to machine, you can specify these flags on a per-machine basis.
+
+
+
+	   bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config
+
+
+
+       After running this command, every time bundler  needs  to  install  the
+       mysql gem, it will pass along the flags you specified.
+
+CONFIGURATION KEYS
+       Configuration  keys  in	bundler have two forms: the canonical form and
+       the environment variable form.
+
+       For instance, passing the --without  flag  to  bundle  install(1)  bun-
+       dle-install.1.html  prevents  Bundler  from  installing	certain groups
+       specified in the Gemfile(5). Bundler persists this value  in  app/.bun-
+       dle/config  so that calls to Bundler.setup do not try to find gems from
+       the Gemfile that you didn't install. Additionally, subsequent calls  to
+       bundle  install(1) bundle-install.1.html remember this setting and skip
+       those groups.
+
+       The canonical form of this configuration is "without". To  convert  the
+       canonical  form	to  the  environment variable form, capitalize it, and
+       prepend BUNDLE_. The environment variable form  of  "without"  is  BUN-
+       DLE_WITHOUT.
+
+LIST OF AVAILABLE KEYS
+       The  following  is  a list of all configuration keys and their purpose.
+       You can learn more about their  operation  in  bundle  install(1)  bun-
+       dle-install.1.html.
+
+       path (BUNDLE_PATH)
+	      The  location  on disk to install gems. Defaults to $GEM_HOME in
+	      development and vendor/bundler when --deployment is used
+
+       frozen (BUNDLE_FROZEN)
+	      Disallow changes to the Gemfile. Defaults to true when --deploy-
+	      ment is used.
+
+       without (BUNDLE_WITHOUT)
+	      A  :-separated  list  of	groups	whose  gems bundler should not
+	      install
+
+       bin (BUNDLE_BIN)
+	      Install executables from gems in the  bundle  to	the  specified
+	      directory. Defaults to false.
+
+       gemfile (BUNDLE_GEMFILE)
+	      The  name  of  the  file that bundler should use as the Gemfile.
+	      This location of this file also sets the root  of  the  project,
+	      which  is  used  to resolve relative paths in the Gemfile, among
+	      other things. By default, bundler will search up from  the  cur-
+	      rent working directory until it finds a Gemfile.
+
+       In  general, you should set these settings per-application by using the
+       applicable flag to the bundle install(1) bundle-install.1.html command.
+
+       You  can  set  them globally either via environment variables or bundle
+       config, whichever is preferable for your setup. If you use both,  envi-
+       ronment variables will take preference over global settings.
+
+LOCAL GIT REPOS
+       Bundler	also  allows  you  to  work  against  a git repository locally
+       instead of using the remote version. This can be achieved by setting up
+       a local override:
+
+
+
+	   bundle config local.GEM_NAME /path/to/local/git/repository
+
+
+
+       For example, in order to use a local Rack repository, a developer could
+       call:
+
+
+
+	   bundle config local.rack ~/Work/git/rack
+
+
+
+       Now instead of checking out the remote git repository, the local  over-
+       ride  will  be used. Similar to a path source, every time the local git
+       repository change, changes will be automatically picked up by  Bundler.
+       This  means  a commit in the local git repo will update the revision in
+       the Gemfile.lock to the local git repo revision. This requires the same
+       attention  as git submodules. Before pushing to the remote, you need to
+       ensure the local override was pushed, otherwise you may point to a com-
+       mit that only exists in your local machine.
+
+       Bundler	does many checks to ensure a developer won't work with invalid
+       references. Particularly, we force a developer to specify a  branch  in
+       the  Gemfile  in  order to use this feature. If the branch specified in
+       the Gemfile and the current branch in the local git repository  do  not
+       match,  Bundler	will  abort.  This  ensures that a developer is always
+       working against the correct branches, and prevents  accidental  locking
+       to a different branch.
+
+       Finally,  Bundler  also	ensures  that the current revision in the Gem-
+       file.lock exists in the local git repository. By  doing	this,  Bundler
+       forces you to fetch the latest changes in the remotes.
+
+
+
+				  April 2013		      BUNDLE-CONFIG(1)
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-exec b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-exec
new file mode 100644
index 0000000..ee28b65
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-exec
@@ -0,0 +1,122 @@
+.\" generated with Ronn/v0.7.3
+.\" http://github.com/rtomayko/ronn/tree/0.7.3
+.
+.TH "BUNDLE\-EXEC" "1" "April 2013" "" ""
+.
+.SH "NAME"
+\fBbundle\-exec\fR \- Execute a command in the context of the bundle
+.
+.SH "SYNOPSIS"
+\fBbundle exec\fR \fIcommand\fR
+.
+.SH "DESCRIPTION"
+This command executes the command, making all gems specified in the \fBGemfile(5)\fR available to \fBrequire\fR in Ruby programs\.
+.
+.P
+Essentially, if you would normally have run something like \fBrspec spec/my_spec\.rb\fR, and you want to use the gems specified in the \fBGemfile(5)\fR and installed via bundle install(1) \fIbundle\-install\.1\.html\fR, you should run \fBbundle exec rspec spec/my_spec\.rb\fR\.
+.
+.P
+Note that \fBbundle exec\fR does not require that an executable is available on your shell\'s \fB$PATH\fR\.
+.
+.SH "BUNDLE INSTALL \-\-BINSTUBS"
+If you use the \fB\-\-binstubs\fR flag in bundle install(1) \fIbundle\-install\.1\.html\fR, Bundler will automatically create a directory (which defaults to \fBapp_root/bin\fR) containing all of the executables available from gems in the bundle\.
+.
+.P
+After using \fB\-\-binstubs\fR, \fBbin/rspec spec/my_spec\.rb\fR is identical to \fBbundle exec rspec spec/my_spec\.rb\fR\.
+.
+.SH "ENVIRONMENT MODIFICATIONS"
+\fBbundle exec\fR makes a number of changes to the shell environment, then executes the command you specify in full\.
+.
+.IP "\(bu" 4
+make sure that it\'s still possible to shell out to \fBbundle\fR from inside a command invoked by \fBbundle exec\fR (using \fB$BUNDLE_BIN_PATH\fR)
+.
+.IP "\(bu" 4
+put the directory containing executables (like \fBrails\fR, \fBrspec\fR, \fBrackup\fR) for your bundle on \fB$PATH\fR
+.
+.IP "\(bu" 4
+make sure that if bundler is invoked in the subshell, it uses the same \fBGemfile\fR (by setting \fBBUNDLE_GEMFILE\fR)
+.
+.IP "\(bu" 4
+add \fB\-rbundler/setup\fR to \fB$RUBYOPT\fR, which makes sure that Ruby programs invoked in the subshell can see the gems in the bundle
+.
+.IP "" 0
+.
+.P
+It also modifies Rubygems:
+.
+.IP "\(bu" 4
+disallow loading additional gems not in the bundle
+.
+.IP "\(bu" 4
+modify the \fBgem\fR method to be a no\-op if a gem matching the requirements is in the bundle, and to raise a \fBGem::LoadError\fR if it\'s not
+.
+.IP "\(bu" 4
+Define \fBGem\.refresh\fR to be a no\-op, since the source index is always frozen when using bundler, and to prevent gems from the system leaking into the environment
+.
+.IP "\(bu" 4
+Override \fBGem\.bin_path\fR to use the gems in the bundle, making system executables work
+.
+.IP "\(bu" 4
+Add all gems in the bundle into Gem\.loaded_specs
+.
+.IP "" 0
+.
+.SS "Shelling out"
+When shelling out (using the \fBsystem\fR or backticks methods, for example), Bundler\'s environment changes will propagate to the subshell environment\. If you desire to shell out without Bundler\'s environment changes, simply employ the \fBwith_clean_env\fR method\. It will restore all environment variables to what they were before Bundler was activated\. For example:
+.
+.IP "" 4
+.
+.nf
+
+Bundler\.with_clean_env do
+  `brew install wget`
+end
+.
+.fi
+.
+.IP "" 0
+.
+.SH "RUBYGEMS PLUGINS"
+At present, the Rubygems plugin system requires all files named \fBrubygems_plugin\.rb\fR on the load path of \fIany\fR installed gem when any Ruby code requires \fBrubygems\.rb\fR\. This includes executables installed into the system, like \fBrails\fR, \fBrackup\fR, and \fBrspec\fR\.
+.
+.P
+Since Rubygems plugins can contain arbitrary Ruby code, they commonly end up activating themselves or their dependencies\.
+.
+.P
+For instance, the \fBgemcutter 0\.5\fR gem depended on \fBjson_pure\fR\. If you had that version of gemcutter installed (even if you \fIalso\fR had a newer version without this problem), Rubygems would activate \fBgemcutter 0\.5\fR and \fBjson_pure <latest>\fR\.
+.
+.P
+If your Gemfile(5) also contained \fBjson_pure\fR (or a gem with a dependency on \fBjson_pure\fR), the latest version on your system might conflict with the version in your Gemfile(5), or the snapshot version in your \fBGemfile\.lock\fR\.
+.
+.P
+If this happens, bundler will say:
+.
+.IP "" 4
+.
+.nf
+
+You have already activated json_pure 1\.4\.6 but your Gemfile
+requires json_pure 1\.4\.3\. Consider using bundle exec\.
+.
+.fi
+.
+.IP "" 0
+.
+.P
+In this situation, you almost certainly want to remove the underlying gem with the problematic gem plugin\. In general, the authors of these plugins (in this case, the \fBgemcutter\fR gem) have released newer versions that are more careful in their plugins\.
+.
+.P
+You can find a list of all the gems containing gem plugins by running
+.
+.IP "" 4
+.
+.nf
+
+ruby \-rubygems \-e "puts Gem\.find_files(\'rubygems_plugin\.rb\')"
+.
+.fi
+.
+.IP "" 0
+.
+.P
+At the very least, you should remove all but the newest version of each gem plugin, and also remove all gem plugins that you aren\'t using (\fBgem uninstall gem_name\fR)\.
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-exec.txt b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-exec.txt
new file mode 100644
index 0000000..2f935d7
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-exec.txt
@@ -0,0 +1,131 @@
+BUNDLE-EXEC(1)							BUNDLE-EXEC(1)
+
+
+
+NAME
+       bundle-exec - Execute a command in the context of the bundle
+
+SYNOPSIS
+       bundle exec command
+
+DESCRIPTION
+       This  command  executes	the  command, making all gems specified in the
+       Gemfile(5) available to require in Ruby programs.
+
+       Essentially, if you  would  normally  have  run	something  like  rspec
+       spec/my_spec.rb,  and  you  want  to use the gems specified in the Gem-
+       file(5) and installed via bundle install(1) bundle-install.1.html,  you
+       should run bundle exec rspec spec/my_spec.rb.
+
+       Note  that bundle exec does not require that an executable is available
+       on your shell's $PATH.
+
+BUNDLE INSTALL --BINSTUBS
+       If  you	use  the   --binstubs	flag   in   bundle   install(1)   bun-
+       dle-install.1.html,  Bundler  will  automatically  create  a  directory
+       (which defaults to app_root/bin)  containing  all  of  the  executables
+       available from gems in the bundle.
+
+       After  using --binstubs, bin/rspec spec/my_spec.rb is identical to bun-
+       dle exec rspec spec/my_spec.rb.
+
+ENVIRONMENT MODIFICATIONS
+       bundle exec makes a number of changes to the  shell  environment,  then
+       executes the command you specify in full.
+
+       o   make  sure  that  it's  still  possible to shell out to bundle from
+	   inside a command invoked by bundle exec (using $BUNDLE_BIN_PATH)
+
+       o   put	the  directory	containing  executables  (like	rails,	rspec,
+	   rackup) for your bundle on $PATH
+
+       o   make  sure  that if bundler is invoked in the subshell, it uses the
+	   same Gemfile (by setting BUNDLE_GEMFILE)
+
+       o   add -rbundler/setup to $RUBYOPT, which makes sure  that  Ruby  pro-
+	   grams invoked in the subshell can see the gems in the bundle
+
+
+
+       It also modifies Rubygems:
+
+       o   disallow loading additional gems not in the bundle
+
+       o   modify  the gem method to be a no-op if a gem matching the require-
+	   ments is in the bundle, and to raise a Gem::LoadError if it's not
+
+       o   Define Gem.refresh to be a no-op, since the source index is	always
+	   frozen  when  using	bundler,  and  to prevent gems from the system
+	   leaking into the environment
+
+       o   Override Gem.bin_path to use the gems in the bundle, making	system
+	   executables work
+
+       o   Add all gems in the bundle into Gem.loaded_specs
+
+
+
+   Shelling out
+       When shelling out (using the system or backticks methods, for example),
+       Bundler's environment changes will propagate to the  subshell  environ-
+       ment. If you desire to shell out without Bundler's environment changes,
+       simply employ the with_clean_env method. It will restore  all  environ-
+       ment  variables	to  what  they	were before Bundler was activated. For
+       example:
+
+
+
+	   Bundler.with_clean_env do
+	     `brew install wget`
+	   end
+
+
+
+RUBYGEMS PLUGINS
+       At present,  the  Rubygems  plugin  system  requires  all  files  named
+       rubygems_plugin.rb  on the load path of any installed gem when any Ruby
+       code requires rubygems.rb. This includes executables installed into the
+       system, like rails, rackup, and rspec.
+
+       Since  Rubygems	plugins can contain arbitrary Ruby code, they commonly
+       end up activating themselves or their dependencies.
+
+       For instance, the gemcutter 0.5 gem depended on json_pure. If  you  had
+       that  version of gemcutter installed (even if you also had a newer ver-
+       sion without this problem), Rubygems would activate gemcutter  0.5  and
+       json_pure <latest>.
+
+       If your Gemfile(5) also contained json_pure (or a gem with a dependency
+       on json_pure), the latest version on your system  might	conflict  with
+       the  version  in  your Gemfile(5), or the snapshot version in your Gem-
+       file.lock.
+
+       If this happens, bundler will say:
+
+
+
+	   You have already activated json_pure 1.4.6 but your Gemfile
+	   requires json_pure 1.4.3. Consider using bundle exec.
+
+
+
+       In this situation, you almost certainly want to remove  the  underlying
+       gem  with  the problematic gem plugin. In general, the authors of these
+       plugins (in this case, the gemcutter gem) have released newer  versions
+       that are more careful in their plugins.
+
+       You can find a list of all the gems containing gem plugins by running
+
+
+
+	   ruby -rubygems -e "puts Gem.find_files('rubygems_plugin.rb')"
+
+
+
+       At the very least, you should remove all but the newest version of each
+       gem plugin, and also remove all gem plugins that you aren't using  (gem
+       uninstall gem_name).
+
+
+
+				  April 2013			BUNDLE-EXEC(1)
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-install b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-install
new file mode 100644
index 0000000..5ad7f52
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-install
@@ -0,0 +1,317 @@
+.\" generated with Ronn/v0.7.3
+.\" http://github.com/rtomayko/ronn/tree/0.7.3
+.
+.TH "BUNDLE\-INSTALL" "1" "April 2013" "" ""
+.
+.SH "NAME"
+\fBbundle\-install\fR \- Install the dependencies specified in your Gemfile
+.
+.SH "SYNOPSIS"
+\fBbundle install\fR [\-\-gemfile=GEMFILE]
+.
+.IP "" 4
+.
+.nf
+
+             [\-\-path PATH] [\-\-system]
+             [\-\-without=GROUP1[ GROUP2\.\.\.]]
+             [\-\-local] [\-\-deployment]
+             [\-\-binstubs[=DIRECTORY]]
+             [\-\-standalone[=GROUP1[ GROUP2\.\.\.]]]
+             [\-\-trust\-policy=POLICY]
+             [\-\-no\-cache]
+             [\-\-quiet]
+.
+.fi
+.
+.IP "" 0
+.
+.SH "DESCRIPTION"
+Install the gems specified in your Gemfile(5)\. If this is the first time you run bundle install (and a \fBGemfile\.lock\fR does not exist), bundler will fetch all remote sources, resolve dependencies and install all needed gems\.
+.
+.P
+If a \fBGemfile\.lock\fR does exist, and you have not updated your Gemfile(5), bundler will fetch all remote sources, but use the dependencies specified in the \fBGemfile\.lock\fR instead of resolving dependencies\.
+.
+.P
+If a \fBGemfile\.lock\fR does exist, and you have updated your Gemfile(5), bundler will use the dependencies in the \fBGemfile\.lock\fR for all gems that you did not update, but will re\-resolve the dependencies of gems that you did update\. You can find more information about this update process below under \fICONSERVATIVE UPDATING\fR\.
+.
+.SH "OPTIONS"
+.
+.TP
+\fB\-\-gemfile=<gemfile>\fR
+The location of the Gemfile(5) that bundler should use\. This defaults to a gemfile in the current working directory\. In general, bundler will assume that the location of the Gemfile(5) is also the project root, and will look for the \fBGemfile\.lock\fR and \fBvendor/cache\fR relative to it\.
+.
+.TP
+\fB\-\-path=<path>\fR
+The location to install the gems in the bundle to\. This defaults to the gem home, which is the location that \fBgem install\fR installs gems to\. This means that, by default, gems installed without a \fB\-\-path\fR setting will show up in \fBgem list\fR\. This setting is a \fIremembered option\fR\.
+.
+.TP
+\fB\-\-system\fR
+Installs the gems in the bundle to the system location\. This overrides any previous \fIremembered\fR use of \fB\-\-path\fR\.
+.
+.TP
+\fB\-\-without=<list>\fR
+A space\-separated list of groups to skip installing\. This is a \fIremembered option\fR\.
+.
+.TP
+\fB\-\-local\fR
+Do not attempt to connect to \fBrubygems\.org\fR, instead using just the gems already present in Rubygems\' cache or in \fBvendor/cache\fR\. Note that if a more appropriate platform\-specific gem exists on \fBrubygems\.org\fR, it will not be found\.
+.
+.TP
+\fB\-\-deployment\fR
+Switches bundler\'s defaults into \fIdeployment mode\fR\. Do not use this flag on development machines\.
+.
+.TP
+\fB\-\-binstubs[=<directory>]\fR
+Create a directory (defaults to \fBbin\fR) containing an executable that runs in the context of the bundle\. For instance, if the \fBrails\fR gem comes with a \fBrails\fR executable, this flag will create a \fBbin/rails\fR executable that ensures that all dependencies used come from the bundled gems\.
+.
+.TP
+\fB\-\-shebang ruby\-install\-name\fR
+Uses the ruby executable (usually \fBruby\fR) provided to execute the scripts created with \-\-binstubs\. For instance, if you use \-\-binstubs with \fB\-\-shebang jruby\fR, all executables will be created to use jruby instead\.
+.
+.TP
+\fB\-\-standalone[=<list>]\fR
+Make a bundle that can work without Ruby Gems or Bundler at runtime\. It takes a space separated list of groups to install\. It creates a \fBbundle\fR directory and installs the bundle there\. It also generates a \fBbundle/bundler/setup\.rb\fR file to replace Bundler\'s own setup\.
+.
+.TP
+\fB\-\-trust\-policy=[<policy>]\fR
+Apply the Rubygems security policy named \fIpolicy\fR, where policy is one of HighSecurity, MediumSecurity, LowSecurity, or NoSecurity\. For more detail, see the Rubygems signing documentation, linked below in \fISEE ALSO\fR\.
+.
+.TP
+\fB\-\-no\-cache\fR
+Do not update the cache in \fBvendor/cache\fR with the newly bundled gems\. This does not remove any existing cached gems, only stops the newly bundled gems from being cached during the install\.
+.
+.TP
+\fB\-\-quiet\fR
+Do not print progress information to stdout\. Instead, communicate the success of the install operation via exit status code\.
+.
+.SH "DEPLOYMENT MODE"
+Bundler\'s defaults are optimized for development\. To switch to defaults optimized for deployment, use the \fB\-\-deployment\fR flag\. Do not activate deployment mode on development machines, as it will cause in an error when the Gemfile is modified\.
+.
+.IP "1." 4
+A \fBGemfile\.lock\fR is required\.
+.
+.IP
+To ensure that the same versions of the gems you developed with and tested with are also used in deployments, a \fBGemfile\.lock\fR is required\.
+.
+.IP
+This is mainly to ensure that you remember to check your \fBGemfile\.lock\fR into version control\.
+.
+.IP "2." 4
+The \fBGemfile\.lock\fR must be up to date
+.
+.IP
+In development, you can modify your Gemfile(5) and re\-run \fBbundle install\fR to \fIconservatively update\fR your \fBGemfile\.lock\fR snapshot\.
+.
+.IP
+In deployment, your \fBGemfile\.lock\fR should be up\-to\-date with changes made in your Gemfile(5)\.
+.
+.IP "3." 4
+Gems are installed to \fBvendor/bundle\fR not your default system location
+.
+.IP
+In development, it\'s convenient to share the gems used in your application with other applications and other scripts run on the system\.
+.
+.IP
+In deployment, isolation is a more important default\. In addition, the user deploying the application may not have permission to install gems to the system, or the web server may not have permission to read them\.
+.
+.IP
+As a result, \fBbundle install \-\-deployment\fR installs gems to the \fBvendor/bundle\fR directory in the application\. This may be overridden using the \fB\-\-path\fR option\.
+.
+.IP "" 0
+.
+.SH "SUDO USAGE"
+By default, bundler installs gems to the same location as \fBgem install\fR\.
+.
+.P
+In some cases, that location may not be writable by your Unix user\. In that case, bundler will stage everything in a temporary directory, then ask you for your \fBsudo\fR password in order to copy the gems into their system location\.
+.
+.P
+From your perspective, this is identical to installing them gems directly into the system\.
+.
+.P
+You should never use \fBsudo bundle install\fR\. This is because several other steps in \fBbundle install\fR must be performed as the current user:
+.
+.IP "\(bu" 4
+Updating your \fBGemfile\.lock\fR
+.
+.IP "\(bu" 4
+Updating your \fBvendor/cache\fR, if necessary
+.
+.IP "\(bu" 4
+Checking out private git repositories using your user\'s SSH keys
+.
+.IP "" 0
+.
+.P
+Of these three, the first two could theoretically be performed by \fBchown\fRing the resulting files to \fB$SUDO_USER\fR\. The third, however, can only be performed by actually invoking the \fBgit\fR command as the current user\. Therefore, git gems are downloaded and installed into \fB~/\.bundle\fR rather than $GEM_HOME or $BUNDLE_PATH\.
+.
+.P
+As a result, you should run \fBbundle install\fR as the current user, and bundler will ask for your password if it is needed to put the gems into their final location\.
+.
+.SH "INSTALLING GROUPS"
+By default, \fBbundle install\fR will install all gems in all groups in your Gemfile(5), except those declared for a different platform\.
+.
+.P
+However, you can explicitly tell bundler to skip installing certain groups with the \fB\-\-without\fR option\. This option takes a space\-separated list of groups\.
+.
+.P
+While the \fB\-\-without\fR option will skip \fIinstalling\fR the gems in the specified groups, it will still \fIdownload\fR those gems and use them to resolve the dependencies of every gem in your Gemfile(5)\.
+.
+.P
+This is so that installing a different set of groups on another machine (such as a production server) will not change the gems and versions that you have already developed and tested against\.
+.
+.P
+\fBBundler offers a rock\-solid guarantee that the third\-party code you are running in development and testing is also the third\-party code you are running in production\. You can choose to exclude some of that code in different environments, but you will never be caught flat\-footed by different versions of third\-party code being used in different environments\.\fR
+.
+.P
+For a simple illustration, consider the following Gemfile(5):
+.
+.IP "" 4
+.
+.nf
+
+source "https://rubygems\.org"
+
+gem "sinatra"
+
+group :production do
+  gem "rack\-perftools\-profiler"
+end
+.
+.fi
+.
+.IP "" 0
+.
+.P
+In this case, \fBsinatra\fR depends on any version of Rack (\fB>= 1\.0\fR, while \fBrack\-perftools\-profiler\fR depends on 1\.x (\fB~> 1\.0\fR)\.
+.
+.P
+When you run \fBbundle install \-\-without production\fR in development, we look at the dependencies of \fBrack\-perftools\-profiler\fR as well\. That way, you do not spend all your time developing against Rack 2\.0, using new APIs unavailable in Rack 1\.x, only to have bundler switch to Rack 1\.2 when the \fBproduction\fR group \fIis\fR used\.
+.
+.P
+This should not cause any problems in practice, because we do not attempt to \fBinstall\fR the gems in the excluded groups, and only evaluate as part of the dependency resolution process\.
+.
+.P
+This also means that you cannot include different versions of the same gem in different groups, because doing so would result in different sets of dependencies used in development and production\. Because of the vagaries of the dependency resolution process, this usually affects more than just the gems you list in your Gemfile(5), and can (surprisingly) radically change the gems you are using\.
+.
+.SH "REMEMBERED OPTIONS"
+Some options (marked above in the \fIOPTIONS\fR section) are remembered between calls to \fBbundle install\fR, and by the Bundler runtime\.
+.
+.P
+For instance, if you run \fBbundle install \-\-without test\fR, a subsequent call to \fBbundle install\fR that does not include a \fB\-\-without\fR flag will remember your previous choice\.
+.
+.P
+In addition, a call to \fBBundler\.setup\fR will not attempt to make the gems in those groups available on the Ruby load path, as they were not installed\.
+.
+.P
+The settings that are remembered are:
+.
+.TP
+\fB\-\-deployment\fR
+At runtime, this remembered setting will also result in Bundler raising an exception if the \fBGemfile\.lock\fR is out of date\.
+.
+.TP
+\fB\-\-path\fR
+Subsequent calls to \fBbundle install\fR will install gems to the directory originally passed to \fB\-\-path\fR\. The Bundler runtime will look for gems in that location\. You can revert this option by running \fBbundle install \-\-system\fR\.
+.
+.TP
+\fB\-\-binstubs\fR
+Bundler will update the executables every subsequent call to \fBbundle install\fR\.
+.
+.TP
+\fB\-\-without\fR
+As described above, Bundler will skip the gems specified by \fB\-\-without\fR in subsequent calls to \fBbundle install\fR\. The Bundler runtime will also not try to make the gems in the skipped groups available\.
+.
+.SH "THE GEMFILE\.LOCK"
+When you run \fBbundle install\fR, Bundler will persist the full names and versions of all gems that you used (including dependencies of the gems specified in the Gemfile(5)) into a file called \fBGemfile\.lock\fR\.
+.
+.P
+Bundler uses this file in all subsequent calls to \fBbundle install\fR, which guarantees that you always use the same exact code, even as your application moves across machines\.
+.
+.P
+Because of the way dependency resolution works, even a seemingly small change (for instance, an update to a point\-release of a dependency of a gem in your Gemfile(5)) can result in radically different gems being needed to satisfy all dependencies\.
+.
+.P
+As a result, you \fBSHOULD\fR check your \fBGemfile\.lock\fR into version control\. If you do not, every machine that checks out your repository (including your production server) will resolve all dependencies again, which will result in different versions of third\-party code being used if \fBany\fR of the gems in the Gemfile(5) or any of their dependencies have been updated\.
+.
+.SH "CONSERVATIVE UPDATING"
+When you make a change to the Gemfile(5) and then run \fBbundle install\fR, Bundler will update only the gems that you modified\.
+.
+.P
+In other words, if a gem that you \fBdid not modify\fR worked before you called \fBbundle install\fR, it will continue to use the exact same versions of all dependencies as it used before the update\.
+.
+.P
+Let\'s take a look at an example\. Here\'s your original Gemfile(5):
+.
+.IP "" 4
+.
+.nf
+
+source "https://rubygems\.org"
+
+gem "actionpack", "2\.3\.8"
+gem "activemerchant"
+.
+.fi
+.
+.IP "" 0
+.
+.P
+In this case, both \fBactionpack\fR and \fBactivemerchant\fR depend on \fBactivesupport\fR\. The \fBactionpack\fR gem depends on \fBactivesupport 2\.3\.8\fR and \fBrack ~> 1\.1\.0\fR, while the \fBactivemerchant\fR gem depends on \fBactivesupport >= 2\.3\.2\fR, \fBbraintree >= 2\.0\.0\fR, and \fBbuilder >= 2\.0\.0\fR\.
+.
+.P
+When the dependencies are first resolved, Bundler will select \fBactivesupport 2\.3\.8\fR, which satisfies the requirements of both gems in your Gemfile(5)\.
+.
+.P
+Next, you modify your Gemfile(5) to:
+.
+.IP "" 4
+.
+.nf
+
+source "https://rubygems\.org"
+
+gem "actionpack", "3\.0\.0\.rc"
+gem "activemerchant"
+.
+.fi
+.
+.IP "" 0
+.
+.P
+The \fBactionpack 3\.0\.0\.rc\fR gem has a number of new dependencies, and updates the \fBactivesupport\fR dependency to \fB= 3\.0\.0\.rc\fR and the \fBrack\fR dependency to \fB~> 1\.2\.1\fR\.
+.
+.P
+When you run \fBbundle install\fR, Bundler notices that you changed the \fBactionpack\fR gem, but not the \fBactivemerchant\fR gem\. It evaluates the gems currently being used to satisfy its requirements:
+.
+.TP
+\fBactivesupport 2\.3\.8\fR
+also used to satisfy a dependency in \fBactivemerchant\fR, which is not being updated
+.
+.TP
+\fBrack ~> 1\.1\.0\fR
+not currently being used to satify another dependency
+.
+.P
+Because you did not explicitly ask to update \fBactivemerchant\fR, you would not expect it to suddenly stop working after updating \fBactionpack\fR\. However, satisfying the new \fBactivesupport 3\.0\.0\.rc\fR dependency of actionpack requires updating one of its dependencies\.
+.
+.P
+Even though \fBactivemerchant\fR declares a very loose dependency that theoretically matches \fBactivesupport 3\.0\.0\.rc\fR, bundler treats gems in your Gemfile(5) that have not changed as an atomic unit together with their dependencies\. In this case, the \fBactivemerchant\fR dependency is treated as \fBactivemerchant 1\.7\.1 + activesupport 2\.3\.8\fR, so \fBbundle install\fR will report that it cannot update \fBactionpack\fR\.
+.
+.P
+To explicitly update \fBactionpack\fR, including its dependencies which other gems in the Gemfile(5) still depend on, run \fBbundle update actionpack\fR (see \fBbundle update(1)\fR)\.
+.
+.P
+\fBSummary\fR: In general, after making a change to the Gemfile(5) , you should first try to run \fBbundle install\fR, which will guarantee that no other gems in the Gemfile(5) are impacted by the change\. If that does not work, run bundle update(1) \fIbundle\-update\.1\.html\fR\.
+.
+.SH "SEE ALSO"
+.
+.IP "\(bu" 4
+Gem install docs: http://docs\.rubygems\.org/read/chapter/2
+.
+.IP "\(bu" 4
+Rubygems signing docs: http://docs\.rubygems\.org/read/chapter/21
+.
+.IP "" 0
+
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-install.txt b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-install.txt
new file mode 100644
index 0000000..3d8eba3
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-install.txt
@@ -0,0 +1,377 @@
+BUNDLE-INSTALL(1)					     BUNDLE-INSTALL(1)
+
+
+
+NAME
+       bundle-install - Install the dependencies specified in your Gemfile
+
+SYNOPSIS
+       bundle install [--gemfile=GEMFILE]
+
+
+
+			[--path PATH] [--system]
+			[--without=GROUP1[ GROUP2...]]
+			[--local] [--deployment]
+			[--binstubs[=DIRECTORY]]
+			[--standalone[=GROUP1[ GROUP2...]]]
+			[--trust-policy=POLICY]
+			[--no-cache]
+			[--quiet]
+
+
+
+DESCRIPTION
+       Install	the  gems  specified  in your Gemfile(5). If this is the first
+       time you run bundle  install  (and  a  Gemfile.lock  does  not  exist),
+       bundler will fetch all remote sources, resolve dependencies and install
+       all needed gems.
+
+       If a Gemfile.lock does exist, and you have not updated your Gemfile(5),
+       bundler	will fetch all remote sources, but use the dependencies speci-
+       fied in the Gemfile.lock instead of resolving dependencies.
+
+       If a Gemfile.lock does exist, and you  have  updated  your  Gemfile(5),
+       bundler will use the dependencies in the Gemfile.lock for all gems that
+       you did not update, but will re-resolve the dependencies of  gems  that
+       you did update. You can find more information about this update process
+       below under CONSERVATIVE UPDATING.
+
+OPTIONS
+       --gemfile=<gemfile>
+	      The location of the Gemfile(5) that  bundler  should  use.  This
+	      defaults	to a gemfile in the current working directory. In gen-
+	      eral, bundler will assume that the location of the Gemfile(5) is
+	      also  the  project  root, and will look for the Gemfile.lock and
+	      vendor/cache relative to it.
+
+       --path=<path>
+	      The location to install the gems in the bundle to. This defaults
+	      to the gem home, which is the location that gem install installs
+	      gems to. This means that, by default, gems installed  without  a
+	      --path  setting  will  show  up  in  gem list. This setting is a
+	      remembered option.
+
+       --system
+	      Installs the gems in the bundle to  the  system  location.  This
+	      overrides any previous remembered use of --path.
+
+       --without=<list>
+	      A  space-separated  list of groups to skip installing. This is a
+	      remembered option.
+
+       --local
+	      Do not attempt to connect to rubygems.org,  instead  using  just
+	      the  gems already present in Rubygems' cache or in vendor/cache.
+	      Note that if a more appropriate platform-specific gem exists  on
+	      rubygems.org, it will not be found.
+
+       --deployment
+	      Switches	bundler's  defaults  into  deployment mode. Do not use
+	      this flag on development machines.
+
+       --binstubs[=<directory>]
+	      Create a directory (defaults to bin)  containing	an  executable
+	      that  runs  in  the  context of the bundle. For instance, if the
+	      rails gem comes with a rails executable, this flag will create a
+	      bin/rails  executable  that  ensures  that all dependencies used
+	      come from the bundled gems.
+
+       --shebang ruby-install-name
+	      Uses the ruby executable (usually ruby) provided to execute  the
+	      scripts created with --binstubs. For instance, if you use --bin-
+	      stubs with --shebang jruby, all executables will be  created  to
+	      use jruby instead.
+
+       --standalone[=<list>]
+	      Make a bundle that can work without Ruby Gems or Bundler at run-
+	      time. It takes a space separated list of groups to  install.  It
+	      creates  a  bundle  directory  and installs the bundle there. It
+	      also  generates  a  bundle/bundler/setup.rb  file   to   replace
+	      Bundler's own setup.
+
+       --trust-policy=[<policy>]
+	      Apply the Rubygems security policy named policy, where policy is
+	      one of HighSecurity, MediumSecurity, LowSecurity, or NoSecurity.
+	      For  more detail, see the Rubygems signing documentation, linked
+	      below in SEE ALSO.
+
+       --no-cache
+	      Do not update the cache in vendor/cache with the	newly  bundled
+	      gems.  This does not remove any existing cached gems, only stops
+	      the newly bundled gems from being cached during the install.
+
+       --quiet
+	      Do not print progress information to stdout.  Instead,  communi-
+	      cate  the success of the install operation via exit status code.
+
+DEPLOYMENT MODE
+       Bundler's defaults are optimized for development. To switch to defaults
+       optimized  for  deployment,  use the --deployment flag. Do not activate
+       deployment mode on development machines, as it will cause in  an  error
+       when the Gemfile is modified.
+
+       1.  A Gemfile.lock is required.
+
+	   To ensure that the same versions of the gems you developed with and
+	   tested with	are  also  used  in  deployments,  a  Gemfile.lock  is
+	   required.
+
+	   This  is  mainly  to  ensure  that  you remember to check your Gem-
+	   file.lock into version control.
+
+       2.  The Gemfile.lock must be up to date
+
+	   In development, you can modify your Gemfile(5)  and	re-run	bundle
+	   install to conservatively update your Gemfile.lock snapshot.
+
+	   In  deployment, your Gemfile.lock should be up-to-date with changes
+	   made in your Gemfile(5).
+
+       3.  Gems are installed to vendor/bundle not your default  system  loca-
+	   tion
+
+	   In  development,  it's  convenient  to  share the gems used in your
+	   application with other applications and other scripts  run  on  the
+	   system.
+
+	   In  deployment, isolation is a more important default. In addition,
+	   the user deploying the  application	may  not  have	permission  to
+	   install  gems to the system, or the web server may not have permis-
+	   sion to read them.
+
+	   As a result, bundle install --deployment installs gems to the  ven-
+	   dor/bundle  directory  in  the  application. This may be overridden
+	   using the --path option.
+
+
+
+SUDO USAGE
+       By default, bundler installs gems to the same location as gem  install.
+
+       In  some cases, that location may not be writable by your Unix user. In
+       that case, bundler will stage everything in a temporary directory, then
+       ask  you  for  your  sudo password in order to copy the gems into their
+       system location.
+
+       From your perspective,  this  is  identical  to	installing  them  gems
+       directly into the system.
+
+       You should never use sudo bundle install. This is because several other
+       steps in bundle install must be performed as the current user:
+
+       o   Updating your Gemfile.lock
+
+       o   Updating your vendor/cache, if necessary
+
+       o   Checking out private git repositories using your user's SSH keys
+
+
+
+       Of these three, the first  two  could  theoretically  be  performed  by
+       chowning  the  resulting  files	to $SUDO_USER. The third, however, can
+       only be performed by actually invoking the git command as  the  current
+       user.  Therefore,  git gems are downloaded and installed into ~/.bundle
+       rather than $GEM_HOME or $BUNDLE_PATH.
+
+       As a result, you should run bundle install as  the  current  user,  and
+       bundler will ask for your password if it is needed to put the gems into
+       their final location.
+
+INSTALLING GROUPS
+       By default, bundle install will install all gems in all groups in  your
+       Gemfile(5), except those declared for a different platform.
+
+       However,  you  can  explicitly  tell bundler to skip installing certain
+       groups with the --without option. This option takes  a  space-separated
+       list of groups.
+
+       While  the --without option will skip installing the gems in the speci-
+       fied groups, it will still download those gems and use them to  resolve
+       the dependencies of every gem in your Gemfile(5).
+
+       This is so that installing a different set of groups on another machine
+       (such as a production server) will not change  the  gems  and  versions
+       that you have already developed and tested against.
+
+       Bundler offers a rock-solid guarantee that the third-party code you are
+       running in development and testing is also the third-party code you are
+       running	in  production. You can choose to exclude some of that code in
+       different environments, but you will never  be  caught  flat-footed  by
+       different versions of third-party code being used in different environ-
+       ments.
+
+       For a simple illustration, consider the following Gemfile(5):
+
+
+
+	   source "https://rubygems.org"
+
+	   gem "sinatra"
+
+	   group :production do
+	     gem "rack-perftools-profiler"
+	   end
+
+
+
+       In this case, sinatra depends on any version of	Rack  (>=  1.0,  while
+       rack-perftools-profiler depends on 1.x (~> 1.0).
+
+       When  you  run  bundle  install --without production in development, we
+       look at the dependencies of rack-perftools-profiler as well. That  way,
+       you  do	not spend all your time developing against Rack 2.0, using new
+       APIs unavailable in Rack 1.x, only to have bundler switch to  Rack  1.2
+       when the production group is used.
+
+       This  should  not  cause  any  problems	in practice, because we do not
+       attempt to install the gems in the excluded groups, and	only  evaluate
+       as part of the dependency resolution process.
+
+       This  also means that you cannot include different versions of the same
+       gem in different groups, because doing so  would  result  in  different
+       sets of dependencies used in development and production. Because of the
+       vagaries of the dependency resolution  process,	this  usually  affects
+       more  than just the gems you list in your Gemfile(5), and can (surpris-
+       ingly) radically change the gems you are using.
+
+REMEMBERED OPTIONS
+       Some options (marked above  in  the  OPTIONS  section)  are  remembered
+       between calls to bundle install, and by the Bundler runtime.
+
+       For  instance,  if  you run bundle install --without test, a subsequent
+       call to bundle install that does not  include  a  --without  flag  will
+       remember your previous choice.
+
+       In  addition, a call to Bundler.setup will not attempt to make the gems
+       in those groups available on the Ruby  load  path,  as  they  were  not
+       installed.
+
+       The settings that are remembered are:
+
+       --deployment
+	      At  runtime, this remembered setting will also result in Bundler
+	      raising an exception if the Gemfile.lock is out of date.
+
+       --path Subsequent calls to bundle install  will	install  gems  to  the
+	      directory  originally passed to --path. The Bundler runtime will
+	      look for gems in that location. You can revert  this  option  by
+	      running bundle install --system.
+
+       --binstubs
+	      Bundler  will  update  the  executables every subsequent call to
+	      bundle install.
+
+       --without
+	      As described above, Bundler will	skip  the  gems  specified  by
+	      --without  in  subsequent  calls	to bundle install. The Bundler
+	      runtime will also not try to make the gems in the skipped groups
+	      available.
+
+THE GEMFILE.LOCK
+       When  you  run  bundle install, Bundler will persist the full names and
+       versions of all gems that you used (including dependencies of the  gems
+       specified in the Gemfile(5)) into a file called Gemfile.lock.
+
+       Bundler uses this file in all subsequent calls to bundle install, which
+       guarantees that you always use the same exact code, even as your appli-
+       cation moves across machines.
+
+       Because	of the way dependency resolution works, even a seemingly small
+       change (for instance, an update to a point-release of a dependency of a
+       gem  in	your  Gemfile(5)) can result in radically different gems being
+       needed to satisfy all dependencies.
+
+       As a result, you SHOULD check your Gemfile.lock into  version  control.
+       If you do not, every machine that checks out your repository (including
+       your production server) will resolve all dependencies again, which will
+       result  in  different versions of third-party code being used if any of
+       the gems in the Gemfile(5) or  any  of  their  dependencies  have  been
+       updated.
+
+CONSERVATIVE UPDATING
+       When  you  make a change to the Gemfile(5) and then run bundle install,
+       Bundler will update only the gems that you modified.
+
+       In other words, if a gem that you did  not  modify  worked  before  you
+       called  bundle install, it will continue to use the exact same versions
+       of all dependencies as it used before the update.
+
+       Let's take a look at an example. Here's your original Gemfile(5):
+
+
+
+	   source "https://rubygems.org"
+
+	   gem "actionpack", "2.3.8"
+	   gem "activemerchant"
+
+
+
+       In this case, both actionpack and activemerchant depend	on  activesup-
+       port.  The  actionpack  gem  depends on activesupport 2.3.8 and rack ~>
+       1.1.0, while the activemerchant gem depends on activesupport >=	2.3.2,
+       braintree >= 2.0.0, and builder >= 2.0.0.
+
+       When   the   dependencies  are  first  resolved,  Bundler  will	select
+       activesupport 2.3.8, which satisfies the requirements of both  gems  in
+       your Gemfile(5).
+
+       Next, you modify your Gemfile(5) to:
+
+
+
+	   source "https://rubygems.org"
+
+	   gem "actionpack", "3.0.0.rc"
+	   gem "activemerchant"
+
+
+
+       The  actionpack	3.0.0.rc  gem  has  a  number of new dependencies, and
+       updates the activesupport dependency to = 3.0.0.rc and the rack	depen-
+       dency to ~> 1.2.1.
+
+       When  you  run  bundle  install,  Bundler  notices that you changed the
+       actionpack gem, but not the activemerchant gem. It evaluates  the  gems
+       currently being used to satisfy its requirements:
+
+       activesupport 2.3.8
+	      also  used  to  satisfy a dependency in activemerchant, which is
+	      not being updated
+
+       rack ~> 1.1.0
+	      not currently being used to satify another dependency
+
+       Because you did not explicitly ask to update activemerchant, you  would
+       not  expect it to suddenly stop working after updating actionpack. How-
+       ever, satisfying the new activesupport 3.0.0.rc dependency  of  action-
+       pack requires updating one of its dependencies.
+
+       Even  though activemerchant declares a very loose dependency that theo-
+       retically matches activesupport 3.0.0.rc, bundler treats gems  in  your
+       Gemfile(5)  that have not changed as an atomic unit together with their
+       dependencies. In this case, the activemerchant dependency is treated as
+       activemerchant  1.7.1  +  activesupport	2.3.8,	so bundle install will
+       report that it cannot update actionpack.
+
+       To explicitly update actionpack, including its dependencies which other
+       gems  in  the  Gemfile(5) still depend on, run bundle update actionpack
+       (see bundle update(1)).
+
+       Summary: In general, after making a change  to  the  Gemfile(5)	,  you
+       should  first  try  to run bundle install, which will guarantee that no
+       other gems in the Gemfile(5) are impacted by the change. If  that  does
+       not work, run bundle update(1) bundle-update.1.html.
+
+SEE ALSO
+       o   Gem install docs: http://docs.rubygems.org/read/chapter/2
+
+       o   Rubygems signing docs: http://docs.rubygems.org/read/chapter/21
+
+
+
+
+
+
+				  April 2013		     BUNDLE-INSTALL(1)
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-package b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-package
new file mode 100644
index 0000000..fdf7152
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-package
@@ -0,0 +1,49 @@
+.\" generated with Ronn/v0.7.3
+.\" http://github.com/rtomayko/ronn/tree/0.7.3
+.
+.TH "BUNDLE\-PACKAGE" "1" "April 2013" "" ""
+.
+.SH "NAME"
+\fBbundle\-package\fR \- Package your needed \fB\.gem\fR files into your application
+.
+.SH "SYNOPSIS"
+\fBbundle package\fR
+.
+.SH "DESCRIPTION"
+Copy all of the \fB\.gem\fR files needed to run the application into the \fBvendor/cache\fR directory\. In the future, when running bundle install(1) \fIbundle\-install\.1\.html\fR, use the gems in the cache in preference to the ones on \fBrubygems\.org\fR\.
+.
+.SH "GIT AND PATH GEMS"
+Since Bundler 1\.2, the \fBbundle package\fR command can also package \fB:git\fR and \fB:path\fR dependencies besides \.gem files\. This needs to be explicitly enabled via the \fB\-\-all\fR option\. Once used, the \fB\-\-all\fR option will be remembered\.
+.
+.SH "REMOTE FETCHING"
+By default, if you simply run bundle install(1) \fIbundle\-install\.1\.html\fR after running bundle package(1) \fIbundle\-package\.1\.html\fR, bundler will still connect to \fBrubygems\.org\fR to check whether a platform\-specific gem exists for any of the gems in \fBvendor/cache\fR\.
+.
+.P
+For instance, consider this Gemfile(5):
+.
+.IP "" 4
+.
+.nf
+
+source "https://rubygems\.org"
+
+gem "nokogiri"
+.
+.fi
+.
+.IP "" 0
+.
+.P
+If you run \fBbundle package\fR under C Ruby, bundler will retrieve the version of \fBnokogiri\fR for the \fB"ruby"\fR platform\. If you deploy to JRuby and run \fBbundle install\fR, bundler is forced to check to see whether a \fB"java"\fR platformed \fBnokogiri\fR exists\.
+.
+.P
+Even though the \fBnokogiri\fR gem for the Ruby platform is \fItechnically\fR acceptable on JRuby, it actually has a C extension that does not run on JRuby\. As a result, bundler will, by default, still connect to \fBrubygems\.org\fR to check whether it has a version of one of your gems more specific to your platform\.
+.
+.P
+This problem is also not just limited to the \fB"java"\fR platform\. A similar (common) problem can happen when developing on Windows and deploying to Linux, or even when developing on OSX and deploying to Linux\.
+.
+.P
+If you know for sure that the gems packaged in \fBvendor/cache\fR are appropriate for the platform you are on, you can run \fBbundle install \-\-local\fR to skip checking for more appropriate gems, and just use the ones in \fBvendor/cache\fR\.
+.
+.P
+One way to be sure that you have the right platformed versions of all your gems is to run \fBbundle package\fR on an identical machine and check in the gems\. For instance, you can run \fBbundle package\fR on an identical staging box during your staging process, and check in the \fBvendor/cache\fR before deploying to production\.
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-package.txt b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-package.txt
new file mode 100644
index 0000000..423a6e1
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-package.txt
@@ -0,0 +1,67 @@
+BUNDLE-PACKAGE(1)					     BUNDLE-PACKAGE(1)
+
+
+
+NAME
+       bundle-package - Package your needed .gem files into your application
+
+SYNOPSIS
+       bundle package
+
+DESCRIPTION
+       Copy  all of the .gem files needed to run the application into the ven-
+       dor/cache directory. In the future, when running bundle install(1) bun-
+       dle-install.1.html, use the gems in the cache in preference to the ones
+       on rubygems.org.
+
+GIT AND PATH GEMS
+       Since Bundler 1.2, the bundle package command can also package :git and
+       :path  dependencies  besides  .gem  files.  This needs to be explicitly
+       enabled via the --all option. Once  used,  the  --all  option  will  be
+       remembered.
+
+REMOTE FETCHING
+       By  default,  if you simply run bundle install(1) bundle-install.1.html
+       after running bundle  package(1)  bundle-package.1.html,  bundler  will
+       still  connect to rubygems.org to check whether a platform-specific gem
+       exists for any of the gems in vendor/cache.
+
+       For instance, consider this Gemfile(5):
+
+
+
+	   source "https://rubygems.org"
+
+	   gem "nokogiri"
+
+
+
+       If you run bundle package under C Ruby, bundler will retrieve the  ver-
+       sion  of  nokogiri  for the "ruby" platform. If you deploy to JRuby and
+       run bundle install, bundler is forced to check to see whether a	"java"
+       platformed nokogiri exists.
+
+       Even  though  the  nokogiri  gem  for  the Ruby platform is technically
+       acceptable on JRuby, it actually has a C extension that does not run on
+       JRuby.  As  a  result,  bundler	will,  by  default,  still  connect to
+       rubygems.org to check whether it has a version of one of your gems more
+       specific to your platform.
+
+       This problem is also not just limited to the "java" platform. A similar
+       (common) problem can happen when developing on Windows and deploying to
+       Linux, or even when developing on OSX and deploying to Linux.
+
+       If  you know for sure that the gems packaged in vendor/cache are appro-
+       priate for the platform you are on, you can run bundle install  --local
+       to  skip  checking  for more appropriate gems, and just use the ones in
+       vendor/cache.
+
+       One way to be sure that you have the right platformed versions  of  all
+       your gems is to run bundle package on an identical machine and check in
+       the gems. For instance, you can run  bundle  package  on  an  identical
+       staging	box during your staging process, and check in the vendor/cache
+       before deploying to production.
+
+
+
+				  April 2013		     BUNDLE-PACKAGE(1)
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-platform b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-platform
new file mode 100644
index 0000000..33427bb
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-platform
@@ -0,0 +1,61 @@
+.\" generated with Ronn/v0.7.3
+.\" http://github.com/rtomayko/ronn/tree/0.7.3
+.
+.TH "BUNDLE\-PLATFORM" "1" "April 2013" "" ""
+.
+.SH "NAME"
+\fBbundle\-platform\fR \- Displays platform compatibility information
+.
+.SH "SYNOPSIS"
+\fBbundle platform\fR [\-\-ruby]
+.
+.SH "DESCRIPTION"
+\fBplatform\fR will display information from your Gemfile, Gemfile\.lock, and Ruby VM about your platform\.
+.
+.P
+For instance, using this Gemfile(5):
+.
+.IP "" 4
+.
+.nf
+
+source "https://rubygems\.org"
+
+ruby "1\.9\.3"
+
+gem "rack"
+.
+.fi
+.
+.IP "" 0
+.
+.P
+If you run \fBbundle platform\fR on Ruby 1\.9\.3, it will display the following output:
+.
+.IP "" 4
+.
+.nf
+
+Your platform is: x86_64\-linux
+
+Your app has gems that work on these platforms:
+* ruby
+
+Your Gemfile specifies a Ruby version requirement:
+* ruby 1\.9\.3
+
+Your current platform satisfies the Ruby version requirement\.
+.
+.fi
+.
+.IP "" 0
+.
+.P
+\fBplatform\fR will list all the platforms in your \fBGemfile\.lock\fR as well as the \fBruby\fR directive if applicable from your Gemfile(5)\. It will also let you know if the \fBruby\fR directive requirement has been met\. If \fBruby\fR directive doesn\'t match the running Ruby VM, it will tell you what part does not\.
+.
+.SH "OPTIONS"
+.
+.TP
+\fB\-\-ruby\fR
+It will just display the ruby directive information, so you don\'t have to parse it from the Gemfile(5)\.
+
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-platform.txt b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-platform.txt
new file mode 100644
index 0000000..5ecb0c9
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-platform.txt
@@ -0,0 +1,57 @@
+BUNDLE-PLATFORM(1)					    BUNDLE-PLATFORM(1)
+
+
+
+NAME
+       bundle-platform - Displays platform compatibility information
+
+SYNOPSIS
+       bundle platform [--ruby]
+
+DESCRIPTION
+       platform  will display information from your Gemfile, Gemfile.lock, and
+       Ruby VM about your platform.
+
+       For instance, using this Gemfile(5):
+
+
+
+	   source "https://rubygems.org"
+
+	   ruby "1.9.3"
+
+	   gem "rack"
+
+
+
+       If you run bundle platform on Ruby 1.9.3, it will display the following
+       output:
+
+
+
+	   Your platform is: x86_64-linux
+
+	   Your app has gems that work on these platforms:
+	   * ruby
+
+	   Your Gemfile specifies a Ruby version requirement:
+	   * ruby 1.9.3
+
+	   Your current platform satisfies the Ruby version requirement.
+
+
+
+       platform  will  list  all the platforms in your Gemfile.lock as well as
+       the ruby directive if applicable from your Gemfile(5). It will also let
+       you know if the ruby directive requirement has been met. If ruby direc-
+       tive doesn't match the running Ruby VM, it will tell you what part does
+       not.
+
+OPTIONS
+       --ruby It  will	just  display  the  ruby directive information, so you
+	      don't have to parse it from the Gemfile(5).
+
+
+
+
+				  April 2013		    BUNDLE-PLATFORM(1)
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-update b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-update
new file mode 100644
index 0000000..747311e
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-update
@@ -0,0 +1,202 @@
+.\" generated with Ronn/v0.7.3
+.\" http://github.com/rtomayko/ronn/tree/0.7.3
+.
+.TH "BUNDLE\-UPDATE" "1" "April 2013" "" ""
+.
+.SH "NAME"
+\fBbundle\-update\fR \- Update your gems to the latest available versions
+.
+.SH "SYNOPSIS"
+\fBbundle update\fR \fI*gems\fR [\-\-source=NAME]
+.
+.SH "DESCRIPTION"
+Update the gems specified (all gems, if none are specified), ignoring the previously installed gems specified in the \fBGemfile\.lock\fR\. In general, you should use bundle install(1) \fIbundle\-install\.1\.html\fR to install the same exact gems and versions across machines\.
+.
+.P
+You would use \fBbundle update\fR to explicitly update the version of a gem\.
+.
+.SH "OPTIONS"
+.
+.TP
+\fB\-\-source=<name>\fR
+The name of a \fB:git\fR or \fB:path\fR source used in the Gemfile(5)\. For instance, with a \fB:git\fR source of \fBhttp://github\.com/rails/rails\.git\fR, you would call \fBbundle update \-\-source rails\fR
+.
+.SH "UPDATING ALL GEMS"
+If you run \fBbundle update\fR with no parameters, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources\.
+.
+.P
+Consider the following Gemfile(5):
+.
+.IP "" 4
+.
+.nf
+
+source "https://rubygems\.org"
+
+gem "rails", "3\.0\.0\.rc"
+gem "nokogiri"
+.
+.fi
+.
+.IP "" 0
+.
+.P
+When you run bundle install(1) \fIbundle\-install\.1\.html\fR the first time, bundler will resolve all of the dependencies, all the way down, and install what you need:
+.
+.IP "" 4
+.
+.nf
+
+Fetching source index for https://rubygems\.org/
+Installing rake (10\.0\.2)
+Installing abstract (1\.0\.0)
+Installing activesupport (3\.0\.0\.rc)
+Installing builder (2\.1\.2)
+Installing i18n (0\.4\.1)
+Installing activemodel (3\.0\.0\.rc)
+Installing erubis (2\.6\.6)
+Installing rack (1\.2\.1)
+Installing rack\-mount (0\.6\.9)
+Installing rack\-test (0\.5\.4)
+Installing tzinfo (0\.3\.22)
+Installing actionpack (3\.0\.0\.rc)
+Installing mime\-types (1\.16)
+Installing polyglot (0\.3\.1)
+Installing treetop (1\.4\.8)
+Installing mail (2\.2\.5)
+Installing actionmailer (3\.0\.0\.rc)
+Installing arel (0\.4\.0)
+Installing activerecord (3\.0\.0\.rc)
+Installing activeresource (3\.0\.0\.rc)
+Installing bundler (1\.0\.0\.rc\.3)
+Installing nokogiri (1\.4\.3\.1) with native extensions
+Installing thor (0\.14\.0)
+Installing railties (3\.0\.0\.rc)
+Installing rails (3\.0\.0\.rc)
+
+Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed\.
+.
+.fi
+.
+.IP "" 0
+.
+.P
+As you can see, even though you have just two gems in the Gemfile(5), your application actually needs 25 different gems in order to run\. Bundler remembers the exact versions it installed in \fBGemfile\.lock\fR\. The next time you run bundle install(1) \fIbundle\-install\.1\.html\fR, bundler skips the dependency resolution and installs the same gems as it installed last time\.
+.
+.P
+After checking in the \fBGemfile\.lock\fR into version control and cloning it on another machine, running bundle install(1) \fIbundle\-install\.1\.html\fR will \fIstill\fR install the gems that you installed last time\. You don\'t need to worry that a new release of \fBerubis\fR or \fBmail\fR changes the gems you use\.
+.
+.P
+However, from time to time, you might want to update the gems you are using to the newest versions that still match the gems in your Gemfile(5)\.
+.
+.P
+To do this, run \fBbundle update\fR, which will ignore the \fBGemfile\.lock\fR, and resolve all the dependencies again\. Keep in mind that this process can result in a significantly different set of the 25 gems, based on the requirements of new gems that the gem authors released since the last time you ran \fBbundle update\fR\.
+.
+.SH "UPDATING A LIST OF GEMS"
+Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the gems that you specified locked to the versions in the \fBGemfile\.lock\fR\.
+.
+.P
+For instance, in the scenario above, imagine that \fBnokogiri\fR releases version \fB1\.4\.4\fR, and you want to update it \fIwithout\fR updating Rails and all of its dependencies\. To do this, run \fBbundle update nokogiri\fR\.
+.
+.P
+Bundler will update \fBnokogiri\fR and any of its dependencies, but leave alone Rails and its dependencies\.
+.
+.SH "OVERLAPPING DEPENDENCIES"
+Sometimes, multiple gems declared in your Gemfile(5) are satisfied by the same second\-level dependency\. For instance, consider the case of \fBthin\fR and \fBrack\-perftools\-profiler\fR\.
+.
+.IP "" 4
+.
+.nf
+
+source "https://rubygems\.org"
+
+gem "thin"
+gem "rack\-perftools\-profiler"
+.
+.fi
+.
+.IP "" 0
+.
+.P
+The \fBthin\fR gem depends on \fBrack >= 1\.0\fR, while \fBrack\-perftools\-profiler\fR depends on \fBrack ~> 1\.0\fR\. If you run bundle install, you get:
+.
+.IP "" 4
+.
+.nf
+
+Fetching source index for https://rubygems\.org/
+Installing daemons (1\.1\.0)
+Installing eventmachine (0\.12\.10) with native extensions
+Installing open4 (1\.0\.1)
+Installing perftools\.rb (0\.4\.7) with native extensions
+Installing rack (1\.2\.1)
+Installing rack\-perftools_profiler (0\.0\.2)
+Installing thin (1\.2\.7) with native extensions
+Using bundler (1\.0\.0\.rc\.3)
+.
+.fi
+.
+.IP "" 0
+.
+.P
+In this case, the two gems have their own set of dependencies, but they share \fBrack\fR in common\. If you run \fBbundle update thin\fR, bundler will update \fBdaemons\fR, \fBeventmachine\fR and \fBrack\fR, which are dependencies of \fBthin\fR, but not \fBopen4\fR or \fBperftools\.rb\fR, which are dependencies of \fBrack\-perftools_profiler\fR\. Note that \fBbundle update thin\fR will update \fBrack\fR even though it\'s \fIalso\fR a dependency of \fBrack\-perftools_profiler\fR\.
+.
+.P
+\fBIn short\fR, when you update a gem using \fBbundle update\fR, bundler will update all dependencies of that gem, including those that are also dependencies of another gem\.
+.
+.P
+In this scenario, updating the \fBthin\fR version manually in the Gemfile(5), and then running bundle install(1) \fIbundle\-install\.1\.html\fR will only update \fBdaemons\fR and \fBeventmachine\fR, but not \fBrack\fR\. For more information, see the \fBCONSERVATIVE UPDATING\fR section of bundle install(1) \fIbundle\-install\.1\.html\fR\.
+.
+.SH "RECOMMENDED WORKFLOW"
+In general, when working with an application managed with bundler, you should use the following workflow:
+.
+.IP "\(bu" 4
+After you create your Gemfile(5) for the first time, run
+.
+.IP
+$ bundle install
+.
+.IP "\(bu" 4
+Check the resulting \fBGemfile\.lock\fR into version control
+.
+.IP
+$ git add Gemfile\.lock
+.
+.IP "\(bu" 4
+When checking out this repository on another development machine, run
+.
+.IP
+$ bundle install
+.
+.IP "\(bu" 4
+When checking out this repository on a deployment machine, run
+.
+.IP
+$ bundle install \-\-deployment
+.
+.IP "\(bu" 4
+After changing the Gemfile(5) to reflect a new or update dependency, run
+.
+.IP
+$ bundle install
+.
+.IP "\(bu" 4
+Make sure to check the updated \fBGemfile\.lock\fR into version control
+.
+.IP
+$ git add Gemfile\.lock
+.
+.IP "\(bu" 4
+If bundle install(1) \fIbundle\-install\.1\.html\fR reports a conflict, manually update the specific gems that you changed in the Gemfile(5)
+.
+.IP
+$ bundle update rails thin
+.
+.IP "\(bu" 4
+If you want to update all the gems to the latest possible versions that still match the gems listed in the Gemfile(5), run
+.
+.IP
+$ bundle update
+.
+.IP "" 0
+
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-update.txt b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-update.txt
new file mode 100644
index 0000000..ee78abf
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle-update.txt
@@ -0,0 +1,207 @@
+BUNDLE-UPDATE(1)					      BUNDLE-UPDATE(1)
+
+
+
+NAME
+       bundle-update - Update your gems to the latest available versions
+
+SYNOPSIS
+       bundle update *gems [--source=NAME]
+
+DESCRIPTION
+       Update  the  gems specified (all gems, if none are specified), ignoring
+       the previously installed gems specified in the  Gemfile.lock.  In  gen-
+       eral, you should use bundle install(1) bundle-install.1.html to install
+       the same exact gems and versions across machines.
+
+       You would use bundle update to explicitly update the version of a  gem.
+
+OPTIONS
+       --source=<name>
+	      The  name  of a :git or :path source used in the Gemfile(5). For
+	      instance,       with	 a	  :git	      source	    of
+	      http://github.com/rails/rails.git,  you would call bundle update
+	      --source rails
+
+UPDATING ALL GEMS
+       If you run bundle update with no parameters, bundler  will  ignore  any
+       previously  installed  gems and resolve all dependencies again based on
+       the latest versions of all gems available in the sources.
+
+       Consider the following Gemfile(5):
+
+
+
+	   source "https://rubygems.org"
+
+	   gem "rails", "3.0.0.rc"
+	   gem "nokogiri"
+
+
+
+       When you run bundle install(1) bundle-install.1.html  the  first  time,
+       bundler	will  resolve  all  of the dependencies, all the way down, and
+       install what you need:
+
+
+
+	   Fetching source index for https://rubygems.org/
+	   Installing rake (10.0.2)
+	   Installing abstract (1.0.0)
+	   Installing activesupport (3.0.0.rc)
+	   Installing builder (2.1.2)
+	   Installing i18n (0.4.1)
+	   Installing activemodel (3.0.0.rc)
+	   Installing erubis (2.6.6)
+	   Installing rack (1.2.1)
+	   Installing rack-mount (0.6.9)
+	   Installing rack-test (0.5.4)
+	   Installing tzinfo (0.3.22)
+	   Installing actionpack (3.0.0.rc)
+	   Installing mime-types (1.16)
+	   Installing polyglot (0.3.1)
+	   Installing treetop (1.4.8)
+	   Installing mail (2.2.5)
+	   Installing actionmailer (3.0.0.rc)
+	   Installing arel (0.4.0)
+	   Installing activerecord (3.0.0.rc)
+	   Installing activeresource (3.0.0.rc)
+	   Installing bundler (1.0.0.rc.3)
+	   Installing nokogiri (1.4.3.1) with native extensions
+	   Installing thor (0.14.0)
+	   Installing railties (3.0.0.rc)
+	   Installing rails (3.0.0.rc)
+
+	   Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
+
+
+
+       As you can see, even though you have just two gems in  the  Gemfile(5),
+       your  application  actually  needs  25  different gems in order to run.
+       Bundler remembers the exact versions it installed in Gemfile.lock.  The
+       next  time  you	run  bundle  install(1) bundle-install.1.html, bundler
+       skips the dependency resolution	and  installs  the  same  gems	as  it
+       installed last time.
+
+       After  checking in the Gemfile.lock into version control and cloning it
+       on another machine,  running  bundle  install(1)  bundle-install.1.html
+       will  still  install  the  gems that you installed last time. You don't
+       need to worry that a new release of erubis or mail changes the gems you
+       use.
+
+       However,  from  time to time, you might want to update the gems you are
+       using to the newest versions that still match the  gems	in  your  Gem-
+       file(5).
+
+       To  do this, run bundle update, which will ignore the Gemfile.lock, and
+       resolve all the dependencies again. Keep in mind that this process  can
+       result  in  a  significantly different set of the 25 gems, based on the
+       requirements of new gems that the gem authors released since  the  last
+       time you ran bundle update.
+
+UPDATING A LIST OF GEMS
+       Sometimes, you want to update a single gem in the Gemfile(5), and leave
+       the rest of the gems that you specified locked to the versions  in  the
+       Gemfile.lock.
+
+       For  instance,  in  the	scenario above, imagine that nokogiri releases
+       version 1.4.4, and you want to update it without updating Rails and all
+       of its dependencies. To do this, run bundle update nokogiri.
+
+       Bundler	will  update  nokogiri	and any of its dependencies, but leave
+       alone Rails and its dependencies.
+
+OVERLAPPING DEPENDENCIES
+       Sometimes, multiple gems declared in your Gemfile(5) are  satisfied  by
+       the  same  second-level	dependency. For instance, consider the case of
+       thin and rack-perftools-profiler.
+
+
+
+	   source "https://rubygems.org"
+
+	   gem "thin"
+	   gem "rack-perftools-profiler"
+
+
+
+       The thin gem depends on	rack  >=  1.0,	while  rack-perftools-profiler
+       depends on rack ~> 1.0. If you run bundle install, you get:
+
+
+
+	   Fetching source index for https://rubygems.org/
+	   Installing daemons (1.1.0)
+	   Installing eventmachine (0.12.10) with native extensions
+	   Installing open4 (1.0.1)
+	   Installing perftools.rb (0.4.7) with native extensions
+	   Installing rack (1.2.1)
+	   Installing rack-perftools_profiler (0.0.2)
+	   Installing thin (1.2.7) with native extensions
+	   Using bundler (1.0.0.rc.3)
+
+
+
+       In this case, the two gems have their own set of dependencies, but they
+       share rack in common. If you  run  bundle  update  thin,  bundler  will
+       update  daemons, eventmachine and rack, which are dependencies of thin,
+       but  not   open4   or   perftools.rb,   which   are   dependencies   of
+       rack-perftools_profiler.  Note that bundle update thin will update rack
+       even though it's also a dependency of rack-perftools_profiler.
+
+       In short, when you update a  gem  using	bundle	update,  bundler  will
+       update  all  dependencies  of  that  gem, including those that are also
+       dependencies of another gem.
+
+       In this scenario, updating the thin version manually in the Gemfile(5),
+       and  then  running  bundle  install(1)  bundle-install.1.html will only
+       update daemons and eventmachine, but not rack.  For  more  information,
+       see  the  CONSERVATIVE  UPDATING  section  of  bundle  install(1)  bun-
+       dle-install.1.html.
+
+RECOMMENDED WORKFLOW
+       In general, when working with an application managed with bundler,  you
+       should use the following workflow:
+
+       o   After you create your Gemfile(5) for the first time, run
+
+	   $ bundle install
+
+       o   Check the resulting Gemfile.lock into version control
+
+	   $ git add Gemfile.lock
+
+       o   When  checking  out this repository on another development machine,
+	   run
+
+	   $ bundle install
+
+       o   When checking out this repository on a deployment machine, run
+
+	   $ bundle install --deployment
+
+       o   After changing the Gemfile(5) to reflect a  new  or	update	depen-
+	   dency, run
+
+	   $ bundle install
+
+       o   Make sure to check the updated Gemfile.lock into version control
+
+	   $ git add Gemfile.lock
+
+       o   If bundle install(1) bundle-install.1.html reports a conflict, man-
+	   ually update the specific gems that you changed in the Gemfile(5)
+
+	   $ bundle update rails thin
+
+       o   If you want to update all the gems to the latest possible  versions
+	   that still match the gems listed in the Gemfile(5), run
+
+	   $ bundle update
+
+
+
+
+
+
+				  April 2013		      BUNDLE-UPDATE(1)
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/bundle.txt b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle.txt
new file mode 100644
index 0000000..66ed056
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/bundle.txt
@@ -0,0 +1,98 @@
+BUNDLE(1)							     BUNDLE(1)
+
+
+
+NAME
+       bundle - Ruby Dependency Management
+
+SYNOPSIS
+       bundle COMMAND [--no-color] [--verbose] [ARGS]
+
+DESCRIPTION
+       Bundler	manages  an application's dependencies through its entire life
+       across many machines systematically and repeatably.
+
+       See the bundler website http://gembundler.com for information  on  get-
+       ting  started,  and Gemfile(5) for more information on the Gemfile for-
+       mat.
+
+OPTIONS
+       --no-color
+	      Prints all output without color
+
+       --verbose
+	      Prints out additional logging information
+
+BUNDLE COMMANDS
+       We divide bundle subcommands into primary commands and utilities.
+
+PRIMARY COMMANDS
+       bundle install(1) bundle-install.1.html
+	      Install the gems specified by the Gemfile or Gemfile.lock
+
+       bundle update(1) bundle-update.1.html
+	      Update dependencies to their latest versions
+
+       bundle package(1) bundle-package.1.html
+	      Package the .gem files required by  your	application  into  the
+	      vendor/cache directory
+
+       bundle exec(1) bundle-exec.1.html
+	      Execute a script in the context of the current bundle
+
+       bundle config(1) bundle-config.1.html
+	      Specify and read configuration options for bundler
+
+       bundle help(1)
+	      Displays this help page
+
+UTILITIES
+       bundle check(1)
+	      Determine  whether  the  requirements  for  your application are
+	      installed and available to bundler
+
+       bundle list(1)
+	      Show all of the gems in the current bundle
+
+       bundle show(1)
+	      Show the source location of a particular gem in the bundle
+
+       bundle outdated(1)
+	      Show all of the outdated gems in the current bundle
+
+       bundle console(1)
+	      Start an IRB session in the context of the current bundle
+
+       bundle open(1)
+	      Open an installed gem in the editor
+
+       bundle viz(1)
+	      Generate a visual representation of your dependencies
+
+       bundle init(1)
+	      Generate a simple Gemfile, placed in the current directory
+
+       bundle gem(1)
+	      Create a simple gem, suitable for development with bundler
+
+       bundle platform(1) bundle-platform.1.html
+	      Displays platform compatibility information
+
+       bundle clean(1)
+	      Cleans up unused gems in your bundler directory
+
+OBSOLETE
+       These commands are obsolete and should no longer be used
+
+       o   bundle lock(1)
+
+       o   bundle unlock(1)
+
+       o   bundle cache(1)
+
+
+
+
+
+
+				  April 2013			     BUNDLE(1)
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/gemfile.5 b/misc/lib/bundler-1.3.5/lib/bundler/man/gemfile.5
new file mode 100644
index 0000000..0cf7b96
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/gemfile.5
@@ -0,0 +1,440 @@
+.\" generated with Ronn/v0.7.3
+.\" http://github.com/rtomayko/ronn/tree/0.7.3
+.
+.TH "GEMFILE" "5" "April 2013" "" ""
+.
+.SH "NAME"
+\fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
+.
+.SH "SYNOPSIS"
+A \fBGemfile\fR describes the gem dependencies required to execute associated Ruby code\.
+.
+.P
+Place the \fBGemfile\fR in the root of the directory containing the associated code\. For instance, in a Rails application, place the \fBGemfile\fR in the same directory as the \fBRakefile\fR\.
+.
+.SH "SYNTAX"
+A \fBGemfile\fR is evaluated as Ruby code, in a context which makes available a number of methods used to describe the gem requirements\.
+.
+.SH "SOURCES (#source)"
+At the top of the \fBGemfile\fR, add one line for each \fBRubygems\fR source that might contain the gems listed in the \fBGemfile\fR\.
+.
+.IP "" 4
+.
+.nf
+
+source "https://rubygems\.org"
+source "http://gems\.github\.com"
+.
+.fi
+.
+.IP "" 0
+.
+.P
+Each of these _source_s \fBMUST\fR be a valid Rubygems repository\. Sources are checked for gems following the heuristics described in \fISOURCE PRIORITY\fR\.
+.
+.SH "RUBY (#ruby)"
+If your application requires a specific Ruby version or engine, specify your requirements using the \fBruby\fR method, with the following arguments\. All parameters are \fBOPTIONAL\fR unless otherwise specified\.
+.
+.SS "VERSION (required)"
+The version of Ruby that your application requires\. If your application requires an alternate Ruby engine, such as JRuby or Rubinius, this should be the Ruby version that the engine is compatible with\.
+.
+.IP "" 4
+.
+.nf
+
+ruby "1\.9\.3"
+.
+.fi
+.
+.IP "" 0
+.
+.SS "ENGINE (:engine)"
+Each application \fImay\fR specify a Ruby engine\. If an engine is specified, an engine version \fImust\fR also be specified\.
+.
+.SS "ENGINE VERSION (:engine_version)"
+Each application \fImay\fR specify a Ruby engine version\. If an engine version is specified, an engine \fImust\fR also be specified\. If the engine is "ruby" the engine version specified \fImust\fR match the Ruby version\.
+.
+.IP "" 4
+.
+.nf
+
+ruby "1\.8\.7", :engine => "jruby", :engine_version => "1\.6\.7"
+.
+.fi
+.
+.IP "" 0
+.
+.SH "GEMS (#gem)"
+Specify gem requirements using the \fBgem\fR method, with the following arguments\. All parameters are \fBOPTIONAL\fR unless otherwise specified\.
+.
+.SS "NAME (required)"
+For each gem requirement, list a single \fIgem\fR line\.
+.
+.IP "" 4
+.
+.nf
+
+gem "nokogiri"
+.
+.fi
+.
+.IP "" 0
+.
+.SS "VERSION"
+Each \fIgem\fR \fBMAY\fR have one or more version specifiers\.
+.
+.IP "" 4
+.
+.nf
+
+gem "nokogiri", ">= 1\.4\.2"
+gem "RedCloth", ">= 4\.1\.0", "< 4\.2\.0"
+.
+.fi
+.
+.IP "" 0
+.
+.SS "REQUIRE AS (:require)"
+Each \fIgem\fR \fBMAY\fR specify files that should be used when autorequiring via \fBBundler\.require\fR\. You may pass an array with multiple files, or \fBfalse\fR to prevent any file from being autorequired\.
+.
+.IP "" 4
+.
+.nf
+
+gem "redis", :require => ["redis/connection/hiredis", "redis"]
+gem "webmock", :require => false
+.
+.fi
+.
+.IP "" 0
+.
+.P
+The argument defaults to the name of the gem\. For example, these are identical:
+.
+.IP "" 4
+.
+.nf
+
+gem "nokogiri"
+gem "nokogiri", :require => "nokogiri"
+.
+.fi
+.
+.IP "" 0
+.
+.SS "GROUPS (:group or :groups)"
+Each \fIgem\fR \fBMAY\fR specify membership in one or more groups\. Any \fIgem\fR that does not specify membership in any group is placed in the \fBdefault\fR group\.
+.
+.IP "" 4
+.
+.nf
+
+gem "rspec", :group => :test
+gem "wirble", :groups => [:development, :test]
+.
+.fi
+.
+.IP "" 0
+.
+.P
+The Bundler runtime allows its two main methods, \fBBundler\.setup\fR and \fBBundler\.require\fR, to limit their impact to particular groups\.
+.
+.IP "" 4
+.
+.nf
+
+# setup adds gems to Ruby\'s load path
+Bundler\.setup                    # defaults to all groups
+require "bundler/setup"          # same as Bundler\.setup
+Bundler\.setup(:default)          # only set up the _default_ group
+Bundler\.setup(:test)             # only set up the _test_ group (but `not` _default_)
+Bundler\.setup(:default, :test)   # set up the _default_ and _test_ groups, but no others
+
+# require requires all of the gems in the specified groups
+Bundler\.require                  # defaults to just the _default_ group
+Bundler\.require(:default)        # identical
+Bundler\.require(:default, :test) # requires the _default_ and _test_ groups
+Bundler\.require(:test)           # requires just the _test_ group
+.
+.fi
+.
+.IP "" 0
+.
+.P
+The Bundler CLI allows you to specify a list of groups whose gems \fBbundle install\fR should not install with the \fB\-\-without\fR option\. To specify multiple groups to ignore, specify a list of groups separated by spaces\.
+.
+.IP "" 4
+.
+.nf
+
+bundle install \-\-without test
+bundle install \-\-without development test
+.
+.fi
+.
+.IP "" 0
+.
+.P
+After running \fBbundle install \-\-without test\fR, bundler will remember that you excluded the test group in the last installation\. The next time you run \fBbundle install\fR, without any \fB\-\-without option\fR, bundler will recall it\.
+.
+.P
+Also, calling \fBBundler\.setup\fR with no parameters, or calling \fBrequire "bundler/setup"\fR will setup all groups except for the ones you excluded via \fB\-\-without\fR (since they are obviously not available)\.
+.
+.P
+Note that on \fBbundle install\fR, bundler downloads and evaluates all gems, in order to create a single canonical list of all of the required gems and their dependencies\. This means that you cannot list different versions of the same gems in different groups\. For more details, see Understanding Bundler \fIhttp://gembundler\.com/rationale\.html\fR\.
+.
+.SS "PLATFORMS (:platforms)"
+If a gem should only be used in a particular platform or set of platforms, you can specify them\. Platforms are essentially identical to groups, except that you do not need to use the \fB\-\-without\fR install\-time flag to exclude groups of gems for other platforms\.
+.
+.P
+There are a number of \fBGemfile\fR platforms:
+.
+.TP
+\fBruby\fR
+C Ruby (MRI) or Rubinius, but \fBNOT\fR Windows
+.
+.TP
+\fBruby_18\fR
+\fIruby\fR \fBAND\fR version 1\.8
+.
+.TP
+\fBruby_19\fR
+\fIruby\fR \fBAND\fR version 1\.9
+.
+.TP
+\fBruby_20\fR
+\fIruby\fR \fBAND\fR version 2\.0
+.
+.TP
+\fBmri\fR
+Same as \fIruby\fR, but not Rubinius
+.
+.TP
+\fBmri_18\fR
+\fImri\fR \fBAND\fR version 1\.8
+.
+.TP
+\fBmri_19\fR
+\fImri\fR \fBAND\fR version 1\.9
+.
+.TP
+\fBmri_20\fR
+\fImri\fR \fBAND\fR version 2\.0
+.
+.TP
+\fBrbx\fR
+Same as \fIruby\fR, but only Rubinius (not MRI)
+.
+.TP
+\fBjruby\fR
+JRuby
+.
+.TP
+\fBmswin\fR
+Windows
+.
+.TP
+\fBmingw\fR
+Windows \'mingw32\' platform (aka RubyInstaller)
+.
+.TP
+\fBmingw_18\fR
+\fImingw\fR \fBAND\fR version 1\.8
+.
+.TP
+\fBmingw_19\fR
+\fImingw\fR \fBAND\fR version 1\.9
+.
+.TP
+\fBmingw_20\fR
+\fImingw\fR \fBAND\fR version 2\.0
+.
+.P
+As with groups, you can specify one or more platforms:
+.
+.IP "" 4
+.
+.nf
+
+gem "weakling",   :platforms => :jruby
+gem "ruby\-debug", :platforms => :mri_18
+gem "nokogiri",   :platforms => [:mri_18, :jruby]
+.
+.fi
+.
+.IP "" 0
+.
+.P
+All operations involving groups (\fBbundle install\fR, \fBBundler\.setup\fR, \fBBundler\.require\fR) behave exactly the same as if any groups not matching the current platform were explicitly excluded\.
+.
+.SS "GIT (:git)"
+If necessary, you can specify that a gem is located at a particular git repository\. The repository can be public (\fBhttp://github\.com/rails/rails\.git\fR) or private (\fBgit at github\.com:rails/rails\.git\fR)\. If the repository is private, the user that you use to run \fBbundle install\fR \fBMUST\fR have the appropriate keys available in their \fB$HOME/\.ssh\fR\.
+.
+.P
+Git repositories are specified using the \fB:git\fR parameter\. The \fBgroup\fR, \fBplatforms\fR, and \fBrequire\fR options are available and behave exactly the same as they would for a normal gem\.
+.
+.IP "" 4
+.
+.nf
+
+gem "rails", :git => "git://github\.com/rails/rails\.git"
+.
+.fi
+.
+.IP "" 0
+.
+.P
+A git repository \fBSHOULD\fR have at least one file, at the root of the directory containing the gem, with the extension \fB\.gemspec\fR\. This file \fBMUST\fR contain a valid gem specification, as expected by the \fBgem build\fR command\. It \fBMUST NOT\fR have any dependencies, other than on the files in the git repository itself and any built\-in functionality of Ruby or Rubygems\.
+.
+.P
+If a git repository does not have a \fB\.gemspec\fR, bundler will attempt to create one, but it will not contain any dependencies, executables, or C extension compilation instructions\. As a result, it may fail to properly integrate into your application\.
+.
+.P
+If a git repository does have a \fB\.gemspec\fR for the gem you attached it to, a version specifier, if provided, means that the git repository is only valid if the \fB\.gemspec\fR specifies a version matching the version specifier\. If not, bundler will print a warning\.
+.
+.IP "" 4
+.
+.nf
+
+gem "rails", "2\.3\.8", :git => "git://github\.com/rails/rails\.git"
+# bundle install will fail, because the \.gemspec in the rails
+# repository\'s master branch specifies version 3\.0\.0
+.
+.fi
+.
+.IP "" 0
+.
+.P
+If a git repository does \fBnot\fR have a \fB\.gemspec\fR for the gem you attached it to, a version specifier \fBMUST\fR be provided\. Bundler will use this version in the simple \fB\.gemspec\fR it creates\.
+.
+.P
+Git repositories support a number of additional options\.
+.
+.TP
+\fBbranch\fR, \fBtag\fR, and \fBref\fR
+You \fBMUST\fR only specify at most one of these options\. The default is \fB:branch => "master"\fR
+.
+.TP
+\fBsubmodules\fR
+Specify \fB:submodules => true\fR to cause bundler to expand any submodules included in the git repository
+.
+.P
+If a git repository contains multiple \fB\.gemspecs\fR, each \fB\.gemspec\fR represents a gem located at the same place in the file system as the \fB\.gemspec\fR\.
+.
+.IP "" 4
+.
+.nf
+
+|~rails                   [git root]
+| |\-rails\.gemspec         [rails gem located here]
+|~actionpack
+| |\-actionpack\.gemspec    [actionpack gem located here]
+|~activesupport
+| |\-activesupport\.gemspec [activesupport gem located here]
+|\.\.\.
+.
+.fi
+.
+.IP "" 0
+.
+.P
+To install a gem located in a git repository, bundler changes to the directory containing the gemspec, runs \fBgem build name\.gemspec\fR and then installs the resulting gem\. The \fBgem build\fR command, which comes standard with Rubygems, evaluates the \fB\.gemspec\fR in the context of the directory in which it is located\.
+.
+.SS "GITHUB (:github)"
+If the git repository you want to use is hosted on GitHub and is public, you can use the :github shorthand to specify just the github username and repository name (without the trailing "\.git"), separated by a slash\. If both the username and repository name are the same, you can omit one\.
+.
+.IP "" 4
+.
+.nf
+
+gem "rails", :github => "rails/rails"
+gem "rails", :github => "rails"
+.
+.fi
+.
+.IP "" 0
+.
+.P
+Are both equivalent to
+.
+.IP "" 4
+.
+.nf
+
+gem "rails", :git => "git://github\.com/rails/rails\.git"
+.
+.fi
+.
+.IP "" 0
+.
+.SS "PATH (:path)"
+You can specify that a gem is located in a particular location on the file system\. Relative paths are resolved relative to the directory containing the \fBGemfile\fR\.
+.
+.P
+Similar to the semantics of the \fB:git\fR option, the \fB:path\fR option requires that the directory in question either contains a \fB\.gemspec\fR for the gem, or that you specify an explicit version that bundler should use\.
+.
+.P
+Unlike \fB:git\fR, bundler does not compile C extensions for gems specified as paths\.
+.
+.IP "" 4
+.
+.nf
+
+gem "rails", :path => "vendor/rails"
+.
+.fi
+.
+.IP "" 0
+.
+.SH "BLOCK FORM OF GIT, PATH, GROUP and PLATFORMS"
+The \fB:git\fR, \fB:path\fR, \fB:group\fR, and \fB:platforms\fR options may be applied to a group of gems by using block form\.
+.
+.IP "" 4
+.
+.nf
+
+git "git://github\.com/rails/rails\.git" do
+  gem "activesupport"
+  gem "actionpack"
+end
+
+platforms :ruby do
+  gem "ruby\-debug"
+  gem "sqlite3"
+end
+
+group :development do
+  gem "wirble"
+  gem "faker"
+end
+.
+.fi
+.
+.IP "" 0
+.
+.P
+In the case of the \fBgit\fR block form, the \fB:ref\fR, \fB:branch\fR, \fB:tag\fR, and \fB:submodules\fR options may be passed to the \fBgit\fR method, and all gems in the block will inherit those options\.
+.
+.SH "GEMSPEC (#gemspec)"
+If you wish to use Bundler to help install dependencies for a gem while it is being developed, use the \fBgemspec\fR method to pull in the dependencies listed in the \fB\.gemspec\fR file\.
+.
+.P
+The \fBgemspec\fR method adds any runtime dependencies as gem requirements in the default group\. It also adds development dependencies as gem requirements in the \fBdevelopment\fR group\. Finally, it adds a gem requirement on your project (\fB:path => \'\.\'\fR)\. In conjunction with \fBBundler\.setup\fR, this allows you to require project files in your test code as you would if the project were installed as a gem; you need not manipulate the load path manually or require project files  [...]
+.
+.P
+The \fBgemspec\fR method supports optional \fB:path\fR, \fB:name\fR, and \fB:development_group\fR options, which control where bundler looks for the \fB\.gemspec\fR, what named \fB\.gemspec\fR it uses (if more than one is present), and which group development dependencies are included in\.
+.
+.SH "SOURCE PRIORITY"
+When attempting to locate a gem to satisfy a gem requirement, bundler uses the following priority order:
+.
+.IP "1." 4
+The source explicitly attached to the gem (using \fB:path\fR or \fB:git\fR)
+.
+.IP "2." 4
+For implicit gems (dependencies of explicit gems), any git or path repository otherwise declared\. This results in bundler prioritizing the ActiveSupport gem from the Rails git repository over ones from \fBrubygems\.org\fR
+.
+.IP "3." 4
+The sources specified via \fBsource\fR, searching each source in your \fBGemfile\fR from last added to first added\.
+.
+.IP "" 0
+
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/man/gemfile.5.txt b/misc/lib/bundler-1.3.5/lib/bundler/man/gemfile.5.txt
new file mode 100644
index 0000000..f7a664e
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/man/gemfile.5.txt
@@ -0,0 +1,411 @@
+GEMFILE(5)							    GEMFILE(5)
+
+
+
+NAME
+       Gemfile - A format for describing gem dependencies for Ruby programs
+
+SYNOPSIS
+       A Gemfile describes the gem dependencies required to execute associated
+       Ruby code.
+
+       Place the Gemfile in the root of the directory containing  the  associ-
+       ated  code.  For instance, in a Rails application, place the Gemfile in
+       the same directory as the Rakefile.
+
+SYNTAX
+       A Gemfile is evaluated as Ruby code, in a context which makes available
+       a number of methods used to describe the gem requirements.
+
+SOURCES (#source)
+       At  the	top of the Gemfile, add one line for each Rubygems source that
+       might contain the gems listed in the Gemfile.
+
+
+
+	   source "https://rubygems.org"
+	   source "http://gems.github.com"
+
+
+
+       Each of these _source_s MUST be a valid	Rubygems  repository.  Sources
+       are  checked for gems following the heuristics described in SOURCE PRI-
+       ORITY.
+
+RUBY (#ruby)
+       If your application requires a specific Ruby version or engine, specify
+       your  requirements using the ruby method, with the following arguments.
+       All parameters are OPTIONAL unless otherwise specified.
+
+   VERSION (required)
+       The version of Ruby that your application requires. If your application
+       requires  an  alternate	Ruby  engine,  such as JRuby or Rubinius, this
+       should be the Ruby version that the engine is compatible with.
+
+
+
+	   ruby "1.9.3"
+
+
+
+   ENGINE (:engine)
+       Each application may specify a Ruby engine. If an engine is  specified,
+       an engine version must also be specified.
+
+   ENGINE VERSION (:engine_version)
+       Each  application  may specify a Ruby engine version. If an engine ver-
+       sion is specified, an engine must also be specified. If the  engine  is
+       "ruby" the engine version specified must match the Ruby version.
+
+
+
+	   ruby "1.8.7", :engine => "jruby", :engine_version => "1.6.7"
+
+
+
+GEMS (#gem)
+       Specify gem requirements using the gem method, with the following argu-
+       ments. All parameters are OPTIONAL unless otherwise specified.
+
+   NAME (required)
+       For each gem requirement, list a single gem line.
+
+
+
+	   gem "nokogiri"
+
+
+
+   VERSION
+       Each gem MAY have one or more version specifiers.
+
+
+
+	   gem "nokogiri", ">= 1.4.2"
+	   gem "RedCloth", ">= 4.1.0", "< 4.2.0"
+
+
+
+   REQUIRE AS (:require)
+       Each gem MAY specify files that should be used when  autorequiring  via
+       Bundler.require. You may pass an array with multiple files, or false to
+       prevent any file from being autorequired.
+
+
+
+	   gem "redis", :require => ["redis/connection/hiredis", "redis"]
+	   gem "webmock", :require => false
+
+
+
+       The argument defaults to the name of the gem. For  example,  these  are
+       identical:
+
+
+
+	   gem "nokogiri"
+	   gem "nokogiri", :require => "nokogiri"
+
+
+
+   GROUPS (:group or :groups)
+       Each  gem  MAY  specify	membership in one or more groups. Any gem that
+       does not specify membership in any  group  is  placed  in  the  default
+       group.
+
+
+
+	   gem "rspec", :group => :test
+	   gem "wirble", :groups => [:development, :test]
+
+
+
+       The  Bundler  runtime  allows  its  two main methods, Bundler.setup and
+       Bundler.require, to limit their impact to particular groups.
+
+
+
+	   # setup adds gems to Ruby's load path
+	   Bundler.setup		    # defaults to all groups
+	   require "bundler/setup"	    # same as Bundler.setup
+	   Bundler.setup(:default)	    # only set up the _default_ group
+	   Bundler.setup(:test) 	    # only set up the _test_ group (but `not` _default_)
+	   Bundler.setup(:default, :test)   # set up the _default_ and _test_ groups, but no others
+
+	   # require requires all of the gems in the specified groups
+	   Bundler.require		    # defaults to just the _default_ group
+	   Bundler.require(:default)	    # identical
+	   Bundler.require(:default, :test) # requires the _default_ and _test_ groups
+	   Bundler.require(:test)	    # requires just the _test_ group
+
+
+
+       The Bundler CLI allows you to specify a list of groups whose gems  bun-
+       dle  install  should  not install with the --without option. To specify
+       multiple groups to ignore, specify a list of groups separated  by  spa-
+       ces.
+
+
+
+	   bundle install --without test
+	   bundle install --without development test
+
+
+
+       After running bundle install --without test, bundler will remember that
+       you excluded the test group in the last installation. The next time you
+       run  bundle  install, without any --without option, bundler will recall
+       it.
+
+       Also, calling Bundler.setup with  no  parameters,  or  calling  require
+       "bundler/setup"	will setup all groups except for the ones you excluded
+       via --without (since they are obviously not available).
+
+       Note that on bundle install, bundler downloads and evaluates all  gems,
+       in  order to create a single canonical list of all of the required gems
+       and their dependencies. This means that you cannot list different  ver-
+       sions  of  the  same  gems  in  different groups. For more details, see
+       Understanding Bundler http://gembundler.com/rationale.html.
+
+   PLATFORMS (:platforms)
+       If a gem should only be used in a particular platform or set  of  plat-
+       forms,  you  can  specify  them. Platforms are essentially identical to
+       groups, except that you do not need to use the  --without  install-time
+       flag to exclude groups of gems for other platforms.
+
+       There are a number of Gemfile platforms:
+
+       ruby   C Ruby (MRI) or Rubinius, but NOT Windows
+
+       ruby_18
+	      ruby AND version 1.8
+
+       ruby_19
+	      ruby AND version 1.9
+
+       ruby_20
+	      ruby AND version 2.0
+
+       mri    Same as ruby, but not Rubinius
+
+       mri_18 mri AND version 1.8
+
+       mri_19 mri AND version 1.9
+
+       mri_20 mri AND version 2.0
+
+       rbx    Same as ruby, but only Rubinius (not MRI)
+
+       jruby  JRuby
+
+       mswin  Windows
+
+       mingw  Windows 'mingw32' platform (aka RubyInstaller)
+
+       mingw_18
+	      mingw AND version 1.8
+
+       mingw_19
+	      mingw AND version 1.9
+
+       mingw_20
+	      mingw AND version 2.0
+
+       As with groups, you can specify one or more platforms:
+
+
+
+	   gem "weakling",   :platforms => :jruby
+	   gem "ruby-debug", :platforms => :mri_18
+	   gem "nokogiri",   :platforms => [:mri_18, :jruby]
+
+
+
+       All   operations   involving  groups  (bundle  install,	Bundler.setup,
+       Bundler.require) behave exactly the same as if any groups not  matching
+       the current platform were explicitly excluded.
+
+   GIT (:git)
+       If necessary, you can specify that a gem is located at a particular git
+       repository.	 The	   repository	    can       be	public
+       (http://github.com/rails/rails.git)		or	       private
+       (git at github.com:rails/rails.git). If the  repository  is  private,  the
+       user  that you use to run bundle install MUST have the appropriate keys
+       available in their $HOME/.ssh.
+
+       Git repositories are specified using the  :git  parameter.  The	group,
+       platforms,  and	require  options  are available and behave exactly the
+       same as they would for a normal gem.
+
+
+
+	   gem "rails", :git => "git://github.com/rails/rails.git"
+
+
+
+       A git repository SHOULD have at least one file,	at  the  root  of  the
+       directory  containing  the  gem, with the extension .gemspec. This file
+       MUST contain a valid gem specification, as expected by  the  gem  build
+       command.  It MUST NOT have any dependencies, other than on the files in
+       the git repository itself and any built-in  functionality  of  Ruby  or
+       Rubygems.
+
+       If  a  git repository does not have a .gemspec, bundler will attempt to
+       create one, but it will not contain any dependencies, executables, or C
+       extension  compilation  instructions. As a result, it may fail to prop-
+       erly integrate into your application.
+
+       If a git repository does have a .gemspec for the gem  you  attached  it
+       to,  a version specifier, if provided, means that the git repository is
+       only valid if the .gemspec specifies a  version	matching  the  version
+       specifier. If not, bundler will print a warning.
+
+
+
+	   gem "rails", "2.3.8", :git => "git://github.com/rails/rails.git"
+	   # bundle install will fail, because the .gemspec in the rails
+	   # repository's master branch specifies version 3.0.0
+
+
+
+       If  a  git repository does not have a .gemspec for the gem you attached
+       it to, a version specifier MUST be provided. Bundler will use this ver-
+       sion in the simple .gemspec it creates.
+
+       Git repositories support a number of additional options.
+
+       branch, tag, and ref
+	      You  MUST only specify at most one of these options. The default
+	      is :branch => "master"
+
+       submodules
+	      Specify :submodules => true to cause bundler to expand any  sub-
+	      modules included in the git repository
+
+       If  a  git repository contains multiple .gemspecs, each .gemspec repre-
+       sents a gem located at the same place in the file system as  the  .gem-
+       spec.
+
+
+
+	   |~rails		     [git root]
+	   | |-rails.gemspec	     [rails gem located here]
+	   |~actionpack
+	   | |-actionpack.gemspec    [actionpack gem located here]
+	   |~activesupport
+	   | |-activesupport.gemspec [activesupport gem located here]
+	   |...
+
+
+
+       To  install  a  gem located in a git repository, bundler changes to the
+       directory containing the gemspec, runs gem build name.gemspec and  then
+       installs the resulting gem. The gem build command, which comes standard
+       with Rubygems, evaluates the .gemspec in the context of	the  directory
+       in which it is located.
+
+   GITHUB (:github)
+       If  the	git repository you want to use is hosted on GitHub and is pub-
+       lic, you can use the :github shorthand to specify just the github user-
+       name  and repository name (without the trailing ".git"), separated by a
+       slash. If both the username and repository name are the same,  you  can
+       omit one.
+
+
+
+	   gem "rails", :github => "rails/rails"
+	   gem "rails", :github => "rails"
+
+
+
+       Are both equivalent to
+
+
+
+	   gem "rails", :git => "git://github.com/rails/rails.git"
+
+
+
+   PATH (:path)
+       You  can  specify that a gem is located in a particular location on the
+       file system. Relative paths are resolved relative to the directory con-
+       taining the Gemfile.
+
+       Similar	to the semantics of the :git option, the :path option requires
+       that the directory in question either contains a .gemspec for the  gem,
+       or that you specify an explicit version that bundler should use.
+
+       Unlike  :git,  bundler does not compile C extensions for gems specified
+       as paths.
+
+
+
+	   gem "rails", :path => "vendor/rails"
+
+
+
+BLOCK FORM OF GIT, PATH, GROUP and PLATFORMS
+       The :git, :path, :group, and :platforms options may  be	applied  to  a
+       group of gems by using block form.
+
+
+
+	   git "git://github.com/rails/rails.git" do
+	     gem "activesupport"
+	     gem "actionpack"
+	   end
+
+	   platforms :ruby do
+	     gem "ruby-debug"
+	     gem "sqlite3"
+	   end
+
+	   group :development do
+	     gem "wirble"
+	     gem "faker"
+	   end
+
+
+
+       In  the	case of the git block form, the :ref, :branch, :tag, and :sub-
+       modules options may be passed to the git method, and all  gems  in  the
+       block will inherit those options.
+
+GEMSPEC (#gemspec)
+       If you wish to use Bundler to help install dependencies for a gem while
+       it is being developed, use the gemspec method to pull in the  dependen-
+       cies listed in the .gemspec file.
+
+       The gemspec method adds any runtime dependencies as gem requirements in
+       the default  group.  It	also  adds  development  dependencies  as  gem
+       requirements  in the development group. Finally, it adds a gem require-
+       ment on your project (:path => '.'). In conjunction with Bundler.setup,
+       this allows you to require project files in your test code as you would
+       if the project were installed as a gem; you  need  not  manipulate  the
+       load path manually or require project files via relative paths.
+
+       The  gemspec  method  supports  optional  :path,  :name,  and :develop-
+       ment_group options, which control where bundler looks for the .gemspec,
+       what  named  .gemspec  it uses (if more than one is present), and which
+       group development dependencies are included in.
+
+SOURCE PRIORITY
+       When attempting to locate a gem to satisfy a gem  requirement,  bundler
+       uses the following priority order:
+
+       1.  The source explicitly attached to the gem (using :path or :git)
+
+       2.  For	implicit gems (dependencies of explicit gems), any git or path
+	   repository otherwise declared. This results in bundler prioritizing
+	   the	ActiveSupport gem from the Rails git repository over ones from
+	   rubygems.org
+
+       3.  The sources specified via source, searching	each  source  in  your
+	   Gemfile from last added to first added.
+
+
+
+
+
+
+				  April 2013			    GEMFILE(5)
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/match_platform.rb b/misc/lib/bundler-1.3.5/lib/bundler/match_platform.rb
new file mode 100644
index 0000000..523dafb
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/match_platform.rb
@@ -0,0 +1,13 @@
+require 'bundler/gem_helpers'
+
+module Bundler
+  module MatchPlatform
+    include GemHelpers
+
+    def match_platform(p)
+      Gem::Platform::RUBY == platform or
+      platform.nil? or p == platform or
+      generic(Gem::Platform.new(platform)) == p
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/psyched_yaml.rb b/misc/lib/bundler-1.3.5/lib/bundler/psyched_yaml.rb
new file mode 100644
index 0000000..7ce3bb9
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/psyched_yaml.rb
@@ -0,0 +1,26 @@
+# Psych could be a gem, so try to ask for it
+begin
+  gem 'psych'
+rescue LoadError
+end if defined?(gem)
+
+# Psych could just be in the stdlib
+# but it's too late if Syck is already loaded
+begin
+  require 'psych' unless defined?(Syck)
+rescue LoadError
+  # Apparently Psych wasn't available. Oh well.
+end
+
+# At least load the YAML stdlib, whatever that may be
+require 'yaml' unless defined?(YAML.dump)
+
+module Bundler
+  # On encountering invalid YAML,
+  # Psych raises Psych::SyntaxError
+  if defined?(::Psych::SyntaxError)
+    YamlSyntaxError = ::Psych::SyntaxError
+  else # Syck raises ArgumentError
+    YamlSyntaxError = ::ArgumentError
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/remote_specification.rb b/misc/lib/bundler-1.3.5/lib/bundler/remote_specification.rb
new file mode 100644
index 0000000..5fe9505
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/remote_specification.rb
@@ -0,0 +1,57 @@
+require "uri"
+require "rubygems/spec_fetcher"
+
+module Bundler
+  # Represents a lazily loaded gem specification, where the full specification
+  # is on the source server in rubygems' "quick" index. The proxy object is to
+  # be seeded with what we're given from the source's abbreviated index - the
+  # full specification will only be fetched when necesary.
+  class RemoteSpecification
+    include MatchPlatform
+
+    attr_reader :name, :version, :platform
+    attr_accessor :source
+
+    def initialize(name, version, platform, spec_fetcher)
+      @name         = name
+      @version      = version
+      @platform     = platform
+      @spec_fetcher = spec_fetcher
+    end
+
+    # Needed before installs, since the arch matters then and quick
+    # specs don't bother to include the arch in the platform string
+    def fetch_platform
+      @platform = _remote_specification.platform
+    end
+
+    def full_name
+      if platform == Gem::Platform::RUBY or platform.nil? then
+        "#{@name}-#{@version}"
+      else
+        "#{@name}-#{@version}-#{platform}"
+      end
+    end
+
+    # Because Rubyforge cannot be trusted to provide valid specifications
+    # once the remote gem is downloaded, the backend specification will
+    # be swapped out.
+    def __swap__(spec)
+      @specification = spec
+    end
+
+  private
+
+    def _remote_specification
+      @specification ||= @spec_fetcher.fetch_spec([@name, @version, @platform])
+    end
+
+    def method_missing(method, *args, &blk)
+      if Gem::Specification.new.respond_to?(method)
+        _remote_specification.send(method, *args, &blk)
+      else
+        super
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/resolver.rb b/misc/lib/bundler-1.3.5/lib/bundler/resolver.rb
new file mode 100644
index 0000000..60597e3
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/resolver.rb
@@ -0,0 +1,530 @@
+require 'set'
+# This is the latest iteration of the gem dependency resolving algorithm. As of now,
+# it can resolve (as a success or failure) any set of gem dependencies we throw at it
+# in a reasonable amount of time. The most iterations I've seen it take is about 150.
+# The actual implementation of the algorithm is not as good as it could be yet, but that
+# can come later.
+
+# Extending Gem classes to add necessary tracking information
+module Gem
+  class Specification
+    def required_by
+      @required_by ||= []
+    end
+  end
+  class Dependency
+    def required_by
+      @required_by ||= []
+    end
+  end
+end
+
+module Bundler
+  class Resolver
+    ALL = Bundler::Dependency::PLATFORM_MAP.values.uniq.freeze
+
+    class SpecGroup < Array
+      include GemHelpers
+
+      attr_reader :activated, :required_by
+
+      def initialize(a)
+        super
+        @required_by  = []
+        @activated    = []
+        @dependencies = nil
+        @specs        = {}
+
+        ALL.each do |p|
+          @specs[p] = reverse.find { |s| s.match_platform(p) }
+        end
+      end
+
+      def initialize_copy(o)
+        super
+        @required_by = o.required_by.dup
+        @activated   = o.activated.dup
+      end
+
+      def to_specs
+        specs = {}
+
+        @activated.each do |p|
+          if s = @specs[p]
+            platform = generic(Gem::Platform.new(s.platform))
+            next if specs[platform]
+
+            lazy_spec = LazySpecification.new(name, version, platform, source)
+            lazy_spec.dependencies.replace s.dependencies
+            specs[platform] = lazy_spec
+          end
+        end
+        specs.values
+      end
+
+      def activate_platform(platform)
+        unless @activated.include?(platform)
+          @activated << platform
+          return __dependencies[platform] || []
+        end
+        []
+      end
+
+      def name
+        @name ||= first.name
+      end
+
+      def version
+        @version ||= first.version
+      end
+
+      def source
+        @source ||= first.source
+      end
+
+      def for?(platform)
+        @specs[platform]
+      end
+
+      def to_s
+        "#{name} (#{version})"
+      end
+
+    private
+
+      def __dependencies
+        @dependencies ||= begin
+          dependencies = {}
+          ALL.each do |p|
+            if spec = @specs[p]
+              dependencies[p] = []
+              spec.dependencies.each do |dep|
+                next if dep.type == :development
+                dependencies[p] << DepProxy.new(dep, p)
+              end
+            end
+          end
+          dependencies
+        end
+      end
+    end
+
+    attr_reader :errors, :started_at, :iteration_rate, :iteration_counter
+
+    # Figures out the best possible configuration of gems that satisfies
+    # the list of passed dependencies and any child dependencies without
+    # causing any gem activation errors.
+    #
+    # ==== Parameters
+    # *dependencies<Gem::Dependency>:: The list of dependencies to resolve
+    #
+    # ==== Returns
+    # <GemBundle>,nil:: If the list of dependencies can be resolved, a
+    #   collection of gemspecs is returned. Otherwise, nil is returned.
+    def self.resolve(requirements, index, source_requirements = {}, base = [])
+      Bundler.ui.info "Resolving dependencies...", false
+      base = SpecSet.new(base) unless base.is_a?(SpecSet)
+      resolver = new(index, source_requirements, base)
+      result = catch(:success) do
+        resolver.start(requirements)
+        raise resolver.version_conflict
+        nil
+      end
+      Bundler.ui.info "" # new line now that dots are done
+      SpecSet.new(result)
+    rescue => e
+      Bundler.ui.info "" # new line before the error
+      raise e
+    end
+
+    def initialize(index, source_requirements, base)
+      @errors               = {}
+      @stack                = []
+      @base                 = base
+      @index                = index
+      @deps_for             = {}
+      @missing_gems         = Hash.new(0)
+      @source_requirements  = source_requirements
+      @iteration_counter    = 0
+      @started_at           = Time.now
+    end
+
+    def debug
+      if ENV['DEBUG_RESOLVER']
+        debug_info = yield
+        debug_info = debug_info.inspect unless debug_info.is_a?(String)
+        $stderr.puts debug_info
+      end
+    end
+
+    def successify(activated)
+      activated.values.map { |s| s.to_specs }.flatten.compact
+    end
+
+    def start(reqs)
+      activated = {}
+      @gems_size = Hash[reqs.map { |r| [r, gems_size(r)] }]
+
+      resolve(reqs, activated)
+    end
+
+    def resolve(reqs, activated)
+      # If the requirements are empty, then we are in a success state. Aka, all
+      # gem dependencies have been resolved.
+      throw :success, successify(activated) if reqs.empty?
+
+      indicate_progress
+
+      debug { print "\e[2J\e[f" ; "==== Iterating ====\n\n" }
+
+      # Sort dependencies so that the ones that are easiest to resolve are first.
+      # Easiest to resolve is defined by:
+      #   1) Is this gem already activated?
+      #   2) Do the version requirements include prereleased gems?
+      #   3) Sort by number of gems available in the source.
+      reqs = reqs.sort_by do |a|
+        [ activated[a.name] ? 0 : 1,
+          a.requirement.prerelease? ? 0 : 1,
+          @errors[a.name]   ? 0 : 1,
+          activated[a.name] ? 0 : @gems_size[a] ]
+      end
+
+      debug { "Activated:\n" + activated.values.map {|a| "  #{a}" }.join("\n") }
+      debug { "Requirements:\n" + reqs.map {|r| "  #{r}"}.join("\n") }
+
+      activated = activated.dup
+
+      # Pull off the first requirement so that we can resolve it
+      current = reqs.shift
+
+      debug { "Attempting:\n  #{current}"}
+
+      # Check if the gem has already been activated, if it has, we will make sure
+      # that the currently activated gem satisfies the requirement.
+      existing = activated[current.name]
+      if existing || current.name == 'bundler'
+        # Force the current
+        if current.name == 'bundler' && !existing
+          existing = search(DepProxy.new(Gem::Dependency.new('bundler', VERSION), Gem::Platform::RUBY)).first
+          raise GemNotFound, %Q{Bundler could not find gem "bundler" (#{VERSION})} unless existing
+          existing.required_by << existing
+          activated['bundler'] = existing
+        end
+
+        if current.requirement.satisfied_by?(existing.version)
+          debug { "    * [SUCCESS] Already activated" }
+          @errors.delete(existing.name)
+          # Since the current requirement is satisfied, we can continue resolving
+          # the remaining requirements.
+
+          # I have no idea if this is the right way to do it, but let's see if it works
+          # The current requirement might activate some other platforms, so let's try
+          # adding those requirements here.
+          dependencies = existing.activate_platform(current.__platform)
+          reqs.concat dependencies
+
+          dependencies.each do |dep|
+            next if dep.type == :development
+            @gems_size[dep] ||= gems_size(dep)
+          end
+
+          resolve(reqs, activated)
+        else
+          debug { "    * [FAIL] Already activated" }
+          @errors[existing.name] = [existing, current]
+          debug { current.required_by.map {|d| "      * #{d.name} (#{d.requirement})" }.join("\n") }
+          # debug { "    * All current conflicts:\n" + @errors.keys.map { |c| "      - #{c}" }.join("\n") }
+          # Since the current requirement conflicts with an activated gem, we need
+          # to backtrack to the current requirement's parent and try another version
+          # of it (maybe the current requirement won't be present anymore). If the
+          # current requirement is a root level requirement, we need to jump back to
+          # where the conflicting gem was activated.
+          parent = current.required_by.last
+          # `existing` could not respond to required_by if it is part of the base set
+          # of specs that was passed to the resolver (aka, instance of LazySpecification)
+          parent ||= existing.required_by.last if existing.respond_to?(:required_by)
+          # We track the spot where the current gem was activated because we need
+          # to keep a list of every spot a failure happened.
+          if parent && parent.name != 'bundler'
+            debug { "    -> Jumping to: #{parent.name}" }
+            required_by = existing.respond_to?(:required_by) && existing.required_by.last
+            throw parent.name, required_by && required_by.name
+          else
+            # The original set of dependencies conflict with the base set of specs
+            # passed to the resolver. This is by definition an impossible resolve.
+            raise version_conflict
+          end
+        end
+      else
+        # There are no activated gems for the current requirement, so we are going
+        # to find all gems that match the current requirement and try them in decending
+        # order. We also need to keep a set of all conflicts that happen while trying
+        # this gem. This is so that if no versions work, we can figure out the best
+        # place to backtrack to.
+        conflicts = Set.new
+
+        # Fetch all gem versions matching the requirement
+        matching_versions = search(current)
+
+        # If we found no versions that match the current requirement
+        if matching_versions.empty?
+          # If this is a top-level Gemfile requirement
+          if current.required_by.empty?
+            if base = @base[current.name] and !base.empty?
+              version = base.first.version
+              message = "You have requested:\n" \
+                    "  #{current.name} #{current.requirement}\n\n" \
+                    "The bundle currently has #{current.name} locked at #{version}.\n" \
+                    "Try running `bundle update #{current.name}`"
+            elsif current.source
+              name = current.name
+              versions = @source_requirements[name][name].map { |s| s.version }
+              message  = "Could not find gem '#{current}' in #{current.source}.\n"
+              if versions.any?
+                message << "Source contains '#{name}' at: #{versions.join(', ')}"
+              else
+                message << "Source does not contain any versions of '#{current}'"
+              end
+            else
+              message = "Could not find gem '#{current}' "
+              if @index.source_types.include?(Bundler::Source::Rubygems)
+                message << "in any of the gem sources listed in your Gemfile."
+              else
+                message << "in the gems available on this machine."
+              end
+            end
+            raise GemNotFound, message
+          # This is not a top-level Gemfile requirement
+          else
+            @errors[current.name] = [nil, current]
+          end
+        end
+
+        matching_versions.reverse_each do |spec_group|
+          conflict = resolve_requirement(spec_group, current, reqs.dup, activated.dup)
+          conflicts << conflict if conflict
+        end
+
+        # We throw the conflict up the dependency chain if it has not been
+        # resolved (in @errors), thus avoiding branches of the tree that have no effect
+        # on this conflict.  Note that if the tree has multiple conflicts, we don't
+        # care which one we throw, as long as we get out safe
+        if !current.required_by.empty? && !conflicts.empty?
+          @errors.reverse_each do |req_name, pair|
+            if conflicts.include?(req_name)
+              # Choose the closest pivot in the stack that will affect the conflict
+              errorpivot = (@stack & [req_name, current.required_by.last.name]).last
+              debug { "    -> Jumping to: #{errorpivot}" }
+              throw errorpivot, req_name
+            end
+          end
+        end
+
+        # If the current requirement is a root level gem and we have conflicts, we
+        # can figure out the best spot to backtrack to.
+        if current.required_by.empty? && !conflicts.empty?
+          # Check the current "catch" stack for the first one that is included in the
+          # conflicts set. That is where the parent of the conflicting gem was required.
+          # By jumping back to this spot, we can try other version of the parent of
+          # the conflicting gem, hopefully finding a combination that activates correctly.
+          @stack.reverse_each do |savepoint|
+            if conflicts.include?(savepoint)
+              debug { "    -> Jumping to: #{savepoint}" }
+              throw savepoint
+            end
+          end
+        end
+      end
+    end
+
+    def resolve_requirement(spec_group, requirement, reqs, activated)
+      # We are going to try activating the spec. We need to keep track of stack of
+      # requirements that got us to the point of activating this gem.
+      spec_group.required_by.replace requirement.required_by
+      spec_group.required_by << requirement
+
+      activated[spec_group.name] = spec_group
+      debug { "  Activating: #{spec_group.name} (#{spec_group.version})" }
+      debug { spec_group.required_by.map { |d| "    * #{d.name} (#{d.requirement})" }.join("\n") }
+
+      dependencies = spec_group.activate_platform(requirement.__platform)
+
+      # Now, we have to loop through all child dependencies and add them to our
+      # array of requirements.
+      debug { "    Dependencies"}
+      dependencies.each do |dep|
+        next if dep.type == :development
+        debug { "    * #{dep.name} (#{dep.requirement})" }
+        dep.required_by.replace(requirement.required_by)
+        dep.required_by << requirement
+        @gems_size[dep] ||= gems_size(dep)
+        reqs << dep
+      end
+
+      # We create a savepoint and mark it by the name of the requirement that caused
+      # the gem to be activated. If the activated gem ever conflicts, we are able to
+      # jump back to this point and try another version of the gem.
+      length = @stack.length
+      @stack << requirement.name
+      retval = catch(requirement.name) do
+        # try to resolve the next option
+        resolve(reqs, activated)
+      end
+
+      # clear the search cache since the catch means we couldn't meet the
+      # requirement we need with the current constraints on search
+      clear_search_cache
+
+      # Since we're doing a lot of throw / catches. A push does not necessarily match
+      # up to a pop. So, we simply slice the stack back to what it was before the catch
+      # block.
+      @stack.slice!(length..-1)
+      retval
+    end
+
+    def gems_size(dep)
+      search(dep).size
+    end
+
+    def clear_search_cache
+      @deps_for = {}
+    end
+
+    def search(dep)
+      if base = @base[dep.name] and base.any?
+        reqs = [dep.requirement.as_list, base.first.version.to_s].flatten.compact
+        d = Gem::Dependency.new(base.first.name, *reqs)
+      else
+        d = dep.dep
+      end
+
+      @deps_for[d.hash] ||= begin
+        index = @source_requirements[d.name] || @index
+        results = index.search(d, @base[d.name])
+
+        if results.any?
+          version = results.first.version
+          nested  = [[]]
+          results.each do |spec|
+            if spec.version != version
+              nested << []
+              version = spec.version
+            end
+            nested.last << spec
+          end
+          deps = nested.map{|a| SpecGroup.new(a) }.select{|sg| sg.for?(dep.__platform) }
+        else
+          deps = []
+        end
+      end
+    end
+
+    def clean_req(req)
+      if req.to_s.include?(">= 0")
+        req.to_s.gsub(/ \(.*?\)$/, '')
+      else
+        req.to_s.gsub(/\, (runtime|development)\)$/, ')')
+      end
+    end
+
+    def version_conflict
+      VersionConflict.new(errors.keys, error_message)
+    end
+
+    # For a given conflicted requirement, print out what exactly went wrong
+    def gem_message(requirement)
+      m = ""
+
+      # A requirement that is required by itself is actually in the Gemfile, and does
+      # not "depend on" itself
+      if requirement.required_by.first && requirement.required_by.first.name != requirement.name
+        m << "    #{clean_req(requirement.required_by.first)} depends on\n"
+        m << "      #{clean_req(requirement)}\n"
+      else
+        m << "    #{clean_req(requirement)}\n"
+      end
+      m << "\n"
+    end
+
+    def error_message
+      errors.inject("") do |o, (conflict, (origin, requirement))|
+
+        # origin is the SpecSet of specs from the Gemfile that is conflicted with
+        if origin
+
+          o << %{Bundler could not find compatible versions for gem "#{origin.name}":\n}
+          o << "  In Gemfile:\n"
+
+          o << gem_message(requirement)
+
+          # If the origin is "bundler", the conflict is us
+          if origin.name == "bundler"
+            o << "  Current Bundler version:\n"
+            other_bundler_required = !requirement.requirement.satisfied_by?(origin.version)
+          # If the origin is a LockfileParser, it does not respond_to :required_by
+          elsif !origin.respond_to?(:required_by) || !(origin.required_by.first)
+            o << "  In snapshot (Gemfile.lock):\n"
+          end
+
+          o << gem_message(origin)
+
+          # If the bundle wants a newer bundler than the running bundler, explain
+          if origin.name == "bundler" && other_bundler_required
+            o << "This Gemfile requires a different version of Bundler.\n"
+            o << "Perhaps you need to update Bundler by running `gem install bundler`?"
+          end
+
+        # origin is nil if the required gem and version cannot be found in any of
+        # the specified sources
+        else
+
+          # if the gem cannot be found because of a version conflict between lockfile and gemfile,
+          # print a useful error that suggests running `bundle update`, which may fix things
+          #
+          # @base is a SpecSet of the gems in the lockfile
+          # conflict is the name of the gem that could not be found
+          if locked = @base[conflict].first
+            o << "Bundler could not find compatible versions for gem #{conflict.inspect}:\n"
+            o << "  In snapshot (Gemfile.lock):\n"
+            o << "    #{clean_req(locked)}\n\n"
+
+            o << "  In Gemfile:\n"
+            o << gem_message(requirement)
+            o << "Running `bundle update` will rebuild your snapshot from scratch, using only\n"
+            o << "the gems in your Gemfile, which may resolve the conflict.\n"
+
+          # the rest of the time, the gem cannot be found because it does not exist in the known sources
+          else
+            if requirement.required_by.first
+              o << "Could not find gem '#{clean_req(requirement)}', which is required by "
+              o << "gem '#{clean_req(requirement.required_by.first)}', in any of the sources."
+            else
+              o << "Could not find gem '#{clean_req(requirement)} in any of the sources\n"
+            end
+          end
+
+        end
+        o
+      end
+    end
+
+    private
+
+    # Indicates progress by writing a '.' every iteration_rate time which is
+    # aproximately every second. iteration_rate is calculated in the first
+    # second of resolve running.
+    def indicate_progress
+      @iteration_counter += 1
+
+      if iteration_rate.nil?
+        if ((Time.now - started_at) % 3600).round >= 1
+          @iteration_rate = iteration_counter
+        end
+      else
+        if ((iteration_counter % iteration_rate) == 0)
+          Bundler.ui.info ".", false
+        end
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/ruby_dsl.rb b/misc/lib/bundler-1.3.5/lib/bundler/ruby_dsl.rb
new file mode 100644
index 0000000..87bb801
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/ruby_dsl.rb
@@ -0,0 +1,11 @@
+module Bundler
+  module RubyDsl
+    def ruby(ruby_version, options = {})
+      raise GemfileError, "Please define :engine_version" if options[:engine] && options[:engine_version].nil?
+      raise GemfileError, "Please define :engine" if options[:engine_version] && options[:engine].nil?
+
+      raise GemfileError, "ruby_version must match the :engine_version for MRI" if options[:engine] == "ruby" && options[:engine_version] && ruby_version != options[:engine_version]
+      @ruby_version = RubyVersion.new(ruby_version, options[:engine], options[:engine_version])
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/ruby_version.rb b/misc/lib/bundler-1.3.5/lib/bundler/ruby_version.rb
new file mode 100644
index 0000000..9fff143
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/ruby_version.rb
@@ -0,0 +1,100 @@
+module Bundler
+  class RubyVersion
+    attr_reader :version, :engine, :engine_version
+
+    def initialize(version, engine, engine_version)
+      # The parameters to this method must satisfy the
+      # following constraints, which are verified in
+      # the DSL:
+      #
+      # * If an engine is specified, an engine version
+      #   must also be specified
+      # * If an engine version is specified, an engine
+      #   must also be specified
+      # * If the engine is "ruby", the engine version
+      #   must not be specified, or the engine version
+      #   specified must match the version.
+
+      @version        = version
+      @engine         = engine || "ruby"
+      # keep track of the engine specified by the user
+      @input_engine   = engine
+      @engine_version = engine_version || version
+    end
+
+    def to_s
+      output = "ruby #{version}"
+      output << " (#{engine} #{engine_version})" unless engine == "ruby"
+
+      output
+    end
+
+    def ==(other)
+      version          == other.version &&
+        engine         == other.engine &&
+        engine_version == other.engine_version
+    end
+
+    # Returns a tuple of thsee things:
+    #   [diff, this, other]
+    #   The priority of attributes are
+    #   1. engine
+    #   2. ruby_version
+    #   3. engine_version
+    def diff(other)
+      if engine != other.engine && @input_engine
+        [ :engine, engine, other.engine ]
+      elsif version != other.version
+        [ :version, version, other.version ]
+      elsif engine_version != other.engine_version && @input_engine
+        [ :engine_version, engine_version, other.engine_version ]
+      else
+        nil
+      end
+    end
+  end
+
+  # A subclass of RubyVersion that implements version,
+  # engine and engine_version based upon the current
+  # information in the system. It can be used anywhere
+  # a RubyVersion object is expected, and can be
+  # compared with a RubyVersion object.
+  class SystemRubyVersion < RubyVersion
+    def initialize(*)
+      # override the default initialize, because
+      # we will implement version, engine and
+      # engine_version dynamically
+    end
+
+    def version
+      RUBY_VERSION.dup
+    end
+
+    def gem_version
+      @gem_version ||= Gem::Version.new(version)
+    end
+
+    def engine
+      if defined?(RUBY_ENGINE)
+        RUBY_ENGINE.dup
+      else
+        # not defined in ruby 1.8.7
+        "ruby"
+      end
+    end
+
+    def engine_version
+      case engine
+      when "ruby"
+        RUBY_VERSION.dup
+      when "rbx"
+        Rubinius::VERSION.dup
+      when "jruby"
+        JRUBY_VERSION.dup
+      else
+        raise BundlerError, "That RUBY_ENGINE is not recognized"
+        nil
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/rubygems_ext.rb b/misc/lib/bundler-1.3.5/lib/bundler/rubygems_ext.rb
new file mode 100644
index 0000000..eeeed1e
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/rubygems_ext.rb
@@ -0,0 +1,154 @@
+require 'pathname'
+
+if defined?(Gem::QuickLoader)
+  # Gem Prelude makes me a sad panda :'(
+  Gem::QuickLoader.load_full_rubygems_library
+end
+
+require 'rubygems'
+require 'rubygems/specification'
+require 'bundler/match_platform'
+
+module Gem
+  @loaded_stacks = Hash.new { |h,k| h[k] = [] }
+
+  class Specification
+    attr_accessor :source, :location, :relative_loaded_from
+
+    alias_method :rg_full_gem_path, :full_gem_path
+    alias_method :rg_loaded_from,   :loaded_from
+
+    def full_gem_path
+      source.respond_to?(:path) ?
+        Pathname.new(loaded_from).dirname.expand_path(Bundler.root).to_s :
+        rg_full_gem_path
+    end
+
+    def loaded_from
+      relative_loaded_from ?
+        source.path.join(relative_loaded_from).to_s :
+        rg_loaded_from
+    end
+
+    def load_paths
+      require_paths.map do |require_path|
+        if require_path.include?(full_gem_path)
+          require_path
+        else
+          File.join(full_gem_path, require_path)
+        end
+      end
+    end
+
+    # RubyGems 1.8+ used only.
+    remove_method :gem_dir if method_defined? :gem_dir
+    def gem_dir
+      full_gem_path
+    end
+
+    def groups
+      @groups ||= []
+    end
+
+    def git_version
+      if @loaded_from && File.exist?(File.join(full_gem_path, ".git"))
+        sha = Dir.chdir(full_gem_path){ `git rev-parse HEAD`.strip }
+        " #{sha[0..6]}"
+      end
+    end
+
+    def to_gemfile(path = nil)
+      gemfile = "source :gemcutter\n"
+      gemfile << dependencies_to_gemfile(nondevelopment_dependencies)
+      unless development_dependencies.empty?
+        gemfile << "\n"
+        gemfile << dependencies_to_gemfile(development_dependencies, :development)
+      end
+      gemfile
+    end
+
+    def nondevelopment_dependencies
+      dependencies - development_dependencies
+    end
+
+  private
+
+    def dependencies_to_gemfile(dependencies, group = nil)
+      gemfile = ''
+      if dependencies.any?
+        gemfile << "group :#{group} do\n" if group
+        dependencies.each do |dependency|
+          gemfile << '  ' if group
+          gemfile << %|gem "#{dependency.name}"|
+          req = dependency.requirements_list.first
+          gemfile << %|, "#{req}"| if req
+          gemfile << "\n"
+        end
+        gemfile << "end\n" if group
+      end
+      gemfile
+    end
+
+  end
+
+  class Dependency
+    attr_accessor :source, :groups
+
+    alias eql? ==
+
+    def encode_with(coder)
+      to_yaml_properties.each do |ivar|
+        coder[ivar.to_s.sub(/^@/, '')] = instance_variable_get(ivar)
+      end
+    end
+
+    def to_yaml_properties
+      instance_variables.reject { |p| ["@source", "@groups"].include?(p.to_s) }
+    end
+
+    def to_lock
+      out = "  #{name}"
+      unless requirement == Gem::Requirement.default
+        reqs = requirement.requirements.map{|o,v| "#{o} #{v}" }.sort.reverse
+        out << " (#{reqs.join(', ')})"
+      end
+      out
+    end
+
+    # Backport of performance enhancement added to Rubygems 1.4
+    def matches_spec?(spec)
+      # name can be a Regexp, so use ===
+      return false unless name === spec.name
+      return true  if requirement.none?
+
+      requirement.satisfied_by?(spec.version)
+    end unless allocate.respond_to?(:matches_spec?)
+  end
+
+  class Requirement
+    # Backport of performance enhancement added to Rubygems 1.4
+    def none?
+      @none ||= (to_s == ">= 0")
+    end unless allocate.respond_to?(:none?)
+  end
+
+  class Platform
+    JAVA  = Gem::Platform.new('java') unless defined?(JAVA)
+    MSWIN = Gem::Platform.new('mswin32') unless defined?(MSWIN)
+    MINGW = Gem::Platform.new('x86-mingw32') unless defined?(MINGW)
+
+    undef_method :hash if method_defined? :hash
+    def hash
+      @cpu.hash ^ @os.hash ^ @version.hash
+    end
+
+    undef_method :eql? if method_defined? :eql?
+    alias eql? ==
+  end
+end
+
+module Gem
+  class Specification
+    include ::Bundler::MatchPlatform
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/rubygems_integration.rb b/misc/lib/bundler-1.3.5/lib/bundler/rubygems_integration.rb
new file mode 100644
index 0000000..44d648b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/rubygems_integration.rb
@@ -0,0 +1,510 @@
+require 'rubygems'
+# rubygems master requires UI for ConfigFile but doesn't require it
+require 'rubygems/user_interaction'
+require 'rubygems/config_file'
+
+module Bundler
+  class RubygemsIntegration
+
+    def build_args
+      Gem::Command.build_args
+    end
+
+    def build_args=(args)
+      Gem::Command.build_args = args
+    end
+
+    def loaded_specs(name)
+      Gem.loaded_specs[name]
+    end
+
+    def mark_loaded(spec)
+      Gem.loaded_specs[spec.name] = spec
+    end
+
+    def path(obj)
+      obj.to_s
+    end
+
+    def platforms
+      Gem.platforms
+    end
+
+    def configuration
+      Gem.configuration
+    end
+
+    def ruby_engine
+      Gem.ruby_engine
+    end
+
+    def read_binary(path)
+      Gem.read_binary(path)
+    end
+
+    def inflate(obj)
+      Gem.inflate(obj)
+    end
+
+    def sources=(val)
+      # Gem.configuration creates a new Gem::ConfigFile, which by default will read ~/.gemrc
+      # If that file exists, its settings (including sources) will overwrite the values we
+      # are about to set here. In order to avoid that, we force memoizing the config file now.
+      configuration
+
+      Gem.sources = val
+    end
+
+    def sources
+      Gem.sources
+    end
+
+    def gem_dir
+      Gem.dir
+    end
+
+    def gem_bindir
+      Gem.bindir
+    end
+
+    def user_home
+      Gem.user_home
+    end
+
+    def gem_path
+      Gem.path
+    end
+
+    def marshal_spec_dir
+      Gem::MARSHAL_SPEC_DIR
+    end
+
+    def clear_paths
+      Gem.clear_paths
+    end
+
+    def bin_path(gem, bin, ver)
+      Gem.bin_path(gem, bin, ver)
+    end
+
+    def refresh
+      Gem.refresh
+    end
+
+    def preserve_paths
+      # this is a no-op outside of Rubygems 1.8
+      yield
+    end
+
+    def ui=(obj)
+      Gem::DefaultUserInteraction.ui = obj
+    end
+
+    def fetch_specs(all, pre, &blk)
+      specs = Gem::SpecFetcher.new.list(all, pre)
+      specs.each { yield } if block_given?
+      specs
+    end
+
+    def fetch_prerelease_specs
+      fetch_specs(false, true)
+    rescue Gem::RemoteFetcher::FetchError
+      [] # if we can't download them, there aren't any
+    end
+
+    def fetch_all_remote_specs
+      # Fetch all specs, minus prerelease specs
+      spec_list = fetch_specs(true, false)
+      # Then fetch the prerelease specs
+      fetch_prerelease_specs.each {|k, v| spec_list[k] += v }
+
+      return spec_list
+    end
+
+    def with_build_args(args)
+      old_args = self.build_args
+      begin
+        self.build_args = args
+        yield
+      ensure
+        self.build_args = old_args
+      end
+    end
+
+    def gem_from_path(path, policy = nil)
+      require 'rubygems/format'
+      Gem::Format.from_file_by_path(path, policy)
+    end
+
+    def spec_from_gem(path, policy = nil)
+      require 'rubygems/security'
+      gem_from_path(path, Gem::Security::Policies[policy]).spec
+    rescue Gem::Package::FormatError
+      raise GemspecError, "Could not read gem at #{path}. It may be corrupted."
+    rescue Exception, Gem::Exception, Gem::Security::Exception => e
+      if e.is_a?(Gem::Security::Exception) ||
+          e.message =~ /unknown trust policy|unsigned gem/i ||
+          e.message =~ /couldn't verify (meta)?data signature/i
+        raise SecurityError,
+          "The gem #{File.basename(path, '.gem')} can't be installed because " \
+          "the security policy didn't allow it, with the message: #{e.message}"
+      else
+        raise e
+      end
+    end
+
+    def build(spec)
+      require 'rubygems/builder'
+      Gem::Builder.new(spec).build
+    end
+
+    def build_gem(gem_dir, spec)
+      Dir.chdir(gem_dir) { build(spec) }
+    end
+
+    def download_gem(spec, uri, path)
+      Gem::RemoteFetcher.fetcher.download(spec, uri, path)
+    end
+
+    def security_policies
+      @security_policies ||= begin
+        require 'rubygems/security'
+        Gem::Security::Policies
+      rescue LoadError
+        {}
+      end
+    end
+
+    def reverse_rubygems_kernel_mixin
+      # Disable rubygems' gem activation system
+      ::Kernel.class_eval do
+        if private_method_defined?(:gem_original_require)
+          alias rubygems_require require
+          alias require gem_original_require
+        end
+
+        undef gem
+      end
+    end
+
+    def replace_gem(specs)
+      executables = specs.map { |s| s.executables }.flatten
+
+      ::Kernel.send(:define_method, :gem) do |dep, *reqs|
+        if executables.include? File.basename(caller.first.split(':').first)
+          return
+        end
+        reqs.pop if reqs.last.is_a?(Hash)
+
+        unless dep.respond_to?(:name) && dep.respond_to?(:requirement)
+          dep = Gem::Dependency.new(dep, reqs)
+        end
+
+        spec = specs.find  { |s| s.name == dep.name }
+
+        if spec.nil?
+
+          e = Gem::LoadError.new "#{dep.name} is not part of the bundle. Add it to Gemfile."
+          e.name = dep.name
+          if e.respond_to?(:requirement=)
+            e.requirement = dep.requirement
+          else
+            e.version_requirement = dep.requirement
+          end
+          raise e
+        elsif dep !~ spec
+          e = Gem::LoadError.new "can't activate #{dep}, already activated #{spec.full_name}. " \
+                                 "Make sure all dependencies are added to Gemfile."
+          e.name = dep.name
+          if e.respond_to?(:requirement=)
+            e.requirement = dep.requirement
+          else
+            e.version_requirement = dep.requirement
+          end
+          raise e
+        end
+
+        true
+      end
+    end
+
+    def stub_source_index137(specs)
+      # Rubygems versions lower than 1.7 use SourceIndex#from_gems_in
+      source_index_class = (class << Gem::SourceIndex ; self ; end)
+      source_index_class.send(:remove_method, :from_gems_in)
+      source_index_class.send(:define_method, :from_gems_in) do |*args|
+        source_index = Gem::SourceIndex.new
+        source_index.spec_dirs = *args
+        source_index.add_specs(*specs)
+        source_index
+      end
+    end
+
+    def stub_source_index170(specs)
+      Gem::SourceIndex.send(:alias_method, :old_initialize, :initialize)
+      Gem::SourceIndex.send(:define_method, :initialize) do |*args|
+        @gems = {}
+        # You're looking at this thinking: Oh! This is how I make those
+        # rubygems deprecations go away!
+        #
+        # You'd be correct BUT using of this method in production code
+        # must be approved by the rubygems team itself!
+        #
+        # This is your warning. If you use this and don't have approval
+        # we can't protect you.
+        #
+        Deprecate.skip_during do
+          self.spec_dirs = *args
+          add_specs(*specs)
+        end
+      end
+    end
+
+    # Used to make bin stubs that are not created by bundler work
+    # under bundler. The new Gem.bin_path only considers gems in
+    # +specs+
+    def replace_bin_path(specs)
+      gem_class = (class << Gem ; self ; end)
+      gem_class.send(:remove_method, :bin_path)
+      gem_class.send(:define_method, :bin_path) do |name, *args|
+        exec_name = args.first
+
+        if exec_name == 'bundle'
+          return ENV['BUNDLE_BIN_PATH']
+        end
+
+        spec = nil
+
+        if exec_name
+          spec = specs.find { |s| s.executables.include?(exec_name) }
+          spec or raise Gem::Exception, "can't find executable #{exec_name}"
+        else
+          spec = specs.find  { |s| s.name == name }
+          exec_name = spec.default_executable or raise Gem::Exception, "no default executable for #{spec.full_name}"
+        end
+
+        gem_bin = File.join(spec.full_gem_path, spec.bindir, exec_name)
+        gem_from_path_bin = File.join(File.dirname(spec.loaded_from), spec.bindir, exec_name)
+        File.exist?(gem_bin) ? gem_bin : gem_from_path_bin
+      end
+    end
+
+    # Because Bundler has a static view of what specs are available,
+    # we don't #refresh, so stub it out.
+    def replace_refresh
+      gem_class = (class << Gem ; self ; end)
+      gem_class.send(:remove_method, :refresh)
+      gem_class.send(:define_method, :refresh) { }
+    end
+
+    # Replace or hook into Rubygems to provide a bundlerized view
+    # of the world.
+    def replace_entrypoints(specs)
+      reverse_rubygems_kernel_mixin
+
+      replace_gem(specs)
+
+      stub_rubygems(specs)
+
+      replace_bin_path(specs)
+      replace_refresh
+
+      Gem.clear_paths
+    end
+
+    # This backports the correct segment generation code from Rubygems 1.4+
+    # by monkeypatching it into the method in Rubygems 1.3.6 and 1.3.7.
+    def backport_segment_generation
+      Gem::Version.send(:define_method, :segments) do
+        @segments ||= @version.scan(/[0-9]+|[a-z]+/i).map do |s|
+          /^\d+$/ =~ s ? s.to_i : s
+        end
+      end
+    end
+
+    # This backport fixes the marshaling of @segments.
+    def backport_yaml_initialize
+      Gem::Version.send(:define_method, :yaml_initialize) do |tag, map|
+        @version = map['version']
+        @segments = nil
+        @hash = nil
+      end
+    end
+
+    # This backports base_dir which replaces installation path
+    # Rubygems 1.8+
+    def backport_base_dir
+      Gem::Specification.send(:define_method, :base_dir) do
+        return Gem.dir unless loaded_from
+        File.dirname File.dirname loaded_from
+      end
+    end
+
+    def backport_cache_file
+      Gem::Specification.send(:define_method, :cache_dir) do
+        @cache_dir ||= File.join base_dir, "cache"
+      end
+
+      Gem::Specification.send(:define_method, :cache_file) do
+        @cache_file ||= File.join cache_dir, "#{full_name}.gem"
+      end
+    end
+
+    def backport_spec_file
+      Gem::Specification.send(:define_method, :spec_dir) do
+        @spec_dir ||= File.join base_dir, "specifications"
+      end
+
+      Gem::Specification.send(:define_method, :spec_file) do
+        @spec_file ||= File.join spec_dir, "#{full_name}.gemspec"
+      end
+    end
+
+    # Rubygems 1.4 through 1.6
+    class Legacy < RubygemsIntegration
+      def initialize
+        super
+        backport_base_dir
+        backport_cache_file
+        backport_spec_file
+        backport_yaml_initialize
+      end
+
+      def stub_rubygems(specs)
+        stub_source_index137(specs)
+      end
+
+      def all_specs
+        Gem.source_index.gems.values
+      end
+
+      def find_name(name)
+        Gem.source_index.find_name(name)
+      end
+    end
+
+    # Rubygems versions 1.3.6 and 1.3.7
+    class Ancient < Legacy
+      def initialize
+        super
+        backport_segment_generation
+      end
+    end
+
+    # Rubygems 1.7
+    class Transitional < Legacy
+      def stub_rubygems(specs)
+        stub_source_index170(specs)
+      end
+    end
+
+    # Rubygems ~> 1.8.5
+    class Modern < RubygemsIntegration
+      def stub_rubygems(specs)
+        Gem::Specification.all = specs
+
+        Gem.post_reset {
+          Gem::Specification.all = specs
+        }
+
+        stub_source_index170(specs)
+      end
+
+      def all_specs
+        Gem::Specification.to_a
+      end
+
+      def find_name(name)
+        Gem::Specification.find_all_by_name name
+      end
+    end
+
+    # Rubygems 1.8.0 to 1.8.4
+    class AlmostModern < Modern
+      # Rubygems [>= 1.8.0, < 1.8.5] has a bug that changes Gem.dir whenever
+      # you call Gem::Installer#install with an :install_dir set. We have to
+      # change it back for our sudo mode to work.
+      def preserve_paths
+        old_dir, old_path = gem_dir, gem_path
+        yield
+        Gem.use_paths(old_dir, old_path)
+      end
+    end
+
+    # Rubygems 2.0
+    class Future < RubygemsIntegration
+      def stub_rubygems(specs)
+        Gem::Specification.all = specs
+
+        Gem.post_reset {
+          Gem::Specification.all = specs
+        }
+      end
+
+      def all_specs
+        Gem::Specification.to_a
+      end
+
+      def find_name(name)
+        Gem::Specification.find_all_by_name name
+      end
+
+      def fetch_specs(source, name)
+        path = source + "#{name}.#{Gem.marshal_version}.gz"
+        string = Gem::RemoteFetcher.fetcher.fetch_path(path)
+        Bundler.load_marshal(string)
+      rescue Gem::RemoteFetcher::FetchError => e
+        # it's okay for prerelease to fail
+        raise e unless name == "prerelease_specs"
+      end
+
+      def fetch_all_remote_specs
+        # Since SpecFetcher now returns NameTuples, we just fetch directly
+        # and unmarshal the array ourselves.
+        hash = {}
+
+        Gem.sources.each do |source|
+          source = URI.parse(source.to_s) unless source.is_a?(URI)
+          hash[source] = fetch_specs(source, "specs")
+
+          pres = fetch_specs(source, "prerelease_specs")
+          hash[source].push(*pres) if pres && !pres.empty?
+        end
+
+        hash
+      end
+
+      def gem_from_path(path, policy = nil)
+        require 'rubygems/package'
+        p = Gem::Package.new(path)
+        p.security_policy = policy if policy
+        return p
+      end
+
+      def build(spec)
+        require 'rubygems/package'
+        Gem::Package.build(spec)
+      end
+
+    end
+
+  end
+
+  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.99.99')
+    @rubygems = RubygemsIntegration::Future.new
+  elsif Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.8.5')
+    @rubygems = RubygemsIntegration::Modern.new
+  elsif Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.8.0')
+    @rubygems = RubygemsIntegration::AlmostModern.new
+  elsif Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.7.0')
+    @rubygems = RubygemsIntegration::Transitional.new
+  elsif Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.4.0')
+    @rubygems = RubygemsIntegration::Legacy.new
+  else # Rubygems 1.3.6 and 1.3.7
+    @rubygems = RubygemsIntegration::Ancient.new
+  end
+
+  class << self
+    attr_reader :rubygems
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/runtime.rb b/misc/lib/bundler-1.3.5/lib/bundler/runtime.rb
new file mode 100644
index 0000000..9dd6a5f
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/runtime.rb
@@ -0,0 +1,299 @@
+require "digest/sha1"
+
+module Bundler
+  class Runtime < Environment
+    include SharedHelpers
+
+    def setup(*groups)
+      groups.map! { |g| g.to_sym }
+
+      # Has to happen first
+      clean_load_path
+
+      specs = groups.any? ? @definition.specs_for(groups) : requested_specs
+
+      setup_environment
+      Bundler.rubygems.replace_entrypoints(specs)
+
+      # Activate the specs
+      specs.each do |spec|
+        unless spec.loaded_from
+          raise GemNotFound, "#{spec.full_name} is missing. Run `bundle` to get it."
+        end
+
+        if activated_spec = Bundler.rubygems.loaded_specs(spec.name) and activated_spec.version != spec.version
+          e = Gem::LoadError.new "You have already activated #{activated_spec.name} #{activated_spec.version}, " \
+                                 "but your Gemfile requires #{spec.name} #{spec.version}. Using bundle exec may solve this."
+          e.name = spec.name
+          if e.respond_to?(:requirement=)
+            e.requirement = Gem::Requirement.new(spec.version.to_s)
+          else
+            e.version_requirement = Gem::Requirement.new(spec.version.to_s)
+          end
+          raise e
+        end
+
+        Bundler.rubygems.mark_loaded(spec)
+        load_paths = spec.load_paths.reject {|path| $LOAD_PATH.include?(path)}
+        $LOAD_PATH.unshift(*load_paths)
+      end
+
+      setup_manpath
+
+      lock
+
+      self
+    end
+
+    REGEXPS = [
+      /^no such file to load -- (.+)$/i,
+      /^Missing \w+ (?:file\s*)?([^\s]+.rb)$/i,
+      /^Missing API definition file in (.+)$/i,
+      /^cannot load such file -- (.+)$/i,
+    ]
+
+    def require(*groups)
+      groups.map! { |g| g.to_sym }
+      groups = [:default] if groups.empty?
+
+      @definition.dependencies.each do |dep|
+        # Skip the dependency if it is not in any of the requested
+        # groups
+        next unless ((dep.groups & groups).any? && dep.current_platform?)
+
+        required_file = nil
+
+        begin
+          # Loop through all the specified autorequires for the
+          # dependency. If there are none, use the dependency's name
+          # as the autorequire.
+          Array(dep.autorequire || dep.name).each do |file|
+            required_file = file
+            Kernel.require file
+          end
+        rescue LoadError => e
+          REGEXPS.find { |r| r =~ e.message }
+          raise if dep.autorequire || $1 != required_file
+
+          if dep.autorequire.nil? && dep.name.include?('-')
+            begin
+              namespaced_file = dep.name.gsub('-', '/')
+              Kernel.require namespaced_file
+            rescue LoadError
+              REGEXPS.find { |r| r =~ e.message }
+              regex_name = $1
+              raise e if dep.autorequire || (regex_name && regex_name.gsub('-', '/') != namespaced_file)
+              raise e if regex_name.nil?
+            end
+          end
+        end
+      end
+    end
+
+    def dependencies_for(*groups)
+      if groups.empty?
+        dependencies
+      else
+        dependencies.select { |d| (groups & d.groups).any? }
+      end
+    end
+
+    alias gems specs
+
+    def cache
+      FileUtils.mkdir_p(cache_path) unless File.exists?(cache_path)
+
+      Bundler.ui.info "Updating files in vendor/cache"
+      specs.each do |spec|
+        next if spec.name == 'bundler'
+        spec.source.cache(spec) if spec.source.respond_to?(:cache)
+      end
+
+      Dir[cache_path.join("*/.git")].each do |git_dir|
+        FileUtils.rm_rf(git_dir)
+        FileUtils.touch(File.expand_path("../.bundlecache", git_dir))
+      end
+
+      prune_cache unless Bundler.settings[:no_prune]
+    end
+
+    def prune_cache
+      FileUtils.mkdir_p(cache_path) unless File.exists?(cache_path)
+      resolve = @definition.resolve
+      prune_gem_cache(resolve)
+      prune_git_and_path_cache(resolve)
+    end
+
+    def clean(dry_run = false)
+      gem_bins             = Dir["#{Gem.dir}/bin/*"]
+      git_dirs             = Dir["#{Gem.dir}/bundler/gems/*"]
+      git_cache_dirs       = Dir["#{Gem.dir}/cache/bundler/git/*"]
+      gem_dirs             = Dir["#{Gem.dir}/gems/*"]
+      gem_files            = Dir["#{Gem.dir}/cache/*.gem"]
+      gemspec_files        = Dir["#{Gem.dir}/specifications/*.gemspec"]
+      spec_gem_paths       = []
+      # need to keep git sources around
+      spec_git_paths       = @definition.sources.select {|s| s.is_a?(Bundler::Source::Git) }.map {|s| s.path.to_s }
+      spec_git_cache_dirs  = []
+      spec_gem_executables = []
+      spec_cache_paths     = []
+      spec_gemspec_paths   = []
+      specs.each do |spec|
+        spec_gem_paths << spec.full_gem_path
+        # need to check here in case gems are nested like for the rails git repo
+        md = %r{(.+bundler/gems/.+-[a-f0-9]{7,12})}.match(spec.full_gem_path)
+        spec_git_paths << md[1] if md
+        spec_gem_executables << spec.executables.collect do |executable|
+          e = "#{Bundler.rubygems.gem_bindir}/#{executable}"
+          [e, "#{e}.bat"]
+        end
+        spec_cache_paths << spec.cache_file
+        spec_gemspec_paths << spec.spec_file
+        spec_git_cache_dirs << spec.source.cache_path.to_s if spec.source.is_a?(Bundler::Source::Git)
+      end
+      spec_gem_paths.uniq!
+      spec_gem_executables.flatten!
+
+      stale_gem_bins       = gem_bins - spec_gem_executables
+      stale_git_dirs       = git_dirs - spec_git_paths
+      stale_git_cache_dirs = git_cache_dirs - spec_git_cache_dirs
+      stale_gem_dirs       = gem_dirs - spec_gem_paths
+      stale_gem_files      = gem_files - spec_cache_paths
+      stale_gemspec_files  = gemspec_files - spec_gemspec_paths
+
+      output = stale_gem_dirs.collect do |gem_dir|
+        full_name = Pathname.new(gem_dir).basename.to_s
+
+        parts   = full_name.split('-')
+        name    = parts[0..-2].join('-')
+        version = parts.last
+        output  = "#{name} (#{version})"
+
+        if dry_run
+          Bundler.ui.info "Would have removed #{output}"
+        else
+          Bundler.ui.info "Removing #{output}"
+          FileUtils.rm_rf(gem_dir)
+        end
+
+        output
+      end + stale_git_dirs.collect do |gem_dir|
+        full_name = Pathname.new(gem_dir).basename.to_s
+
+        parts    = full_name.split('-')
+        name     = parts[0..-2].join('-')
+        revision = parts[-1]
+        output   = "#{name} (#{revision})"
+
+        if dry_run
+          Bundler.ui.info "Would have removed #{output}"
+        else
+          Bundler.ui.info "Removing #{output}"
+          FileUtils.rm_rf(gem_dir)
+        end
+
+        output
+      end
+
+      unless dry_run
+        stale_gem_bins.each { |bin| FileUtils.rm(bin) if File.exists?(bin) }
+        stale_gem_files.each { |file| FileUtils.rm(file) if File.exists?(file) }
+        stale_gemspec_files.each { |file| FileUtils.rm(file) if File.exists?(file) }
+        stale_git_cache_dirs.each { |dir| FileUtils.rm_rf(dir) if File.exists?(dir) }
+      end
+
+      output
+    end
+
+    def setup_environment
+      begin
+        ENV["BUNDLE_BIN_PATH"] = Bundler.rubygems.bin_path("bundler", "bundle", VERSION)
+      rescue Gem::GemNotFoundException
+        ENV["BUNDLE_BIN_PATH"] = File.expand_path("../../../bin/bundle", __FILE__)
+      end
+
+      # Set PATH
+      paths = (ENV["PATH"] || "").split(File::PATH_SEPARATOR)
+      paths.unshift "#{Bundler.bundle_path}/bin"
+      ENV["PATH"] = paths.uniq.join(File::PATH_SEPARATOR)
+
+      # Set BUNDLE_GEMFILE
+      ENV["BUNDLE_GEMFILE"] = default_gemfile.to_s
+
+      # Set RUBYOPT
+      rubyopt = [ENV["RUBYOPT"]].compact
+      if rubyopt.empty? || rubyopt.first !~ /-rbundler\/setup/
+        rubyopt.unshift %|-rbundler/setup|
+        rubyopt.unshift %|-I#{File.expand_path('../..', __FILE__)}|
+        ENV["RUBYOPT"] = rubyopt.join(' ')
+      end
+    end
+
+  private
+
+    def prune_gem_cache(resolve)
+      cached  = Dir["#{cache_path}/*.gem"]
+
+      cached = cached.delete_if do |path|
+        spec = Bundler.rubygems.spec_from_gem path
+
+        resolve.any? do |s|
+          s.name == spec.name && s.version == spec.version && !s.source.is_a?(Bundler::Source::Git)
+        end
+      end
+
+      if cached.any?
+        Bundler.ui.info "Removing outdated .gem files from vendor/cache"
+
+        cached.each do |path|
+          Bundler.ui.info "  * #{File.basename(path)}"
+          File.delete(path)
+        end
+      end
+    end
+
+    def prune_git_and_path_cache(resolve)
+      cached  = Dir["#{cache_path}/*/.bundlecache"]
+
+      cached = cached.delete_if do |path|
+        name = File.basename(File.dirname(path))
+
+        resolve.any? do |s|
+          source = s.source
+          source.respond_to?(:app_cache_dirname) && source.app_cache_dirname == name
+        end
+      end
+
+      if cached.any?
+        Bundler.ui.info "Removing outdated git and path gems from vendor/cache"
+
+        cached.each do |path|
+          path = File.dirname(path)
+          Bundler.ui.info "  * #{File.basename(path)}"
+          FileUtils.rm_rf(path)
+        end
+      end
+    end
+
+    def setup_manpath
+      # Store original MANPATH for restoration later in with_clean_env()
+      ENV['BUNDLE_ORIG_MANPATH'] = ENV['MANPATH']
+
+      # Add man/ subdirectories from activated bundles to MANPATH for man(1)
+      manuals = $LOAD_PATH.map do |path|
+        man_subdir = path.sub(/lib$/, 'man')
+        man_subdir unless Dir[man_subdir + '/man?/'].empty?
+      end.compact
+
+      unless manuals.empty?
+        ENV['MANPATH'] = manuals.concat(
+          ENV['MANPATH'].to_s.split(File::PATH_SEPARATOR)
+        ).uniq.join(File::PATH_SEPARATOR)
+      end
+    end
+
+    def cache_path
+      root.join("vendor/cache")
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/settings.rb b/misc/lib/bundler-1.3.5/lib/bundler/settings.rb
new file mode 100644
index 0000000..02b6cef
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/settings.rb
@@ -0,0 +1,153 @@
+module Bundler
+  class Settings
+    def initialize(root = nil)
+      @root          = root
+      @local_config  = load_config(local_config_file)
+      @global_config = load_config(global_config_file)
+    end
+
+    def [](key)
+      the_key = key_for(key)
+      value = (@local_config[the_key] || ENV[the_key] || @global_config[the_key])
+      is_bool(key) ? to_bool(value) : value
+    end
+
+    def []=(key, value)
+      local_config_file || raise(GemfileNotFound)
+      set_key(key, value, @local_config, local_config_file)
+    end
+
+    alias :set_local :[]=
+
+    def delete(key)
+      @local_config.delete(key_for(key))
+    end
+
+    def set_global(key, value)
+      set_key(key, value, @global_config, global_config_file)
+    end
+
+    def all
+      env_keys = ENV.keys.select { |k| k =~ /BUNDLE_.*/ }
+      keys = @global_config.keys | @local_config.keys | env_keys
+
+      keys.map do |key|
+        key.sub(/^BUNDLE_/, '').gsub(/__/, ".").downcase
+      end
+    end
+
+    def local_overrides
+      repos = {}
+      all.each do |k|
+        if k =~ /^local\./
+          repos[$'] = self[k]
+        end
+      end
+      repos
+    end
+
+    def locations(key)
+      key = key_for(key)
+      locations = {}
+      locations[:local]  = @local_config[key] if @local_config.key?(key)
+      locations[:env]    = ENV[key] if ENV[key]
+      locations[:global] = @global_config[key] if @global_config.key?(key)
+      locations
+    end
+
+    def pretty_values_for(exposed_key)
+      key = key_for(exposed_key)
+
+      locations = []
+      if @local_config.key?(key)
+        locations << "Set for your local app (#{local_config_file}): #{@local_config[key].inspect}"
+      end
+
+      if value = ENV[key]
+        locations << "Set via #{key}: #{value.inspect}"
+      end
+
+      if @global_config.key?(key)
+        locations << "Set for the current user (#{global_config_file}): #{@global_config[key].inspect}"
+      end
+
+      return ["You have not configured a value for `#{exposed_key}`"] if locations.empty?
+      locations
+    end
+
+    def without=(array)
+      self[:without] = (array.empty? ? nil : array.join(":")) if array
+    end
+
+    def without
+      self[:without] ? self[:without].split(":").map { |w| w.to_sym } : []
+    end
+
+    # @local_config["BUNDLE_PATH"] should be prioritized over ENV["BUNDLE_PATH"]
+    def path
+      key  = key_for(:path)
+      path = ENV[key] || @global_config[key]
+      return path if path && !@local_config.key?(key)
+
+      if path = self[:path]
+        "#{path}/#{Bundler.ruby_scope}"
+      else
+        Bundler.rubygems.gem_dir
+      end
+    end
+
+    def allow_sudo?
+      !@local_config.key?(key_for(:path))
+    end
+
+    def ignore_config?
+      ENV['BUNDLE_IGNORE_CONFIG']
+    end
+
+  private
+    def key_for(key)
+      key = key.to_s.sub(".", "__").upcase
+      "BUNDLE_#{key}"
+    end
+
+    def is_bool(key)
+      %w(frozen cache_all no_prune disable_local_branch_check).include? key.to_s
+    end
+
+    def to_bool(value)
+      !(value.nil? || value == '' || value =~ /^(false|f|no|n|0)$/i)
+    end
+
+    def set_key(key, value, hash, file)
+      key = key_for(key)
+
+      unless hash[key] == value
+        hash[key] = value
+        hash.delete(key) if value.nil?
+        FileUtils.mkdir_p(file.dirname)
+        require 'bundler/psyched_yaml'
+        File.open(file, "w") { |f| f.puts YAML.dump(hash) }
+      end
+      value
+    end
+
+    def global_config_file
+      file = ENV["BUNDLE_CONFIG"] || File.join(Bundler.rubygems.user_home, ".bundle/config")
+      Pathname.new(file)
+    end
+
+    def local_config_file
+      Pathname.new(@root).join("config") if @root
+    end
+
+    def load_config(config_file)
+      valid_file = config_file && config_file.exist? && !config_file.size.zero?
+      if !ignore_config? && valid_file
+        Hash[config_file.read.scan(/^(BUNDLE_.+): ['"]?(.+?)['"]?$/)]
+      else
+        {}
+      end
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/setup.rb b/misc/lib/bundler-1.3.5/lib/bundler/setup.rb
new file mode 100644
index 0000000..d577097
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/setup.rb
@@ -0,0 +1,23 @@
+require 'bundler/shared_helpers'
+
+if Bundler::SharedHelpers.in_bundle?
+  require 'bundler'
+  if STDOUT.tty?
+    begin
+      Bundler.setup
+    rescue Bundler::BundlerError => e
+      puts "\e[31m#{e.message}\e[0m"
+      puts e.backtrace.join("\n") if ENV["DEBUG"]
+      if Bundler::GemNotFound === e
+        puts "\e[33mRun `bundle install` to install missing gems.\e[0m"
+      end
+      exit e.status_code
+    end
+  else
+    Bundler.setup
+  end
+
+  # Add bundler to the load path after disabling system gems
+  bundler_lib = File.expand_path("../..", __FILE__)
+  $LOAD_PATH.unshift(bundler_lib) unless $LOAD_PATH.include?(bundler_lib)
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/shared_helpers.rb b/misc/lib/bundler-1.3.5/lib/bundler/shared_helpers.rb
new file mode 100644
index 0000000..e6f4899
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/shared_helpers.rb
@@ -0,0 +1,71 @@
+require 'pathname'
+require 'rubygems'
+
+require 'bundler/rubygems_integration'
+
+module Gem
+  class Dependency
+    if !instance_methods.map { |m| m.to_s }.include?("requirement")
+      def requirement
+        version_requirements
+      end
+    end
+  end
+end
+
+module Bundler
+  module SharedHelpers
+    attr_accessor :gem_loaded
+
+    def default_gemfile
+      gemfile = find_gemfile
+      raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
+      Pathname.new(gemfile)
+    end
+
+    def default_lockfile
+      Pathname.new("#{default_gemfile}.lock")
+    end
+
+    def in_bundle?
+      find_gemfile
+    end
+
+  private
+
+    def find_gemfile
+      given = ENV['BUNDLE_GEMFILE']
+      return given if given && !given.empty?
+
+      previous = nil
+      current  = File.expand_path(Dir.pwd)
+
+      until !File.directory?(current) || current == previous
+        if ENV['BUNDLE_SPEC_RUN']
+          # avoid stepping above the tmp directory when testing
+          return nil if File.file?(File.join(current, 'bundler.gemspec'))
+        end
+
+        # otherwise return the Gemfile if it's there
+        filename = File.join(current, 'Gemfile')
+        return filename if File.file?(filename)
+        current, previous = File.expand_path("..", current), current
+      end
+    end
+
+    def clean_load_path
+      # handle 1.9 where system gems are always on the load path
+      if defined?(::Gem)
+        me = File.expand_path("../../", __FILE__)
+        $LOAD_PATH.reject! do |p|
+          next if File.expand_path(p) =~ /^#{Regexp.escape(me)}/
+          p != File.dirname(__FILE__) &&
+            Bundler.rubygems.gem_path.any?{|gp| p =~ /^#{Regexp.escape(gp)}/ }
+        end
+        $LOAD_PATH.uniq!
+      end
+    end
+
+    extend self
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/similarity_detector.rb b/misc/lib/bundler-1.3.5/lib/bundler/similarity_detector.rb
new file mode 100644
index 0000000..9bb1e8d
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/similarity_detector.rb
@@ -0,0 +1,63 @@
+module Bundler
+  class SimilarityDetector
+    SimilarityScore = Struct.new(:string, :distance)
+
+    # initialize with an array of words to be matched against
+    def initialize(corpus)
+      @corpus = corpus
+    end
+
+    # return an array of words similar to 'word' from the corpus
+    def similar_words(word, limit=3)
+      words_by_similarity = @corpus.map{|w| SimilarityScore.new(w, levenshtein_distance(word, w))}
+      words_by_similarity.select{|s| s.distance<=limit}.sort_by(&:distance).map(&:string)
+    end
+
+    # return the result of 'similar_words', concatenated into a list
+    # (eg "a, b, or c")
+    def similar_word_list(word, limit=3)
+      words = similar_words(word,limit)
+      if words.length==1
+        words[0]
+      elsif words.length>1
+        [words[0..-2].join(', '), words[-1]].join(' or ')
+      end
+    end
+
+
+  protected
+    # http://www.informit.com/articles/article.aspx?p=683059&seqNum=36
+    def levenshtein_distance(this, that, ins=2, del=2, sub=1)
+      # ins, del, sub are weighted costs
+      return nil if this.nil?
+      return nil if that.nil?
+      dm = []        # distance matrix
+
+      # Initialize first row values
+      dm[0] = (0..this.length).collect { |i| i * ins }
+      fill = [0] * (this.length - 1)
+
+      # Initialize first column values
+      for i in 1..that.length
+        dm[i] = [i * del, fill.flatten]
+      end
+
+      # populate matrix
+      for i in 1..that.length
+        for j in 1..this.length
+          # critical comparison
+          dm[i][j] = [
+               dm[i-1][j-1] +
+                 (this[j-1] == that[i-1] ? 0 : sub),
+                   dm[i][j-1] + ins,
+               dm[i-1][j] + del
+         ].min
+        end
+      end
+
+      # The last value in matrix is the Levenshtein distance between the strings
+      dm[that.length][this.length]
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/source.rb b/misc/lib/bundler-1.3.5/lib/bundler/source.rb
new file mode 100644
index 0000000..c75599f
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/source.rb
@@ -0,0 +1,7 @@
+module Bundler
+  module Source
+    autoload :Rubygems, 'bundler/source/rubygems'
+    autoload :Path, 'bundler/source/path'
+    autoload :Git, 'bundler/source/git'
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/source/git.rb b/misc/lib/bundler-1.3.5/lib/bundler/source/git.rb
new file mode 100644
index 0000000..59576e5
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/source/git.rb
@@ -0,0 +1,279 @@
+require 'fileutils'
+require 'uri'
+require 'digest/sha1'
+
+module Bundler
+  module Source
+
+    class Git < Path
+      autoload :GitProxy, 'bundler/source/git/git_proxy'
+
+      attr_reader :uri, :ref, :branch, :options, :submodules
+
+      def initialize(options)
+        @options = options
+        @glob = options["glob"] || DEFAULT_GLOB
+
+        @allow_cached = false
+        @allow_remote = false
+
+        # Stringify options that could be set as symbols
+        %w(ref branch tag revision).each{|k| options[k] = options[k].to_s if options[k] }
+
+        @uri        = options["uri"]
+        @branch     = options["branch"]
+        @ref        = options["ref"] || options["branch"] || options["tag"] || 'master'
+        @submodules = options["submodules"]
+        @name       = options["name"]
+        @version    = options["version"]
+
+        @copied     = false
+        @local      = false
+      end
+
+      def self.from_lock(options)
+        new(options.merge("uri" => options.delete("remote")))
+      end
+
+      def to_lock
+        out = "GIT\n"
+        out << "  remote: #{@uri}\n"
+        out << "  revision: #{revision}\n"
+        %w(ref branch tag submodules).each do |opt|
+          out << "  #{opt}: #{options[opt]}\n" if options[opt]
+        end
+        out << "  glob: #{@glob}\n" unless @glob == DEFAULT_GLOB
+        out << "  specs:\n"
+      end
+
+      def eql?(o)
+        Git === o            &&
+        uri == o.uri         &&
+        ref == o.ref         &&
+        branch == o.branch   &&
+        name == o.name       &&
+        version == o.version &&
+        submodules == o.submodules
+      end
+
+      alias == eql?
+
+      def to_s
+        at = if local?
+          path
+        elsif options["ref"]
+          shortref_for_display(options["ref"])
+        else
+          ref
+        end
+        "#{uri} (at #{at})"
+      end
+
+      def name
+        File.basename(@uri, '.git')
+      end
+
+      # This is the path which is going to contain a specific
+      # checkout of the git repository. When using local git
+      # repos, this is set to the local repo.
+      def install_path
+        @install_path ||= begin
+          git_scope = "#{base_name}-#{shortref_for_path(revision)}"
+
+          if Bundler.requires_sudo?
+            Bundler.user_bundle_path.join(Bundler.ruby_scope).join(git_scope)
+          else
+            Bundler.install_path.join(git_scope)
+          end
+        end
+      end
+
+      alias :path :install_path
+
+      def unlock!
+        git_proxy.revision = nil
+        @unlocked = true
+      end
+
+      def local_override!(path)
+        return false if local?
+
+        path = Pathname.new(path)
+        path = path.expand_path(Bundler.root) unless path.relative?
+
+        unless options["branch"] || Bundler.settings[:disable_local_branch_check]
+          raise GitError, "Cannot use local override for #{name} at #{path} because " \
+            ":branch is not specified in Gemfile. Specify a branch or use " \
+            "`bundle config --delete` to remove the local override"
+        end
+
+        unless path.exist?
+          raise GitError, "Cannot use local override for #{name} because #{path} " \
+            "does not exist. Check `bundle config --delete` to remove the local override"
+        end
+
+        set_local!(path)
+
+        # Create a new git proxy without the cached revision
+        # so the Gemfile.lock always picks up the new revision.
+        @git_proxy = GitProxy.new(path, uri, ref)
+
+        if git_proxy.branch != options["branch"] && !Bundler.settings[:disable_local_branch_check]
+          raise GitError, "Local override for #{name} at #{path} is using branch " \
+            "#{git_proxy.branch} but Gemfile specifies #{options["branch"]}"
+        end
+
+        changed = cached_revision && cached_revision != git_proxy.revision
+
+        if changed && !@unlocked && !git_proxy.contains?(cached_revision)
+          raise GitError, "The Gemfile lock is pointing to revision #{shortref_for_display(cached_revision)} " \
+            "but the current branch in your local override for #{name} does not contain such commit. " \
+            "Please make sure your branch is up to date."
+        end
+
+        changed
+      end
+
+      # TODO: actually cache git specs
+      def specs(*)
+        if has_app_cache? && !local?
+          set_local!(app_cache_path)
+        end
+
+        if requires_checkout? && !@copied
+          git_proxy.checkout
+          git_proxy.copy_to(install_path, submodules)
+          serialize_gemspecs_in(install_path)
+          @copied = true
+        end
+
+        local_specs
+      end
+
+      def install(spec)
+        Bundler.ui.info "Using #{spec.name} (#{spec.version}) from #{to_s} "
+        if requires_checkout? && !@copied
+          Bundler.ui.debug "  * Checking out revision: #{ref}"
+          git_proxy.copy_to(install_path, submodules)
+          serialize_gemspecs_in(install_path)
+          @copied = true
+        end
+        generate_bin(spec)
+      end
+
+      def cache(spec)
+        return unless Bundler.settings[:cache_all]
+        return if path == app_cache_path
+        cached!
+        FileUtils.rm_rf(app_cache_path)
+        git_proxy.checkout if requires_checkout?
+        git_proxy.copy_to(app_cache_path, @submodules)
+        serialize_gemspecs_in(app_cache_path)
+      end
+
+      def load_spec_files
+        super
+      rescue PathError, GitError
+        raise GitError, "#{to_s} is not checked out. Please run `bundle install`"
+      end
+
+      # This is the path which is going to contain a cache
+      # of the git repository. When using the same git repository
+      # across different projects, this cache will be shared.
+      # When using local git repos, this is set to the local repo.
+      def cache_path
+        @cache_path ||= begin
+          git_scope = "#{base_name}-#{uri_hash}"
+
+          if Bundler.requires_sudo?
+            Bundler.user_bundle_path.join("cache/git", git_scope)
+          else
+            Bundler.cache.join("git", git_scope)
+          end
+        end
+      end
+
+      def app_cache_dirname
+        "#{base_name}-#{shortref_for_path(cached_revision || revision)}"
+      end
+
+    private
+
+      def serialize_gemspecs_in(destination)
+        expanded_path = destination.expand_path(Bundler.root)
+        Dir["#{expanded_path}/#{@glob}"].each do |spec_path|
+          # Evaluate gemspecs and cache the result. Gemspecs
+          # in git might require git or other dependencies.
+          # The gemspecs we cache should already be evaluated.
+          spec = Bundler.load_gemspec(spec_path)
+          next unless spec
+          File.open(spec_path, 'wb') {|file| file.write(spec.to_ruby) }
+        end
+      end
+
+      def set_local!(path)
+        @local       = true
+        @local_specs = @git_proxy = nil
+        @cache_path  = @install_path = path
+      end
+
+      def has_app_cache?
+        cached_revision && super
+      end
+
+      def local?
+        @local
+      end
+
+      def requires_checkout?
+        allow_git_ops? && !local?
+      end
+
+      def base_name
+        File.basename(uri.sub(%r{^(\w+://)?([^/:]+:)?(//\w*/)?(\w*/)*},''),".git")
+      end
+
+      def shortref_for_display(ref)
+        ref[0..6]
+      end
+
+      def shortref_for_path(ref)
+        ref[0..11]
+      end
+
+      def uri_hash
+        if uri =~ %r{^\w+://(\w+@)?}
+          # Downcase the domain component of the URI
+          # and strip off a trailing slash, if one is present
+          input = URI.parse(uri).normalize.to_s.sub(%r{/$},'')
+        else
+          # If there is no URI scheme, assume it is an ssh/git URI
+          input = uri
+        end
+        Digest::SHA1.hexdigest(input)
+      end
+
+      def allow_git_ops?
+        @allow_remote || @allow_cached
+      end
+
+      def cached_revision
+        options["revision"]
+      end
+
+      def revision
+        git_proxy.revision
+      end
+
+      def cached?
+        cache_path.exist?
+      end
+
+      def git_proxy
+        @git_proxy ||= GitProxy.new(cache_path, uri, ref, cached_revision){ allow_git_ops? }
+      end
+
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/source/git/git_proxy.rb b/misc/lib/bundler-1.3.5/lib/bundler/source/git/git_proxy.rb
new file mode 100644
index 0000000..e480f15
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/source/git/git_proxy.rb
@@ -0,0 +1,145 @@
+module Bundler
+  module Source
+
+    class Git < Path
+      # The GitProxy is responsible to iteract with git repositories.
+      # All actions required by the Git source is encapsualted in this
+      # object.
+      class GitProxy
+        attr_accessor :path, :uri, :ref
+        attr_writer :revision
+
+        def initialize(path, uri, ref, revision=nil, &allow)
+          @path     = path
+          @uri      = uri
+          @ref      = ref
+          @revision = revision
+          @allow    = allow || Proc.new { true }
+        end
+
+        def revision
+          @revision ||= allowed_in_path { git("rev-parse #{ref}").strip }
+        end
+
+        def branch
+          @branch ||= allowed_in_path do
+            git("branch") =~ /^\* (.*)$/ && $1.strip
+          end
+        end
+
+        def contains?(commit)
+          allowed_in_path do
+            result = git_null("branch --contains #{commit}")
+            $? == 0 && result =~ /^\* (.*)$/
+          end
+        end
+
+        def checkout
+          if path.exist?
+            return if has_revision_cached?
+            Bundler.ui.info "Updating #{uri}"
+            in_path do
+              git %|fetch --force --quiet --tags #{uri_escaped} "refs/heads/*:refs/heads/*"|
+            end
+          else
+            Bundler.ui.info "Fetching #{uri}"
+            FileUtils.mkdir_p(path.dirname)
+            clone_command = %|clone #{uri_escaped} "#{path}" --bare --no-hardlinks|
+            clone_command = "#{clone_command} --quiet" if Bundler.ui.quiet?
+            git clone_command
+          end
+        end
+
+        def copy_to(destination, submodules=false)
+          unless File.exist?(destination.join(".git"))
+            FileUtils.mkdir_p(destination.dirname)
+            FileUtils.rm_rf(destination)
+            git %|clone --no-checkout "#{path}" "#{destination}"|
+            File.chmod((0777 & ~File.umask), destination)
+          end
+
+          Dir.chdir(destination) do
+            git %|fetch --force --quiet --tags "#{path}"|
+            git "reset --hard #{@revision}"
+
+            if submodules
+              git "submodule update --init --recursive"
+            end
+          end
+        end
+
+      private
+
+        # TODO: Do not rely on /dev/null.
+        # Given that open3 is not cross platform until Ruby 1.9.3,
+        # the best solution is to pipe to /dev/null if it exists.
+        # If it doesn't, everything will work fine, but the user
+        # will get the $stderr messages as well.
+        def git_null(command)
+          if !Bundler::WINDOWS && File.exist?("/dev/null")
+            git("#{command} 2>/dev/null", false)
+          else
+            git(command, false)
+          end
+        end
+
+        def git(command, check_errors=true)
+          if allow?
+            out = %x{git #{command}}
+
+            if check_errors && $?.exitstatus != 0
+              msg = "Git error: command `git #{command}` in directory #{Dir.pwd} has failed."
+              msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path.exist?
+              raise GitError, msg
+            end
+            out
+          else
+            raise GitError, "Bundler is trying to run a `git #{command}` at runtime. You probably need to run `bundle install`. However, " \
+                            "this error message could probably be more useful. Please submit a ticket at http://github.com/carlhuda/bundler/issues " \
+                            "with steps to reproduce as well as the following\n\nCALLER: #{caller.join("\n")}"
+          end
+        end
+
+        def has_revision_cached?
+          return unless @revision
+          in_path { git("cat-file -e #{@revision}") }
+          true
+        rescue GitError
+          false
+        end
+
+        # Escape the URI for git commands
+        def uri_escaped
+          if Bundler::WINDOWS
+            # Windows quoting requires double quotes only, with double quotes
+            # inside the string escaped by being doubled.
+            '"' + uri.gsub('"') {|s| '""'} + '"'
+          else
+            # Bash requires single quoted strings, with the single quotes escaped
+            # by ending the string, escaping the quote, and restarting the string.
+            "'" + uri.gsub("'") {|s| "'\\''"} + "'"
+          end
+        end
+
+        def allow?
+          @allow.call
+        end
+
+        def in_path(&blk)
+          checkout unless path.exist?
+          Dir.chdir(path, &blk)
+        end
+
+        def allowed_in_path
+          if allow?
+            in_path { yield }
+          else
+            raise GitError, "The git source #{uri} is not yet checked out. Please run `bundle install` before trying to start your application"
+          end
+        end
+
+      end
+
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/source/path.rb b/misc/lib/bundler-1.3.5/lib/bundler/source/path.rb
new file mode 100644
index 0000000..625ede4
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/source/path.rb
@@ -0,0 +1,211 @@
+module Bundler
+  module Source
+
+    class Path
+      autoload :Installer, 'bundler/source/path/installer'
+
+      attr_reader   :path, :options
+      attr_writer   :name
+      attr_accessor :version
+
+      DEFAULT_GLOB = "{,*,*/*}.gemspec"
+
+      def initialize(options)
+        @options = options
+        @glob = options["glob"] || DEFAULT_GLOB
+
+        @allow_cached = false
+        @allow_remote = false
+
+        if options["path"]
+          @path = Pathname.new(options["path"])
+          @path = @path.expand_path(Bundler.root) unless @path.relative?
+        end
+
+        @name    = options["name"]
+        @version = options["version"]
+
+        # Stores the original path. If at any point we move to the
+        # cached directory, we still have the original path to copy from.
+        @original_path = @path
+      end
+
+      def remote!
+        @allow_remote = true
+      end
+
+      def cached!
+        @allow_cached = true
+      end
+
+      def self.from_lock(options)
+        new(options.merge("path" => options.delete("remote")))
+      end
+
+      def to_lock
+        out = "PATH\n"
+        out << "  remote: #{relative_path}\n"
+        out << "  glob: #{@glob}\n" unless @glob == DEFAULT_GLOB
+        out << "  specs:\n"
+      end
+
+      def to_s
+        "source at #{@path}"
+      end
+
+      def hash
+        self.class.hash
+      end
+
+      def eql?(o)
+        o.instance_of?(Path) &&
+        path.expand_path(Bundler.root) == o.path.expand_path(Bundler.root) &&
+        version == o.version
+      end
+
+      alias == eql?
+
+      def name
+        File.basename(path.expand_path(Bundler.root).to_s)
+      end
+
+      def install(spec)
+        Bundler.ui.info "Using #{spec.name} (#{spec.version}) from #{to_s} "
+        generate_bin(spec, :disable_extensions)
+      end
+
+      def cache(spec)
+        return unless Bundler.settings[:cache_all]
+        return if @original_path.expand_path(Bundler.root).to_s.index(Bundler.root.to_s) == 0
+        FileUtils.rm_rf(app_cache_path)
+        FileUtils.cp_r("#{@original_path}/.", app_cache_path)
+        FileUtils.touch(app_cache_path.join(".bundlecache"))
+      end
+
+      def local_specs(*)
+        @local_specs ||= load_spec_files
+      end
+
+      def specs
+        if has_app_cache?
+          @path = app_cache_path
+        end
+        local_specs
+      end
+
+      def app_cache_dirname
+        name
+      end
+
+    private
+
+      def app_cache_path
+        @app_cache_path ||= Bundler.app_cache.join(app_cache_dirname)
+      end
+
+      def has_app_cache?
+        SharedHelpers.in_bundle? && app_cache_path.exist?
+      end
+
+      def load_spec_files
+        index = Index.new
+        expanded_path = path.expand_path(Bundler.root)
+
+        if File.directory?(expanded_path)
+          Dir["#{expanded_path}/#{@glob}"].each do |file|
+            spec = Bundler.load_gemspec(file)
+            if spec
+              spec.loaded_from = file.to_s
+              spec.source = self
+              index << spec
+            end
+          end
+
+          if index.empty? && @name && @version
+            index << Gem::Specification.new do |s|
+              s.name     = @name
+              s.source   = self
+              s.version  = Gem::Version.new(@version)
+              s.platform = Gem::Platform::RUBY
+              s.summary  = "Fake gemspec for #{@name}"
+              s.relative_loaded_from = "#{@name}.gemspec"
+              s.authors  = ["no one"]
+              if expanded_path.join("bin").exist?
+                executables = expanded_path.join("bin").children
+                executables.reject!{|p| File.directory?(p) }
+                s.executables = executables.map{|c| c.basename.to_s }
+              end
+            end
+          end
+        elsif File.exists?(expanded_path)
+          raise PathError, "The path `#{expanded_path}` is not a directory."
+        else
+          raise PathError, "The path `#{expanded_path}` does not exist."
+        end
+
+        index
+      end
+
+      def relative_path
+        if path.to_s.match(%r{^#{Regexp.escape Bundler.root.to_s}})
+          return path.relative_path_from(Bundler.root)
+        end
+        path
+      end
+
+      def generate_bin(spec, disable_extensions = false)
+        gem_dir  = Pathname.new(spec.full_gem_path)
+
+        # Some gem authors put absolute paths in their gemspec
+        # and we have to save them from themselves
+        spec.files = spec.files.map do |p|
+          next if File.directory?(p)
+          begin
+            Pathname.new(p).relative_path_from(gem_dir).to_s
+          rescue ArgumentError
+            p
+          end
+        end.compact
+
+        gem_file = Bundler.rubygems.build_gem gem_dir, spec
+
+        installer = Path::Installer.new(spec, :env_shebang => false)
+        run_hooks(:pre_install, installer)
+        installer.build_extensions unless disable_extensions
+        run_hooks(:post_build, installer)
+        installer.generate_bin
+        run_hooks(:post_install, installer)
+      rescue Gem::InvalidSpecificationException => e
+        Bundler.ui.warn "\n#{spec.name} at #{spec.full_gem_path} did not have a valid gemspec.\n" \
+                        "This prevents bundler from installing bins or native extensions, but " \
+                        "that may not affect its functionality."
+
+        if !spec.extensions.empty? && !spec.email.empty?
+          Bundler.ui.warn "If you need to use this package without installing it from a gem " \
+                          "repository, please contact #{spec.email} and ask them " \
+                          "to modify their .gemspec so it can work with `gem build`."
+        end
+
+        Bundler.ui.warn "The validation message from Rubygems was:\n  #{e.message}"
+      ensure
+        if gem_dir && gem_file
+          Dir.chdir(gem_dir){ FileUtils.rm_rf(gem_file) if File.exist?(gem_file) }
+        end
+      end
+
+      def run_hooks(type, installer)
+        hooks_meth = "#{type}_hooks"
+        return unless Gem.respond_to?(hooks_meth)
+        Gem.send(hooks_meth).each do |hook|
+          result = hook.call(installer)
+          if result == false
+            location = " at #{$1}" if hook.inspect =~ /@(.*:\d+)/
+            message = "#{type} hook#{location} failed for #{installer.spec.full_name}"
+            raise InstallHookError, message
+          end
+        end
+      end
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/source/path/installer.rb b/misc/lib/bundler-1.3.5/lib/bundler/source/path/installer.rb
new file mode 100644
index 0000000..1bfdeac
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/source/path/installer.rb
@@ -0,0 +1,34 @@
+module Bundler
+  module Source
+    class Path
+
+      class Installer < Bundler::GemInstaller
+        def initialize(spec, options = {})
+          @spec              = spec
+          @bin_dir           = Bundler.requires_sudo? ? "#{Bundler.tmp}/bin" : "#{Bundler.rubygems.gem_dir}/bin"
+          @gem_dir           = Bundler.rubygems.path(spec.full_gem_path)
+          @wrappers          = options[:wrappers] || true
+          @env_shebang       = options[:env_shebang] || true
+          @format_executable = options[:format_executable] || false
+          @build_args        = options[:build_args] || Bundler.rubygems.build_args
+        end
+
+        def generate_bin
+          return if spec.executables.nil? || spec.executables.empty?
+
+          if Bundler.requires_sudo?
+            FileUtils.mkdir_p("#{Bundler.tmp}/bin") unless File.exist?("#{Bundler.tmp}/bin")
+          end
+          super
+          if Bundler.requires_sudo?
+            Bundler.mkdir_p "#{Bundler.rubygems.gem_dir}/bin"
+            spec.executables.each do |exe|
+              Bundler.sudo "cp -R #{Bundler.tmp}/bin/#{exe} #{Bundler.rubygems.gem_dir}/bin/"
+            end
+          end
+        end
+      end
+
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/source/rubygems.rb b/misc/lib/bundler-1.3.5/lib/bundler/source/rubygems.rb
new file mode 100644
index 0000000..0b5d264
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/source/rubygems.rb
@@ -0,0 +1,256 @@
+require 'uri'
+require 'rubygems/user_interaction'
+require 'rubygems/spec_fetcher'
+
+module Bundler
+  module Source
+    # TODO: Refactor this class
+    class Rubygems
+      API_REQUEST_LIMIT = 100 # threshold for switching back to the modern index instead of fetching every spec
+
+      attr_reader :remotes, :caches
+      attr_accessor :dependency_names
+
+      def initialize(options = {})
+        @options = options
+        @remotes = (options["remotes"] || []).map { |r| normalize_uri(r) }
+        @fetchers = {}
+        @dependency_names = []
+        @allow_remote = false
+        @allow_cached = false
+
+        @caches = [ Bundler.app_cache ] +
+          Bundler.rubygems.gem_path.map{|p| File.expand_path("#{p}/cache") }
+      end
+
+      def remote!
+        @allow_remote = true
+      end
+
+      def cached!
+        @allow_cached = true
+      end
+
+      def hash
+        Rubygems.hash
+      end
+
+      def eql?(o)
+        Rubygems === o
+      end
+
+      alias == eql?
+
+      def options
+        { "remotes" => @remotes.map { |r| r.to_s } }
+      end
+
+      def self.from_lock(options)
+        s = new(options)
+        Array(options["remote"]).each { |r| s.add_remote(r) }
+        s
+      end
+
+      def to_lock
+        out = "GEM\n"
+        out << remotes.map {|r| "  remote: #{r}\n" }.join
+        out << "  specs:\n"
+      end
+
+      def to_s
+        remote_names = self.remotes.map { |r| r.to_s }.join(', ')
+        "rubygems repository #{remote_names}"
+      end
+      alias_method :name, :to_s
+
+      def specs
+        @specs ||= fetch_specs
+      end
+
+      def install(spec)
+        if installed_specs[spec].any?
+          Bundler.ui.info "Using #{spec.name} (#{spec.version}) "
+          return
+        end
+
+        Bundler.ui.info "Installing #{spec.name} (#{spec.version}) "
+        path = cached_gem(spec)
+        if Bundler.requires_sudo?
+          install_path = Bundler.tmp
+          bin_path     = install_path.join("bin")
+        else
+          install_path = Bundler.rubygems.gem_dir
+          bin_path     = Bundler.system_bindir
+        end
+
+        installed_spec = nil
+        Bundler.rubygems.preserve_paths do
+          installed_spec = Bundler::GemInstaller.new(path,
+            :install_dir         => install_path.to_s,
+            :bin_dir             => bin_path.to_s,
+            :ignore_dependencies => true,
+            :wrappers            => true,
+            :env_shebang         => true
+          ).install
+        end
+
+        if spec.post_install_message
+          Installer.post_install_messages[spec.name] = spec.post_install_message
+        end
+
+        # SUDO HAX
+        if Bundler.requires_sudo?
+          Bundler.mkdir_p "#{Bundler.rubygems.gem_dir}/gems"
+          Bundler.mkdir_p "#{Bundler.rubygems.gem_dir}/specifications"
+          Bundler.sudo "cp -R #{Bundler.tmp}/gems/#{spec.full_name} #{Bundler.rubygems.gem_dir}/gems/"
+          Bundler.sudo "cp -R #{Bundler.tmp}/specifications/#{spec.full_name}.gemspec #{Bundler.rubygems.gem_dir}/specifications/"
+          spec.executables.each do |exe|
+            Bundler.mkdir_p Bundler.system_bindir
+            Bundler.sudo "cp -R #{Bundler.tmp}/bin/#{exe} #{Bundler.system_bindir}"
+          end
+        end
+        installed_spec.loaded_from = "#{Bundler.rubygems.gem_dir}/specifications/#{spec.full_name}.gemspec"
+        spec.loaded_from = "#{Bundler.rubygems.gem_dir}/specifications/#{spec.full_name}.gemspec"
+      end
+
+      def cache(spec)
+        cached_path = cached_gem(spec)
+        raise GemNotFound, "Missing gem file '#{spec.full_name}.gem'." unless cached_path
+        return if File.dirname(cached_path) == Bundler.app_cache.to_s
+        Bundler.ui.info "  * #{File.basename(cached_path)}"
+        FileUtils.cp(cached_path, Bundler.app_cache)
+      end
+
+      def add_remote(source)
+        @remotes << normalize_uri(source)
+      end
+
+      def replace_remotes(source)
+        return false if source.remotes == @remotes
+
+        @remotes = []
+        source.remotes.each do |r|
+          add_remote r.to_s
+        end
+
+        true
+      end
+
+    private
+
+      def cached_gem(spec)
+        possibilities = @caches.map { |p| "#{p}/#{spec.file_name}" }
+        cached_gem = possibilities.find { |p| File.exist?(p) }
+        unless cached_gem
+          raise Bundler::GemNotFound, "Could not find #{spec.file_name} for installation"
+        end
+        cached_gem
+      end
+
+      def normalize_uri(uri)
+        uri = uri.to_s
+        uri = "#{uri}/" unless uri =~ %r'/$'
+        uri = URI(uri)
+        raise ArgumentError, "The source must be an absolute URI" unless uri.absolute?
+        uri
+      end
+
+      def fetch_specs
+        # remote_specs usually generates a way larger Index than the other
+        # sources, and large_idx.use small_idx is way faster than
+        # small_idx.use large_idx.
+        if @allow_remote
+          idx = remote_specs.dup
+        else
+          idx = Index.new
+        end
+        idx.use(cached_specs, :override_dupes) if @allow_cached || @allow_remote
+        idx.use(installed_specs, :override_dupes)
+        idx
+      end
+
+      def installed_specs
+        @installed_specs ||= begin
+          idx = Index.new
+          have_bundler = false
+          Bundler.rubygems.all_specs.reverse.each do |spec|
+            next if spec.name == 'bundler' && spec.version.to_s != VERSION
+            have_bundler = true if spec.name == 'bundler'
+            spec.source = self
+            idx << spec
+          end
+
+          # Always have bundler locally
+          unless have_bundler
+           # We're running bundler directly from the source
+           # so, let's create a fake gemspec for it (it's a path)
+           # gemspec
+           bundler = Gem::Specification.new do |s|
+             s.name     = 'bundler'
+             s.version  = VERSION
+             s.platform = Gem::Platform::RUBY
+             s.source   = self
+             s.authors  = ["bundler team"]
+             s.loaded_from = File.expand_path("..", __FILE__)
+           end
+           idx << bundler
+          end
+          idx
+        end
+      end
+
+      def cached_specs
+        @cached_specs ||= begin
+          idx = installed_specs.dup
+
+          path = Bundler.app_cache
+          Dir["#{path}/*.gem"].each do |gemfile|
+            next if gemfile =~ /^bundler\-[\d\.]+?\.gem/
+            s ||= Bundler.rubygems.spec_from_gem(gemfile)
+            s.source = self
+            idx << s
+          end
+        end
+
+        idx
+      end
+
+      def remote_specs
+        @remote_specs ||= begin
+          old = Bundler.rubygems.sources
+          idx = Index.new
+
+          fetchers       = remotes.map { |uri| Bundler::Fetcher.new(uri) }
+          api_fetchers   = fetchers.select { |f| f.use_api }
+          index_fetchers = fetchers - api_fetchers
+
+          # gather lists from non-api sites
+          index_fetchers.each { |f| idx.use f.specs(nil, self) }
+          return idx if api_fetchers.empty?
+
+          # because ensuring we have all the gems we need involves downloading
+          # the gemspecs of those gems, if the non-api sites contain more than
+          # about 100 gems, we just treat all sites as non-api for speed.
+          if idx.size < API_REQUEST_LIMIT && dependency_names.size < API_REQUEST_LIMIT
+            api_fetchers.each { |f| idx.use f.specs(dependency_names, self) }
+
+            # it's possible that gems from one source depend on gems from some
+            # other source, so now we download gemspecs and iterate over those
+            # dependencies, looking for gems we don't have info on yet.
+            unmet = idx.unmet_dependency_names
+
+            # if there are any cross-site gems we missed, get them now
+            api_fetchers.each { |f| idx.use f.specs(unmet, self) } if unmet.any?
+          else
+            api_fetchers.each { |f| idx.use f.specs(nil, self) }
+          end
+
+          return idx
+        ensure
+          Bundler.rubygems.sources = old
+        end
+      end
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/spec_set.rb b/misc/lib/bundler-1.3.5/lib/bundler/spec_set.rb
new file mode 100644
index 0000000..2cdffdc
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/spec_set.rb
@@ -0,0 +1,139 @@
+require 'tsort'
+require 'forwardable'
+
+module Bundler
+  class SpecSet
+    extend Forwardable
+    include TSort, Enumerable
+
+    def_delegators :@specs, :<<, :length, :add, :remove
+    def_delegators :sorted, :each
+
+    def initialize(specs)
+      @specs = specs.sort_by { |s| s.name }
+    end
+
+    def for(dependencies, skip = [], check = false, match_current_platform = false)
+      handled, deps, specs = {}, dependencies.dup, []
+      skip << 'bundler'
+
+      until deps.empty?
+        dep = deps.shift
+        next if handled[dep] || skip.include?(dep.name)
+
+        spec = lookup[dep.name].find do |s|
+          if match_current_platform
+            Gem::Platform.match(s.platform)
+          else
+            s.match_platform(dep.__platform)
+          end
+        end
+
+        handled[dep] = true
+
+        if spec
+          specs << spec
+
+          spec.dependencies.each do |d|
+            next if d.type == :development
+            d = DepProxy.new(d, dep.__platform) unless match_current_platform
+            deps << d
+          end
+        elsif check
+          return false
+        end
+      end
+
+      if spec = lookup['bundler'].first
+        specs << spec
+      end
+
+      check ? true : SpecSet.new(specs)
+    end
+
+    def valid_for?(deps)
+      self.for(deps, [], true)
+    end
+
+    def [](key)
+      key = key.name if key.respond_to?(:name)
+      lookup[key].reverse
+    end
+
+    def []=(key, value)
+      @specs << value
+      @lookup = nil
+      @sorted = nil
+      value
+    end
+
+    def sort!
+      self
+    end
+
+    def to_a
+      sorted.dup
+    end
+
+    def to_hash
+      lookup.dup
+    end
+
+    def materialize(deps, missing_specs = nil)
+      materialized = self.for(deps, [], false, true).to_a
+      deps = materialized.map {|s| s.name }.uniq
+      materialized.map! do |s|
+        next s unless s.is_a?(LazySpecification)
+        s.source.dependency_names = deps if s.source.respond_to?(:dependency_names=)
+        spec = s.__materialize__
+        if missing_specs
+          missing_specs << s unless spec
+        else
+          raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
+        end
+        spec if spec
+      end
+      SpecSet.new(materialized.compact)
+    end
+
+    def merge(set)
+      arr = sorted.dup
+      set.each do |s|
+        next if arr.any? { |s2| s2.name == s.name && s2.version == s.version && s2.platform == s.platform }
+        arr << s
+      end
+      SpecSet.new(arr)
+    end
+
+  private
+
+    def sorted
+      rake = @specs.find { |s| s.name == 'rake' }
+      @sorted ||= ([rake] + tsort).compact.uniq
+    end
+
+    def lookup
+      @lookup ||= begin
+        lookup = Hash.new { |h,k| h[k] = [] }
+        specs = @specs.sort_by do |s|
+          s.platform.to_s == 'ruby' ? "\0" : s.platform.to_s
+        end
+        specs.reverse_each do |s|
+          lookup[s.name] << s
+        end
+        lookup
+      end
+    end
+
+    def tsort_each_node
+      @specs.each { |s| yield s }
+    end
+
+    def tsort_each_child(s)
+      s.dependencies.sort_by { |d| d.name }.each do |d|
+        next if d.type == :development
+        lookup[d.name].each { |s2| yield s2 }
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/.document b/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/.document
new file mode 100644
index 0000000..fb66f13
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/.document
@@ -0,0 +1 @@
+# Ignore all files in this directory
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/AddTrustExternalCARoot.pem b/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/AddTrustExternalCARoot.pem
new file mode 100644
index 0000000..580158f
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/AddTrustExternalCARoot.pem
@@ -0,0 +1,90 @@
+This CA certificate is for verifying HTTPS connection to;
+  - https://rubygems.org/ (obtained by RubyGems team)
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 1 (0x1)
+    Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=SE, O=AddTrust AB, OU=AddTrust External TTP Network, CN=AddTrust External CA Root
+        Validity
+            Not Before: May 30 10:48:38 2000 GMT
+            Not After : May 30 10:48:38 2020 GMT
+        Subject: C=SE, O=AddTrust AB, OU=AddTrust External TTP Network, CN=AddTrust External CA Root
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Public-Key: (2048 bit)
+                Modulus:
+                    00:b7:f7:1a:33:e6:f2:00:04:2d:39:e0:4e:5b:ed:
+                    1f:bc:6c:0f:cd:b5:fa:23:b6:ce:de:9b:11:33:97:
+                    a4:29:4c:7d:93:9f:bd:4a:bc:93:ed:03:1a:e3:8f:
+                    cf:e5:6d:50:5a:d6:97:29:94:5a:80:b0:49:7a:db:
+                    2e:95:fd:b8:ca:bf:37:38:2d:1e:3e:91:41:ad:70:
+                    56:c7:f0:4f:3f:e8:32:9e:74:ca:c8:90:54:e9:c6:
+                    5f:0f:78:9d:9a:40:3c:0e:ac:61:aa:5e:14:8f:9e:
+                    87:a1:6a:50:dc:d7:9a:4e:af:05:b3:a6:71:94:9c:
+                    71:b3:50:60:0a:c7:13:9d:38:07:86:02:a8:e9:a8:
+                    69:26:18:90:ab:4c:b0:4f:23:ab:3a:4f:84:d8:df:
+                    ce:9f:e1:69:6f:bb:d7:42:d7:6b:44:e4:c7:ad:ee:
+                    6d:41:5f:72:5a:71:08:37:b3:79:65:a4:59:a0:94:
+                    37:f7:00:2f:0d:c2:92:72:da:d0:38:72:db:14:a8:
+                    45:c4:5d:2a:7d:b7:b4:d6:c4:ee:ac:cd:13:44:b7:
+                    c9:2b:dd:43:00:25:fa:61:b9:69:6a:58:23:11:b7:
+                    a7:33:8f:56:75:59:f5:cd:29:d7:46:b7:0a:2b:65:
+                    b6:d3:42:6f:15:b2:b8:7b:fb:ef:e9:5d:53:d5:34:
+                    5a:27
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Subject Key Identifier: 
+                AD:BD:98:7A:34:B4:26:F7:FA:C4:26:54:EF:03:BD:E0:24:CB:54:1A
+            X509v3 Key Usage: 
+                Certificate Sign, CRL Sign
+            X509v3 Basic Constraints: critical
+                CA:TRUE
+            X509v3 Authority Key Identifier: 
+                keyid:AD:BD:98:7A:34:B4:26:F7:FA:C4:26:54:EF:03:BD:E0:24:CB:54:1A
+                DirName:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
+                serial:01
+
+    Signature Algorithm: sha1WithRSAEncryption
+         b0:9b:e0:85:25:c2:d6:23:e2:0f:96:06:92:9d:41:98:9c:d9:
+         84:79:81:d9:1e:5b:14:07:23:36:65:8f:b0:d8:77:bb:ac:41:
+         6c:47:60:83:51:b0:f9:32:3d:e7:fc:f6:26:13:c7:80:16:a5:
+         bf:5a:fc:87:cf:78:79:89:21:9a:e2:4c:07:0a:86:35:bc:f2:
+         de:51:c4:d2:96:b7:dc:7e:4e:ee:70:fd:1c:39:eb:0c:02:51:
+         14:2d:8e:bd:16:e0:c1:df:46:75:e7:24:ad:ec:f4:42:b4:85:
+         93:70:10:67:ba:9d:06:35:4a:18:d3:2b:7a:cc:51:42:a1:7a:
+         63:d1:e6:bb:a1:c5:2b:c2:36:be:13:0d:e6:bd:63:7e:79:7b:
+         a7:09:0d:40:ab:6a:dd:8f:8a:c3:f6:f6:8c:1a:42:05:51:d4:
+         45:f5:9f:a7:62:21:68:15:20:43:3c:99:e7:7c:bd:24:d8:a9:
+         91:17:73:88:3f:56:1b:31:38:18:b4:71:0f:9a:cd:c8:0e:9e:
+         8e:2e:1b:e1:8c:98:83:cb:1f:31:f1:44:4c:c6:04:73:49:76:
+         60:0f:c7:f8:bd:17:80:6b:2e:e9:cc:4c:0e:5a:9a:79:0f:20:
+         0a:2e:d5:9e:63:26:1e:55:92:94:d8:82:17:5a:7b:d0:bc:c7:
+         8f:4e:86:04
+
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/Entrust_net-Secure-Server-Certification-Authority.pem b/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/Entrust_net-Secure-Server-Certification-Authority.pem
new file mode 100644
index 0000000..b48d9cd
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/Entrust_net-Secure-Server-Certification-Authority.pem
@@ -0,0 +1,90 @@
+This CA certificate is for verifying HTTPS connection to;
+  - https://d2chzxaqi4y7f8.cloudfront.net/ (prepared by AWS)
+
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 927650371 (0x374ad243)
+    Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority
+        Validity
+            Not Before: May 25 16:09:40 1999 GMT
+            Not After : May 25 16:39:40 2019 GMT
+        Subject: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Public-Key: (1024 bit)
+                Modulus:
+                    00:cd:28:83:34:54:1b:89:f3:0f:af:37:91:31:ff:
+                    af:31:60:c9:a8:e8:b2:10:68:ed:9f:e7:93:36:f1:
+                    0a:64:bb:47:f5:04:17:3f:23:47:4d:c5:27:19:81:
+                    26:0c:54:72:0d:88:2d:d9:1f:9a:12:9f:bc:b3:71:
+                    d3:80:19:3f:47:66:7b:8c:35:28:d2:b9:0a:df:24:
+                    da:9c:d6:50:79:81:7a:5a:d3:37:f7:c2:4a:d8:29:
+                    92:26:64:d1:e4:98:6c:3a:00:8a:f5:34:9b:65:f8:
+                    ed:e3:10:ff:fd:b8:49:58:dc:a0:de:82:39:6b:81:
+                    b1:16:19:61:b9:54:b6:e6:43
+                Exponent: 3 (0x3)
+        X509v3 extensions:
+            Netscape Cert Type: 
+                SSL CA, S/MIME CA, Object Signing CA
+            X509v3 CRL Distribution Points: 
+
+                Full Name:
+                  DirName: C = US, O = Entrust.net, OU = www.entrust.net/CPS incorp. by ref. (limits liab.), OU = (c) 1999 Entrust.net Limited, CN = Entrust.net Secure Server Certification Authority, CN = CRL1
+
+                Full Name:
+                  URI:http://www.entrust.net/CRL/net1.crl
+
+            X509v3 Private Key Usage Period: 
+                Not Before: May 25 16:09:40 1999 GMT, Not After: May 25 16:09:40 2019 GMT
+            X509v3 Key Usage: 
+                Certificate Sign, CRL Sign
+            X509v3 Authority Key Identifier: 
+                keyid:F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A
+
+            X509v3 Subject Key Identifier: 
+                F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A
+            X509v3 Basic Constraints: 
+                CA:TRUE
+            1.2.840.113533.7.65.0: 
+                0
+..V4.0....
+    Signature Algorithm: sha1WithRSAEncryption
+         90:dc:30:02:fa:64:74:c2:a7:0a:a5:7c:21:8d:34:17:a8:fb:
+         47:0e:ff:25:7c:8d:13:0a:fb:e4:98:b5:ef:8c:f8:c5:10:0d:
+         f7:92:be:f1:c3:d5:d5:95:6a:04:bb:2c:ce:26:36:65:c8:31:
+         c6:e7:ee:3f:e3:57:75:84:7a:11:ef:46:4f:18:f4:d3:98:bb:
+         a8:87:32:ba:72:f6:3c:e2:3d:9f:d7:1d:d9:c3:60:43:8c:58:
+         0e:22:96:2f:62:a3:2c:1f:ba:ad:05:ef:ab:32:78:87:a0:54:
+         73:19:b5:5c:05:f9:52:3e:6d:2d:45:0b:f7:0a:93:ea:ed:06:
+         f9:b2
+
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
+ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
+KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
+ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
+MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
+ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
+b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
+U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
+I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
+wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
+AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
+oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
+BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
+dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
+MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
+b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
+MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
+E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
+MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
+hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
+95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
+2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/GeoTrust_Global_CA.pem b/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/GeoTrust_Global_CA.pem
new file mode 100644
index 0000000..5d795bb
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/GeoTrust_Global_CA.pem
@@ -0,0 +1,20 @@
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
+R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
+9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
+fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
+iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
+1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
+MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
+ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
+uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
+Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
+tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
+PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
+hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
+5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/VerisignClass3PublicPrimaryCertificationAuthority-G2.pem b/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/VerisignClass3PublicPrimaryCertificationAuthority-G2.pem
new file mode 100644
index 0000000..43bad3e
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/ssl_certs/VerisignClass3PublicPrimaryCertificationAuthority-G2.pem
@@ -0,0 +1,57 @@
+This CA certificate is for verifying HTTPS connection to;
+  - https://s3.amazon.com/ (prepared by AWS)
+
+Certificate:
+    Data:
+        Version: 1 (0x0)
+        Serial Number:
+            7d:d9:fe:07:cf:a8:1e:b7:10:79:67:fb:a7:89:34:c6
+    Signature Algorithm: sha1WithRSAEncryption
+        Issuer: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority - G2, OU=(c) 1998 VeriSign, Inc. - For authorized use only, OU=VeriSign Trust Network
+        Validity
+            Not Before: May 18 00:00:00 1998 GMT
+            Not After : Aug  1 23:59:59 2028 GMT
+        Subject: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority - G2, OU=(c) 1998 VeriSign, Inc. - For authorized use only, OU=VeriSign Trust Network
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Public-Key: (1024 bit)
+                Modulus:
+                    00:cc:5e:d1:11:5d:5c:69:d0:ab:d3:b9:6a:4c:99:
+                    1f:59:98:30:8e:16:85:20:46:6d:47:3f:d4:85:20:
+                    84:e1:6d:b3:f8:a4:ed:0c:f1:17:0f:3b:f9:a7:f9:
+                    25:d7:c1:cf:84:63:f2:7c:63:cf:a2:47:f2:c6:5b:
+                    33:8e:64:40:04:68:c1:80:b9:64:1c:45:77:c7:d8:
+                    6e:f5:95:29:3c:50:e8:34:d7:78:1f:a8:ba:6d:43:
+                    91:95:8f:45:57:5e:7e:c5:fb:ca:a4:04:eb:ea:97:
+                    37:54:30:6f:bb:01:47:32:33:cd:dc:57:9b:64:69:
+                    61:f8:9b:1d:1c:89:4f:5c:67
+                Exponent: 65537 (0x10001)
+    Signature Algorithm: sha1WithRSAEncryption
+         51:4d:cd:be:5c:cb:98:19:9c:15:b2:01:39:78:2e:4d:0f:67:
+         70:70:99:c6:10:5a:94:a4:53:4d:54:6d:2b:af:0d:5d:40:8b:
+         64:d3:d7:ee:de:56:61:92:5f:a6:c4:1d:10:61:36:d3:2c:27:
+         3c:e8:29:09:b9:11:64:74:cc:b5:73:9f:1c:48:a9:bc:61:01:
+         ee:e2:17:a6:0c:e3:40:08:3b:0e:e7:eb:44:73:2a:9a:f1:69:
+         92:ef:71:14:c3:39:ac:71:a7:91:09:6f:e4:71:06:b3:ba:59:
+         57:26:79:00:f6:f8:0d:a2:33:30:28:d4:aa:58:a0:9d:9d:69:
+         91:fd
+
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
+c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
+MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
+emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
+DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
+FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
+UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
+YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
+MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
+AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
+pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
+13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
+AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
+U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
+F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
+oJ2daZH9
+-----END CERTIFICATE-----
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/Executable b/misc/lib/bundler-1.3.5/lib/bundler/templates/Executable
new file mode 100755
index 0000000..5c60c28
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/Executable
@@ -0,0 +1,16 @@
+#!/usr/bin/env <%= Bundler.settings[:shebang] || RbConfig::CONFIG['ruby_install_name'] %>
+#
+# This file was generated by Bundler.
+#
+# The application '<%= executable %>' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'pathname'
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../<%= relative_gemfile_path %>",
+  Pathname.new(__FILE__).realpath)
+
+require 'rubygems'
+require 'bundler/setup'
+
+load Gem.bin_path('<%= spec.name %>', '<%= executable %>')
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/Executable.standalone b/misc/lib/bundler-1.3.5/lib/bundler/templates/Executable.standalone
new file mode 100644
index 0000000..c4f2703
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/Executable.standalone
@@ -0,0 +1,12 @@
+#!/usr/bin/env <%= Bundler.settings[:shebang] || RbConfig::CONFIG['ruby_install_name'] %>
+#
+# This file was generated by Bundler.
+#
+# The application '<%= executable %>' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+$:.unshift File.expand_path '../<%= standalone_path %>', __FILE__
+
+require 'bundler/setup'
+load File.expand_path '../<%= executable_path %>', __FILE__
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/Gemfile b/misc/lib/bundler-1.3.5/lib/bundler/templates/Gemfile
new file mode 100644
index 0000000..8d5b66e
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/Gemfile
@@ -0,0 +1,4 @@
+# A sample Gemfile
+source "https://rubygems.org"
+
+# gem "rails"
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/.travis.yml.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/.travis.yml.tt
new file mode 100644
index 0000000..4c7eba6
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/.travis.yml.tt
@@ -0,0 +1,3 @@
+language: ruby
+rvm:
+  - <%= RUBY_VERSION %>
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/Gemfile.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/Gemfile.tt
new file mode 100644
index 0000000..d24b852
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/Gemfile.tt
@@ -0,0 +1,4 @@
+source 'https://rubygems.org'
+
+# Specify your gem's dependencies in <%=config[:name]%>.gemspec
+gemspec
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/LICENSE.txt.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/LICENSE.txt.tt
new file mode 100644
index 0000000..a9f52e6
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/LICENSE.txt.tt
@@ -0,0 +1,22 @@
+Copyright (c) <%=Time.now.year%> <%=config[:author]%>
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/README.md.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/README.md.tt
new file mode 100644
index 0000000..98692c5
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/README.md.tt
@@ -0,0 +1,29 @@
+# <%=config[:constant_name]%>
+
+TODO: Write a gem description
+
+## Installation
+
+Add this line to your application's Gemfile:
+
+    gem '<%=config[:name]%>'
+
+And then execute:
+
+    $ bundle
+
+Or install it yourself as:
+
+    $ gem install <%=config[:name]%>
+
+## Usage
+
+TODO: Write usage instructions here
+
+## Contributing
+
+1. Fork it
+2. Create your feature branch (`git checkout -b my-new-feature`)
+3. Commit your changes (`git commit -am 'Add some feature'`)
+4. Push to the branch (`git push origin my-new-feature`)
+5. Create new Pull Request
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/Rakefile.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/Rakefile.tt
new file mode 100644
index 0000000..2ecf186
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/Rakefile.tt
@@ -0,0 +1,16 @@
+require "bundler/gem_tasks"
+<% if config[:test] == 'minitest' -%>
+require "rake/testtask"
+
+Rake::TestTask.new(:test) do |t|
+  t.libs << "test"
+end
+
+task :default => :test
+<% elsif config[:test] == 'rspec' -%>
+require "rspec/core/rake_task"
+
+RSpec::Core::RakeTask.new(:spec)
+
+task :default => :spec
+<% end -%>
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/bin/newgem.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/bin/newgem.tt
new file mode 100644
index 0000000..a005298
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/bin/newgem.tt
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+
+require '<%= config[:namespaced_path] %>'
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/gitignore.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/gitignore.tt
new file mode 100644
index 0000000..d87d4be
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/gitignore.tt
@@ -0,0 +1,17 @@
+*.gem
+*.rbc
+.bundle
+.config
+.yardoc
+Gemfile.lock
+InstalledFiles
+_yardoc
+coverage
+doc/
+lib/bundler/man
+pkg
+rdoc
+spec/reports
+test/tmp
+test/version_tmp
+tmp
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/lib/newgem.rb.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/lib/newgem.rb.tt
new file mode 100644
index 0000000..35920cf
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/lib/newgem.rb.tt
@@ -0,0 +1,9 @@
+require "<%=config[:namespaced_path]%>/version"
+
+<%- config[:constant_array].each_with_index do |c,i| -%>
+<%= '  '*i %>module <%= c %>
+<%- end -%>
+<%= '  '*config[:constant_array].size %># Your code goes here...
+<%- (config[:constant_array].size-1).downto(0) do |i| -%>
+<%= '  '*i %>end
+<%- end -%>
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/lib/newgem/version.rb.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/lib/newgem/version.rb.tt
new file mode 100644
index 0000000..fe9b5fc
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/lib/newgem/version.rb.tt
@@ -0,0 +1,7 @@
+<%- config[:constant_array].each_with_index do |c,i| -%>
+<%= '  '*i %>module <%= c %>
+<%- end -%>
+<%= '  '*config[:constant_array].size %>VERSION = "0.0.1"
+<%- (config[:constant_array].size-1).downto(0) do |i| -%>
+<%= '  '*i %>end
+<%- end -%>
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/newgem.gemspec.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/newgem.gemspec.tt
new file mode 100644
index 0000000..28997f0
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/newgem.gemspec.tt
@@ -0,0 +1,26 @@
+# coding: utf-8
+lib = File.expand_path('../lib', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+require '<%=config[:namespaced_path]%>/version'
+
+Gem::Specification.new do |spec|
+  spec.name          = <%=config[:name].inspect%>
+  spec.version       = <%=config[:constant_name]%>::VERSION
+  spec.authors       = [<%=config[:author].inspect%>]
+  spec.email         = [<%=config[:email].inspect%>]
+  spec.description   = %q{TODO: Write a gem description}
+  spec.summary       = %q{TODO: Write a gem summary}
+  spec.homepage      = ""
+  spec.license       = "MIT"
+
+  spec.files         = `git ls-files`.split($/)
+  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
+  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
+  spec.require_paths = ["lib"]
+
+  spec.add_development_dependency "bundler", "~> <%= Bundler::VERSION.split(".")[0..1].join(".") %>"
+  spec.add_development_dependency "rake"
+<% if config[:test] -%>
+  spec.add_development_dependency "<%=config[:test]%>"
+<% end -%>
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/rspec.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/rspec.tt
new file mode 100644
index 0000000..8c18f1a
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/rspec.tt
@@ -0,0 +1,2 @@
+--format documentation
+--color
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt
new file mode 100644
index 0000000..ad324da
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt
@@ -0,0 +1,11 @@
+require 'spec_helper'
+
+describe <%= config[:constant_name] %> do
+  it 'should have a version number' do
+    <%= config[:constant_name] %>::VERSION.should_not be_nil
+  end
+
+  it 'should do something useful' do
+    false.should be_true
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/spec/spec_helper.rb.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/spec/spec_helper.rb.tt
new file mode 100644
index 0000000..212c747
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/spec/spec_helper.rb.tt
@@ -0,0 +1,2 @@
+$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
+require '<%= config[:namespaced_path] %>'
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/test/minitest_helper.rb.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/test/minitest_helper.rb.tt
new file mode 100644
index 0000000..49a56c1
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/test/minitest_helper.rb.tt
@@ -0,0 +1,4 @@
+$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
+require '<%= config[:namespaced_path] %>'
+
+require 'minitest/autorun'
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/test/test_newgem.rb.tt b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/test/test_newgem.rb.tt
new file mode 100644
index 0000000..34cc473
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/templates/newgem/test/test_newgem.rb.tt
@@ -0,0 +1,11 @@
+require 'minitest_helper'
+
+class Test<%= config[:constant_name] %> < MiniTest::Unit::TestCase
+  def test_that_it_has_a_version_number
+    refute_nil ::<%= config[:constant_name] %>::VERSION
+  end
+
+  def test_it_does_something_useful
+    assert false
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/ui.rb b/misc/lib/bundler-1.3.5/lib/bundler/ui.rb
new file mode 100644
index 0000000..01b6c6e
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/ui.rb
@@ -0,0 +1,140 @@
+require 'rubygems/user_interaction'
+
+module Bundler
+  class UI
+    def warn(message, newline = nil)
+    end
+
+    def debug(message, newline = nil)
+    end
+
+    def trace(message, newline = nil)
+    end
+
+    def error(message, newline = nil)
+    end
+
+    def info(message, newline = nil)
+    end
+
+    def confirm(message, newline = nil)
+    end
+
+    def debug?
+      false
+    end
+
+    def ask(message)
+    end
+
+    class Shell < UI
+      LEVELS = %w(silent error warn confirm info debug)
+
+      attr_writer :shell
+
+      def initialize(options = {})
+        if options["no-color"] || !STDOUT.tty?
+          Thor::Base.shell = Thor::Shell::Basic
+        end
+        @shell = Thor::Base.shell.new
+        @level = ENV['DEBUG'] ? "debug" : "info"
+      end
+
+      def info(msg, newline = nil)
+        tell_me(msg, nil, newline) if level("info")
+      end
+
+      def confirm(msg, newline = nil)
+        tell_me(msg, :green, newline) if level("confirm")
+      end
+
+      def warn(msg, newline = nil)
+        tell_me(msg, :yellow, newline) if level("warn")
+      end
+
+      def error(msg, newline = nil)
+        tell_me(msg, :red, newline) if level("error")
+      end
+
+      def debug(msg, newline = nil)
+        tell_me(msg, nil, newline) if level("debug")
+      end
+
+      def debug?
+        # needs to be false instead of nil to be newline param to other methods
+        level("debug")
+      end
+
+      def quiet?
+        LEVELS.index(@level) <= LEVELS.index("warn")
+      end
+
+      def ask(msg)
+        @shell.ask(msg)
+      end
+
+      def level=(level)
+        raise ArgumentError unless LEVELS.include?(level.to_s)
+        @level = level
+      end
+
+      def level(name = nil)
+        name ? LEVELS.index(name) <= LEVELS.index(@level) : @level
+      end
+
+      def trace(e, newline = nil)
+        msg = ["#{e.class}: #{e.message}", *e.backtrace].join("\n")
+        if debug?
+          tell_me(msg, nil, newline)
+        elsif @trace
+          STDERR.puts "#{msg}#{newline}"
+        end
+      end
+
+      def silence
+        old_level, @level = @level, "silent"
+        yield
+      ensure
+        @level = old_level
+      end
+
+    private
+
+      # valimism
+      def tell_me(msg, color = nil, newline = nil)
+        msg = word_wrap(msg) if newline.is_a?(Hash) && newline[:wrap]
+        if newline.nil?
+          @shell.say(msg, color)
+        else
+          @shell.say(msg, color, newline)
+        end
+      end
+
+      def strip_leading_spaces(text)
+        spaces = text[/\A\s+/, 0]
+        spaces ? text.gsub(/#{spaces}/, '') : text
+      end
+
+      def word_wrap(text, line_width = @shell.terminal_width)
+        strip_leading_spaces(text).split("\n").collect do |line|
+          line.length > line_width ? line.gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip : line
+        end * "\n"
+      end
+    end
+
+    class RGProxy < ::Gem::SilentUI
+      def initialize(ui)
+        @ui = ui
+        super()
+      end
+
+      def say(message)
+        if message =~ /native extensions/
+          @ui.info "with native extensions "
+        else
+          @ui.debug(message)
+        end
+      end
+    end
+  end
+end
diff --git a/vendor/json_pure-1.7.7/lib/json/ext/.keep b/misc/lib/bundler-1.3.5/lib/bundler/vendor/.document
similarity index 100%
rename from vendor/json_pure-1.7.7/lib/json/ext/.keep
rename to misc/lib/bundler-1.3.5/lib/bundler/vendor/.document
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/net/http/faster.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/net/http/faster.rb
new file mode 100644
index 0000000..e5e0908
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/net/http/faster.rb
@@ -0,0 +1,27 @@
+require 'net/protocol'
+
+##
+# Aaron Patterson's monkeypatch (accepted into 1.9.1) to fix Net::HTTP's speed
+# problems.
+#
+# http://gist.github.com/251244
+
+class Net::BufferedIO #:nodoc:
+  alias :old_rbuf_fill :rbuf_fill
+
+  def rbuf_fill
+    if @io.respond_to? :read_nonblock then
+      begin
+        @rbuf << @io.read_nonblock(65536)
+      rescue Errno::EWOULDBLOCK, Errno::EAGAIN => e
+        retry if IO.select [@io], nil, nil, @read_timeout
+        raise Timeout::Error, e.message
+      end
+    else # SSL sockets do not have read_nonblock
+      timeout @read_timeout do
+        @rbuf << @io.sysread(65536)
+      end
+    end
+  end
+end if RUBY_VERSION < '1.9'
+
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/net/http/persistent.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/net/http/persistent.rb
new file mode 100644
index 0000000..dcdc5b5
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/net/http/persistent.rb
@@ -0,0 +1,1120 @@
+require 'net/http'
+require 'net/https'
+require 'net/http/faster'
+require 'uri'
+require 'cgi' # for escaping
+
+begin
+  require 'net/http/pipeline'
+rescue LoadError
+end
+
+##
+# Persistent connections for Net::HTTP
+#
+# Net::HTTP::Persistent maintains persistent connections across all the
+# servers you wish to talk to.  For each host:port you communicate with a
+# single persistent connection is created.
+#
+# Multiple Net::HTTP::Persistent objects will share the same set of
+# connections.
+#
+# For each thread you start a new connection will be created.  A
+# Net::HTTP::Persistent connection will not be shared across threads.
+#
+# You can shut down the HTTP connections when done by calling #shutdown.  You
+# should name your Net::HTTP::Persistent object if you intend to call this
+# method.
+#
+# Example:
+#
+#   require 'net/http/persistent'
+#
+#   uri = URI 'http://example.com/awesome/web/service'
+#
+#   http = Net::HTTP::Persistent.new 'my_app_name'
+#
+#   # perform a GET
+#   response = http.request uri
+#
+#   # create a POST
+#   post_uri = uri + 'create'
+#   post = Net::HTTP::Post.new post_uri.path
+#   post.set_form_data 'some' => 'cool data'
+#
+#   # perform the POST, the URI is always required
+#   response http.request post_uri, post
+#
+# == SSL
+#
+# SSL connections are automatically created depending upon the scheme of the
+# URI.  SSL connections are automatically verified against the default
+# certificate store for your computer.  You can override this by changing
+# verify_mode or by specifying an alternate cert_store.
+#
+# Here are the SSL settings, see the individual methods for documentation:
+#
+# #certificate        :: This client's certificate
+# #ca_file            :: The certificate-authority
+# #cert_store         :: An SSL certificate store
+# #private_key        :: The client's SSL private key
+# #reuse_ssl_sessions :: Reuse a previously opened SSL session for a new
+#                        connection
+# #ssl_version        :: Which specific SSL version to use
+# #verify_callback    :: For server certificate verification
+# #verify_mode        :: How connections should be verified
+#
+# == Proxies
+#
+# A proxy can be set through #proxy= or at initialization time by providing a
+# second argument to ::new.  The proxy may be the URI of the proxy server or
+# <code>:ENV</code> which will consult environment variables.
+#
+# See #proxy= and #proxy_from_env for details.
+#
+# == Headers
+#
+# Headers may be specified for use in every request.  #headers are appended to
+# any headers on the request.  #override_headers replace existing headers on
+# the request.
+#
+# The difference between the two can be seen in setting the User-Agent.  Using
+# <code>http.headers['User-Agent'] = 'MyUserAgent'</code> will send "Ruby,
+# MyUserAgent" while <code>http.override_headers['User-Agent'] =
+# 'MyUserAgent'</code> will send "MyUserAgent".
+#
+# == Tuning
+#
+# === Segregation
+#
+# By providing an application name to ::new you can separate your connections
+# from the connections of other applications.
+#
+# === Idle Timeout
+#
+# If a connection hasn't been used for this number of seconds it will automatically be
+# reset upon the next use to avoid attempting to send to a closed connection.
+# The default value is 5 seconds. nil means no timeout. Set through #idle_timeout.
+#
+# Reducing this value may help avoid the "too many connection resets" error
+# when sending non-idempotent requests while increasing this value will cause
+# fewer round-trips.
+#
+# === Read Timeout
+#
+# The amount of time allowed between reading two chunks from the socket.  Set
+# through #read_timeout
+#
+# === Open Timeout
+#
+# The amount of time to wait for a connection to be opened.  Set through
+# #open_timeout.
+#
+# === Socket Options
+#
+# Socket options may be set on newly-created connections.  See #socket_options
+# for details.
+#
+# === Non-Idempotent Requests
+#
+# By default non-idempotent requests will not be retried per RFC 2616.  By
+# setting retry_change_requests to true requests will automatically be retried
+# once.
+#
+# Only do this when you know that retrying a POST or other non-idempotent
+# request is safe for your application and will not create duplicate
+# resources.
+#
+# The recommended way to handle non-idempotent requests is the following:
+#
+#   require 'net/http/persistent'
+#
+#   uri = URI 'http://example.com/awesome/web/service'
+#   post_uri = uri + 'create'
+#
+#   http = Net::HTTP::Persistent.new 'my_app_name'
+#
+#   post = Net::HTTP::Post.new post_uri.path
+#   # ... fill in POST request
+#
+#   begin
+#     response = http.request post_uri, post
+#   rescue Net::HTTP::Persistent::Error
+#
+#     # POST failed, make a new request to verify the server did not process
+#     # the request
+#     exists_uri = uri + '...'
+#     response = http.get exists_uri
+#
+#     # Retry if it failed
+#     retry if response.code == '404'
+#   end
+#
+# The method of determining if the resource was created or not is unique to
+# the particular service you are using.  Of course, you will want to add
+# protection from infinite looping.
+#
+# === Connection Termination
+#
+# If you are done using the Net::HTTP::Persistent instance you may shut down
+# all the connections in the current thread with #shutdown.  This is not
+# recommended for normal use, it should only be used when it will be several
+# minutes before you make another HTTP request.
+#
+# If you are using multiple threads, call #shutdown in each thread when the
+# thread is done making requests.  If you don't call shutdown, that's OK.
+# Ruby will automatically garbage collect and shutdown your HTTP connections
+# when the thread terminates.
+
+class Net::HTTP::Persistent
+
+  ##
+  # The beginning of Time
+
+  EPOCH = Time.at 0 # :nodoc:
+
+  ##
+  # The version of Net::HTTP::Persistent you are using
+
+  VERSION = '2.8'
+
+  ##
+  # Error class for errors raised by Net::HTTP::Persistent.  Various
+  # SystemCallErrors are re-raised with a human-readable message under this
+  # class.
+
+  class Error < StandardError; end
+
+  ##
+  # Use this method to detect the idle timeout of the host at +uri+.  The
+  # value returned can be used to configure #idle_timeout.  +max+ controls the
+  # maximum idle timeout to detect.
+  #
+  # After
+  #
+  # Idle timeout detection is performed by creating a connection then
+  # performing a HEAD request in a loop until the connection terminates
+  # waiting one additional second per loop.
+  #
+  # NOTE:  This may not work on ruby > 1.9.
+
+  def self.detect_idle_timeout uri, max = 10
+    uri = URI uri unless URI::Generic === uri
+    uri += '/'
+
+    req = Net::HTTP::Head.new uri.request_uri
+
+    http = new 'net-http-persistent detect_idle_timeout'
+
+    connection = http.connection_for uri
+
+    sleep_time = 0
+
+    loop do
+      response = connection.request req
+
+      $stderr.puts "HEAD #{uri} => #{response.code}" if $DEBUG
+
+      unless Net::HTTPOK === response then
+        raise Error, "bad response code #{response.code} detecting idle timeout"
+      end
+
+      break if sleep_time >= max
+
+      sleep_time += 1
+
+      $stderr.puts "sleeping #{sleep_time}" if $DEBUG
+      sleep sleep_time
+    end
+  ensure
+    http.shutdown
+
+    return sleep_time unless $!
+  end
+
+  ##
+  # This client's OpenSSL::X509::Certificate
+
+  attr_reader :certificate
+
+  # For Net::HTTP parity
+  alias cert certificate
+
+  ##
+  # An SSL certificate authority.  Setting this will set verify_mode to
+  # VERIFY_PEER.
+
+  attr_reader :ca_file
+
+  ##
+  # An SSL certificate store.  Setting this will override the default
+  # certificate store.  See verify_mode for more information.
+
+  attr_reader :cert_store
+
+  ##
+  # Sends debug_output to this IO via Net::HTTP#set_debug_output.
+  #
+  # Never use this method in production code, it causes a serious security
+  # hole.
+
+  attr_accessor :debug_output
+
+  ##
+  # Current connection generation
+
+  attr_reader :generation # :nodoc:
+
+  ##
+  # Where this instance's connections live in the thread local variables
+
+  attr_reader :generation_key # :nodoc:
+
+  ##
+  # Headers that are added to every request using Net::HTTP#add_field
+
+  attr_reader :headers
+
+  ##
+  # Maps host:port to an HTTP version.  This allows us to enable version
+  # specific features.
+
+  attr_reader :http_versions
+
+  ##
+  # Maximum time an unused connection can remain idle before being
+  # automatically closed.
+
+  attr_accessor :idle_timeout
+
+  ##
+  # The value sent in the Keep-Alive header.  Defaults to 30.  Not needed for
+  # HTTP/1.1 servers.
+  #
+  # This may not work correctly for HTTP/1.0 servers
+  #
+  # This method may be removed in a future version as RFC 2616 does not
+  # require this header.
+
+  attr_accessor :keep_alive
+
+  ##
+  # A name for this connection.  Allows you to keep your connections apart
+  # from everybody else's.
+
+  attr_reader :name
+
+  ##
+  # Seconds to wait until a connection is opened.  See Net::HTTP#open_timeout
+
+  attr_accessor :open_timeout
+
+  ##
+  # Headers that are added to every request using Net::HTTP#[]=
+
+  attr_reader :override_headers
+
+  ##
+  # This client's SSL private key
+
+  attr_reader :private_key
+
+  # For Net::HTTP parity
+  alias key private_key
+
+  ##
+  # The URL through which requests will be proxied
+
+  attr_reader :proxy_uri
+
+  ##
+  # List of host suffixes which will not be proxied
+
+  attr_reader :no_proxy
+
+  ##
+  # Seconds to wait until reading one block.  See Net::HTTP#read_timeout
+
+  attr_accessor :read_timeout
+
+  ##
+  # Where this instance's request counts live in the thread local variables
+
+  attr_reader :request_key # :nodoc:
+
+  ##
+  # By default SSL sessions are reused to avoid extra SSL handshakes.  Set
+  # this to false if you have problems communicating with an HTTPS server
+  # like:
+  #
+  #   SSL_connect [...] read finished A: unexpected message (OpenSSL::SSL::SSLError)
+
+  attr_accessor :reuse_ssl_sessions
+
+  ##
+  # An array of options for Socket#setsockopt.
+  #
+  # By default the TCP_NODELAY option is set on sockets.
+  #
+  # To set additional options append them to this array:
+  #
+  #   http.socket_options << [Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1]
+
+  attr_reader :socket_options
+
+  ##
+  # Current SSL connection generation
+
+  attr_reader :ssl_generation # :nodoc:
+
+  ##
+  # Where this instance's SSL connections live in the thread local variables
+
+  attr_reader :ssl_generation_key # :nodoc:
+
+  ##
+  # SSL version to use.
+  #
+  # By default, the version will be negotiated automatically between client
+  # and server.  Ruby 1.9 and newer only.
+
+  attr_reader :ssl_version if RUBY_VERSION > '1.9'
+
+  ##
+  # Where this instance's last-use times live in the thread local variables
+
+  attr_reader :timeout_key # :nodoc:
+
+  ##
+  # SSL verification callback.  Used when ca_file is set.
+
+  attr_reader :verify_callback
+
+  ##
+  # HTTPS verify mode.  Defaults to OpenSSL::SSL::VERIFY_PEER which verifies
+  # the server certificate.
+  #
+  # If no ca_file or cert_store is set the default system certificate store is
+  # used.
+  #
+  # You can use +verify_mode+ to override any default values.
+
+  attr_reader :verify_mode
+
+  ##
+  # Enable retries of non-idempotent requests that change data (e.g. POST
+  # requests) when the server has disconnected.
+  #
+  # This will in the worst case lead to multiple requests with the same data,
+  # but it may be useful for some applications.  Take care when enabling
+  # this option to ensure it is safe to POST or perform other non-idempotent
+  # requests to the server.
+
+  attr_accessor :retry_change_requests
+
+  ##
+  # Creates a new Net::HTTP::Persistent.
+  #
+  # Set +name+ to keep your connections apart from everybody else's.  Not
+  # required currently, but highly recommended.  Your library name should be
+  # good enough.  This parameter will be required in a future version.
+  #
+  # +proxy+ may be set to a URI::HTTP or :ENV to pick up proxy options from
+  # the environment.  See proxy_from_env for details.
+  #
+  # In order to use a URI for the proxy you may need to do some extra work
+  # beyond URI parsing if the proxy requires a password:
+  #
+  #   proxy = URI 'http://proxy.example'
+  #   proxy.user     = 'AzureDiamond'
+  #   proxy.password = 'hunter2'
+
+  def initialize name = nil, proxy = nil
+    @name = name
+
+    @debug_output     = nil
+    @proxy_uri        = nil
+    @no_proxy         = []
+    @headers          = {}
+    @override_headers = {}
+    @http_versions    = {}
+    @keep_alive       = 30
+    @open_timeout     = nil
+    @read_timeout     = nil
+    @idle_timeout     = 5
+    @socket_options   = []
+
+    @socket_options << [Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1] if
+      Socket.const_defined? :TCP_NODELAY
+
+    key = ['net_http_persistent', name].compact
+    @generation_key     = [key, 'generations'    ].join('_').intern
+    @ssl_generation_key = [key, 'ssl_generations'].join('_').intern
+    @request_key        = [key, 'requests'       ].join('_').intern
+    @timeout_key        = [key, 'timeouts'       ].join('_').intern
+
+    @certificate        = nil
+    @ca_file            = nil
+    @private_key        = nil
+    @ssl_version        = nil
+    @verify_callback    = nil
+    @verify_mode        = OpenSSL::SSL::VERIFY_PEER
+    @cert_store         = nil
+
+    @generation         = 0 # incremented when proxy URI changes
+    @ssl_generation     = 0 # incremented when SSL session variables change
+    @reuse_ssl_sessions = OpenSSL::SSL.const_defined? :Session
+
+    @retry_change_requests = false
+
+    self.proxy = proxy if proxy
+  end
+
+  ##
+  # Sets this client's OpenSSL::X509::Certificate
+
+  def certificate= certificate
+    @certificate = certificate
+
+    reconnect_ssl
+  end
+
+  # For Net::HTTP parity
+  alias cert= certificate=
+
+  ##
+  # Sets the SSL certificate authority file.
+
+  def ca_file= file
+    @ca_file = file
+
+    reconnect_ssl
+  end
+
+  ##
+  # Overrides the default SSL certificate store used for verifying
+  # connections.
+
+  def cert_store= store
+    @cert_store = store
+
+    reconnect_ssl
+  end
+
+  ##
+  # Finishes all connections on the given +thread+ that were created before
+  # the given +generation+ in the threads +generation_key+ list.
+  #
+  # See #shutdown for a bunch of scary warning about misusing this method.
+
+  def cleanup(generation, thread = Thread.current,
+              generation_key = @generation_key) # :nodoc:
+    timeouts = thread[@timeout_key]
+
+    (0...generation).each do |old_generation|
+      next unless thread[generation_key]
+
+      conns = thread[generation_key].delete old_generation
+
+      conns.each_value do |conn|
+        finish conn, thread
+
+        timeouts.delete conn.object_id if timeouts
+      end if conns
+    end
+  end
+
+  ##
+  # Creates a new connection for +uri+
+
+  def connection_for uri
+    Thread.current[@generation_key]     ||= Hash.new { |h,k| h[k] = {} }
+    Thread.current[@ssl_generation_key] ||= Hash.new { |h,k| h[k] = {} }
+    Thread.current[@request_key]        ||= Hash.new 0
+    Thread.current[@timeout_key]        ||= Hash.new EPOCH
+
+    use_ssl = uri.scheme.downcase == 'https'
+
+    if use_ssl then
+      ssl_generation = @ssl_generation
+
+      ssl_cleanup ssl_generation
+
+      connections = Thread.current[@ssl_generation_key][ssl_generation]
+    else
+      generation = @generation
+
+      cleanup generation
+
+      connections = Thread.current[@generation_key][generation]
+    end
+
+    net_http_args = [uri.host, uri.port]
+    connection_id = net_http_args.join ':'
+
+    if @proxy_uri and not proxy_bypass? uri.host, uri.port then
+      connection_id << @proxy_connection_id
+      net_http_args.concat @proxy_args
+    end
+
+    connection = connections[connection_id]
+
+    unless connection = connections[connection_id] then
+      connections[connection_id] = http_class.new(*net_http_args)
+      connection = connections[connection_id]
+      ssl connection if use_ssl
+    else
+      reset connection if expired? connection
+    end
+
+    start connection unless connection.started?
+
+    connection.read_timeout = @read_timeout if @read_timeout
+
+    connection
+  rescue Errno::ECONNREFUSED
+    address = connection.proxy_address || connection.address
+    port    = connection.proxy_port    || connection.port
+
+    raise Error, "connection refused: #{address}:#{port}"
+  rescue Errno::EHOSTDOWN
+    address = connection.proxy_address || connection.address
+    port    = connection.proxy_port    || connection.port
+
+    raise Error, "host down: #{address}:#{port}"
+  end
+
+  ##
+  # Returns an error message containing the number of requests performed on
+  # this connection
+
+  def error_message connection
+    requests = Thread.current[@request_key][connection.object_id] - 1 # fixup
+    last_use = Thread.current[@timeout_key][connection.object_id]
+
+    age = Time.now - last_use
+
+    "after #{requests} requests on #{connection.object_id}, " \
+      "last used #{age} seconds ago"
+  end
+
+  ##
+  # URI::escape wrapper
+
+  def escape str
+    CGI.escape str if str
+  end
+
+  ##
+  # Returns true if the connection should be reset due to an idle timeout,
+  # false otherwise.
+
+  def expired? connection
+    return false unless @idle_timeout
+    return true  if     @idle_timeout.zero?
+
+    last_used = Thread.current[@timeout_key][connection.object_id]
+
+    Time.now - last_used > @idle_timeout
+  end
+
+  ##
+  # Starts the Net::HTTP +connection+
+
+  def start connection
+    connection.set_debug_output @debug_output if @debug_output
+    connection.open_timeout = @open_timeout if @open_timeout
+
+    connection.start
+
+    socket = connection.instance_variable_get :@socket
+
+    if socket then # for fakeweb
+      @socket_options.each do |option|
+        socket.io.setsockopt(*option)
+      end
+    end
+  end
+
+  ##
+  # Finishes the Net::HTTP +connection+
+
+  def finish connection, thread = Thread.current
+    if requests = thread[@request_key] then
+      requests.delete connection.object_id
+    end
+
+    connection.finish
+  rescue IOError
+  end
+
+  def http_class # :nodoc:
+    if RUBY_VERSION > '2.0' then
+      Net::HTTP
+    elsif [:Artifice, :FakeWeb, :WebMock].any? { |klass|
+             Object.const_defined?(klass)
+          } or not @reuse_ssl_sessions then
+        Net::HTTP
+    else
+      Net::HTTP::Persistent::SSLReuse
+    end
+  end
+
+  ##
+  # Returns the HTTP protocol version for +uri+
+
+  def http_version uri
+    @http_versions["#{uri.host}:#{uri.port}"]
+  end
+
+  ##
+  # Is +req+ idempotent according to RFC 2616?
+
+  def idempotent? req
+    case req
+    when Net::HTTP::Delete, Net::HTTP::Get, Net::HTTP::Head,
+         Net::HTTP::Options, Net::HTTP::Put, Net::HTTP::Trace then
+      true
+    end
+  end
+
+  ##
+  # Is the request idempotent or is retry_change_requests allowed
+
+  def can_retry? req
+    retry_change_requests or idempotent?(req)
+  end
+
+  if RUBY_VERSION > '1.9' then
+    ##
+    # Workaround for missing Net::HTTPHeader#connection_close? on Ruby 1.8
+
+    def connection_close? header
+      header.connection_close?
+    end
+
+    ##
+    # Workaround for missing Net::HTTPHeader#connection_keep_alive? on Ruby 1.8
+
+    def connection_keep_alive? header
+      header.connection_keep_alive?
+    end
+  else
+    ##
+    # Workaround for missing Net::HTTPRequest#connection_close? on Ruby 1.8
+
+    def connection_close? header
+      header['connection'] =~ /close/ or header['proxy-connection'] =~ /close/
+    end
+
+    ##
+    # Workaround for missing Net::HTTPRequest#connection_keep_alive? on Ruby
+    # 1.8
+
+    def connection_keep_alive? header
+      header['connection'] =~ /keep-alive/ or
+        header['proxy-connection'] =~ /keep-alive/
+    end
+  end
+
+  ##
+  # Deprecated in favor of #expired?
+
+  def max_age # :nodoc:
+    return Time.now + 1 unless @idle_timeout
+
+    Time.now - @idle_timeout
+  end
+
+  ##
+  # Adds "http://" to the String +uri+ if it is missing.
+
+  def normalize_uri uri
+    (uri =~ /^https?:/) ? uri : "http://#{uri}"
+  end
+
+  ##
+  # Pipelines +requests+ to the HTTP server at +uri+ yielding responses if a
+  # block is given.  Returns all responses recieved.
+  #
+  # See
+  # Net::HTTP::Pipeline[http://docs.seattlerb.org/net-http-pipeline/Net/HTTP/Pipeline.html]
+  # for further details.
+  #
+  # Only if <tt>net-http-pipeline</tt> was required before
+  # <tt>net-http-persistent</tt> #pipeline will be present.
+
+  def pipeline uri, requests, &block # :yields: responses
+    connection = connection_for uri
+
+    connection.pipeline requests, &block
+  end
+
+  ##
+  # Sets this client's SSL private key
+
+  def private_key= key
+    @private_key = key
+
+    reconnect_ssl
+  end
+
+  # For Net::HTTP parity
+  alias key= private_key=
+
+  ##
+  # Sets the proxy server.  The +proxy+ may be the URI of the proxy server,
+  # the symbol +:ENV+ which will read the proxy from the environment or nil to
+  # disable use of a proxy.  See #proxy_from_env for details on setting the
+  # proxy from the environment.
+  #
+  # If the proxy URI is set after requests have been made, the next request
+  # will shut-down and re-open all connections.
+  #
+  # The +no_proxy+ query parameter can be used to specify hosts which shouldn't
+  # be reached via proxy; if set it should be a comma separated list of
+  # hostname suffixes, optionally with +:port+ appended, for example
+  # <tt>example.com,some.host:8080</tt>.
+
+  def proxy= proxy
+    @proxy_uri = case proxy
+                 when :ENV      then proxy_from_env
+                 when URI::HTTP then proxy
+                 when nil       then # ignore
+                 else raise ArgumentError, 'proxy must be :ENV or a URI::HTTP'
+                 end
+
+    @no_proxy.clear
+
+    if @proxy_uri then
+      @proxy_args = [
+        @proxy_uri.host,
+        @proxy_uri.port,
+        @proxy_uri.user,
+        @proxy_uri.password,
+      ]
+
+      @proxy_connection_id = [nil, *@proxy_args].join ':'
+
+      if @proxy_uri.query then
+        @no_proxy = CGI.parse(@proxy_uri.query)['no_proxy'].join(',').downcase.split(',').map { |x| x.strip }.reject { |x| x.empty? }
+      end
+    end
+
+    reconnect
+    reconnect_ssl
+  end
+
+  ##
+  # Creates a URI for an HTTP proxy server from ENV variables.
+  #
+  # If +HTTP_PROXY+ is set a proxy will be returned.
+  #
+  # If +HTTP_PROXY_USER+ or +HTTP_PROXY_PASS+ are set the URI is given the
+  # indicated user and password unless HTTP_PROXY contains either of these in
+  # the URI.
+  #
+  # The +NO_PROXY+ ENV variable can be used to specify hosts which shouldn't
+  # be reached via proxy; if set it should be a comma separated list of
+  # hostname suffixes, optionally with +:port+ appended, for example
+  # <tt>example.com,some.host:8080</tt>. When set to <tt>*</tt> no proxy will
+  # be returned.
+  #
+  # For Windows users, lowercase ENV variables are preferred over uppercase ENV
+  # variables.
+
+  def proxy_from_env
+    env_proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
+
+    return nil if env_proxy.nil? or env_proxy.empty?
+
+    uri = URI normalize_uri env_proxy
+
+    env_no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
+
+    # '*' is special case for always bypass
+    return nil if env_no_proxy == '*'
+
+    if env_no_proxy then
+      uri.query = "no_proxy=#{escape(env_no_proxy)}"
+    end
+
+    unless uri.user or uri.password then
+      uri.user     = escape ENV['http_proxy_user'] || ENV['HTTP_PROXY_USER']
+      uri.password = escape ENV['http_proxy_pass'] || ENV['HTTP_PROXY_PASS']
+    end
+
+    uri
+  end
+
+  ##
+  # Returns true when proxy should by bypassed for host.
+
+  def proxy_bypass? host, port
+    host = host.downcase
+    host_port = [host, port].join ':'
+
+    @no_proxy.each do |name|
+      return true if host[-name.length, name.length] == name or
+         host_port[-name.length, name.length] == name
+    end
+
+    false
+  end
+
+  ##
+  # Forces reconnection of HTTP connections.
+
+  def reconnect
+    @generation += 1
+  end
+
+  ##
+  # Forces reconnection of SSL connections.
+
+  def reconnect_ssl
+    @ssl_generation += 1
+  end
+
+  ##
+  # Finishes then restarts the Net::HTTP +connection+
+
+  def reset connection
+    Thread.current[@request_key].delete connection.object_id
+    Thread.current[@timeout_key].delete connection.object_id
+
+    finish connection
+
+    start connection
+  rescue Errno::ECONNREFUSED
+    raise Error, "connection refused: #{connection.address}:#{connection.port}"
+  rescue Errno::EHOSTDOWN
+    raise Error, "host down: #{connection.address}:#{connection.port}"
+  end
+
+  ##
+  # Makes a request on +uri+.  If +req+ is nil a Net::HTTP::Get is performed
+  # against +uri+.
+  #
+  # If a block is passed #request behaves like Net::HTTP#request (the body of
+  # the response will not have been read).
+  #
+  # +req+ must be a Net::HTTPRequest subclass (see Net::HTTP for a list).
+  #
+  # If there is an error and the request is idempontent according to RFC 2616
+  # it will be retried automatically.
+
+  def request uri, req = nil, &block
+    retried      = false
+    bad_response = false
+
+    req = Net::HTTP::Get.new uri.request_uri unless req
+
+    @headers.each do |pair|
+      req.add_field(*pair)
+    end
+
+    if uri.user or uri.password
+      req.basic_auth uri.user, uri.password
+    end
+
+    @override_headers.each do |name, value|
+      req[name] = value
+    end
+
+    unless req['Connection'] then
+      req.add_field 'Connection', 'keep-alive'
+      req.add_field 'Keep-Alive', @keep_alive
+    end
+
+    connection = connection_for uri
+    connection_id = connection.object_id
+
+    begin
+      Thread.current[@request_key][connection_id] += 1
+      response = connection.request req, &block
+
+      if connection_close?(req) or
+         (response.http_version <= '1.0' and
+          not connection_keep_alive?(response)) or
+         connection_close?(response) then
+        connection.finish
+      end
+    rescue Net::HTTPBadResponse => e
+      message = error_message connection
+
+      finish connection
+
+      raise Error, "too many bad responses #{message}" if
+        bad_response or not can_retry? req
+
+      bad_response = true
+      retry
+    rescue IOError, EOFError, Timeout::Error,
+           Errno::ECONNABORTED, Errno::ECONNRESET, Errno::EPIPE,
+           Errno::EINVAL, OpenSSL::SSL::SSLError => e
+
+      if retried or not can_retry? req
+        due_to = "(due to #{e.message} - #{e.class})"
+        message = error_message connection
+
+        finish connection
+
+        raise Error, "too many connection resets #{due_to} #{message}"
+      end
+
+      reset connection
+
+      retried = true
+      retry
+    ensure
+      Thread.current[@timeout_key][connection_id] = Time.now
+    end
+
+    @http_versions["#{uri.host}:#{uri.port}"] ||= response.http_version
+
+    response
+  end
+
+  ##
+  # Shuts down all connections for +thread+.
+  #
+  # Uses the current thread by default.
+  #
+  # If you've used Net::HTTP::Persistent across multiple threads you should
+  # call this in each thread when you're done making HTTP requests.
+  #
+  # *NOTE*: Calling shutdown for another thread can be dangerous!
+  #
+  # If the thread is still using the connection it may cause an error!  It is
+  # best to call #shutdown in the thread at the appropriate time instead!
+
+  def shutdown thread = Thread.current
+    generation = reconnect
+    cleanup generation, thread, @generation_key
+
+    ssl_generation = reconnect_ssl
+    cleanup ssl_generation, thread, @ssl_generation_key
+
+    thread[@request_key] = nil
+    thread[@timeout_key] = nil
+  end
+
+  ##
+  # Shuts down all connections in all threads
+  #
+  # *NOTE*: THIS METHOD IS VERY DANGEROUS!
+  #
+  # Do not call this method if other threads are still using their
+  # connections!  Call #shutdown at the appropriate time instead!
+  #
+  # Use this method only as a last resort!
+
+  def shutdown_in_all_threads
+    Thread.list.each do |thread|
+      shutdown thread
+    end
+
+    nil
+  end
+
+  ##
+  # Enables SSL on +connection+
+
+  def ssl connection
+    connection.use_ssl = true
+
+    connection.ssl_version = @ssl_version if @ssl_version
+
+    connection.verify_mode = @verify_mode
+
+    if OpenSSL::SSL::VERIFY_PEER == OpenSSL::SSL::VERIFY_NONE and
+       not Object.const_defined?(:I_KNOW_THAT_OPENSSL_VERIFY_PEER_EQUALS_VERIFY_NONE_IS_WRONG) then
+      warn <<-WARNING
+                             !!!SECURITY WARNING!!!
+
+The SSL HTTP connection to:
+
+  #{connection.address}:#{connection.port}
+
+                           !!!MAY NOT BE VERIFIED!!!
+
+On your platform your OpenSSL implementation is broken.
+
+There is no difference between the values of VERIFY_NONE and VERIFY_PEER.
+
+This means that attempting to verify the security of SSL connections may not
+work.  This exposes you to man-in-the-middle exploits, snooping on the
+contents of your connection and other dangers to the security of your data.
+
+To disable this warning define the following constant at top-level in your
+application:
+
+  I_KNOW_THAT_OPENSSL_VERIFY_PEER_EQUALS_VERIFY_NONE_IS_WRONG = nil
+
+      WARNING
+    end
+
+    if @ca_file then
+      connection.ca_file = @ca_file
+      connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
+      connection.verify_callback = @verify_callback if @verify_callback
+    end
+
+    if @certificate and @private_key then
+      connection.cert = @certificate
+      connection.key  = @private_key
+    end
+
+    connection.cert_store = if @cert_store then
+                              @cert_store
+                            else
+                              store = OpenSSL::X509::Store.new
+                              store.set_default_paths
+                              store
+                            end
+  end
+
+  ##
+  # Finishes all connections that existed before the given SSL parameter
+  # +generation+.
+
+  def ssl_cleanup generation # :nodoc:
+    cleanup generation, Thread.current, @ssl_generation_key
+  end
+
+  ##
+  # SSL version to use
+
+  def ssl_version= ssl_version
+    @ssl_version = ssl_version
+
+    reconnect_ssl
+  end if RUBY_VERSION > '1.9'
+
+  ##
+  # Sets the HTTPS verify mode.  Defaults to OpenSSL::SSL::VERIFY_PEER.
+  #
+  # Setting this to VERIFY_NONE is a VERY BAD IDEA and should NEVER be used.
+  # Securely transfer the correct certificate and update the default
+  # certificate store or set the ca file instead.
+
+  def verify_mode= verify_mode
+    @verify_mode = verify_mode
+
+    reconnect_ssl
+  end
+
+  ##
+  # SSL verification callback.
+
+  def verify_callback= callback
+    @verify_callback = callback
+
+    reconnect_ssl
+  end
+
+end
+
+require 'net/http/persistent/ssl_reuse'
+
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/net/http/persistent/ssl_reuse.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/net/http/persistent/ssl_reuse.rb
new file mode 100644
index 0000000..0513970
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/net/http/persistent/ssl_reuse.rb
@@ -0,0 +1,129 @@
+##
+# This Net::HTTP subclass adds SSL session reuse and Server Name Indication
+# (SNI) RFC 3546.
+#
+# DO NOT DEPEND UPON THIS CLASS
+#
+# This class is an implementation detail and is subject to change or removal
+# at any time.
+
+class Net::HTTP::Persistent::SSLReuse < Net::HTTP
+
+  @is_proxy_class = false
+  @proxy_addr = nil
+  @proxy_port = nil
+  @proxy_user = nil
+  @proxy_pass = nil
+
+  def initialize address, port = nil # :nodoc:
+    super
+
+    @ssl_session = nil
+  end
+
+  ##
+  # From ruby trunk r33086 including http://redmine.ruby-lang.org/issues/5341
+
+  def connect # :nodoc:
+    D "opening connection to #{conn_address()}..."
+    s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) }
+    D "opened"
+    if use_ssl?
+      ssl_parameters = Hash.new
+      iv_list = instance_variables
+      SSL_ATTRIBUTES.each do |name|
+        ivname = "@#{name}".intern
+        if iv_list.include?(ivname) and
+           value = instance_variable_get(ivname)
+          ssl_parameters[name] = value
+        end
+      end
+      unless @ssl_context then
+        @ssl_context = OpenSSL::SSL::SSLContext.new
+        @ssl_context.set_params(ssl_parameters)
+      end
+      s = OpenSSL::SSL::SSLSocket.new(s, @ssl_context)
+      s.sync_close = true
+    end
+    @socket = Net::BufferedIO.new(s)
+    @socket.read_timeout = @read_timeout
+    @socket.continue_timeout = @continue_timeout if
+      @socket.respond_to? :continue_timeout
+    @socket.debug_output = @debug_output
+    if use_ssl?
+      begin
+        if proxy?
+          @socket.writeline sprintf('CONNECT %s:%s HTTP/%s',
+                                    @address, @port, HTTPVersion)
+          @socket.writeline "Host: #{@address}:#{@port}"
+          if proxy_user
+            credential = ["#{proxy_user}:#{proxy_pass}"].pack('m')
+            credential.delete!("\r\n")
+            @socket.writeline "Proxy-Authorization: Basic #{credential}"
+          end
+          @socket.writeline ''
+          Net::HTTPResponse.read_new(@socket).value
+        end
+        s.session = @ssl_session if @ssl_session
+        # Server Name Indication (SNI) RFC 3546
+        s.hostname = @address if s.respond_to? :hostname=
+        timeout(@open_timeout) { s.connect }
+        if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE
+          s.post_connection_check(@address)
+        end
+        @ssl_session = s.session
+      rescue => exception
+        D "Conn close because of connect error #{exception}"
+        @socket.close if @socket and not @socket.closed?
+        raise exception
+      end
+    end
+    on_connect
+  end if RUBY_VERSION > '1.9'
+
+  ##
+  # From ruby_1_8_7 branch r29865 including a modified
+  # http://redmine.ruby-lang.org/issues/5341
+
+  def connect # :nodoc:
+    D "opening connection to #{conn_address()}..."
+    s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) }
+    D "opened"
+    if use_ssl?
+      unless @ssl_context.verify_mode
+        warn "warning: peer certificate won't be verified in this SSL session"
+        @ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
+      end
+      s = OpenSSL::SSL::SSLSocket.new(s, @ssl_context)
+      s.sync_close = true
+    end
+    @socket = Net::BufferedIO.new(s)
+    @socket.read_timeout = @read_timeout
+    @socket.debug_output = @debug_output
+    if use_ssl?
+      if proxy?
+        @socket.writeline sprintf('CONNECT %s:%s HTTP/%s',
+                                  @address, @port, HTTPVersion)
+        @socket.writeline "Host: #{@address}:#{@port}"
+        if proxy_user
+          credential = ["#{proxy_user}:#{proxy_pass}"].pack('m')
+          credential.delete!("\r\n")
+          @socket.writeline "Proxy-Authorization: Basic #{credential}"
+        end
+        @socket.writeline ''
+        Net::HTTPResponse.read_new(@socket).value
+      end
+      s.session = @ssl_session if @ssl_session
+      s.connect
+      if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE
+        s.post_connection_check(@address)
+      end
+      @ssl_session = s.session
+    end
+    on_connect
+  end if RUBY_VERSION < '1.9'
+
+  private :connect
+
+end
+
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor.rb
new file mode 100644
index 0000000..88b907c
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor.rb
@@ -0,0 +1,450 @@
+require 'set'
+require 'thor/base'
+
+class Thor
+  class << self
+    # Sets the default task when thor is executed without an explicit task to be called.
+    #
+    # ==== Parameters
+    # meth<Symbol>:: name of the default task
+    #
+    def default_task(meth=nil)
+      case meth
+        when :none
+          @default_task = 'help'
+        when nil
+          @default_task ||= from_superclass(:default_task, 'help')
+        else
+          @default_task = meth.to_s
+      end
+    end
+
+    # Registers another Thor subclass as a command.
+    #
+    # ==== Parameters
+    # klass<Class>:: Thor subclass to register
+    # command<String>:: Subcommand name to use
+    # usage<String>:: Short usage for the subcommand
+    # description<String>:: Description for the subcommand
+    def register(klass, subcommand_name, usage, description, options={})
+      if klass <= Thor::Group
+        desc usage, description, options
+        define_method(subcommand_name) { |*args| invoke(klass, args) }
+      else
+        desc usage, description, options
+        subcommand subcommand_name, klass
+      end
+    end
+
+    # Defines the usage and the description of the next task.
+    #
+    # ==== Parameters
+    # usage<String>
+    # description<String>
+    # options<String>
+    #
+    def desc(usage, description, options={})
+      if options[:for]
+        task = find_and_refresh_task(options[:for])
+        task.usage = usage             if usage
+        task.description = description if description
+      else
+        @usage, @desc, @hide = usage, description, options[:hide] || false
+      end
+    end
+
+    # Defines the long description of the next task.
+    #
+    # ==== Parameters
+    # long description<String>
+    #
+    def long_desc(long_description, options={})
+      if options[:for]
+        task = find_and_refresh_task(options[:for])
+        task.long_description = long_description if long_description
+      else
+        @long_desc = long_description
+      end
+    end
+
+    # Maps an input to a task. If you define:
+    #
+    #   map "-T" => "list"
+    #
+    # Running:
+    #
+    #   thor -T
+    #
+    # Will invoke the list task.
+    #
+    # ==== Parameters
+    # Hash[String|Array => Symbol]:: Maps the string or the strings in the array to the given task.
+    #
+    def map(mappings=nil)
+      @map ||= from_superclass(:map, {})
+
+      if mappings
+        mappings.each do |key, value|
+          if key.respond_to?(:each)
+            key.each {|subkey| @map[subkey] = value}
+          else
+            @map[key] = value
+          end
+        end
+      end
+
+      @map
+    end
+
+    # Declares the options for the next task to be declared.
+    #
+    # ==== Parameters
+    # Hash[Symbol => Object]:: The hash key is the name of the option and the value
+    # is the type of the option. Can be :string, :array, :hash, :boolean, :numeric
+    # or :required (string). If you give a value, the type of the value is used.
+    #
+    def method_options(options=nil)
+      @method_options ||= {}
+      build_options(options, @method_options) if options
+      @method_options
+    end
+
+    alias options method_options
+
+    # Adds an option to the set of method options. If :for is given as option,
+    # it allows you to change the options from a previous defined task.
+    #
+    #   def previous_task
+    #     # magic
+    #   end
+    #
+    #   method_option :foo => :bar, :for => :previous_task
+    #
+    #   def next_task
+    #     # magic
+    #   end
+    #
+    # ==== Parameters
+    # name<Symbol>:: The name of the argument.
+    # options<Hash>:: Described below.
+    #
+    # ==== Options
+    # :desc     - Description for the argument.
+    # :required - If the argument is required or not.
+    # :default  - Default value for this argument. It cannot be required and have default values.
+    # :aliases  - Aliases for this option.
+    # :type     - The type of the argument, can be :string, :hash, :array, :numeric or :boolean.
+    # :banner   - String to show on usage notes.
+    # :hide     - If you want to hide this option from the help.
+    #
+    def method_option(name, options={})
+      scope = if options[:for]
+        find_and_refresh_task(options[:for]).options
+      else
+        method_options
+      end
+
+      build_option(name, options, scope)
+    end
+
+    alias option method_option
+
+    # Prints help information for the given task.
+    #
+    # ==== Parameters
+    # shell<Thor::Shell>
+    # task_name<String>
+    #
+    def task_help(shell, task_name)
+      meth = normalize_task_name(task_name)
+      task = all_tasks[meth]
+      handle_no_task_error(meth) unless task
+
+      shell.say "Usage:"
+      shell.say "  #{banner(task)}"
+      shell.say
+      class_options_help(shell, nil => task.options.map { |_, o| o })
+      if task.long_description
+        shell.say "Description:"
+        shell.print_wrapped(task.long_description, :indent => 2)
+      else
+        shell.say task.description
+      end
+    end
+
+    # Prints help information for this class.
+    #
+    # ==== Parameters
+    # shell<Thor::Shell>
+    #
+    def help(shell, subcommand = false)
+      list = printable_tasks(true, subcommand)
+      Thor::Util.thor_classes_in(self).each do |klass|
+        list += klass.printable_tasks(false)
+      end
+      list.sort!{ |a,b| a[0] <=> b[0] }
+
+      shell.say "Tasks:"
+      shell.print_table(list, :indent => 2, :truncate => true)
+      shell.say
+      class_options_help(shell)
+    end
+
+    # Returns tasks ready to be printed.
+    def printable_tasks(all = true, subcommand = false)
+      (all ? all_tasks : tasks).map do |_, task|
+        next if task.hidden?
+        item = []
+        item << banner(task, false, subcommand)
+        item << (task.description ? "# #{task.description.gsub(/\s+/m,' ')}" : "")
+        item
+      end.compact
+    end
+
+    def subcommands
+      @subcommands ||= from_superclass(:subcommands, [])
+    end
+
+    def subcommand(subcommand, subcommand_class)
+      self.subcommands << subcommand.to_s
+      subcommand_class.subcommand_help subcommand
+
+      define_method(subcommand) do |*args|
+        args, opts = Thor::Arguments.split(args)
+        invoke subcommand_class, args, opts, :invoked_via_subcommand => true
+      end
+    end
+
+    # Extend check unknown options to accept a hash of conditions.
+    #
+    # === Parameters
+    # options<Hash>: A hash containing :only and/or :except keys
+    def check_unknown_options!(options={})
+      @check_unknown_options ||= Hash.new
+      options.each do |key, value|
+        if value
+          @check_unknown_options[key] = Array(value)
+        else
+          @check_unknown_options.delete(key)
+        end
+      end
+      @check_unknown_options
+    end
+
+    # Overwrite check_unknown_options? to take subcommands and options into account.
+    def check_unknown_options?(config) #:nodoc:
+      options = check_unknown_options
+      return false unless options
+
+      task = config[:current_task]
+      return true unless task
+
+      name = task.name
+
+      if subcommands.include?(name)
+        false
+      elsif options[:except]
+        !options[:except].include?(name.to_sym)
+      elsif options[:only]
+        options[:only].include?(name.to_sym)
+      else
+        true
+      end
+    end
+
+    # Stop parsing of options as soon as an unknown option or a regular
+    # argument is encountered.  All remaining arguments are passed to the task.
+    # This is useful if you have a task that can receive arbitrary additional
+    # options, and where those additional options should not be handled by
+    # Thor.
+    #
+    # ==== Example
+    #
+    # To better understand how this is useful, let's consider a task that calls
+    # an external command.  A user may want to pass arbitrary options and
+    # arguments to that command.  The task itself also accepts some options,
+    # which should be handled by Thor.
+    #
+    #   class_option "verbose",  :type => :boolean
+    #   stop_on_unknown_option! :exec
+    #   check_unknown_options!  :except => :exec
+    #
+    #   desc "exec", "Run a shell command"
+    #   def exec(*args)
+    #     puts "diagnostic output" if options[:verbose]
+    #     Kernel.exec(*args)
+    #   end
+    #
+    # Here +exec+ can be called with +--verbose+ to get diagnostic output,
+    # e.g.:
+    #
+    #   $ thor exec --verbose echo foo
+    #   diagnostic output
+    #   foo
+    #
+    # But if +--verbose+ is given after +echo+, it is passed to +echo+ instead:
+    #
+    #   $ thor exec echo --verbose foo
+    #   --verbose foo
+    #
+    # ==== Parameters
+    # Symbol ...:: A list of tasks that should be affected.
+    def stop_on_unknown_option!(*task_names)
+      @stop_on_unknown_option ||= Set.new
+      @stop_on_unknown_option.merge(task_names)
+    end
+
+    def stop_on_unknown_option?(task) #:nodoc:
+      !!@stop_on_unknown_option && @stop_on_unknown_option.include?(task.name.to_sym)
+    end
+
+    protected
+
+      # The method responsible for dispatching given the args.
+      def dispatch(meth, given_args, given_opts, config) #:nodoc:
+        # There is an edge case when dispatching from a subcommand.
+        # A problem occurs invoking the default task. This case occurs
+        # when arguments are passed and a default task is defined, and
+        # the first given_args does not match the default task.
+        # Thor use "help" by default so we skip that case.
+        # Note the call to retrieve_task_name. It's called with
+        # given_args.dup since that method calls args.shift. Then lookup
+        # the task normally. If the first item in given_args is not
+        # a task then use the default task. The given_args will be
+        # intact later since dup was used.
+        if config[:invoked_via_subcommand] && given_args.size >= 1 && default_task != "help" && given_args.first != default_task
+          meth ||= retrieve_task_name(given_args.dup)
+          task = all_tasks[normalize_task_name(meth)]
+          task ||= all_tasks[normalize_task_name(default_task)]
+        else
+          meth ||= retrieve_task_name(given_args)
+          task = all_tasks[normalize_task_name(meth)]
+        end
+
+        if task
+          args, opts = Thor::Options.split(given_args)
+          if stop_on_unknown_option?(task) && !args.empty?
+            # given_args starts with a non-option, so we treat everything as
+            # ordinary arguments
+            args.concat opts
+            opts.clear
+          end
+        else
+          args, opts = given_args, nil
+          task = Thor::DynamicTask.new(meth)
+        end
+
+        opts = given_opts || opts || []
+        config.merge!(:current_task => task, :task_options => task.options)
+
+        instance = new(args, opts, config)
+        yield instance if block_given?
+        args = instance.args
+        trailing = args[Range.new(arguments.size, -1)]
+        instance.invoke_task(task, trailing || [])
+      end
+
+      # The banner for this class. You can customize it if you are invoking the
+      # thor class by another ways which is not the Thor::Runner. It receives
+      # the task that is going to be invoked and a boolean which indicates if
+      # the namespace should be displayed as arguments.
+      #
+      def banner(task, namespace = nil, subcommand = false)
+        "#{basename} #{task.formatted_usage(self, $thor_runner, subcommand)}"
+      end
+
+      def baseclass #:nodoc:
+        Thor
+      end
+
+      def create_task(meth) #:nodoc:
+        @long_desc ||= nil
+        @usage ||= nil
+        if @usage && @desc
+          base_class = @hide ? Thor::HiddenTask : Thor::Task
+          tasks[meth] = base_class.new(meth, @desc, @long_desc, @usage, method_options)
+          @usage, @desc, @long_desc, @method_options, @hide = nil
+          true
+        elsif self.all_tasks[meth] || meth == "method_missing"
+          true
+        else
+          puts "[WARNING] Attempted to create task #{meth.inspect} without usage or description. " <<
+               "Call desc if you want this method to be available as task or declare it inside a " <<
+               "no_tasks{} block. Invoked from #{caller[1].inspect}."
+          false
+        end
+      end
+
+      def initialize_added #:nodoc:
+        class_options.merge!(method_options)
+        @method_options = nil
+      end
+
+      # Retrieve the task name from given args.
+      def retrieve_task_name(args) #:nodoc:
+        meth = args.first.to_s unless args.empty?
+        if meth && (map[meth] || meth !~ /^\-/)
+          args.shift
+        else
+          nil
+        end
+      end
+
+      # receives a (possibly nil) task name and returns a name that is in
+      # the tasks hash. In addition to normalizing aliases, this logic
+      # will determine if a shortened command is an unambiguous substring of
+      # a task or alias.
+      #
+      # +normalize_task_name+ also converts names like +animal-prison+
+      # into +animal_prison+.
+      def normalize_task_name(meth) #:nodoc:
+        return default_task.to_s.gsub('-', '_') unless meth
+
+        possibilities = find_task_possibilities(meth)
+        if possibilities.size > 1
+          raise ArgumentError, "Ambiguous task #{meth} matches [#{possibilities.join(', ')}]"
+        elsif possibilities.size < 1
+          meth = meth || default_task
+        elsif map[meth]
+          meth = map[meth]
+        else
+          meth = possibilities.first
+        end
+
+        meth.to_s.gsub('-','_') # treat foo-bar as foo_bar
+      end
+
+      # this is the logic that takes the task name passed in by the user
+      # and determines whether it is an unambiguous substrings of a task or
+      # alias name.
+      def find_task_possibilities(meth)
+        len = meth.to_s.length
+        possibilities = all_tasks.merge(map).keys.select { |n| meth == n[0, len] }.sort
+        unique_possibilities = possibilities.map { |k| map[k] || k }.uniq
+
+        if possibilities.include?(meth)
+          [meth]
+        elsif unique_possibilities.size == 1
+          unique_possibilities
+        else
+          possibilities
+        end
+      end
+
+      def subcommand_help(cmd)
+        desc "help [COMMAND]", "Describe subcommands or one specific subcommand"
+        class_eval <<-RUBY
+          def help(task = nil, subcommand = true); super; end
+        RUBY
+      end
+  end
+
+  include Thor::Base
+
+  map HELP_MAPPINGS => :help
+
+  desc "help [TASK]", "Describe available tasks or one specific task"
+  def help(task = nil, subcommand = false)
+    task ? self.class.task_help(shell, task) : self.class.help(shell, subcommand)
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions.rb
new file mode 100644
index 0000000..8cc16e6
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions.rb
@@ -0,0 +1,318 @@
+require 'fileutils'
+require 'uri'
+require 'thor/core_ext/file_binary_read'
+require 'thor/actions/create_file'
+require 'thor/actions/create_link'
+require 'thor/actions/directory'
+require 'thor/actions/empty_directory'
+require 'thor/actions/file_manipulation'
+require 'thor/actions/inject_into_file'
+
+class Thor
+  module Actions
+    attr_accessor :behavior
+
+    def self.included(base) #:nodoc:
+      base.extend ClassMethods
+    end
+
+    module ClassMethods
+      # Hold source paths for one Thor instance. source_paths_for_search is the
+      # method responsible to gather source_paths from this current class,
+      # inherited paths and the source root.
+      #
+      def source_paths
+        @_source_paths ||= []
+      end
+
+      # Stores and return the source root for this class
+      def source_root(path=nil)
+        @_source_root = path if path
+        @_source_root
+      end
+
+      # Returns the source paths in the following order:
+      #
+      #   1) This class source paths
+      #   2) Source root
+      #   3) Parents source paths
+      #
+      def source_paths_for_search
+        paths = []
+        paths += self.source_paths
+        paths << self.source_root if self.source_root
+        paths += from_superclass(:source_paths, [])
+        paths
+      end
+
+      # Add runtime options that help actions execution.
+      #
+      def add_runtime_options!
+        class_option :force, :type => :boolean, :aliases => "-f", :group => :runtime,
+                             :desc => "Overwrite files that already exist"
+
+        class_option :pretend, :type => :boolean, :aliases => "-p", :group => :runtime,
+                               :desc => "Run but do not make any changes"
+
+        class_option :quiet, :type => :boolean, :aliases => "-q", :group => :runtime,
+                             :desc => "Suppress status output"
+
+        class_option :skip, :type => :boolean, :aliases => "-s", :group => :runtime,
+                            :desc => "Skip files that already exist"
+      end
+    end
+
+    # Extends initializer to add more configuration options.
+    #
+    # ==== Configuration
+    # behavior<Symbol>:: The actions default behavior. Can be :invoke or :revoke.
+    #                    It also accepts :force, :skip and :pretend to set the behavior
+    #                    and the respective option.
+    #
+    # destination_root<String>:: The root directory needed for some actions.
+    #
+    def initialize(args=[], options={}, config={})
+      self.behavior = case config[:behavior].to_s
+        when "force", "skip"
+          _cleanup_options_and_set(options, config[:behavior])
+          :invoke
+        when "revoke"
+          :revoke
+        else
+          :invoke
+      end
+
+      super
+      self.destination_root = config[:destination_root]
+    end
+
+    # Wraps an action object and call it accordingly to the thor class behavior.
+    #
+    def action(instance) #:nodoc:
+      if behavior == :revoke
+        instance.revoke!
+      else
+        instance.invoke!
+      end
+    end
+
+    # Returns the root for this thor class (also aliased as destination root).
+    #
+    def destination_root
+      @destination_stack.last
+    end
+
+    # Sets the root for this thor class. Relatives path are added to the
+    # directory where the script was invoked and expanded.
+    #
+    def destination_root=(root)
+      @destination_stack ||= []
+      @destination_stack[0] = File.expand_path(root || '')
+    end
+
+    # Returns the given path relative to the absolute root (ie, root where
+    # the script started).
+    #
+    def relative_to_original_destination_root(path, remove_dot=true)
+      path = path.dup
+      if path.gsub!(@destination_stack[0], '.')
+        remove_dot ? (path[2..-1] || '') : path
+      else
+        path
+      end
+    end
+
+    # Holds source paths in instance so they can be manipulated.
+    #
+    def source_paths
+      @source_paths ||= self.class.source_paths_for_search
+    end
+
+    # Receives a file or directory and search for it in the source paths.
+    #
+    def find_in_source_paths(file)
+      relative_root = relative_to_original_destination_root(destination_root, false)
+
+      source_paths.each do |source|
+        source_file = File.expand_path(file, File.join(source, relative_root))
+        return source_file if File.exists?(source_file)
+      end
+
+      message = "Could not find #{file.inspect} in any of your source paths. "
+
+      unless self.class.source_root
+        message << "Please invoke #{self.class.name}.source_root(PATH) with the PATH containing your templates. "
+      end
+
+      if source_paths.empty?
+        message << "Currently you have no source paths."
+      else
+        message << "Your current source paths are: \n#{source_paths.join("\n")}"
+      end
+
+      raise Error, message
+    end
+
+    # Do something in the root or on a provided subfolder. If a relative path
+    # is given it's referenced from the current root. The full path is yielded
+    # to the block you provide. The path is set back to the previous path when
+    # the method exits.
+    #
+    # ==== Parameters
+    # dir<String>:: the directory to move to.
+    # config<Hash>:: give :verbose => true to log and use padding.
+    #
+    def inside(dir='', config={}, &block)
+      verbose = config.fetch(:verbose, false)
+      pretend = options[:pretend]
+
+      say_status :inside, dir, verbose
+      shell.padding += 1 if verbose
+      @destination_stack.push File.expand_path(dir, destination_root)
+
+      # If the directory doesnt exist and we're not pretending
+      if !File.exist?(destination_root) && !pretend
+        FileUtils.mkdir_p(destination_root)
+      end
+
+      if pretend
+        # In pretend mode, just yield down to the block
+        block.arity == 1 ? yield(destination_root) : yield
+      else
+        FileUtils.cd(destination_root) { block.arity == 1 ? yield(destination_root) : yield }
+      end
+
+      @destination_stack.pop
+      shell.padding -= 1 if verbose
+    end
+
+    # Goes to the root and execute the given block.
+    #
+    def in_root
+      inside(@destination_stack.first) { yield }
+    end
+
+    # Loads an external file and execute it in the instance binding.
+    #
+    # ==== Parameters
+    # path<String>:: The path to the file to execute. Can be a web address or
+    #                a relative path from the source root.
+    #
+    # ==== Examples
+    #
+    #   apply "http://gist.github.com/103208"
+    #
+    #   apply "recipes/jquery.rb"
+    #
+    def apply(path, config={})
+      verbose = config.fetch(:verbose, true)
+      is_uri  = path =~ /^https?\:\/\//
+      path    = find_in_source_paths(path) unless is_uri
+
+      say_status :apply, path, verbose
+      shell.padding += 1 if verbose
+
+      if is_uri
+        contents = open(path, "Accept" => "application/x-thor-template") {|io| io.read }
+      else
+        contents = open(path) {|io| io.read }
+      end
+
+      instance_eval(contents, path)
+      shell.padding -= 1 if verbose
+    end
+
+    # Executes a command returning the contents of the command.
+    #
+    # ==== Parameters
+    # command<String>:: the command to be executed.
+    # config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output. Specify :with
+    #                to append an executable to command executation.
+    #
+    # ==== Example
+    #
+    #   inside('vendor') do
+    #     run('ln -s ~/edge rails')
+    #   end
+    #
+    def run(command, config={})
+      return unless behavior == :invoke
+
+      destination = relative_to_original_destination_root(destination_root, false)
+      desc = "#{command} from #{destination.inspect}"
+
+      if config[:with]
+        desc = "#{File.basename(config[:with].to_s)} #{desc}"
+        command = "#{config[:with]} #{command}"
+      end
+
+      say_status :run, desc, config.fetch(:verbose, true)
+
+      unless options[:pretend]
+        config[:capture] ? `#{command}` : system("#{command}")
+      end
+    end
+
+    # Executes a ruby script (taking into account WIN32 platform quirks).
+    #
+    # ==== Parameters
+    # command<String>:: the command to be executed.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    def run_ruby_script(command, config={})
+      return unless behavior == :invoke
+      run command, config.merge(:with => Thor::Util.ruby_command)
+    end
+
+    # Run a thor command. A hash of options can be given and it's converted to
+    # switches.
+    #
+    # ==== Parameters
+    # task<String>:: the task to be invoked
+    # args<Array>:: arguments to the task
+    # config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output.
+    #                Other options are given as parameter to Thor.
+    #
+    #
+    # ==== Examples
+    #
+    #   thor :install, "http://gist.github.com/103208"
+    #   #=> thor install http://gist.github.com/103208
+    #
+    #   thor :list, :all => true, :substring => 'rails'
+    #   #=> thor list --all --substring=rails
+    #
+    def thor(task, *args)
+      config  = args.last.is_a?(Hash) ? args.pop : {}
+      verbose = config.key?(:verbose) ? config.delete(:verbose) : true
+      pretend = config.key?(:pretend) ? config.delete(:pretend) : false
+      capture = config.key?(:capture) ? config.delete(:capture) : false
+
+      args.unshift task
+      args.push Thor::Options.to_switches(config)
+      command = args.join(' ').strip
+
+      run command, :with => :thor, :verbose => verbose, :pretend => pretend, :capture => capture
+    end
+
+    protected
+
+      # Allow current root to be shared between invocations.
+      #
+      def _shared_configuration #:nodoc:
+        super.merge!(:destination_root => self.destination_root)
+      end
+
+      def _cleanup_options_and_set(options, key) #:nodoc:
+        case options
+          when Array
+            %w(--force -f --skip -s).each { |i| options.delete(i) }
+            options << "--#{key}"
+          when Hash
+            [:force, :skip, "force", "skip"].each { |i| options.delete(i) }
+            options.merge!(key => true)
+        end
+      end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/create_file.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/create_file.rb
new file mode 100644
index 0000000..ed5973a
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/create_file.rb
@@ -0,0 +1,105 @@
+require 'thor/actions/empty_directory'
+
+class Thor
+  module Actions
+
+    # Create a new file relative to the destination root with the given data,
+    # which is the return value of a block or a data string.
+    #
+    # ==== Parameters
+    # destination<String>:: the relative path to the destination root.
+    # data<String|NilClass>:: the data to append to the file.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   create_file "lib/fun_party.rb" do
+    #     hostname = ask("What is the virtual hostname I should use?")
+    #     "vhost.name = #{hostname}"
+    #   end
+    #
+    #   create_file "config/apache.conf", "your apache config"
+    #
+    def create_file(destination, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      data = args.first
+      action CreateFile.new(self, destination, block || data.to_s, config)
+    end
+    alias :add_file :create_file
+
+    # CreateFile is a subset of Template, which instead of rendering a file with
+    # ERB, it gets the content from the user.
+    #
+    class CreateFile < EmptyDirectory #:nodoc:
+      attr_reader :data
+
+      def initialize(base, destination, data, config={})
+        @data = data
+        super(base, destination, config)
+      end
+
+      # Checks if the content of the file at the destination is identical to the rendered result.
+      #
+      # ==== Returns
+      # Boolean:: true if it is identical, false otherwise.
+      #
+      def identical?
+        exists? && File.binread(destination) == render
+      end
+
+      # Holds the content to be added to the file.
+      #
+      def render
+        @render ||= if data.is_a?(Proc)
+          data.call
+        else
+          data
+        end
+      end
+
+      def invoke!
+        invoke_with_conflict_check do
+          FileUtils.mkdir_p(File.dirname(destination))
+          File.open(destination, 'wb') { |f| f.write render }
+        end
+        given_destination
+      end
+
+      protected
+
+        # Now on conflict we check if the file is identical or not.
+        #
+        def on_conflict_behavior(&block)
+          if identical?
+            say_status :identical, :blue
+          else
+            options = base.options.merge(config)
+            force_or_skip_or_conflict(options[:force], options[:skip], &block)
+          end
+        end
+
+        # If force is true, run the action, otherwise check if it's not being
+        # skipped. If both are false, show the file_collision menu, if the menu
+        # returns true, force it, otherwise skip.
+        #
+        def force_or_skip_or_conflict(force, skip, &block)
+          if force
+            say_status :force, :yellow
+            block.call unless pretend?
+          elsif skip
+            say_status :skip, :yellow
+          else
+            say_status :conflict, :red
+            force_or_skip_or_conflict(force_on_collision?, true, &block)
+          end
+        end
+
+        # Shows the file collision menu to the user and gets the result.
+        #
+        def force_on_collision?
+          base.shell.file_collision(destination){ render }
+        end
+
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/create_link.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/create_link.rb
new file mode 100644
index 0000000..864a1e9
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/create_link.rb
@@ -0,0 +1,57 @@
+require 'thor/actions/create_file'
+
+class Thor
+  module Actions
+
+    # Create a new file relative to the destination root from the given source.
+    #
+    # ==== Parameters
+    # destination<String>:: the relative path to the destination root.
+    # source<String|NilClass>:: the relative path to the source root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #   :: give :symbolic => false for hard link.
+    #
+    # ==== Examples
+    #
+    #   create_link "config/apache.conf", "/etc/apache.conf"
+    #
+    def create_link(destination, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      source = args.first
+      action CreateLink.new(self, destination, source, config)
+    end
+    alias :add_link :create_link
+
+    # CreateLink is a subset of CreateFile, which instead of taking a block of
+    # data, just takes a source string from the user.
+    #
+    class CreateLink < CreateFile #:nodoc:
+      attr_reader :data
+
+      # Checks if the content of the file at the destination is identical to the rendered result.
+      #
+      # ==== Returns
+      # Boolean:: true if it is identical, false otherwise.
+      #
+      def identical?
+        exists? && File.identical?(render, destination)
+      end
+
+      def invoke!
+        invoke_with_conflict_check do
+          FileUtils.mkdir_p(File.dirname(destination))
+          # Create a symlink by default
+          config[:symbolic] = true if config[:symbolic].nil?
+          File.unlink(destination) if exists?
+          if config[:symbolic]
+            File.symlink(render, destination)
+          else
+            File.link(render, destination)
+          end
+        end
+        given_destination
+      end
+
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/directory.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/directory.rb
new file mode 100644
index 0000000..8e64513
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/directory.rb
@@ -0,0 +1,99 @@
+require 'thor/actions/empty_directory'
+
+class Thor
+  module Actions
+    # Copies recursively the files from source directory to root directory.
+    # If any of the files finishes with .tt, it's considered to be a template
+    # and is placed in the destination without the extension .tt. If any
+    # empty directory is found, it's copied and all .empty_directory files are
+    # ignored. If any file name is wrapped within % signs, the text within
+    # the % signs will be executed as a method and replaced with the returned
+    # value. Let's suppose a doc directory with the following files:
+    #
+    #   doc/
+    #     components/.empty_directory
+    #     README
+    #     rdoc.rb.tt
+    #     %app_name%.rb
+    #
+    # When invoked as:
+    #
+    #   directory "doc"
+    #
+    # It will create a doc directory in the destination with the following
+    # files (assuming that the `app_name` method returns the value "blog"):
+    #
+    #   doc/
+    #     components/
+    #     README
+    #     rdoc.rb
+    #     blog.rb
+    #
+    # <b>Encoded path note:</b> Since Thor internals use Object#respond_to? to check if it can
+    # expand %something%, this `something` should be a public method in the class calling
+    # #directory. If a method is private, Thor stack raises PrivateMethodEncodedError.
+    #
+    # ==== Parameters
+    # source<String>:: the relative path to the source root.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #                If :recursive => false, does not look for paths recursively.
+    #                If :mode => :preserve, preserve the file mode from the source.
+    #
+    # ==== Examples
+    #
+    #   directory "doc"
+    #   directory "doc", "docs", :recursive => false
+    #
+    def directory(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first || source
+      action Directory.new(self, source, destination || source, config, &block)
+    end
+
+    class Directory < EmptyDirectory #:nodoc:
+      attr_reader :source
+
+      def initialize(base, source, destination=nil, config={}, &block)
+        @source = File.expand_path(base.find_in_source_paths(source.to_s))
+        @block  = block
+        super(base, destination, { :recursive => true }.merge(config))
+      end
+
+      def invoke!
+        base.empty_directory given_destination, config
+        execute!
+      end
+
+      def revoke!
+        execute!
+      end
+
+      protected
+
+        def execute!
+          lookup = Util.escape_globs(source)
+          lookup = config[:recursive] ? File.join(lookup, '**') : lookup
+          lookup = File.join(lookup, '{*,.[a-z]*}')
+
+          Dir[lookup].sort.each do |file_source|
+            next if File.directory?(file_source)
+            file_destination = File.join(given_destination, file_source.gsub(source, '.'))
+            file_destination.gsub!('/./', '/')
+
+            case file_source
+              when /\.empty_directory$/
+                dirname = File.dirname(file_destination).gsub(/\/\.$/, '')
+                next if dirname == given_destination
+                base.empty_directory(dirname, config)
+              when /\.tt$/
+                destination = base.template(file_source, file_destination[0..-4], config, &@block)
+              else
+                destination = base.copy_file(file_source, file_destination, config, &@block)
+            end
+          end
+        end
+
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/empty_directory.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/empty_directory.rb
new file mode 100644
index 0000000..93d3e2a
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/empty_directory.rb
@@ -0,0 +1,153 @@
+class Thor
+  module Actions
+
+    # Creates an empty directory.
+    #
+    # ==== Parameters
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   empty_directory "doc"
+    #
+    def empty_directory(destination, config={})
+      action EmptyDirectory.new(self, destination, config)
+    end
+
+    # Class which holds create directory logic. This is the base class for
+    # other actions like create_file and directory.
+    #
+    # This implementation is based in Templater actions, created by Jonas Nicklas
+    # and Michael S. Klishin under MIT LICENSE.
+    #
+    class EmptyDirectory #:nodoc:
+      attr_reader :base, :destination, :given_destination, :relative_destination, :config
+
+      # Initializes given the source and destination.
+      #
+      # ==== Parameters
+      # base<Thor::Base>:: A Thor::Base instance
+      # source<String>:: Relative path to the source of this file
+      # destination<String>:: Relative path to the destination of this file
+      # config<Hash>:: give :verbose => false to not log the status.
+      #
+      def initialize(base, destination, config={})
+        @base, @config   = base, { :verbose => true }.merge(config)
+        self.destination = destination
+      end
+
+      # Checks if the destination file already exists.
+      #
+      # ==== Returns
+      # Boolean:: true if the file exists, false otherwise.
+      #
+      def exists?
+        ::File.exists?(destination)
+      end
+
+      def invoke!
+        invoke_with_conflict_check do
+          ::FileUtils.mkdir_p(destination)
+        end
+      end
+
+      def revoke!
+        say_status :remove, :red
+        ::FileUtils.rm_rf(destination) if !pretend? && exists?
+        given_destination
+      end
+
+      protected
+
+        # Shortcut for pretend.
+        #
+        def pretend?
+          base.options[:pretend]
+        end
+
+        # Sets the absolute destination value from a relative destination value.
+        # It also stores the given and relative destination. Let's suppose our
+        # script is being executed on "dest", it sets the destination root to
+        # "dest". The destination, given_destination and relative_destination
+        # are related in the following way:
+        #
+        #   inside "bar" do
+        #     empty_directory "baz"
+        #   end
+        #
+        #   destination          #=> dest/bar/baz
+        #   relative_destination #=> bar/baz
+        #   given_destination    #=> baz
+        #
+        def destination=(destination)
+          if destination
+            @given_destination = convert_encoded_instructions(destination.to_s)
+            @destination = ::File.expand_path(@given_destination, base.destination_root)
+            @relative_destination = base.relative_to_original_destination_root(@destination)
+          end
+        end
+
+        # Filenames in the encoded form are converted. If you have a file:
+        #
+        #   %file_name%.rb
+        #
+        # It calls #file_name from the base and replaces %-string with the
+        # return value (should be String) of #file_name:
+        #
+        #   user.rb
+        #
+        # The method referenced by %-string SHOULD be public. Otherwise you
+        # get the exception with the corresponding error message.
+        #
+        def convert_encoded_instructions(filename)
+          filename.gsub(/%(.*?)%/) do |initial_string|
+            call_public_method($1.strip) or initial_string
+          end
+        end
+
+        # Calls `base`'s public method `sym`.
+        # Returns:: result of `base.sym` or `nil` if `sym` wasn't found in
+        #  `base`
+        # Raises::  Thor::PrivateMethodEncodedError if `sym` references
+        #  a private method.
+        def call_public_method(sym)
+          if base.respond_to?(sym)
+            base.send(sym)
+          elsif base.respond_to?(sym, true)
+            raise Thor::PrivateMethodEncodedError,
+              "Method #{base.class}##{sym} should be public, not private"
+          else
+            nil
+          end
+        end
+
+        # Receives a hash of options and just execute the block if some
+        # conditions are met.
+        #
+        def invoke_with_conflict_check(&block)
+          if exists?
+            on_conflict_behavior(&block)
+          else
+            say_status :create, :green
+            block.call unless pretend?
+          end
+
+          destination
+        end
+
+        # What to do when the destination file already exists.
+        #
+        def on_conflict_behavior(&block)
+          say_status :exist, :blue
+        end
+
+        # Shortcut to say_status shell method.
+        #
+        def say_status(status, color)
+          base.shell.say_status status, relative_destination, color if config[:verbose]
+        end
+
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/file_manipulation.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/file_manipulation.rb
new file mode 100644
index 0000000..d9d0d6f
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/file_manipulation.rb
@@ -0,0 +1,314 @@
+require 'erb'
+require 'open-uri'
+
+class Thor
+  module Actions
+
+    # Copies the file from the relative source to the relative destination. If
+    # the destination is not given it's assumed to be equal to the source.
+    #
+    # ==== Parameters
+    # source<String>:: the relative path to the source root.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status, and
+    #                :mode => :preserve, to preserve the file mode from the source.
+
+    #
+    # ==== Examples
+    #
+    #   copy_file "README", "doc/README"
+    #
+    #   copy_file "doc/README"
+    #
+    def copy_file(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first || source
+      source = File.expand_path(find_in_source_paths(source.to_s))
+
+      create_file destination, nil, config do
+        content = File.binread(source)
+        content = block.call(content) if block
+        content
+      end
+      if config[:mode] == :preserve
+        mode = File.stat(source).mode
+        chmod(destination, mode, config)
+      end
+    end
+
+    # Links the file from the relative source to the relative destination. If
+    # the destination is not given it's assumed to be equal to the source.
+    #
+    # ==== Parameters
+    # source<String>:: the relative path to the source root.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   link_file "README", "doc/README"
+    #
+    #   link_file "doc/README"
+    #
+    def link_file(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first || source
+      source = File.expand_path(find_in_source_paths(source.to_s))
+
+      create_link destination, source, config
+    end
+
+    # Gets the content at the given address and places it at the given relative
+    # destination. If a block is given instead of destination, the content of
+    # the url is yielded and used as location.
+    #
+    # ==== Parameters
+    # source<String>:: the address of the given content.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   get "http://gist.github.com/103208", "doc/README"
+    #
+    #   get "http://gist.github.com/103208" do |content|
+    #     content.split("\n").first
+    #   end
+    #
+    def get(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first
+
+      source = File.expand_path(find_in_source_paths(source.to_s)) unless source =~ /^https?\:\/\//
+      render = open(source) {|input| input.binmode.read }
+
+      destination ||= if block_given?
+        block.arity == 1 ? block.call(render) : block.call
+      else
+        File.basename(source)
+      end
+
+      create_file destination, render, config
+    end
+
+    # Gets an ERB template at the relative source, executes it and makes a copy
+    # at the relative destination. If the destination is not given it's assumed
+    # to be equal to the source removing .tt from the filename.
+    #
+    # ==== Parameters
+    # source<String>:: the relative path to the source root.
+    # destination<String>:: the relative path to the destination root.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   template "README", "doc/README"
+    #
+    #   template "doc/README"
+    #
+    def template(source, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      destination = args.first || source.sub(/\.tt$/, '')
+
+      source  = File.expand_path(find_in_source_paths(source.to_s))
+      context = instance_eval('binding')
+
+      create_file destination, nil, config do
+        content = ERB.new(::File.binread(source), nil, '-', '@output_buffer').result(context)
+        content = block.call(content) if block
+        content
+      end
+    end
+
+    # Changes the mode of the given file or directory.
+    #
+    # ==== Parameters
+    # mode<Integer>:: the file mode
+    # path<String>:: the name of the file to change mode
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   chmod "script/*", 0755
+    #
+    def chmod(path, mode, config={})
+      return unless behavior == :invoke
+      path = File.expand_path(path, destination_root)
+      say_status :chmod, relative_to_original_destination_root(path), config.fetch(:verbose, true)
+      FileUtils.chmod_R(mode, path) unless options[:pretend]
+    end
+
+    # Prepend text to a file. Since it depends on insert_into_file, it's reversible.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # data<String>:: the data to prepend to the file, can be also given as a block.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   prepend_to_file 'config/environments/test.rb', 'config.gem "rspec"'
+    #
+    #   prepend_to_file 'config/environments/test.rb' do
+    #     'config.gem "rspec"'
+    #   end
+    #
+    def prepend_to_file(path, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      config.merge!(:after => /\A/)
+      insert_into_file(path, *(args << config), &block)
+    end
+    alias_method :prepend_file, :prepend_to_file
+
+    # Append text to a file. Since it depends on insert_into_file, it's reversible.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # data<String>:: the data to append to the file, can be also given as a block.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   append_to_file 'config/environments/test.rb', 'config.gem "rspec"'
+    #
+    #   append_to_file 'config/environments/test.rb' do
+    #     'config.gem "rspec"'
+    #   end
+    #
+    def append_to_file(path, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      config.merge!(:before => /\z/)
+      insert_into_file(path, *(args << config), &block)
+    end
+    alias_method :append_file, :append_to_file
+
+    # Injects text right after the class definition. Since it depends on
+    # insert_into_file, it's reversible.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # klass<String|Class>:: the class to be manipulated
+    # data<String>:: the data to append to the class, can be also given as a block.
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Examples
+    #
+    #   inject_into_class "app/controllers/application_controller.rb", ApplicationController, "  filter_parameter :password\n"
+    #
+    #   inject_into_class "app/controllers/application_controller.rb", ApplicationController do
+    #     "  filter_parameter :password\n"
+    #   end
+    #
+    def inject_into_class(path, klass, *args, &block)
+      config = args.last.is_a?(Hash) ? args.pop : {}
+      config.merge!(:after => /class #{klass}\n|class #{klass} .*\n/)
+      insert_into_file(path, *(args << config), &block)
+    end
+
+    # Run a regular expression replacement on a file.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # flag<Regexp|String>:: the regexp or string to be replaced
+    # replacement<String>:: the replacement, can be also given as a block
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   gsub_file 'app/controllers/application_controller.rb', /#\s*(filter_parameter_logging :password)/, '\1'
+    #
+    #   gsub_file 'README', /rake/, :green do |match|
+    #     match << " no more. Use thor!"
+    #   end
+    #
+    def gsub_file(path, flag, *args, &block)
+      return unless behavior == :invoke
+      config = args.last.is_a?(Hash) ? args.pop : {}
+
+      path = File.expand_path(path, destination_root)
+      say_status :gsub, relative_to_original_destination_root(path), config.fetch(:verbose, true)
+
+      unless options[:pretend]
+        content = File.binread(path)
+        content.gsub!(flag, *args, &block)
+        File.open(path, 'wb') { |file| file.write(content) }
+      end
+    end
+
+    # Uncomment all lines matching a given regex.  It will leave the space
+    # which existed before the comment hash in tact but will remove any spacing
+    # between the comment hash and the beginning of the line.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # flag<Regexp|String>:: the regexp or string used to decide which lines to uncomment
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   uncomment_lines 'config/initializers/session_store.rb', /active_record/
+    #
+    def uncomment_lines(path, flag, *args)
+      flag = flag.respond_to?(:source) ? flag.source : flag
+
+      gsub_file(path, /^(\s*)#\s*(.*#{flag})/, '\1\2', *args)
+    end
+
+    # Comment all lines matching a given regex.  It will leave the space
+    # which existed before the beginning of the line in tact and will insert
+    # a single space after the comment hash.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # flag<Regexp|String>:: the regexp or string used to decide which lines to comment
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   comment_lines 'config/initializers/session_store.rb', /cookie_store/
+    #
+    def comment_lines(path, flag, *args)
+      flag = flag.respond_to?(:source) ? flag.source : flag
+
+      gsub_file(path, /^(\s*)([^#|\n]*#{flag})/, '\1# \2', *args)
+    end
+
+    # Removes a file at the given location.
+    #
+    # ==== Parameters
+    # path<String>:: path of the file to be changed
+    # config<Hash>:: give :verbose => false to not log the status.
+    #
+    # ==== Example
+    #
+    #   remove_file 'README'
+    #   remove_file 'app/controllers/application_controller.rb'
+    #
+    def remove_file(path, config={})
+      return unless behavior == :invoke
+      path  = File.expand_path(path, destination_root)
+
+      say_status :remove, relative_to_original_destination_root(path), config.fetch(:verbose, true)
+      ::FileUtils.rm_rf(path) if !options[:pretend] && File.exists?(path)
+    end
+    alias :remove_dir :remove_file
+
+    attr_accessor :output_buffer
+  private
+    def concat(string)
+      @output_buffer.concat(string)
+    end
+
+    def capture(*args, &block)
+      with_output_buffer { block.call(*args) }
+    end
+
+    def with_output_buffer(buf = '') #:nodoc:
+      self.output_buffer, old_buffer = buf, output_buffer
+      yield
+      output_buffer
+    ensure
+      self.output_buffer = old_buffer
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/inject_into_file.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/inject_into_file.rb
new file mode 100644
index 0000000..c48cfab
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/actions/inject_into_file.rb
@@ -0,0 +1,109 @@
+require 'thor/actions/empty_directory'
+
+class Thor
+  module Actions
+
+    # Injects the given content into a file. Different from gsub_file, this
+    # method is reversible.
+    #
+    # ==== Parameters
+    # destination<String>:: Relative path to the destination root
+    # data<String>:: Data to add to the file. Can be given as a block.
+    # config<Hash>:: give :verbose => false to not log the status and the flag
+    #                for injection (:after or :before) or :force => true for
+    #                insert two or more times the same content.
+    #
+    # ==== Examples
+    #
+    #   insert_into_file "config/environment.rb", "config.gem :thor", :after => "Rails::Initializer.run do |config|\n"
+    #
+    #   insert_into_file "config/environment.rb", :after => "Rails::Initializer.run do |config|\n" do
+    #     gems = ask "Which gems would you like to add?"
+    #     gems.split(" ").map{ |gem| "  config.gem :#{gem}" }.join("\n")
+    #   end
+    #
+    def insert_into_file(destination, *args, &block)
+      if block_given?
+        data, config = block, args.shift
+      else
+        data, config = args.shift, args.shift
+      end
+      action InjectIntoFile.new(self, destination, data, config)
+    end
+    alias_method :inject_into_file, :insert_into_file
+
+    class InjectIntoFile < EmptyDirectory #:nodoc:
+      attr_reader :replacement, :flag, :behavior
+
+      def initialize(base, destination, data, config)
+        super(base, destination, { :verbose => true }.merge(config))
+
+        @behavior, @flag = if @config.key?(:after)
+          [:after, @config.delete(:after)]
+        else
+          [:before, @config.delete(:before)]
+        end
+
+        @replacement = data.is_a?(Proc) ? data.call : data
+        @flag = Regexp.escape(@flag) unless @flag.is_a?(Regexp)
+      end
+
+      def invoke!
+        say_status :invoke
+
+        content = if @behavior == :after
+          '\0' + replacement
+        else
+          replacement + '\0'
+        end
+
+        replace!(/#{flag}/, content, config[:force])
+      end
+
+      def revoke!
+        say_status :revoke
+
+        regexp = if @behavior == :after
+          content = '\1\2'
+          /(#{flag})(.*)(#{Regexp.escape(replacement)})/m
+        else
+          content = '\2\3'
+          /(#{Regexp.escape(replacement)})(.*)(#{flag})/m
+        end
+
+        replace!(regexp, content, true)
+      end
+
+      protected
+
+        def say_status(behavior)
+          status = if behavior == :invoke
+            if flag == /\A/
+               :prepend
+            elsif flag == /\z/
+              :append
+            else
+              :insert
+            end
+          else
+            :subtract
+          end
+
+          super(status, config[:verbose])
+        end
+
+        # Adds the content to the file.
+        #
+        def replace!(regexp, string, force)
+          unless base.options[:pretend]
+            content = File.binread(destination)
+            if force || !content.include?(replacement)
+              content.gsub!(regexp, string)
+              File.open(destination, 'wb') { |file| file.write(content) }
+            end
+          end
+        end
+
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/base.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/base.rb
new file mode 100644
index 0000000..aa1a6f6
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/base.rb
@@ -0,0 +1,650 @@
+require 'thor/core_ext/hash_with_indifferent_access'
+require 'thor/core_ext/ordered_hash'
+require 'thor/error'
+require 'thor/shell'
+require 'thor/invocation'
+require 'thor/parser'
+require 'thor/task'
+require 'thor/util'
+
+class Thor
+  autoload :Actions,    'thor/actions'
+  autoload :RakeCompat, 'thor/rake_compat'
+  autoload :Group,      'thor/group'
+
+  # Shortcuts for help.
+  HELP_MAPPINGS       = %w(-h -? --help -D)
+
+  # Thor methods that should not be overwritten by the user.
+  THOR_RESERVED_WORDS = %w(invoke shell options behavior root destination_root relative_root
+                           action add_file create_file in_root inside run run_ruby_script)
+
+  module Base
+    attr_accessor :options, :parent_options, :args
+
+    # It receives arguments in an Array and two hashes, one for options and
+    # other for configuration.
+    #
+    # Notice that it does not check if all required arguments were supplied.
+    # It should be done by the parser.
+    #
+    # ==== Parameters
+    # args<Array[Object]>:: An array of objects. The objects are applied to their
+    #                       respective accessors declared with <tt>argument</tt>.
+    #
+    # options<Hash>:: An options hash that will be available as self.options.
+    #                 The hash given is converted to a hash with indifferent
+    #                 access, magic predicates (options.skip?) and then frozen.
+    #
+    # config<Hash>:: Configuration for this Thor class.
+    #
+    def initialize(args=[], options={}, config={})
+      parse_options = self.class.class_options
+
+      # The start method splits inbound arguments at the first argument
+      # that looks like an option (starts with - or --). It then calls
+      # new, passing in the two halves of the arguments Array as the
+      # first two parameters.
+
+      if options.is_a?(Array)
+        task_options  = config.delete(:task_options) # hook for start
+        parse_options = parse_options.merge(task_options) if task_options
+        array_options, hash_options = options, {}
+      else
+        # Handle the case where the class was explicitly instantiated
+        # with pre-parsed options.
+        array_options, hash_options = [], options
+      end
+
+      # Let Thor::Options parse the options first, so it can remove
+      # declared options from the array. This will leave us with
+      # a list of arguments that weren't declared.
+      stop_on_unknown = self.class.stop_on_unknown_option? config[:current_task]
+      opts = Thor::Options.new(parse_options, hash_options, stop_on_unknown)
+      self.options = opts.parse(array_options)
+
+      # If unknown options are disallowed, make sure that none of the
+      # remaining arguments looks like an option.
+      opts.check_unknown! if self.class.check_unknown_options?(config)
+
+      # Add the remaining arguments from the options parser to the
+      # arguments passed in to initialize. Then remove any positional
+      # arguments declared using #argument (this is primarily used
+      # by Thor::Group). Tis will leave us with the remaining
+      # positional arguments.
+      to_parse  = args
+      to_parse += opts.remaining unless self.class.strict_args_position?(config)
+
+      thor_args = Thor::Arguments.new(self.class.arguments)
+      thor_args.parse(to_parse).each { |k,v| __send__("#{k}=", v) }
+      @args = thor_args.remaining
+    end
+
+    class << self
+      def included(base) #:nodoc:
+        base.send :extend,  ClassMethods
+        base.send :include, Invocation
+        base.send :include, Shell
+      end
+
+      # Returns the classes that inherits from Thor or Thor::Group.
+      #
+      # ==== Returns
+      # Array[Class]
+      #
+      def subclasses
+        @subclasses ||= []
+      end
+
+      # Returns the files where the subclasses are kept.
+      #
+      # ==== Returns
+      # Hash[path<String> => Class]
+      #
+      def subclass_files
+        @subclass_files ||= Hash.new{ |h,k| h[k] = [] }
+      end
+
+      # Whenever a class inherits from Thor or Thor::Group, we should track the
+      # class and the file on Thor::Base. This is the method responsable for it.
+      #
+      def register_klass_file(klass) #:nodoc:
+        file = caller[1].match(/(.*):\d+/)[1]
+        Thor::Base.subclasses << klass unless Thor::Base.subclasses.include?(klass)
+
+        file_subclasses = Thor::Base.subclass_files[File.expand_path(file)]
+        file_subclasses << klass unless file_subclasses.include?(klass)
+      end
+    end
+
+    module ClassMethods
+      def attr_reader(*) #:nodoc:
+        no_tasks { super }
+      end
+
+      def attr_writer(*) #:nodoc:
+        no_tasks { super }
+      end
+
+      def attr_accessor(*) #:nodoc:
+        no_tasks { super }
+      end
+
+      # If you want to raise an error for unknown options, call check_unknown_options!
+      # This is disabled by default to allow dynamic invocations.
+      def check_unknown_options!
+        @check_unknown_options = true
+      end
+
+      def check_unknown_options #:nodoc:
+        @check_unknown_options ||= from_superclass(:check_unknown_options, false)
+      end
+
+      def check_unknown_options?(config) #:nodoc:
+        !!check_unknown_options
+      end
+
+      # If true, option parsing is suspended as soon as an unknown option or a
+      # regular argument is encountered.  All remaining arguments are passed to
+      # the task as regular arguments.
+      def stop_on_unknown_option?(task_name) #:nodoc:
+        false
+      end
+
+      # If you want only strict string args (useful when cascading thor classes),
+      # call strict_args_position! This is disabled by default to allow dynamic
+      # invocations.
+      def strict_args_position!
+        @strict_args_position = true
+      end
+
+      def strict_args_position #:nodoc:
+        @strict_args_position ||= from_superclass(:strict_args_position, false)
+      end
+
+      def strict_args_position?(config) #:nodoc:
+        !!strict_args_position
+      end
+
+      # Adds an argument to the class and creates an attr_accessor for it.
+      #
+      # Arguments are different from options in several aspects. The first one
+      # is how they are parsed from the command line, arguments are retrieved
+      # from position:
+      #
+      #   thor task NAME
+      #
+      # Instead of:
+      #
+      #   thor task --name=NAME
+      #
+      # Besides, arguments are used inside your code as an accessor (self.argument),
+      # while options are all kept in a hash (self.options).
+      #
+      # Finally, arguments cannot have type :default or :boolean but can be
+      # optional (supplying :optional => :true or :required => false), although
+      # you cannot have a required argument after a non-required argument. If you
+      # try it, an error is raised.
+      #
+      # ==== Parameters
+      # name<Symbol>:: The name of the argument.
+      # options<Hash>:: Described below.
+      #
+      # ==== Options
+      # :desc     - Description for the argument.
+      # :required - If the argument is required or not.
+      # :optional - If the argument is optional or not.
+      # :type     - The type of the argument, can be :string, :hash, :array, :numeric.
+      # :default  - Default value for this argument. It cannot be required and have default values.
+      # :banner   - String to show on usage notes.
+      #
+      # ==== Errors
+      # ArgumentError:: Raised if you supply a required argument after a non required one.
+      #
+      def argument(name, options={})
+        is_thor_reserved_word?(name, :argument)
+        no_tasks { attr_accessor name }
+
+        required = if options.key?(:optional)
+          !options[:optional]
+        elsif options.key?(:required)
+          options[:required]
+        else
+          options[:default].nil?
+        end
+
+        remove_argument name
+
+        arguments.each do |argument|
+          next if argument.required?
+          raise ArgumentError, "You cannot have #{name.to_s.inspect} as required argument after " <<
+                               "the non-required argument #{argument.human_name.inspect}."
+        end if required
+
+        options[:required] = required
+
+        arguments << Thor::Argument.new(name, options)
+      end
+
+      # Returns this class arguments, looking up in the ancestors chain.
+      #
+      # ==== Returns
+      # Array[Thor::Argument]
+      #
+      def arguments
+        @arguments ||= from_superclass(:arguments, [])
+      end
+
+      # Adds a bunch of options to the set of class options.
+      #
+      #   class_options :foo => false, :bar => :required, :baz => :string
+      #
+      # If you prefer more detailed declaration, check class_option.
+      #
+      # ==== Parameters
+      # Hash[Symbol => Object]
+      #
+      def class_options(options=nil)
+        @class_options ||= from_superclass(:class_options, {})
+        build_options(options, @class_options) if options
+        @class_options
+      end
+
+      # Adds an option to the set of class options
+      #
+      # ==== Parameters
+      # name<Symbol>:: The name of the argument.
+      # options<Hash>:: Described below.
+      #
+      # ==== Options
+      # :desc::     -- Description for the argument.
+      # :required:: -- If the argument is required or not.
+      # :default::  -- Default value for this argument.
+      # :group::    -- The group for this options. Use by class options to output options in different levels.
+      # :aliases::  -- Aliases for this option. <b>Note:</b> Thor follows a convention of one-dash-one-letter options. Thus aliases like "-something" wouldn't be parsed; use either "\--something" or "-s" instead.
+      # :type::     -- The type of the argument, can be :string, :hash, :array, :numeric or :boolean.
+      # :banner::   -- String to show on usage notes.
+      # :hide::     -- If you want to hide this option from the help.
+      #
+      def class_option(name, options={})
+        build_option(name, options, class_options)
+      end
+
+      # Removes a previous defined argument. If :undefine is given, undefine
+      # accessors as well.
+      #
+      # ==== Parameters
+      # names<Array>:: Arguments to be removed
+      #
+      # ==== Examples
+      #
+      #   remove_argument :foo
+      #   remove_argument :foo, :bar, :baz, :undefine => true
+      #
+      def remove_argument(*names)
+        options = names.last.is_a?(Hash) ? names.pop : {}
+
+        names.each do |name|
+          arguments.delete_if { |a| a.name == name.to_s }
+          undef_method name, "#{name}=" if options[:undefine]
+        end
+      end
+
+      # Removes a previous defined class option.
+      #
+      # ==== Parameters
+      # names<Array>:: Class options to be removed
+      #
+      # ==== Examples
+      #
+      #   remove_class_option :foo
+      #   remove_class_option :foo, :bar, :baz
+      #
+      def remove_class_option(*names)
+        names.each do |name|
+          class_options.delete(name)
+        end
+      end
+
+      # Defines the group. This is used when thor list is invoked so you can specify
+      # that only tasks from a pre-defined group will be shown. Defaults to standard.
+      #
+      # ==== Parameters
+      # name<String|Symbol>
+      #
+      def group(name=nil)
+        case name
+          when nil
+            @group ||= from_superclass(:group, 'standard')
+          else
+            @group = name.to_s
+        end
+      end
+
+      # Returns the tasks for this Thor class.
+      #
+      # ==== Returns
+      # OrderedHash:: An ordered hash with tasks names as keys and Thor::Task
+      #               objects as values.
+      #
+      def tasks
+        @tasks ||= Thor::CoreExt::OrderedHash.new
+      end
+
+      # Returns the tasks for this Thor class and all subclasses.
+      #
+      # ==== Returns
+      # OrderedHash:: An ordered hash with tasks names as keys and Thor::Task
+      #               objects as values.
+      #
+      def all_tasks
+        @all_tasks ||= from_superclass(:all_tasks, Thor::CoreExt::OrderedHash.new)
+        @all_tasks.merge(tasks)
+      end
+
+      # Removes a given task from this Thor class. This is usually done if you
+      # are inheriting from another class and don't want it to be available
+      # anymore.
+      #
+      # By default it only remove the mapping to the task. But you can supply
+      # :undefine => true to undefine the method from the class as well.
+      #
+      # ==== Parameters
+      # name<Symbol|String>:: The name of the task to be removed
+      # options<Hash>:: You can give :undefine => true if you want tasks the method
+      #                 to be undefined from the class as well.
+      #
+      def remove_task(*names)
+        options = names.last.is_a?(Hash) ? names.pop : {}
+
+        names.each do |name|
+          tasks.delete(name.to_s)
+          all_tasks.delete(name.to_s)
+          undef_method name if options[:undefine]
+        end
+      end
+
+      # All methods defined inside the given block are not added as tasks.
+      #
+      # So you can do:
+      #
+      #   class MyScript < Thor
+      #     no_tasks do
+      #       def this_is_not_a_task
+      #       end
+      #     end
+      #   end
+      #
+      # You can also add the method and remove it from the task list:
+      #
+      #   class MyScript < Thor
+      #     def this_is_not_a_task
+      #     end
+      #     remove_task :this_is_not_a_task
+      #   end
+      #
+      def no_tasks
+        @no_tasks = true
+        yield
+      ensure
+        @no_tasks = false
+      end
+
+      # Sets the namespace for the Thor or Thor::Group class. By default the
+      # namespace is retrieved from the class name. If your Thor class is named
+      # Scripts::MyScript, the help method, for example, will be called as:
+      #
+      #   thor scripts:my_script -h
+      #
+      # If you change the namespace:
+      #
+      #   namespace :my_scripts
+      #
+      # You change how your tasks are invoked:
+      #
+      #   thor my_scripts -h
+      #
+      # Finally, if you change your namespace to default:
+      #
+      #   namespace :default
+      #
+      # Your tasks can be invoked with a shortcut. Instead of:
+      #
+      #   thor :my_task
+      #
+      def namespace(name=nil)
+        case name
+        when nil
+          @namespace ||= Thor::Util.namespace_from_thor_class(self)
+        else
+          @namespace = name.to_s
+        end
+      end
+
+      # Parses the task and options from the given args, instantiate the class
+      # and invoke the task. This method is used when the arguments must be parsed
+      # from an array. If you are inside Ruby and want to use a Thor class, you
+      # can simply initialize it:
+      #
+      #   script = MyScript.new(args, options, config)
+      #   script.invoke(:task, first_arg, second_arg, third_arg)
+      #
+      def start(given_args=ARGV, config={})
+        config[:shell] ||= Thor::Base.shell.new
+        dispatch(nil, given_args.dup, nil, config)
+      rescue Thor::Error => e
+        ENV["THOR_DEBUG"] == "1" ? (raise e) : config[:shell].error(e.message)
+        exit(1) if exit_on_failure?
+      rescue Errno::EPIPE
+        # This happens if a thor task is piped to something like `head`,
+        # which closes the pipe when it's done reading. This will also
+        # mean that if the pipe is closed, further unnecessary
+        # computation will not occur.
+        exit(0)
+      end
+
+      # Allows to use private methods from parent in child classes as tasks.
+      #
+      # ==== Parameters
+      #   names<Array>:: Method names to be used as tasks
+      #
+      # ==== Examples
+      #
+      #   public_task :foo
+      #   public_task :foo, :bar, :baz
+      #
+      def public_task(*names)
+        names.each do |name|
+          class_eval "def #{name}(*); super end"
+        end
+      end
+
+      def handle_no_task_error(task, has_namespace = $thor_runner) #:nodoc:
+        if has_namespace
+          raise UndefinedTaskError, "Could not find task #{task.inspect} in #{namespace.inspect} namespace."
+        else
+          raise UndefinedTaskError, "Could not find task #{task.inspect}."
+        end
+      end
+
+      def handle_argument_error(task, error, arity=nil) #:nodoc:
+        msg = "#{basename} #{task.name}"
+        if arity
+          required = arity < 0 ? (-1 - arity) : arity
+          msg << " requires at least #{required} argument"
+          msg << "s" if required > 1
+        else
+          msg = "call #{msg} as"
+        end
+
+        msg << ": #{self.banner(task).inspect}."
+        raise InvocationError, msg
+      end
+
+      protected
+
+        # Prints the class options per group. If an option does not belong to
+        # any group, it's printed as Class option.
+        #
+        def class_options_help(shell, groups={}) #:nodoc:
+          # Group options by group
+          class_options.each do |_, value|
+            groups[value.group] ||= []
+            groups[value.group] << value
+          end
+
+          # Deal with default group
+          global_options = groups.delete(nil) || []
+          print_options(shell, global_options)
+
+          # Print all others
+          groups.each do |group_name, options|
+            print_options(shell, options, group_name)
+          end
+        end
+
+        # Receives a set of options and print them.
+        def print_options(shell, options, group_name=nil)
+          return if options.empty?
+
+          list = []
+          padding = options.collect{ |o| o.aliases.size }.max.to_i * 4
+
+          options.each do |option|
+            unless option.hide
+              item = [ option.usage(padding) ]
+              item.push(option.description ? "# #{option.description}" : "")
+
+              list << item
+              list << [ "", "# Default: #{option.default}" ] if option.show_default?
+              list << [ "", "# Possible values: #{option.enum.join(', ')}" ] if option.enum
+            end
+          end
+
+          shell.say(group_name ? "#{group_name} options:" : "Options:")
+          shell.print_table(list, :indent => 2)
+          shell.say ""
+        end
+
+        # Raises an error if the word given is a Thor reserved word.
+        def is_thor_reserved_word?(word, type) #:nodoc:
+          return false unless THOR_RESERVED_WORDS.include?(word.to_s)
+          raise "#{word.inspect} is a Thor reserved word and cannot be defined as #{type}"
+        end
+
+        # Build an option and adds it to the given scope.
+        #
+        # ==== Parameters
+        # name<Symbol>:: The name of the argument.
+        # options<Hash>:: Described in both class_option and method_option.
+        # scope<Hash>:: Options hash that is being built up
+        def build_option(name, options, scope) #:nodoc:
+          scope[name] = Thor::Option.new(name, options)
+        end
+
+        # Receives a hash of options, parse them and add to the scope. This is a
+        # fast way to set a bunch of options:
+        #
+        #   build_options :foo => true, :bar => :required, :baz => :string
+        #
+        # ==== Parameters
+        # Hash[Symbol => Object]
+        def build_options(options, scope) #:nodoc:
+          options.each do |key, value|
+            scope[key] = Thor::Option.parse(key, value)
+          end
+        end
+
+        # Finds a task with the given name. If the task belongs to the current
+        # class, just return it, otherwise dup it and add the fresh copy to the
+        # current task hash.
+        def find_and_refresh_task(name) #:nodoc:
+          task = if task = tasks[name.to_s]
+            task
+          elsif task = all_tasks[name.to_s]
+            tasks[name.to_s] = task.clone
+          else
+            raise ArgumentError, "You supplied :for => #{name.inspect}, but the task #{name.inspect} could not be found."
+          end
+        end
+
+        # Everytime someone inherits from a Thor class, register the klass
+        # and file into baseclass.
+        def inherited(klass)
+          Thor::Base.register_klass_file(klass)
+          klass.instance_variable_set(:@no_tasks, false)
+        end
+
+        # Fire this callback whenever a method is added. Added methods are
+        # tracked as tasks by invoking the create_task method.
+        def method_added(meth)
+          meth = meth.to_s
+
+          if meth == "initialize"
+            initialize_added
+            return
+          end
+
+          # Return if it's not a public instance method
+          return unless public_instance_methods.include?(meth) ||
+                        public_instance_methods.include?(meth.to_sym)
+
+          return if (defined?(@no_tasks) && @no_tasks) || !create_task(meth)
+
+          is_thor_reserved_word?(meth, :task)
+          Thor::Base.register_klass_file(self)
+        end
+
+        # Retrieves a value from superclass. If it reaches the baseclass,
+        # returns default.
+        def from_superclass(method, default=nil)
+          if self == baseclass || !superclass.respond_to?(method, true)
+            default
+          else
+            value = superclass.send(method)
+
+            if value
+              if value.is_a?(TrueClass) || value.is_a?(Symbol)
+                value
+              else
+                value.dup
+              end
+            end
+          end
+        end
+
+        # A flag that makes the process exit with status 1 if any error happens.
+        def exit_on_failure?
+          false
+        end
+
+        #
+        # The basename of the program invoking the thor class.
+        #
+        def basename
+          File.basename($0).split(' ').first
+        end
+
+        # SIGNATURE: Sets the baseclass. This is where the superclass lookup
+        # finishes.
+        def baseclass #:nodoc:
+        end
+
+        # SIGNATURE: Creates a new task if valid_task? is true. This method is
+        # called when a new method is added to the class.
+        def create_task(meth) #:nodoc:
+        end
+
+        # SIGNATURE: Defines behavior when the initialize method is added to the
+        # class.
+        def initialize_added #:nodoc:
+        end
+
+        # SIGNATURE: The hook invoked by start.
+        def dispatch(task, given_args, given_opts, config) #:nodoc:
+          raise NotImplementedError
+        end
+
+    end
+  end
+end
diff --git a/public/images/.gitkeep b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/core_ext/dir_escape.rb
similarity index 100%
copy from public/images/.gitkeep
copy to misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/core_ext/dir_escape.rb
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/core_ext/file_binary_read.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/core_ext/file_binary_read.rb
new file mode 100644
index 0000000..d6af7e4
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/core_ext/file_binary_read.rb
@@ -0,0 +1,9 @@
+class File #:nodoc:
+
+  unless File.respond_to?(:binread)
+    def self.binread(file)
+      File.open(file, 'rb') { |f| f.read }
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/core_ext/hash_with_indifferent_access.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/core_ext/hash_with_indifferent_access.rb
new file mode 100644
index 0000000..0a583e6
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/core_ext/hash_with_indifferent_access.rb
@@ -0,0 +1,80 @@
+class Thor
+  module CoreExt #:nodoc:
+
+    # A hash with indifferent access and magic predicates.
+    #
+    #   hash = Thor::CoreExt::HashWithIndifferentAccess.new 'foo' => 'bar', 'baz' => 'bee', 'force' => true
+    #
+    #   hash[:foo]  #=> 'bar'
+    #   hash['foo'] #=> 'bar'
+    #   hash.foo?   #=> true
+    #
+    class HashWithIndifferentAccess < ::Hash #:nodoc:
+
+      def initialize(hash={})
+        super()
+        hash.each do |key, value|
+          self[convert_key(key)] = value
+        end
+      end
+
+      def [](key)
+        super(convert_key(key))
+      end
+
+      def []=(key, value)
+        super(convert_key(key), value)
+      end
+
+      def delete(key)
+        super(convert_key(key))
+      end
+
+      def values_at(*indices)
+        indices.collect { |key| self[convert_key(key)] }
+      end
+
+      def merge(other)
+        dup.merge!(other)
+      end
+
+      def merge!(other)
+        other.each do |key, value|
+          self[convert_key(key)] = value
+        end
+        self
+      end
+
+      # Convert to a Hash with String keys.
+      def to_hash
+        Hash.new(default).merge!(self)
+      end
+
+      protected
+
+        def convert_key(key)
+          key.is_a?(Symbol) ? key.to_s : key
+        end
+
+        # Magic predicates. For instance:
+        #
+        #   options.force?                  # => !!options['force']
+        #   options.shebang                 # => "/usr/lib/local/ruby"
+        #   options.test_framework?(:rspec) # => options[:test_framework] == :rspec
+        #
+        def method_missing(method, *args, &block)
+          method = method.to_s
+          if method =~ /^(\w+)\?$/
+            if args.empty?
+              !!self[$1]
+            else
+              self[$1] == args.first
+            end
+          else
+            self[method]
+          end
+        end
+
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/core_ext/ordered_hash.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/core_ext/ordered_hash.rb
new file mode 100644
index 0000000..27fea5b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/core_ext/ordered_hash.rb
@@ -0,0 +1,100 @@
+class Thor
+  module CoreExt #:nodoc:
+
+    if RUBY_VERSION >= '1.9'
+      class OrderedHash < ::Hash
+      end
+    else
+      # This class is based on the Ruby 1.9 ordered hashes.
+      #
+      # It keeps the semantics and most of the efficiency of normal hashes
+      # while also keeping track of the order in which elements were set.
+      #
+      class OrderedHash #:nodoc:
+        include Enumerable
+
+        Node = Struct.new(:key, :value, :next, :prev)
+
+        def initialize
+          @hash = {}
+        end
+
+        def [](key)
+          @hash[key] && @hash[key].value
+        end
+
+        def []=(key, value)
+          if node = @hash[key]
+            node.value = value
+          else
+            node = Node.new(key, value)
+
+            if @first.nil?
+              @first = @last = node
+            else
+              node.prev = @last
+              @last.next = node
+              @last = node
+            end
+          end
+
+          @hash[key] = node
+          value
+        end
+
+        def delete(key)
+          if node = @hash[key]
+            prev_node = node.prev
+            next_node = node.next
+
+            next_node.prev = prev_node if next_node
+            prev_node.next = next_node if prev_node
+
+            @first = next_node if @first == node
+            @last = prev_node  if @last  == node
+
+            value = node.value
+          end
+
+          @hash.delete(key)
+          value
+        end
+
+        def keys
+          self.map { |k, v| k }
+        end
+
+        def values
+          self.map { |k, v| v }
+        end
+
+        def each
+          return unless @first
+          yield [@first.key, @first.value]
+          node = @first
+          yield [node.key, node.value] while node = node.next
+          self
+        end
+
+        def merge(other)
+          hash = self.class.new
+
+          self.each do |key, value|
+            hash[key] = value
+          end
+
+          other.each do |key, value|
+            hash[key] = value
+          end
+
+          hash
+        end
+
+        def empty?
+          @hash.empty?
+        end
+      end
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/error.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/error.rb
new file mode 100644
index 0000000..532db46
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/error.rb
@@ -0,0 +1,35 @@
+class Thor
+  # Thor::Error is raised when it's caused by wrong usage of thor classes. Those
+  # errors have their backtrace suppressed and are nicely shown to the user.
+  #
+  # Errors that are caused by the developer, like declaring a method which
+  # overwrites a thor keyword, it SHOULD NOT raise a Thor::Error. This way, we
+  # ensure that developer errors are shown with full backtrace.
+  #
+  class Error < StandardError
+  end
+
+  # Raised when a task was not found.
+  #
+  class UndefinedTaskError < Error
+  end
+
+  # Raised when a task was found, but not invoked properly.
+  #
+  class InvocationError < Error
+  end
+
+  class UnknownArgumentError < Error
+  end
+
+  class RequiredArgumentMissingError < InvocationError
+  end
+
+  class MalformattedArgumentError < InvocationError
+  end
+
+  # Raised when a user tries to call a private method encoded in templated filename.
+  #
+  class PrivateMethodEncodedError < Error
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/group.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/group.rb
new file mode 100644
index 0000000..874ac47
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/group.rb
@@ -0,0 +1,285 @@
+require 'thor/base'
+
+# Thor has a special class called Thor::Group. The main difference to Thor class
+# is that it invokes all tasks at once. It also include some methods that allows
+# invocations to be done at the class method, which are not available to Thor
+# tasks.
+class Thor::Group
+  class << self
+    # The description for this Thor::Group. If none is provided, but a source root
+    # exists, tries to find the USAGE one folder above it, otherwise searches
+    # in the superclass.
+    #
+    # ==== Parameters
+    # description<String>:: The description for this Thor::Group.
+    #
+    def desc(description=nil)
+      case description
+        when nil
+          @desc ||= from_superclass(:desc, nil)
+        else
+          @desc = description
+      end
+    end
+
+    # Prints help information.
+    #
+    # ==== Options
+    # short:: When true, shows only usage.
+    #
+    def help(shell)
+      shell.say "Usage:"
+      shell.say "  #{banner}\n"
+      shell.say
+      class_options_help(shell)
+      shell.say self.desc if self.desc
+    end
+
+    # Stores invocations for this class merging with superclass values.
+    #
+    def invocations #:nodoc:
+      @invocations ||= from_superclass(:invocations, {})
+    end
+
+    # Stores invocation blocks used on invoke_from_option.
+    #
+    def invocation_blocks #:nodoc:
+      @invocation_blocks ||= from_superclass(:invocation_blocks, {})
+    end
+
+    # Invoke the given namespace or class given. It adds an instance
+    # method that will invoke the klass and task. You can give a block to
+    # configure how it will be invoked.
+    #
+    # The namespace/class given will have its options showed on the help
+    # usage. Check invoke_from_option for more information.
+    #
+    def invoke(*names, &block)
+      options = names.last.is_a?(Hash) ? names.pop : {}
+      verbose = options.fetch(:verbose, true)
+
+      names.each do |name|
+        invocations[name] = false
+        invocation_blocks[name] = block if block_given?
+
+        class_eval <<-METHOD, __FILE__, __LINE__
+          def _invoke_#{name.to_s.gsub(/\W/, '_')}
+            klass, task = self.class.prepare_for_invocation(nil, #{name.inspect})
+
+            if klass
+              say_status :invoke, #{name.inspect}, #{verbose.inspect}
+              block = self.class.invocation_blocks[#{name.inspect}]
+              _invoke_for_class_method klass, task, &block
+            else
+              say_status :error, %(#{name.inspect} [not found]), :red
+            end
+          end
+        METHOD
+      end
+    end
+
+    # Invoke a thor class based on the value supplied by the user to the
+    # given option named "name". A class option must be created before this
+    # method is invoked for each name given.
+    #
+    # ==== Examples
+    #
+    #   class GemGenerator < Thor::Group
+    #     class_option :test_framework, :type => :string
+    #     invoke_from_option :test_framework
+    #   end
+    #
+    # ==== Boolean options
+    #
+    # In some cases, you want to invoke a thor class if some option is true or
+    # false. This is automatically handled by invoke_from_option. Then the
+    # option name is used to invoke the generator.
+    #
+    # ==== Preparing for invocation
+    #
+    # In some cases you want to customize how a specified hook is going to be
+    # invoked. You can do that by overwriting the class method
+    # prepare_for_invocation. The class method must necessarily return a klass
+    # and an optional task.
+    #
+    # ==== Custom invocations
+    #
+    # You can also supply a block to customize how the option is going to be
+    # invoked. The block receives two parameters, an instance of the current
+    # class and the klass to be invoked.
+    #
+    def invoke_from_option(*names, &block)
+      options = names.last.is_a?(Hash) ? names.pop : {}
+      verbose = options.fetch(:verbose, :white)
+
+      names.each do |name|
+        unless class_options.key?(name)
+          raise ArgumentError, "You have to define the option #{name.inspect} " <<
+                               "before setting invoke_from_option."
+        end
+
+        invocations[name] = true
+        invocation_blocks[name] = block if block_given?
+
+        class_eval <<-METHOD, __FILE__, __LINE__
+          def _invoke_from_option_#{name.to_s.gsub(/\W/, '_')}
+            return unless options[#{name.inspect}]
+
+            value = options[#{name.inspect}]
+            value = #{name.inspect} if TrueClass === value
+            klass, task = self.class.prepare_for_invocation(#{name.inspect}, value)
+
+            if klass
+              say_status :invoke, value, #{verbose.inspect}
+              block = self.class.invocation_blocks[#{name.inspect}]
+              _invoke_for_class_method klass, task, &block
+            else
+              say_status :error, %(\#{value} [not found]), :red
+            end
+          end
+        METHOD
+      end
+    end
+
+    # Remove a previously added invocation.
+    #
+    # ==== Examples
+    #
+    #   remove_invocation :test_framework
+    #
+    def remove_invocation(*names)
+      names.each do |name|
+        remove_task(name)
+        remove_class_option(name)
+        invocations.delete(name)
+        invocation_blocks.delete(name)
+      end
+    end
+
+    # Overwrite class options help to allow invoked generators options to be
+    # shown recursively when invoking a generator.
+    #
+    def class_options_help(shell, groups={}) #:nodoc:
+      get_options_from_invocations(groups, class_options) do |klass|
+        klass.send(:get_options_from_invocations, groups, class_options)
+      end
+      super(shell, groups)
+    end
+
+    # Get invocations array and merge options from invocations. Those
+    # options are added to group_options hash. Options that already exists
+    # in base_options are not added twice.
+    #
+    def get_options_from_invocations(group_options, base_options) #:nodoc:
+      invocations.each do |name, from_option|
+        value = if from_option
+          option = class_options[name]
+          option.type == :boolean ? name : option.default
+        else
+          name
+        end
+        next unless value
+
+        klass, _ = prepare_for_invocation(name, value)
+        next unless klass && klass.respond_to?(:class_options)
+
+        value = value.to_s
+        human_name = value.respond_to?(:classify) ? value.classify : value
+
+        group_options[human_name] ||= []
+        group_options[human_name] += klass.class_options.values.select do |class_option|
+          base_options[class_option.name.to_sym].nil? && class_option.group.nil? &&
+          !group_options.values.flatten.any? { |i| i.name == class_option.name }
+        end
+
+        yield klass if block_given?
+      end
+    end
+
+    # Returns tasks ready to be printed.
+    def printable_tasks(*)
+      item = []
+      item << banner
+      item << (desc ? "# #{desc.gsub(/\s+/m,' ')}" : "")
+      [item]
+    end
+
+    def handle_argument_error(task, error, arity=nil) #:nodoc:
+      if arity > 0
+        msg = "#{basename} #{task.name} takes #{arity} argument"
+        msg << "s" if arity > 1
+        msg << ", but it should not."
+      else
+        msg = "You should not pass arguments to #{basename} #{task.name}."
+      end
+
+      raise error, msg
+    end
+
+    protected
+
+      # The method responsible for dispatching given the args.
+      def dispatch(task, given_args, given_opts, config) #:nodoc:
+        if Thor::HELP_MAPPINGS.include?(given_args.first)
+          help(config[:shell])
+          return
+        end
+
+        args, opts = Thor::Options.split(given_args)
+        opts = given_opts || opts
+
+        instance = new(args, opts, config)
+        yield instance if block_given?
+        args = instance.args
+
+        if task
+          instance.invoke_task(all_tasks[task])
+        else
+          instance.invoke_all
+        end
+      end
+
+      # The banner for this class. You can customize it if you are invoking the
+      # thor class by another ways which is not the Thor::Runner.
+      def banner
+        "#{basename} #{self_task.formatted_usage(self, false)}"
+      end
+
+      # Represents the whole class as a task.
+      def self_task #:nodoc:
+        Thor::DynamicTask.new(self.namespace, class_options)
+      end
+
+      def baseclass #:nodoc:
+        Thor::Group
+      end
+
+      def create_task(meth) #:nodoc:
+        tasks[meth.to_s] = Thor::Task.new(meth, nil, nil, nil, nil)
+        true
+      end
+  end
+
+  include Thor::Base
+
+  protected
+
+  # Shortcut to invoke with padding and block handling. Use internally by
+  # invoke and invoke_from_option class methods.
+  def _invoke_for_class_method(klass, task=nil, *args, &block) #:nodoc:
+    with_padding do
+      if block
+        case block.arity
+        when 3
+          block.call(self, klass, task)
+        when 2
+          block.call(self, klass)
+        when 1
+          instance_exec(klass, &block)
+        end
+      else
+        invoke klass, task, *args
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/invocation.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/invocation.rb
new file mode 100644
index 0000000..71db7c8
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/invocation.rb
@@ -0,0 +1,170 @@
+class Thor
+  module Invocation
+    def self.included(base) #:nodoc:
+      base.extend ClassMethods
+    end
+
+    module ClassMethods
+      # This method is responsible for receiving a name and find the proper
+      # class and task for it. The key is an optional parameter which is
+      # available only in class methods invocations (i.e. in Thor::Group).
+      def prepare_for_invocation(key, name) #:nodoc:
+        case name
+        when Symbol, String
+          Thor::Util.find_class_and_task_by_namespace(name.to_s, !key)
+        else
+          name
+        end
+      end
+    end
+
+    # Make initializer aware of invocations and the initialization args.
+    def initialize(args=[], options={}, config={}, &block) #:nodoc:
+      @_invocations = config[:invocations] || Hash.new { |h,k| h[k] = [] }
+      @_initializer = [ args, options, config ]
+      super
+    end
+
+    # Receives a name and invokes it. The name can be a string (either "task" or
+    # "namespace:task"), a Thor::Task, a Class or a Thor instance. If the task
+    # cannot be guessed by name, it can also be supplied as second argument.
+    #
+    # You can also supply the arguments, options and configuration values for
+    # the task to be invoked, if none is given, the same values used to
+    # initialize the invoker are used to initialize the invoked.
+    #
+    # When no name is given, it will invoke the default task of the current class.
+    #
+    # ==== Examples
+    #
+    #   class A < Thor
+    #     def foo
+    #       invoke :bar
+    #       invoke "b:hello", ["José"]
+    #     end
+    #
+    #     def bar
+    #       invoke "b:hello", ["José"]
+    #     end
+    #   end
+    #
+    #   class B < Thor
+    #     def hello(name)
+    #       puts "hello #{name}"
+    #     end
+    #   end
+    #
+    # You can notice that the method "foo" above invokes two tasks: "bar",
+    # which belongs to the same class and "hello" which belongs to the class B.
+    #
+    # By using an invocation system you ensure that a task is invoked only once.
+    # In the example above, invoking "foo" will invoke "b:hello" just once, even
+    # if it's invoked later by "bar" method.
+    #
+    # When class A invokes class B, all arguments used on A initialization are
+    # supplied to B. This allows lazy parse of options. Let's suppose you have
+    # some rspec tasks:
+    #
+    #   class Rspec < Thor::Group
+    #     class_option :mock_framework, :type => :string, :default => :rr
+    #
+    #     def invoke_mock_framework
+    #       invoke "rspec:#{options[:mock_framework]}"
+    #     end
+    #   end
+    #
+    # As you noticed, it invokes the given mock framework, which might have its
+    # own options:
+    #
+    #   class Rspec::RR < Thor::Group
+    #     class_option :style, :type => :string, :default => :mock
+    #   end
+    #
+    # Since it's not rspec concern to parse mock framework options, when RR
+    # is invoked all options are parsed again, so RR can extract only the options
+    # that it's going to use.
+    #
+    # If you want Rspec::RR to be initialized with its own set of options, you
+    # have to do that explicitly:
+    #
+    #   invoke "rspec:rr", [], :style => :foo
+    #
+    # Besides giving an instance, you can also give a class to invoke:
+    #
+    #   invoke Rspec::RR, [], :style => :foo
+    #
+    def invoke(name=nil, *args)
+      if name.nil?
+        warn "[Thor] Calling invoke() without argument is deprecated. Please use invoke_all instead.\n#{caller.join("\n")}"
+        return invoke_all
+      end
+
+      args.unshift(nil) if Array === args.first || NilClass === args.first
+      task, args, opts, config = args
+
+      klass, task = _retrieve_class_and_task(name, task)
+      raise "Expected Thor class, got #{klass}" unless klass <= Thor::Base
+
+      args, opts, config = _parse_initialization_options(args, opts, config)
+      klass.send(:dispatch, task, args, opts, config) do |instance|
+        instance.parent_options = options
+      end
+    end
+
+    # Invoke the given task if the given args.
+    def invoke_task(task, *args) #:nodoc:
+      current = @_invocations[self.class]
+
+      unless current.include?(task.name)
+        current << task.name
+        task.run(self, *args)
+      end
+    end
+
+    # Invoke all tasks for the current instance.
+    def invoke_all #:nodoc:
+      self.class.all_tasks.map { |_, task| invoke_task(task) }
+    end
+
+    # Invokes using shell padding.
+    def invoke_with_padding(*args)
+      with_padding { invoke(*args) }
+    end
+
+    protected
+
+      # Configuration values that are shared between invocations.
+      def _shared_configuration #:nodoc:
+        { :invocations => @_invocations }
+      end
+
+      # This method simply retrieves the class and task to be invoked.
+      # If the name is nil or the given name is a task in the current class,
+      # use the given name and return self as class. Otherwise, call
+      # prepare_for_invocation in the current class.
+      def _retrieve_class_and_task(name, sent_task=nil) #:nodoc:
+        case
+        when name.nil?
+          [self.class, nil]
+        when self.class.all_tasks[name.to_s]
+          [self.class, name.to_s]
+        else
+          klass, task = self.class.prepare_for_invocation(nil, name)
+          [klass, task || sent_task]
+        end
+      end
+
+      # Initialize klass using values stored in the @_initializer.
+      def _parse_initialization_options(args, opts, config) #:nodoc:
+        stored_args, stored_opts, stored_config = @_initializer
+
+        args ||= stored_args.dup
+        opts ||= stored_opts.dup
+
+        config ||= {}
+        config = stored_config.merge(_shared_configuration).merge!(config)
+
+        [ args, opts, config ]
+      end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser.rb
new file mode 100644
index 0000000..57a3f6e
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser.rb
@@ -0,0 +1,4 @@
+require 'thor/parser/argument'
+require 'thor/parser/arguments'
+require 'thor/parser/option'
+require 'thor/parser/options'
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser/argument.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser/argument.rb
new file mode 100644
index 0000000..39ef9f2
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser/argument.rb
@@ -0,0 +1,74 @@
+class Thor
+  class Argument #:nodoc:
+    VALID_TYPES = [ :numeric, :hash, :array, :string ]
+
+    attr_reader :name, :description, :enum, :required, :type, :default, :banner
+    alias :human_name :name
+
+    def initialize(name, options={})
+      class_name = self.class.name.split("::").last
+
+      type = options[:type]
+
+      raise ArgumentError, "#{class_name} name can't be nil."                         if name.nil?
+      raise ArgumentError, "Type :#{type} is not valid for #{class_name.downcase}s."  if type && !valid_type?(type)
+
+      @name        = name.to_s
+      @description = options[:desc]
+      @required    = options.key?(:required) ? options[:required] : true
+      @type        = (type || :string).to_sym
+      @default     = options[:default]
+      @banner      = options[:banner] || default_banner
+      @enum        = options[:enum]
+
+      validate! # Trigger specific validations
+    end
+
+    def usage
+      required? ? banner : "[#{banner}]"
+    end
+
+    def required?
+      required
+    end
+
+    def show_default?
+      case default
+      when Array, String, Hash
+        !default.empty?
+      else
+        default
+      end
+    end
+
+    protected
+
+      def validate!
+        if required? && !default.nil?
+          raise ArgumentError, "An argument cannot be required and have default value."
+        elsif @enum && !@enum.is_a?(Array)
+          raise ArgumentError, "An argument cannot have an enum other than an array."
+        end
+      end
+
+      def valid_type?(type)
+        self.class::VALID_TYPES.include?(type.to_sym)
+      end
+
+      def default_banner
+        case type
+        when :boolean
+          nil
+        when :string, :default
+          human_name.upcase
+        when :numeric
+          "N"
+        when :hash
+          "key:value"
+        when :array
+          "one two three"
+        end
+      end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser/arguments.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser/arguments.rb
new file mode 100644
index 0000000..f86166d
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser/arguments.rb
@@ -0,0 +1,171 @@
+class Thor
+  class Arguments #:nodoc:
+    NUMERIC = /(\d*\.\d+|\d+)/
+
+    # Receives an array of args and returns two arrays, one with arguments
+    # and one with switches.
+    #
+    def self.split(args)
+      arguments = []
+
+      args.each do |item|
+        break if item =~ /^-/
+        arguments << item
+      end
+
+      return arguments, args[Range.new(arguments.size, -1)]
+    end
+
+    def self.parse(*args)
+      to_parse = args.pop
+      new(*args).parse(to_parse)
+    end
+
+    # Takes an array of Thor::Argument objects.
+    #
+    def initialize(arguments=[])
+      @assigns, @non_assigned_required = {}, []
+      @switches = arguments
+
+      arguments.each do |argument|
+        if argument.default != nil
+          @assigns[argument.human_name] = argument.default
+        elsif argument.required?
+          @non_assigned_required << argument
+        end
+      end
+    end
+
+    def parse(args)
+      @pile = args.dup
+
+      @switches.each do |argument|
+        break unless peek
+        @non_assigned_required.delete(argument)
+        @assigns[argument.human_name] = send(:"parse_#{argument.type}", argument.human_name)
+      end
+
+      check_requirement!
+      @assigns
+    end
+
+    def remaining
+      @pile
+    end
+
+    private
+
+      def no_or_skip?(arg)
+        arg =~ /^--(no|skip)-([-\w]+)$/
+        $2
+      end
+
+      def last?
+        @pile.empty?
+      end
+
+      def peek
+        @pile.first
+      end
+
+      def shift
+        @pile.shift
+      end
+
+      def unshift(arg)
+        unless arg.kind_of?(Array)
+          @pile.unshift(arg)
+        else
+          @pile = arg + @pile
+        end
+      end
+
+      def current_is_value?
+        peek && peek.to_s !~ /^-/
+      end
+
+      # Runs through the argument array getting strings that contains ":" and
+      # mark it as a hash:
+      #
+      #   [ "name:string", "age:integer" ]
+      #
+      # Becomes:
+      #
+      #   { "name" => "string", "age" => "integer" }
+      #
+      def parse_hash(name)
+        return shift if peek.is_a?(Hash)
+        hash = {}
+
+        while current_is_value? && peek.include?(?:)
+          key, value = shift.split(':',2)
+          hash[key] = value
+        end
+        hash
+      end
+
+      # Runs through the argument array getting all strings until no string is
+      # found or a switch is found.
+      #
+      #   ["a", "b", "c"]
+      #
+      # And returns it as an array:
+      #
+      #   ["a", "b", "c"]
+      #
+      def parse_array(name)
+        return shift if peek.is_a?(Array)
+        array = []
+
+        while current_is_value?
+          array << shift
+        end
+        array
+      end
+
+      # Check if the peek is numeric format and return a Float or Integer.
+      # Otherwise raises an error.
+      #
+      def parse_numeric(name)
+        return shift if peek.is_a?(Numeric)
+
+        unless peek =~ NUMERIC && $& == peek
+          raise MalformattedArgumentError, "Expected numeric value for '#{name}'; got #{peek.inspect}"
+        end
+
+        $&.index('.') ? shift.to_f : shift.to_i
+      end
+
+      # Parse string:
+      # for --string-arg, just return the current value in the pile
+      # for --no-string-arg, nil
+      #
+      def parse_string(name)
+        if no_or_skip?(name)
+          nil
+        else
+          value = shift
+          if @switches.is_a?(Hash) && switch = @switches[name]
+            if switch.enum && !switch.enum.include?(value)
+              raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
+            end
+          end
+          value
+        end
+      end
+
+      # Raises an error if @non_assigned_required array is not empty.
+      #
+      def check_requirement!
+        unless @non_assigned_required.empty?
+          names = @non_assigned_required.map do |o|
+            o.respond_to?(:switch_name) ? o.switch_name : o.human_name
+          end.join("', '")
+
+          class_name = self.class.name.split('::').last.downcase
+          raise RequiredArgumentMissingError, "No value provided for required #{class_name} '#{names}'"
+        end
+      end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser/option.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser/option.rb
new file mode 100644
index 0000000..4781069
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser/option.rb
@@ -0,0 +1,121 @@
+class Thor
+  class Option < Argument #:nodoc:
+    attr_reader :aliases, :group, :lazy_default, :hide
+
+    VALID_TYPES = [:boolean, :numeric, :hash, :array, :string]
+
+    def initialize(name, options={})
+      options[:required] = false unless options.key?(:required)
+      super
+      @lazy_default = options[:lazy_default]
+      @group        = options[:group].to_s.capitalize if options[:group]
+      @aliases      = Array(options[:aliases])
+      @hide         = options[:hide]
+    end
+
+    # This parse quick options given as method_options. It makes several
+    # assumptions, but you can be more specific using the option method.
+    #
+    #   parse :foo => "bar"
+    #   #=> Option foo with default value bar
+    #
+    #   parse [:foo, :baz] => "bar"
+    #   #=> Option foo with default value bar and alias :baz
+    #
+    #   parse :foo => :required
+    #   #=> Required option foo without default value
+    #
+    #   parse :foo => 2
+    #   #=> Option foo with default value 2 and type numeric
+    #
+    #   parse :foo => :numeric
+    #   #=> Option foo without default value and type numeric
+    #
+    #   parse :foo => true
+    #   #=> Option foo with default value true and type boolean
+    #
+    # The valid types are :boolean, :numeric, :hash, :array and :string. If none
+    # is given a default type is assumed. This default type accepts arguments as
+    # string (--foo=value) or booleans (just --foo).
+    #
+    # By default all options are optional, unless :required is given.
+    #
+    def self.parse(key, value)
+      if key.is_a?(Array)
+        name, *aliases = key
+      else
+        name, aliases = key, []
+      end
+
+      name    = name.to_s
+      default = value
+
+      type = case value
+      when Symbol
+        default = nil
+        if VALID_TYPES.include?(value)
+          value
+        elsif required = (value == :required)
+          :string
+        end
+      when TrueClass, FalseClass
+        :boolean
+      when Numeric
+        :numeric
+      when Hash, Array, String
+        value.class.name.downcase.to_sym
+      end
+      self.new(name.to_s, :required => required, :type => type, :default => default, :aliases => aliases)
+    end
+
+    def switch_name
+      @switch_name ||= dasherized? ? name : dasherize(name)
+    end
+
+    def human_name
+      @human_name ||= dasherized? ? undasherize(name) : name
+    end
+
+    def usage(padding=0)
+      sample = if banner && !banner.to_s.empty?
+        "#{switch_name}=#{banner}"
+      else
+        switch_name
+      end
+
+      sample = "[#{sample}]" unless required?
+
+      if aliases.empty?
+        (" " * padding) << sample
+      else
+        "#{aliases.join(', ')}, #{sample}"
+      end
+    end
+
+    VALID_TYPES.each do |type|
+      class_eval <<-RUBY, __FILE__, __LINE__ + 1
+        def #{type}?
+          self.type == #{type.inspect}
+        end
+      RUBY
+    end
+
+  protected
+
+    def validate!
+      raise ArgumentError, "An option cannot be boolean and required." if boolean? && required?
+    end
+
+    def dasherized?
+      name.index('-') == 0
+    end
+
+    def undasherize(str)
+      str.sub(/^-{1,2}/, '')
+    end
+
+    def dasherize(str)
+      (str.length > 1 ? "--" : "-") + str.gsub('_', '-')
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser/options.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser/options.rb
new file mode 100644
index 0000000..5e16c52
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/parser/options.rb
@@ -0,0 +1,216 @@
+class Thor
+  class Options < Arguments #:nodoc:
+    LONG_RE     = /^(--\w+(?:-\w+)*)$/
+    SHORT_RE    = /^(-[a-z])$/i
+    EQ_RE       = /^(--\w+(?:-\w+)*|-[a-z])=(.*)$/i
+    SHORT_SQ_RE = /^-([a-z]{2,})$/i # Allow either -x -v or -xv style for single char args
+    SHORT_NUM   = /^(-[a-z])#{NUMERIC}$/i
+    OPTS_END    = '--'.freeze
+
+    # Receives a hash and makes it switches.
+    def self.to_switches(options)
+      options.map do |key, value|
+        case value
+          when true
+            "--#{key}"
+          when Array
+            "--#{key} #{value.map{ |v| v.inspect }.join(' ')}"
+          when Hash
+            "--#{key} #{value.map{ |k,v| "#{k}:#{v}" }.join(' ')}"
+          when nil, false
+            ""
+          else
+            "--#{key} #{value.inspect}"
+        end
+      end.join(" ")
+    end
+
+    # Takes a hash of Thor::Option and a hash with defaults.
+    #
+    # If +stop_on_unknown+ is true, #parse will stop as soon as it encounters
+    # an unknown option or a regular argument.
+    def initialize(hash_options={}, defaults={}, stop_on_unknown=false)
+      @stop_on_unknown = stop_on_unknown
+      options = hash_options.values
+      super(options)
+
+      # Add defaults
+      defaults.each do |key, value|
+        @assigns[key.to_s] = value
+        @non_assigned_required.delete(hash_options[key])
+      end
+
+      @shorts, @switches, @extra = {}, {}, []
+
+      options.each do |option|
+        @switches[option.switch_name] = option
+
+        option.aliases.each do |short|
+          @shorts[short.to_s] ||= option.switch_name
+        end
+      end
+    end
+
+    def remaining
+      @extra
+    end
+
+    def peek
+      return super unless @parsing_options
+
+      result = super
+      if result == OPTS_END
+        shift
+        @parsing_options = false
+        super
+      else
+        result
+      end
+    end
+
+    def parse(args)
+      @pile = args.dup
+      @parsing_options = true
+
+      while peek
+        if parsing_options?
+          match, is_switch = current_is_switch?
+          shifted = shift
+
+          if is_switch
+            case shifted
+              when SHORT_SQ_RE
+                unshift($1.split('').map { |f| "-#{f}" })
+                next
+              when EQ_RE, SHORT_NUM
+                unshift($2)
+                switch = $1
+              when LONG_RE, SHORT_RE
+                switch = $1
+            end
+
+            switch = normalize_switch(switch)
+            option = switch_option(switch)
+            @assigns[option.human_name] = parse_peek(switch, option)
+          elsif @stop_on_unknown
+            @extra << shifted
+            @extra << shift while peek
+            break
+          elsif match
+            @extra << shifted
+            @extra << shift while peek && peek !~ /^-/
+          else
+            @extra << shifted
+          end
+        else
+          @extra << shift
+        end
+      end
+
+      check_requirement!
+
+      assigns = Thor::CoreExt::HashWithIndifferentAccess.new(@assigns)
+      assigns.freeze
+      assigns
+    end
+
+    def check_unknown!
+      # an unknown option starts with - or -- and has no more --'s afterward.
+      unknown = @extra.select { |str| str =~ /^--?(?:(?!--).)*$/ }
+      raise UnknownArgumentError, "Unknown switches '#{unknown.join(', ')}'" unless unknown.empty?
+    end
+
+    protected
+
+      # Check if the current value in peek is a registered switch.
+      #
+      # Two booleans are returned.  The first is true if the current value
+      # starts with a hyphen; the second is true if it is a registered switch.
+      def current_is_switch?
+        case peek
+        when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM
+          [true, switch?($1)]
+        when SHORT_SQ_RE
+          [true, $1.split('').any? { |f| switch?("-#{f}") }]
+        else
+          [false, false]
+        end
+      end
+
+      def current_is_switch_formatted?
+        case peek
+        when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM, SHORT_SQ_RE
+          true
+        else
+          false
+        end
+      end
+
+      def current_is_value?
+        peek && (!parsing_options? || super)
+      end
+
+      def switch?(arg)
+        switch_option(normalize_switch(arg))
+      end
+
+      def switch_option(arg)
+        if match = no_or_skip?(arg)
+          @switches[arg] || @switches["--#{match}"]
+        else
+          @switches[arg]
+        end
+      end
+
+      # Check if the given argument is actually a shortcut.
+      #
+      def normalize_switch(arg)
+        (@shorts[arg] || arg).tr('_', '-')
+      end
+
+      def parsing_options?
+        peek
+        @parsing_options
+      end
+
+      # Parse boolean values which can be given as --foo=true, --foo or --no-foo.
+      #
+      def parse_boolean(switch)
+        if current_is_value?
+          if ["true", "TRUE", "t", "T", true].include?(peek)
+            shift
+            true
+          elsif ["false", "FALSE", "f", "F", false].include?(peek)
+            shift
+            false
+          else
+            true
+          end
+        else
+          @switches.key?(switch) || !no_or_skip?(switch)
+        end
+      end
+
+      # Parse the value at the peek analyzing if it requires an input or not.
+      #
+      def parse_peek(switch, option)
+        if parsing_options? && (current_is_switch_formatted? || last?)
+          if option.boolean?
+            # No problem for boolean types
+          elsif no_or_skip?(switch)
+            return nil # User set value to nil
+          elsif option.string? && !option.required?
+            # Return the default if there is one, else the human name
+            return option.lazy_default || option.default || option.human_name
+          elsif option.lazy_default
+            return option.lazy_default
+          else
+            raise MalformattedArgumentError, "No value provided for option '#{switch}'"
+          end
+        end
+
+        @non_assigned_required.delete(option)
+        send(:"parse_#{option.type}", switch)
+      end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/rake_compat.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/rake_compat.rb
new file mode 100644
index 0000000..c86e840
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/rake_compat.rb
@@ -0,0 +1,71 @@
+require 'rake'
+require 'rake/dsl_definition'
+
+class Thor
+  # Adds a compatibility layer to your Thor classes which allows you to use
+  # rake package tasks. For example, to use rspec rake tasks, one can do:
+  #
+  #   require 'thor/rake_compat'
+  #
+  #   class Default < Thor
+  #     include Thor::RakeCompat
+  #
+  #     Spec::Rake::SpecTask.new(:spec) do |t|
+  #       t.spec_opts = ['--options', "spec/spec.opts"]
+  #       t.spec_files = FileList['spec/**/*_spec.rb']
+  #     end
+  #   end
+  #
+  module RakeCompat
+    include Rake::DSL if defined?(Rake::DSL)
+
+    def self.rake_classes
+      @rake_classes ||= []
+    end
+
+    def self.included(base)
+      # Hack. Make rakefile point to invoker, so rdoc task is generated properly.
+      rakefile = File.basename(caller[0].match(/(.*):\d+/)[1])
+      Rake.application.instance_variable_set(:@rakefile, rakefile)
+      self.rake_classes << base
+    end
+  end
+end
+
+# override task on (main), for compatibility with Rake 0.9
+self.instance_eval do
+  alias rake_namespace namespace
+
+  def task(*)
+    task = super
+
+    if klass = Thor::RakeCompat.rake_classes.last
+      non_namespaced_name = task.name.split(':').last
+
+      description = non_namespaced_name
+      description << task.arg_names.map{ |n| n.to_s.upcase }.join(' ')
+      description.strip!
+
+      klass.desc description, Rake.application.last_description || non_namespaced_name
+      Rake.application.last_description = nil
+      klass.send :define_method, non_namespaced_name do |*args|
+        Rake::Task[task.name.to_sym].invoke(*args)
+      end
+    end
+
+    task
+  end
+
+  def namespace(name)
+    if klass = Thor::RakeCompat.rake_classes.last
+      const_name = Thor::Util.camel_case(name.to_s).to_sym
+      klass.const_set(const_name, Class.new(Thor))
+      new_klass = klass.const_get(const_name)
+      Thor::RakeCompat.rake_classes << new_klass
+    end
+
+    super
+    Thor::RakeCompat.rake_classes.pop
+  end
+end
+
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/runner.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/runner.rb
new file mode 100644
index 0000000..e32ae9c
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/runner.rb
@@ -0,0 +1,321 @@
+require 'thor'
+require 'thor/group'
+require 'thor/core_ext/file_binary_read'
+
+require 'fileutils'
+require 'open-uri'
+require 'yaml'
+require 'digest/md5'
+require 'pathname'
+
+class Thor::Runner < Thor #:nodoc:
+  map "-T" => :list, "-i" => :install, "-u" => :update, "-v" => :version
+
+  # Override Thor#help so it can give information about any class and any method.
+  #
+  def help(meth = nil)
+    if meth && !self.respond_to?(meth)
+      initialize_thorfiles(meth)
+      klass, task = Thor::Util.find_class_and_task_by_namespace(meth)
+      self.class.handle_no_task_error(task, false) if klass.nil?
+      klass.start(["-h", task].compact, :shell => self.shell)
+    else
+      super
+    end
+  end
+
+  # If a task is not found on Thor::Runner, method missing is invoked and
+  # Thor::Runner is then responsible for finding the task in all classes.
+  #
+  def method_missing(meth, *args)
+    meth = meth.to_s
+    initialize_thorfiles(meth)
+    klass, task = Thor::Util.find_class_and_task_by_namespace(meth)
+    self.class.handle_no_task_error(task, false) if klass.nil?
+    args.unshift(task) if task
+    klass.start(args, :shell => self.shell)
+  end
+
+  desc "install NAME", "Install an optionally named Thor file into your system tasks"
+  method_options :as => :string, :relative => :boolean, :force => :boolean
+  def install(name)
+    initialize_thorfiles
+
+    # If a directory name is provided as the argument, look for a 'main.thor'
+    # task in said directory.
+    begin
+      if File.directory?(File.expand_path(name))
+        base, package = File.join(name, "main.thor"), :directory
+        contents      = open(base) {|input| input.read }
+      else
+        base, package = name, :file
+        contents      = open(name) {|input| input.read }
+      end
+    rescue OpenURI::HTTPError
+      raise Error, "Error opening URI '#{name}'"
+    rescue Errno::ENOENT
+      raise Error, "Error opening file '#{name}'"
+    end
+
+    say "Your Thorfile contains:"
+    say contents
+
+    unless options["force"]
+      return false if no?("Do you wish to continue [y/N]?")
+    end
+
+    as = options["as"] || begin
+      first_line = contents.split("\n")[0]
+      (match = first_line.match(/\s*#\s*module:\s*([^\n]*)/)) ? match[1].strip : nil
+    end
+
+    unless as
+      basename = File.basename(name)
+      as = ask("Please specify a name for #{name} in the system repository [#{basename}]:")
+      as = basename if as.empty?
+    end
+
+    location = if options[:relative] || name =~ /^https?:\/\//
+      name
+    else
+      File.expand_path(name)
+    end
+
+    thor_yaml[as] = {
+      :filename   => Digest::MD5.hexdigest(name + as),
+      :location   => location,
+      :namespaces => Thor::Util.namespaces_in_content(contents, base)
+    }
+
+    save_yaml(thor_yaml)
+    say "Storing thor file in your system repository"
+    destination = File.join(thor_root, thor_yaml[as][:filename])
+
+    if package == :file
+      File.open(destination, "w") { |f| f.puts contents }
+    else
+      FileUtils.cp_r(name, destination)
+    end
+
+    thor_yaml[as][:filename] # Indicate success
+  end
+
+  desc "version", "Show Thor version"
+  def version
+    require 'thor/version'
+    say "Thor #{Thor::VERSION}"
+  end
+
+  desc "uninstall NAME", "Uninstall a named Thor module"
+  def uninstall(name)
+    raise Error, "Can't find module '#{name}'" unless thor_yaml[name]
+    say "Uninstalling #{name}."
+    FileUtils.rm_rf(File.join(thor_root, "#{thor_yaml[name][:filename]}"))
+
+    thor_yaml.delete(name)
+    save_yaml(thor_yaml)
+
+    puts "Done."
+  end
+
+  desc "update NAME", "Update a Thor file from its original location"
+  def update(name)
+    raise Error, "Can't find module '#{name}'" if !thor_yaml[name] || !thor_yaml[name][:location]
+
+    say "Updating '#{name}' from #{thor_yaml[name][:location]}"
+
+    old_filename = thor_yaml[name][:filename]
+    self.options = self.options.merge("as" => name)
+
+    if File.directory? File.expand_path(name)
+      FileUtils.rm_rf(File.join(thor_root, old_filename))
+
+      thor_yaml.delete(old_filename)
+      save_yaml(thor_yaml)
+
+      filename = install(name)
+    else
+      filename = install(thor_yaml[name][:location])
+    end
+
+    unless filename == old_filename
+      File.delete(File.join(thor_root, old_filename))
+    end
+  end
+
+  desc "installed", "List the installed Thor modules and tasks"
+  method_options :internal => :boolean
+  def installed
+    initialize_thorfiles(nil, true)
+    display_klasses(true, options["internal"])
+  end
+
+  desc "list [SEARCH]", "List the available thor tasks (--substring means .*SEARCH)"
+  method_options :substring => :boolean, :group => :string, :all => :boolean, :debug => :boolean
+  def list(search="")
+    initialize_thorfiles
+
+    search = ".*#{search}" if options["substring"]
+    search = /^#{search}.*/i
+    group  = options[:group] || "standard"
+
+    klasses = Thor::Base.subclasses.select do |k|
+      (options[:all] || k.group == group) && k.namespace =~ search
+    end
+
+    display_klasses(false, false, klasses)
+  end
+
+  private
+
+    def self.banner(task, all = false, subcommand = false)
+      "thor " + task.formatted_usage(self, all, subcommand)
+    end
+
+    def thor_root
+      Thor::Util.thor_root
+    end
+
+    def thor_yaml
+      @thor_yaml ||= begin
+        yaml_file = File.join(thor_root, "thor.yml")
+        yaml = YAML.load_file(yaml_file) if File.exists?(yaml_file)
+        yaml || {}
+      end
+    end
+
+    # Save the yaml file. If none exists in thor root, creates one.
+    #
+    def save_yaml(yaml)
+      yaml_file = File.join(thor_root, "thor.yml")
+
+      unless File.exists?(yaml_file)
+        FileUtils.mkdir_p(thor_root)
+        yaml_file = File.join(thor_root, "thor.yml")
+        FileUtils.touch(yaml_file)
+      end
+
+      File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml }
+    end
+
+    def self.exit_on_failure?
+      true
+    end
+
+    # Load the Thorfiles. If relevant_to is supplied, looks for specific files
+    # in the thor_root instead of loading them all.
+    #
+    # By default, it also traverses the current path until find Thor files, as
+    # described in thorfiles. This look up can be skipped by suppliying
+    # skip_lookup true.
+    #
+    def initialize_thorfiles(relevant_to=nil, skip_lookup=false)
+      thorfiles(relevant_to, skip_lookup).each do |f|
+        Thor::Util.load_thorfile(f, nil, options[:debug]) unless Thor::Base.subclass_files.keys.include?(File.expand_path(f))
+      end
+    end
+
+    # Finds Thorfiles by traversing from your current directory down to the root
+    # directory of your system. If at any time we find a Thor file, we stop.
+    #
+    # We also ensure that system-wide Thorfiles are loaded first, so local
+    # Thorfiles can override them.
+    #
+    # ==== Example
+    #
+    # If we start at /Users/wycats/dev/thor ...
+    #
+    # 1. /Users/wycats/dev/thor
+    # 2. /Users/wycats/dev
+    # 3. /Users/wycats <-- we find a Thorfile here, so we stop
+    #
+    # Suppose we start at c:\Documents and Settings\james\dev\thor ...
+    #
+    # 1. c:\Documents and Settings\james\dev\thor
+    # 2. c:\Documents and Settings\james\dev
+    # 3. c:\Documents and Settings\james
+    # 4. c:\Documents and Settings
+    # 5. c:\ <-- no Thorfiles found!
+    #
+    def thorfiles(relevant_to=nil, skip_lookup=false)
+      thorfiles = []
+
+      unless skip_lookup
+        Pathname.pwd.ascend do |path|
+          thorfiles = Thor::Util.globs_for(path).map { |g| Dir[g] }.flatten
+          break unless thorfiles.empty?
+        end
+      end
+
+      files  = (relevant_to ? thorfiles_relevant_to(relevant_to) : Thor::Util.thor_root_glob)
+      files += thorfiles
+      files -= ["#{thor_root}/thor.yml"]
+
+      files.map! do |file|
+        File.directory?(file) ? File.join(file, "main.thor") : file
+      end
+    end
+
+    # Load Thorfiles relevant to the given method. If you provide "foo:bar" it
+    # will load all thor files in the thor.yaml that has "foo" e "foo:bar"
+    # namespaces registered.
+    #
+    def thorfiles_relevant_to(meth)
+      lookup = [ meth, meth.split(":")[0...-1].join(":") ]
+
+      files = thor_yaml.select do |k, v|
+        v[:namespaces] && !(v[:namespaces] & lookup).empty?
+      end
+
+      files.map { |k, v| File.join(thor_root, "#{v[:filename]}") }
+    end
+
+    # Display information about the given klasses. If with_module is given,
+    # it shows a table with information extracted from the yaml file.
+    #
+    def display_klasses(with_modules=false, show_internal=false, klasses=Thor::Base.subclasses)
+      klasses -= [Thor, Thor::Runner, Thor::Group] unless show_internal
+
+      raise Error, "No Thor tasks available" if klasses.empty?
+      show_modules if with_modules && !thor_yaml.empty?
+
+      list = Hash.new { |h,k| h[k] = [] }
+      groups = klasses.select { |k| k.ancestors.include?(Thor::Group) }
+
+      # Get classes which inherit from Thor
+      (klasses - groups).each { |k| list[k.namespace.split(":").first] += k.printable_tasks(false) }
+
+      # Get classes which inherit from Thor::Base
+      groups.map! { |k| k.printable_tasks(false).first }
+      list["root"] = groups
+
+      # Order namespaces with default coming first
+      list = list.sort{ |a,b| a[0].sub(/^default/, '') <=> b[0].sub(/^default/, '') }
+      list.each { |n, tasks| display_tasks(n, tasks) unless tasks.empty? }
+    end
+
+    def display_tasks(namespace, list) #:nodoc:
+      list.sort!{ |a,b| a[0] <=> b[0] }
+
+      say shell.set_color(namespace, :blue, true)
+      say "-" * namespace.size
+
+      print_table(list, :truncate => true)
+      say
+    end
+
+    def show_modules #:nodoc:
+      info  = []
+      labels = ["Modules", "Namespaces"]
+
+      info << labels
+      info << [ "-" * labels[0].size, "-" * labels[1].size ]
+
+      thor_yaml.each do |name, hash|
+        info << [ name, hash[:namespaces].join(", ") ]
+      end
+
+      print_table info
+      say ""
+    end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/shell.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/shell.rb
new file mode 100644
index 0000000..a718c53
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/shell.rb
@@ -0,0 +1,88 @@
+require 'rbconfig'
+
+class Thor
+  module Base
+    # Returns the shell used in all Thor classes. If you are in a Unix platform
+    # it will use a colored log, otherwise it will use a basic one without color.
+    #
+    def self.shell
+      @shell ||= if ENV['THOR_SHELL'] && ENV['THOR_SHELL'].size > 0
+        Thor::Shell.const_get(ENV['THOR_SHELL'])
+      elsif ((RbConfig::CONFIG['host_os'] =~ /mswin|mingw/) && !(ENV['ANSICON']))
+        Thor::Shell::Basic
+      else
+        Thor::Shell::Color
+      end
+    end
+
+    # Sets the shell used in all Thor classes.
+    #
+    def self.shell=(klass)
+      @shell = klass
+    end
+  end
+
+  module Shell
+    SHELL_DELEGATED_METHODS = [:ask, :error, :set_color, :yes?, :no?, :say, :say_status, :print_in_columns, :print_table, :print_wrapped, :file_collision, :terminal_width]
+
+    autoload :Basic, 'thor/shell/basic'
+    autoload :Color, 'thor/shell/color'
+    autoload :HTML,  'thor/shell/html'
+
+    # Add shell to initialize config values.
+    #
+    # ==== Configuration
+    # shell<Object>:: An instance of the shell to be used.
+    #
+    # ==== Examples
+    #
+    #   class MyScript < Thor
+    #     argument :first, :type => :numeric
+    #   end
+    #
+    #   MyScript.new [1.0], { :foo => :bar }, :shell => Thor::Shell::Basic.new
+    #
+    def initialize(args=[], options={}, config={})
+      super
+      self.shell = config[:shell]
+      self.shell.base ||= self if self.shell.respond_to?(:base)
+    end
+
+    # Holds the shell for the given Thor instance. If no shell is given,
+    # it gets a default shell from Thor::Base.shell.
+    def shell
+      @shell ||= Thor::Base.shell.new
+    end
+
+    # Sets the shell for this thor class.
+    def shell=(shell)
+      @shell = shell
+    end
+
+    # Common methods that are delegated to the shell.
+    SHELL_DELEGATED_METHODS.each do |method|
+      module_eval <<-METHOD, __FILE__, __LINE__
+        def #{method}(*args,&block)
+          shell.#{method}(*args,&block)
+        end
+      METHOD
+    end
+
+    # Yields the given block with padding.
+    def with_padding
+      shell.padding += 1
+      yield
+    ensure
+      shell.padding -= 1
+    end
+
+    protected
+
+      # Allow shell to be shared between invocations.
+      #
+      def _shared_configuration #:nodoc:
+        super.merge!(:shell => self.shell)
+      end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/shell/basic.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/shell/basic.rb
new file mode 100644
index 0000000..9f8ad24
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/shell/basic.rb
@@ -0,0 +1,389 @@
+require 'tempfile'
+
+class Thor
+  module Shell
+    class Basic
+      attr_accessor :base
+      attr_reader   :padding
+
+      # Initialize base, mute and padding to nil.
+      #
+      def initialize #:nodoc:
+        @base, @mute, @padding = nil, false, 0
+      end
+
+      # Mute everything that's inside given block
+      #
+      def mute
+        @mute = true
+        yield
+      ensure
+        @mute = false
+      end
+
+      # Check if base is muted
+      #
+      def mute?
+        @mute
+      end
+
+      # Sets the output padding, not allowing less than zero values.
+      #
+      def padding=(value)
+        @padding = [0, value].max
+      end
+
+      # Asks something to the user and receives a response.
+      #
+      # If asked to limit the correct responses, you can pass in an
+      # array of acceptable answers.  If one of those is not supplied,
+      # they will be shown a message stating that one of those answers
+      # must be given and re-asked the question.
+      #
+      # ==== Example
+      # ask("What is your name?")
+      #
+      # ask("What is your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])
+      #
+      def ask(statement, *args)
+        options = args.last.is_a?(Hash) ? args.pop : {}
+
+        options[:limited_to] ? ask_filtered(statement, options[:limited_to], *args) : ask_simply(statement, *args)
+      end
+
+      # Say (print) something to the user. If the sentence ends with a whitespace
+      # or tab character, a new line is not appended (print + flush). Otherwise
+      # are passed straight to puts (behavior got from Highline).
+      #
+      # ==== Example
+      # say("I know you knew that.")
+      #
+      def say(message="", color=nil, force_new_line=(message.to_s !~ /( |\t)\Z/))
+        message = message.to_s
+
+        message = set_color(message, *color) if color
+
+        spaces = "  " * padding
+
+        if force_new_line
+          stdout.puts(spaces + message)
+        else
+          stdout.print(spaces + message)
+        end
+        stdout.flush
+      end
+
+      # Say a status with the given color and appends the message. Since this
+      # method is used frequently by actions, it allows nil or false to be given
+      # in log_status, avoiding the message from being shown. If a Symbol is
+      # given in log_status, it's used as the color.
+      #
+      def say_status(status, message, log_status=true)
+        return if quiet? || log_status == false
+        spaces = "  " * (padding + 1)
+        color  = log_status.is_a?(Symbol) ? log_status : :green
+
+        status = status.to_s.rjust(12)
+        status = set_color status, color, true if color
+
+        stdout.puts "#{status}#{spaces}#{message}"
+        stdout.flush
+      end
+
+      # Make a question the to user and returns true if the user replies "y" or
+      # "yes".
+      #
+      def yes?(statement, color=nil)
+        !!(ask(statement, color) =~ is?(:yes))
+      end
+
+      # Make a question the to user and returns true if the user replies "n" or
+      # "no".
+      #
+      def no?(statement, color=nil)
+        !yes?(statement, color)
+      end
+
+      # Prints values in columns
+      #
+      # ==== Parameters
+      # Array[String, String, ...]
+      #
+      def print_in_columns(array)
+        return if array.empty?
+        colwidth = (array.map{|el| el.to_s.size}.max || 0) + 2
+        array.each_with_index do |value, index|
+          # Don't output trailing spaces when printing the last column
+          if ((((index + 1) % (terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
+            stdout.puts value
+          else
+            stdout.printf("%-#{colwidth}s", value)
+          end
+        end
+      end
+
+      # Prints a table.
+      #
+      # ==== Parameters
+      # Array[Array[String, String, ...]]
+      #
+      # ==== Options
+      # indent<Integer>:: Indent the first column by indent value.
+      # colwidth<Integer>:: Force the first column to colwidth spaces wide.
+      #
+      def print_table(array, options={})
+        return if array.empty?
+
+        formats, indent, colwidth = [], options[:indent].to_i, options[:colwidth]
+        options[:truncate] = terminal_width if options[:truncate] == true
+
+        formats << "%-#{colwidth + 2}s" if colwidth
+        start = colwidth ? 1 : 0
+
+        colcount = array.max{|a,b| a.size <=> b.size }.size
+
+        maximas = []
+
+        start.upto(colcount - 1) do |index|
+          maxima = array.map {|row| row[index] ? row[index].to_s.size : 0 }.max
+          maximas << maxima
+          if index == colcount - 1
+            # Don't output 2 trailing spaces when printing the last column
+            formats << "%-s"
+          else
+            formats << "%-#{maxima + 2}s"
+          end
+        end
+
+        formats[0] = formats[0].insert(0, " " * indent)
+        formats << "%s"
+
+        array.each do |row|
+          sentence = ""
+
+          row.each_with_index do |column, index|
+            maxima = maximas[index]
+
+            if column.is_a?(Numeric)
+              if index == row.size - 1
+                # Don't output 2 trailing spaces when printing the last column
+                f = "%#{maxima}s"
+              else
+                f = "%#{maxima}s  "
+              end
+            else
+              f = formats[index]
+            end
+            sentence << f % column.to_s
+          end
+
+          sentence = truncate(sentence, options[:truncate]) if options[:truncate]
+          stdout.puts sentence
+        end
+      end
+
+      # Prints a long string, word-wrapping the text to the current width of the
+      # terminal display. Ideal for printing heredocs.
+      #
+      # ==== Parameters
+      # String
+      #
+      # ==== Options
+      # indent<Integer>:: Indent each line of the printed paragraph by indent value.
+      #
+      def print_wrapped(message, options={})
+        indent = options[:indent] || 0
+        width = terminal_width - indent
+        paras = message.split("\n\n")
+
+        paras.map! do |unwrapped|
+          unwrapped.strip.gsub(/\n/, " ").squeeze(" ").
+          gsub(/.{1,#{width}}(?:\s|\Z)/){($& + 5.chr).
+          gsub(/\n\005/,"\n").gsub(/\005/,"\n")}
+        end
+
+        paras.each do |para|
+          para.split("\n").each do |line|
+            stdout.puts line.insert(0, " " * indent)
+          end
+          stdout.puts unless para == paras.last
+        end
+      end
+
+      # Deals with file collision and returns true if the file should be
+      # overwritten and false otherwise. If a block is given, it uses the block
+      # response as the content for the diff.
+      #
+      # ==== Parameters
+      # destination<String>:: the destination file to solve conflicts
+      # block<Proc>:: an optional block that returns the value to be used in diff
+      #
+      def file_collision(destination)
+        return true if @always_force
+        options = block_given? ? "[Ynaqdh]" : "[Ynaqh]"
+
+        while true
+          answer = ask %[Overwrite #{destination}? (enter "h" for help) #{options}]
+
+          case answer
+            when is?(:yes), is?(:force), ""
+              return true
+            when is?(:no), is?(:skip)
+              return false
+            when is?(:always)
+              return @always_force = true
+            when is?(:quit)
+              say 'Aborting...'
+              raise SystemExit
+            when is?(:diff)
+              show_diff(destination, yield) if block_given?
+              say 'Retrying...'
+            else
+              say file_collision_help
+          end
+        end
+      end
+
+      # This code was copied from Rake, available under MIT-LICENSE
+      # Copyright (c) 2003, 2004 Jim Weirich
+      def terminal_width
+        if ENV['THOR_COLUMNS']
+          result = ENV['THOR_COLUMNS'].to_i
+        else
+          result = unix? ? dynamic_width : 80
+        end
+        (result < 10) ? 80 : result
+      rescue
+        80
+      end
+
+      # Called if something goes wrong during the execution. This is used by Thor
+      # internally and should not be used inside your scripts. If something went
+      # wrong, you can always raise an exception. If you raise a Thor::Error, it
+      # will be rescued and wrapped in the method below.
+      #
+      def error(statement)
+        stderr.puts statement
+      end
+
+      # Apply color to the given string with optional bold. Disabled in the
+      # Thor::Shell::Basic class.
+      #
+      def set_color(string, *args) #:nodoc:
+        string
+      end
+
+    protected
+
+      def lookup_color(color)
+        return color unless color.is_a?(Symbol)
+        self.class.const_get(color.to_s.upcase)
+      end
+
+      def stdout
+        $stdout
+      end
+
+      def stdin
+        $stdin
+      end
+
+      def stderr
+        $stderr
+      end
+
+      def is?(value) #:nodoc:
+        value = value.to_s
+
+        if value.size == 1
+          /\A#{value}\z/i
+        else
+          /\A(#{value}|#{value[0,1]})\z/i
+        end
+      end
+
+      def file_collision_help #:nodoc:
+<<HELP
+Y - yes, overwrite
+n - no, do not overwrite
+a - all, overwrite this and all others
+q - quit, abort
+d - diff, show the differences between the old and the new
+h - help, show this help
+HELP
+      end
+
+      def show_diff(destination, content) #:nodoc:
+        diff_cmd = ENV['THOR_DIFF'] || ENV['RAILS_DIFF'] || 'diff -u'
+
+        Tempfile.open(File.basename(destination), File.dirname(destination)) do |temp|
+          temp.write content
+          temp.rewind
+          system %(#{diff_cmd} "#{destination}" "#{temp.path}")
+        end
+      end
+
+      def quiet? #:nodoc:
+        mute? || (base && base.options[:quiet])
+      end
+
+      # Calculate the dynamic width of the terminal
+      def dynamic_width
+        @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
+      end
+
+      def dynamic_width_stty
+        %x{stty size 2>/dev/null}.split[1].to_i
+      end
+
+      def dynamic_width_tput
+        %x{tput cols 2>/dev/null}.to_i
+      end
+
+      def unix?
+        RUBY_PLATFORM =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
+      end
+
+      def truncate(string, width)
+        as_unicode do
+          chars = string.chars.to_a
+          if chars.length <= width
+            chars.join
+          else
+            ( chars[0, width-3].join ) + "..."
+          end
+        end
+      end
+
+      if "".respond_to?(:encode)
+        def as_unicode
+          yield
+        end
+      else
+        def as_unicode
+          old, $KCODE = $KCODE, "U"
+          yield
+        ensure
+          $KCODE = old
+        end
+      end
+
+      def ask_simply(statement, color=nil)
+        say("#{statement} ", color)
+        stdin.gets.tap{|text| text.strip! if text}
+      end
+
+      def ask_filtered(statement, answer_set, *args)
+        correct_answer = nil
+        until correct_answer
+          answer = ask_simply("#{statement} #{answer_set.inspect}", *args)
+          correct_answer = answer_set.include?(answer) ? answer : nil
+          answers = answer_set.map(&:inspect).join(", ")
+          say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer
+        end
+        correct_answer
+      end
+
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/shell/color.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/shell/color.rb
new file mode 100644
index 0000000..f24ab6c
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/shell/color.rb
@@ -0,0 +1,144 @@
+require 'thor/shell/basic'
+
+class Thor
+  module Shell
+    # Inherit from Thor::Shell::Basic and add set_color behavior. Check
+    # Thor::Shell::Basic to see all available methods.
+    #
+    class Color < Basic
+      # Embed in a String to clear all previous ANSI sequences.
+      CLEAR      = "\e[0m"
+      # The start of an ANSI bold sequence.
+      BOLD       = "\e[1m"
+
+      # Set the terminal's foreground ANSI color to black.
+      BLACK      = "\e[30m"
+      # Set the terminal's foreground ANSI color to red.
+      RED        = "\e[31m"
+      # Set the terminal's foreground ANSI color to green.
+      GREEN      = "\e[32m"
+      # Set the terminal's foreground ANSI color to yellow.
+      YELLOW     = "\e[33m"
+      # Set the terminal's foreground ANSI color to blue.
+      BLUE       = "\e[34m"
+      # Set the terminal's foreground ANSI color to magenta.
+      MAGENTA    = "\e[35m"
+      # Set the terminal's foreground ANSI color to cyan.
+      CYAN       = "\e[36m"
+      # Set the terminal's foreground ANSI color to white.
+      WHITE      = "\e[37m"
+
+      # Set the terminal's background ANSI color to black.
+      ON_BLACK   = "\e[40m"
+      # Set the terminal's background ANSI color to red.
+      ON_RED     = "\e[41m"
+      # Set the terminal's background ANSI color to green.
+      ON_GREEN   = "\e[42m"
+      # Set the terminal's background ANSI color to yellow.
+      ON_YELLOW  = "\e[43m"
+      # Set the terminal's background ANSI color to blue.
+      ON_BLUE    = "\e[44m"
+      # Set the terminal's background ANSI color to magenta.
+      ON_MAGENTA = "\e[45m"
+      # Set the terminal's background ANSI color to cyan.
+      ON_CYAN    = "\e[46m"
+      # Set the terminal's background ANSI color to white.
+      ON_WHITE   = "\e[47m"
+
+      # Set color by using a string or one of the defined constants. If a third
+      # option is set to true, it also adds bold to the string. This is based
+      # on Highline implementation and it automatically appends CLEAR to the end
+      # of the returned String.
+      #
+      # Pass foreground, background and bold options to this method as
+      # symbols.
+      #
+      # Example:
+      #
+      #   set_color "Hi!", :red, :on_white, :bold
+      #
+      # The available colors are:
+      #
+      #   :bold
+      #   :black
+      #   :red
+      #   :green
+      #   :yellow
+      #   :blue
+      #   :magenta
+      #   :cyan
+      #   :white
+      #   :on_black
+      #   :on_red
+      #   :on_green
+      #   :on_yellow
+      #   :on_blue
+      #   :on_magenta
+      #   :on_cyan
+      #   :on_white
+      def set_color(string, *colors)
+        if colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
+          ansi_colors = colors.map { |color| lookup_color(color) }
+          "#{ansi_colors.join}#{string}#{CLEAR}"
+        else
+          # The old API was `set_color(color, bold=boolean)`. We
+          # continue to support the old API because you should never
+          # break old APIs unnecessarily :P
+          foreground, bold = colors
+          foreground = self.class.const_get(foreground.to_s.upcase) if foreground.is_a?(Symbol)
+
+          bold       = bold ? BOLD : ""
+          "#{bold}#{foreground}#{string}#{CLEAR}"
+        end
+      end
+
+      protected
+
+        # Overwrite show_diff to show diff with colors if Diff::LCS is
+        # available.
+        #
+        def show_diff(destination, content) #:nodoc:
+          if diff_lcs_loaded? && ENV['THOR_DIFF'].nil? && ENV['RAILS_DIFF'].nil?
+            actual  = File.binread(destination).to_s.split("\n")
+            content = content.to_s.split("\n")
+
+            Diff::LCS.sdiff(actual, content).each do |diff|
+              output_diff_line(diff)
+            end
+          else
+            super
+          end
+        end
+
+        def output_diff_line(diff) #:nodoc:
+          case diff.action
+            when '-'
+              say "- #{diff.old_element.chomp}", :red, true
+            when '+'
+              say "+ #{diff.new_element.chomp}", :green, true
+            when '!'
+              say "- #{diff.old_element.chomp}", :red, true
+              say "+ #{diff.new_element.chomp}", :green, true
+            else
+              say "  #{diff.old_element.chomp}", nil, true
+          end
+        end
+
+        # Check if Diff::LCS is loaded. If it is, use it to create pretty output
+        # for diff.
+        #
+        def diff_lcs_loaded? #:nodoc:
+          return true  if defined?(Diff::LCS)
+          return @diff_lcs_loaded unless @diff_lcs_loaded.nil?
+
+          @diff_lcs_loaded = begin
+            require 'diff/lcs'
+            true
+          rescue LoadError
+            false
+          end
+        end
+
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/shell/html.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/shell/html.rb
new file mode 100644
index 0000000..678bc89
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/shell/html.rb
@@ -0,0 +1,123 @@
+require 'thor/shell/basic'
+
+class Thor
+  module Shell
+    # Inherit from Thor::Shell::Basic and add set_color behavior. Check
+    # Thor::Shell::Basic to see all available methods.
+    #
+    class HTML < Basic
+      # The start of an HTML bold sequence.
+      BOLD       = "font-weight: bold"
+
+      # Set the terminal's foreground HTML color to black.
+      BLACK      = 'color: black'
+      # Set the terminal's foreground HTML color to red.
+      RED        = 'color: red'
+      # Set the terminal's foreground HTML color to green.
+      GREEN      = 'color: green'
+      # Set the terminal's foreground HTML color to yellow.
+      YELLOW     = 'color: yellow'
+      # Set the terminal's foreground HTML color to blue.
+      BLUE       = 'color: blue'
+      # Set the terminal's foreground HTML color to magenta.
+      MAGENTA    = 'color: magenta'
+      # Set the terminal's foreground HTML color to cyan.
+      CYAN       = 'color: cyan'
+      # Set the terminal's foreground HTML color to white.
+      WHITE      = 'color: white'
+
+      # Set the terminal's background HTML color to black.
+      ON_BLACK   = 'background-color: black'
+      # Set the terminal's background HTML color to red.
+      ON_RED     = 'background-color: red'
+      # Set the terminal's background HTML color to green.
+      ON_GREEN   = 'background-color: green'
+      # Set the terminal's background HTML color to yellow.
+      ON_YELLOW  = 'background-color: yellow'
+      # Set the terminal's background HTML color to blue.
+      ON_BLUE    = 'background-color: blue'
+      # Set the terminal's background HTML color to magenta.
+      ON_MAGENTA = 'background-color: magenta'
+      # Set the terminal's background HTML color to cyan.
+      ON_CYAN    = 'background-color: cyan'
+      # Set the terminal's background HTML color to white.
+      ON_WHITE   = 'background-color: white'
+
+      # Set color by using a string or one of the defined constants. If a third
+      # option is set to true, it also adds bold to the string. This is based
+      # on Highline implementation and it automatically appends CLEAR to the end
+      # of the returned String.
+      #
+      def set_color(string, *colors)
+        if colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
+          html_colors = colors.map { |color| lookup_color(color) }
+          "<span style=\"#{html_colors.join("; ")};\">#{string}</span>"
+        else
+          color, bold = colors
+          html_color = self.class.const_get(color.to_s.upcase) if color.is_a?(Symbol)
+          styles = [html_color]
+          styles << BOLD if bold
+          "<span style=\"#{styles.join("; ")};\">#{string}</span>"
+        end
+      end
+
+      # Ask something to the user and receives a response.
+      #
+      # ==== Example
+      # ask("What is your name?")
+      #
+      # TODO: Implement #ask for Thor::Shell::HTML
+      def ask(statement, color=nil)
+        raise NotImplementedError, "Implement #ask for Thor::Shell::HTML"
+      end
+
+      protected
+
+        # Overwrite show_diff to show diff with colors if Diff::LCS is
+        # available.
+        #
+        def show_diff(destination, content) #:nodoc:
+          if diff_lcs_loaded? && ENV['THOR_DIFF'].nil? && ENV['RAILS_DIFF'].nil?
+            actual  = File.binread(destination).to_s.split("\n")
+            content = content.to_s.split("\n")
+
+            Diff::LCS.sdiff(actual, content).each do |diff|
+              output_diff_line(diff)
+            end
+          else
+            super
+          end
+        end
+
+        def output_diff_line(diff) #:nodoc:
+          case diff.action
+            when '-'
+              say "- #{diff.old_element.chomp}", :red, true
+            when '+'
+              say "+ #{diff.new_element.chomp}", :green, true
+            when '!'
+              say "- #{diff.old_element.chomp}", :red, true
+              say "+ #{diff.new_element.chomp}", :green, true
+            else
+              say "  #{diff.old_element.chomp}", nil, true
+          end
+        end
+
+        # Check if Diff::LCS is loaded. If it is, use it to create pretty output
+        # for diff.
+        #
+        def diff_lcs_loaded? #:nodoc:
+          return true  if defined?(Diff::LCS)
+          return @diff_lcs_loaded unless @diff_lcs_loaded.nil?
+
+          @diff_lcs_loaded = begin
+            require 'diff/lcs'
+            true
+          rescue LoadError
+            false
+          end
+        end
+
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/task.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/task.rb
new file mode 100644
index 0000000..92fb557
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/task.rb
@@ -0,0 +1,132 @@
+class Thor
+  class Task < Struct.new(:name, :description, :long_description, :usage, :options)
+    FILE_REGEXP = /^#{Regexp.escape(File.dirname(__FILE__))}/
+
+    def initialize(name, description, long_description, usage, options=nil)
+      super(name.to_s, description, long_description, usage, options || {})
+    end
+
+    def initialize_copy(other) #:nodoc:
+      super(other)
+      self.options = other.options.dup if other.options
+    end
+
+    def hidden?
+      false
+    end
+
+    # By default, a task invokes a method in the thor class. You can change this
+    # implementation to create custom tasks.
+    def run(instance, args=[])
+      arity = nil
+
+      if private_method?(instance)
+        instance.class.handle_no_task_error(name)
+      elsif public_method?(instance)
+        arity = instance.method(name).arity
+        instance.__send__(name, *args)
+      elsif local_method?(instance, :method_missing)
+        instance.__send__(:method_missing, name.to_sym, *args)
+      else
+        instance.class.handle_no_task_error(name)
+      end
+    rescue ArgumentError => e
+      handle_argument_error?(instance, e, caller) ?
+        instance.class.handle_argument_error(self, e, arity) : (raise e)
+    rescue NoMethodError => e
+      handle_no_method_error?(instance, e, caller) ?
+        instance.class.handle_no_task_error(name) : (raise e)
+    end
+
+    # Returns the formatted usage by injecting given required arguments
+    # and required options into the given usage.
+    def formatted_usage(klass, namespace = true, subcommand = false)
+      if namespace
+        namespace = klass.namespace
+        formatted = "#{namespace.gsub(/^(default)/,'')}:"
+      end
+      formatted = "#{klass.namespace.split(':').last} " if subcommand
+
+      formatted ||= ""
+
+      # Add usage with required arguments
+      formatted << if klass && !klass.arguments.empty?
+        usage.to_s.gsub(/^#{name}/) do |match|
+          match << " " << klass.arguments.map{ |a| a.usage }.compact.join(' ')
+        end
+      else
+        usage.to_s
+      end
+
+      # Add required options
+      formatted << " #{required_options}"
+
+      # Strip and go!
+      formatted.strip
+    end
+
+  protected
+
+    def not_debugging?(instance)
+      !(instance.class.respond_to?(:debugging) && instance.class.debugging)
+    end
+
+    def required_options
+      @required_options ||= options.map{ |_, o| o.usage if o.required? }.compact.sort.join(" ")
+    end
+
+    # Given a target, checks if this class name is a public method.
+    def public_method?(instance) #:nodoc:
+      !(instance.public_methods & [name.to_s, name.to_sym]).empty?
+    end
+
+    def private_method?(instance)
+      !(instance.private_methods & [name.to_s, name.to_sym]).empty?
+    end
+
+    def local_method?(instance, name)
+      methods = instance.public_methods(false) + instance.private_methods(false) + instance.protected_methods(false)
+      !(methods & [name.to_s, name.to_sym]).empty?
+    end
+
+    def sans_backtrace(backtrace, caller) #:nodoc:
+      saned  = backtrace.reject { |frame| frame =~ FILE_REGEXP || (frame =~ /\.java:/ && RUBY_PLATFORM =~ /java/) }
+      saned -= caller
+    end
+
+    def handle_argument_error?(instance, error, caller)
+      not_debugging?(instance) && error.message =~ /wrong number of arguments/ && begin
+        saned = sans_backtrace(error.backtrace, caller)
+        # Ruby 1.9 always include the called method in the backtrace
+        saned.empty? || (saned.size == 1 && RUBY_VERSION >= "1.9")
+      end
+    end
+
+    def handle_no_method_error?(instance, error, caller)
+      not_debugging?(instance) &&
+        error.message =~ /^undefined method `#{name}' for #{Regexp.escape(instance.to_s)}$/
+    end
+  end
+
+  # A task that is hidden in help messages but still invocable.
+  class HiddenTask < Task
+    def hidden?
+      true
+    end
+  end
+
+  # A dynamic task that handles method missing scenarios.
+  class DynamicTask < Task
+    def initialize(name, options=nil)
+      super(name.to_s, "A dynamically-generated task", name.to_s, name.to_s, options)
+    end
+
+    def run(instance, args=[])
+      if (instance.methods & [name.to_s, name.to_sym]).empty?
+        super
+      else
+        instance.class.handle_no_task_error(name)
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/util.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/util.rb
new file mode 100644
index 0000000..d45843d
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/util.rb
@@ -0,0 +1,266 @@
+require 'rbconfig'
+
+class Thor
+  module Sandbox #:nodoc:
+  end
+
+  # This module holds several utilities:
+  #
+  # 1) Methods to convert thor namespaces to constants and vice-versa.
+  #
+  #   Thor::Util.namespace_from_thor_class(Foo::Bar::Baz) #=> "foo:bar:baz"
+  #
+  # 2) Loading thor files and sandboxing:
+  #
+  #   Thor::Util.load_thorfile("~/.thor/foo")
+  #
+  module Util
+
+    # Receives a namespace and search for it in the Thor::Base subclasses.
+    #
+    # ==== Parameters
+    # namespace<String>:: The namespace to search for.
+    #
+    def self.find_by_namespace(namespace)
+      namespace = "default#{namespace}" if namespace.empty? || namespace =~ /^:/
+      Thor::Base.subclasses.find { |klass| klass.namespace == namespace }
+    end
+
+    # Receives a constant and converts it to a Thor namespace. Since Thor tasks
+    # can be added to a sandbox, this method is also responsable for removing
+    # the sandbox namespace.
+    #
+    # This method should not be used in general because it's used to deal with
+    # older versions of Thor. On current versions, if you need to get the
+    # namespace from a class, just call namespace on it.
+    #
+    # ==== Parameters
+    # constant<Object>:: The constant to be converted to the thor path.
+    #
+    # ==== Returns
+    # String:: If we receive Foo::Bar::Baz it returns "foo:bar:baz"
+    #
+    def self.namespace_from_thor_class(constant)
+      constant = constant.to_s.gsub(/^Thor::Sandbox::/, "")
+      constant = snake_case(constant).squeeze(":")
+      constant
+    end
+
+    # Given the contents, evaluate it inside the sandbox and returns the
+    # namespaces defined in the sandbox.
+    #
+    # ==== Parameters
+    # contents<String>
+    #
+    # ==== Returns
+    # Array[Object]
+    #
+    def self.namespaces_in_content(contents, file=__FILE__)
+      old_constants = Thor::Base.subclasses.dup
+      Thor::Base.subclasses.clear
+
+      load_thorfile(file, contents)
+
+      new_constants = Thor::Base.subclasses.dup
+      Thor::Base.subclasses.replace(old_constants)
+
+      new_constants.map!{ |c| c.namespace }
+      new_constants.compact!
+      new_constants
+    end
+
+    # Returns the thor classes declared inside the given class.
+    #
+    def self.thor_classes_in(klass)
+      stringfied_constants = klass.constants.map { |c| c.to_s }
+      Thor::Base.subclasses.select do |subclass|
+        next unless subclass.name
+        stringfied_constants.include?(subclass.name.gsub("#{klass.name}::", ''))
+      end
+    end
+
+    # Receives a string and convert it to snake case. SnakeCase returns snake_case.
+    #
+    # ==== Parameters
+    # String
+    #
+    # ==== Returns
+    # String
+    #
+    def self.snake_case(str)
+      return str.downcase if str =~ /^[A-Z_]+$/
+      str.gsub(/\B[A-Z]/, '_\&').squeeze('_') =~ /_*(.*)/
+      return $+.downcase
+    end
+
+    # Receives a string and convert it to camel case. camel_case returns CamelCase.
+    #
+    # ==== Parameters
+    # String
+    #
+    # ==== Returns
+    # String
+    #
+    def self.camel_case(str)
+      return str if str !~ /_/ && str =~ /[A-Z]+.*/
+      str.split('_').map { |i| i.capitalize }.join
+    end
+
+    # Receives a namespace and tries to retrieve a Thor or Thor::Group class
+    # from it. It first searches for a class using the all the given namespace,
+    # if it's not found, removes the highest entry and searches for the class
+    # again. If found, returns the highest entry as the class name.
+    #
+    # ==== Examples
+    #
+    #   class Foo::Bar < Thor
+    #     def baz
+    #     end
+    #   end
+    #
+    #   class Baz::Foo < Thor::Group
+    #   end
+    #
+    #   Thor::Util.namespace_to_thor_class("foo:bar")     #=> Foo::Bar, nil # will invoke default task
+    #   Thor::Util.namespace_to_thor_class("baz:foo")     #=> Baz::Foo, nil
+    #   Thor::Util.namespace_to_thor_class("foo:bar:baz") #=> Foo::Bar, "baz"
+    #
+    # ==== Parameters
+    # namespace<String>
+    #
+    def self.find_class_and_task_by_namespace(namespace, fallback = true)
+      if namespace.include?(?:) # look for a namespaced task
+        pieces = namespace.split(":")
+        task   = pieces.pop
+        klass  = Thor::Util.find_by_namespace(pieces.join(":"))
+      end
+      unless klass # look for a Thor::Group with the right name
+        klass, task = Thor::Util.find_by_namespace(namespace), nil
+      end
+      if !klass && fallback # try a task in the default namespace
+        task = namespace
+        klass = Thor::Util.find_by_namespace('')
+      end
+      return klass, task
+    end
+
+    # Receives a path and load the thor file in the path. The file is evaluated
+    # inside the sandbox to avoid namespacing conflicts.
+    #
+    def self.load_thorfile(path, content=nil, debug=false)
+      content ||= File.binread(path)
+
+      begin
+        Thor::Sandbox.class_eval(content, path)
+      rescue Exception => e
+        $stderr.puts("WARNING: unable to load thorfile #{path.inspect}: #{e.message}")
+        if debug
+          $stderr.puts(*e.backtrace)
+        else
+          $stderr.puts(e.backtrace.first)
+        end
+      end
+    end
+
+    def self.user_home
+      @@user_home ||= if ENV["HOME"]
+        ENV["HOME"]
+      elsif ENV["USERPROFILE"]
+        ENV["USERPROFILE"]
+      elsif ENV["HOMEDRIVE"] && ENV["HOMEPATH"]
+        File.join(ENV["HOMEDRIVE"], ENV["HOMEPATH"])
+      elsif ENV["APPDATA"]
+        ENV["APPDATA"]
+      else
+        begin
+          File.expand_path("~")
+        rescue
+          if File::ALT_SEPARATOR
+            "C:/"
+          else
+            "/"
+          end
+        end
+      end
+    end
+
+    # Returns the root where thor files are located, depending on the OS.
+    #
+    def self.thor_root
+      File.join(user_home, ".thor").gsub(/\\/, '/')
+    end
+
+    # Returns the files in the thor root. On Windows thor_root will be something
+    # like this:
+    #
+    #   C:\Documents and Settings\james\.thor
+    #
+    # If we don't #gsub the \ character, Dir.glob will fail.
+    #
+    def self.thor_root_glob
+      files = Dir["#{escape_globs(thor_root)}/*"]
+
+      files.map! do |file|
+        File.directory?(file) ? File.join(file, "main.thor") : file
+      end
+    end
+
+    # Where to look for Thor files.
+    #
+    def self.globs_for(path)
+      path = escape_globs(path)
+      ["#{path}/Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"]
+    end
+
+    # Return the path to the ruby interpreter taking into account multiple
+    # installations and windows extensions.
+    #
+    def self.ruby_command
+      @ruby_command ||= begin
+        ruby_name = RbConfig::CONFIG['ruby_install_name']
+        ruby = File.join(RbConfig::CONFIG['bindir'], ruby_name)
+        ruby << RbConfig::CONFIG['EXEEXT']
+
+        # avoid using different name than ruby (on platforms supporting links)
+        if ruby_name != 'ruby' && File.respond_to?(:readlink)
+          begin
+            alternate_ruby = File.join(RbConfig::CONFIG['bindir'], 'ruby')
+            alternate_ruby << RbConfig::CONFIG['EXEEXT']
+
+            # ruby is a symlink
+            if File.symlink? alternate_ruby
+              linked_ruby = File.readlink alternate_ruby
+
+              # symlink points to 'ruby_install_name'
+              ruby = alternate_ruby if linked_ruby == ruby_name || linked_ruby == ruby
+            end
+          rescue NotImplementedError
+            # just ignore on windows
+          end
+        end
+
+        # escape string in case path to ruby executable contain spaces.
+        ruby.sub!(/.*\s.*/m, '"\&"')
+        ruby
+      end
+    end
+
+    # Returns a string that has had any glob characters escaped.
+    # The glob characters are `* ? { } [ ]`.
+    #
+    # ==== Examples
+    #
+    #   Thor::Util.escape_globs('[apps]')   # => '\[apps\]'
+    #
+    # ==== Parameters
+    # String
+    #
+    # ==== Returns
+    # String
+    #
+    def self.escape_globs(path)
+      path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&')
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/version.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/version.rb
new file mode 100644
index 0000000..4765b35
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendor/thor/version.rb
@@ -0,0 +1,3 @@
+class Thor
+  VERSION = "0.16.0"
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendored_persistent.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendored_persistent.rb
new file mode 100644
index 0000000..5726663
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendored_persistent.rb
@@ -0,0 +1,10 @@
+begin
+  require 'openssl'
+  OpenSSL && OpenSSL::SSL # ensure OpenSSL is loaded
+
+  vendor = File.expand_path('../vendor', __FILE__)
+  $:.unshift(vendor) unless $:.include?(vendor)
+  require 'net/http/persistent'
+rescue LoadError, NameError => e
+  require 'net/http'
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vendored_thor.rb b/misc/lib/bundler-1.3.5/lib/bundler/vendored_thor.rb
new file mode 100644
index 0000000..a643426
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vendored_thor.rb
@@ -0,0 +1,8 @@
+if defined?(Thor)
+  Bundler.ui.warn "Thor has already been required. " +
+    "This may cause Bundler to malfunction in unexpected ways."
+end
+vendor = File.expand_path('../vendor', __FILE__)
+$:.unshift(vendor) unless $:.include?(vendor)
+require 'thor'
+require 'thor/actions'
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/version.rb b/misc/lib/bundler-1.3.5/lib/bundler/version.rb
new file mode 100644
index 0000000..2e571e4
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/version.rb
@@ -0,0 +1,6 @@
+module Bundler
+  # We're doing this because we might write tests that deal
+  # with other versions of bundler and we are unsure how to
+  # handle this better.
+  VERSION = "1.3.5" unless defined?(::Bundler::VERSION)
+end
diff --git a/misc/lib/bundler-1.3.5/lib/bundler/vlad.rb b/misc/lib/bundler-1.3.5/lib/bundler/vlad.rb
new file mode 100644
index 0000000..aaf7145
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/lib/bundler/vlad.rb
@@ -0,0 +1,11 @@
+# Vlad task for Bundler.
+#
+# Just add "require 'bundler/vlad'" in your Vlad deploy.rb, and
+# include the vlad:bundle:install task in your vlad:deploy task.
+require 'bundler/deployment'
+
+include Rake::DSL if defined? Rake::DSL
+
+namespace :vlad do
+  Bundler::Deployment.define_task(Rake::RemoteTask, :remote_task, :roles => :app)
+end
diff --git a/misc/lib/bundler-1.3.5/man/bundle-config.ronn b/misc/lib/bundler-1.3.5/man/bundle-config.ronn
new file mode 100644
index 0000000..96cf59b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/man/bundle-config.ronn
@@ -0,0 +1,134 @@
+bundle-config(1) -- Set bundler configuration options
+=====================================================
+
+## SYNOPSIS
+
+`bundle config` [<name> [<value>]]
+
+## DESCRIPTION
+
+This command allows you to interact with bundler's configuration system.
+Bundler retrieves its configuration from the local application (`app/.bundle/config`),
+environment variables, and the user's home directory (`~/.bundle/config`),
+in that order of priority.
+
+Executing `bundle config` with no parameters will print a list of all
+bundler configuration for the current bundle, and where that configuration
+was set.
+
+Executing `bundle config <name>` will print the value of that configuration
+setting, and where it was set.
+
+Executing `bundle config <name> <value>` will set that configuration to the
+value specified for all bundles executed as the current user. The configuration
+will be stored in `~/.bundle/config`. If <name> already is set, <name> will be
+overridden and user will be warned.
+
+Executing `bundle config --global <name> <value>` works the same as above.
+
+Executing `bundle config --local <name> <value>` will set that configuration to
+the local application. The configuration will be stored in `app/.bundle/config`.
+
+Executing `bundle config --delete <name>` will delete the configuration in both
+local and global sources. Not compatible with --global or --local flag.
+
+Executing bundle with the `BUNDLE_IGNORE_CONFIG` environment variable set will
+cause it to ignore all configuration.
+
+## BUILD OPTIONS
+
+You can use `bundle config` to give bundler the flags to pass to the gem
+installer every time bundler tries to install a particular gem.
+
+A very common example, the `mysql` gem, requires Snow Leopard users to
+pass configuration flags to `gem install` to specify where to find the
+`mysql_config` executable.
+
+    gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
+
+Since the specific location of that executable can change from machine
+to machine, you can specify these flags on a per-machine basis.
+
+    bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config
+
+After running this command, every time bundler needs to install the
+`mysql` gem, it will pass along the flags you specified.
+
+## CONFIGURATION KEYS
+
+Configuration keys in bundler have two forms: the canonical form and the
+environment variable form.
+
+For instance, passing the `--without` flag to [bundle install(1)][bundle-install]
+prevents Bundler from installing certain groups specified in the Gemfile(5). Bundler
+persists this value in `app/.bundle/config` so that calls to `Bundler.setup`
+do not try to find gems from the `Gemfile` that you didn't install. Additionally,
+subsequent calls to [bundle install(1)][bundle-install] remember this setting and skip those
+groups.
+
+The canonical form of this configuration is `"without"`. To convert the canonical
+form to the environment variable form, capitalize it, and prepend `BUNDLE_`. The
+environment variable form of `"without"` is `BUNDLE_WITHOUT`.
+
+## LIST OF AVAILABLE KEYS
+
+The following is a list of all configuration keys and their purpose. You can
+learn more about their operation in [bundle install(1)][bundle-install].
+
+* `path` (`BUNDLE_PATH`):
+  The location on disk to install gems. Defaults to `$GEM_HOME` in development
+  and `vendor/bundler` when `--deployment` is used
+* `frozen` (`BUNDLE_FROZEN`):
+  Disallow changes to the `Gemfile`. Defaults to `true` when `--deployment`
+  is used.
+* `without` (`BUNDLE_WITHOUT`):
+  A `:`-separated list of groups whose gems bundler should not install
+* `bin` (`BUNDLE_BIN`):
+  Install executables from gems in the bundle to the specified directory.
+  Defaults to `false`.
+* `gemfile` (`BUNDLE_GEMFILE`):
+  The name of the file that bundler should use as the `Gemfile`. This location
+  of this file also sets the root of the project, which is used to resolve
+  relative paths in the `Gemfile`, among other things. By default, bundler
+  will search up from the current working directory until it finds a
+  `Gemfile`.
+
+In general, you should set these settings per-application by using the applicable
+flag to the [bundle install(1)][bundle-install] command.
+
+You can set them globally either via environment variables or `bundle config`,
+whichever is preferable for your setup. If you use both, environment variables
+will take preference over global settings.
+
+## LOCAL GIT REPOS
+
+Bundler also allows you to work against a git repository locally
+instead of using the remote version. This can be achieved by setting
+up a local override:
+
+    bundle config local.GEM_NAME /path/to/local/git/repository
+
+For example, in order to use a local Rack repository, a developer could call:
+
+    bundle config local.rack ~/Work/git/rack
+
+Now instead of checking out the remote git repository, the local
+override will be used. Similar to a path source, every time the local
+git repository change, changes will be automatically picked up by
+Bundler. This means a commit in the local git repo will update the
+revision in the `Gemfile.lock` to the local git repo revision. This
+requires the same attention as git submodules. Before pushing to
+the remote, you need to ensure the local override was pushed, otherwise
+you may point to a commit that only exists in your local machine.
+
+Bundler does many checks to ensure a developer won't work with
+invalid references. Particularly, we force a developer to specify
+a branch in the `Gemfile` in order to use this feature. If the branch
+specified in the `Gemfile` and the current branch in the local git
+repository do not match, Bundler will abort. This ensures that
+a developer is always working against the correct branches, and prevents
+accidental locking to a different branch.
+
+Finally, Bundler also ensures that the current revision in the
+`Gemfile.lock` exists in the local git repository. By doing this, Bundler
+forces you to fetch the latest changes in the remotes.
diff --git a/misc/lib/bundler-1.3.5/man/bundle-exec.ronn b/misc/lib/bundler-1.3.5/man/bundle-exec.ronn
new file mode 100644
index 0000000..d28ea51
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/man/bundle-exec.ronn
@@ -0,0 +1,111 @@
+bundle-exec(1) -- Execute a command in the context of the bundle
+================================================================
+
+## SYNOPSIS
+
+`bundle exec` <command>
+
+## DESCRIPTION
+
+This command executes the command, making all gems specified in the
+`Gemfile(5)` available to `require` in Ruby programs.
+
+Essentially, if you would normally have run something like
+`rspec spec/my_spec.rb`, and you want to use the gems specified
+in the `Gemfile(5)` and installed via [bundle install(1)][bundle-install], you
+should run `bundle exec rspec spec/my_spec.rb`.
+
+Note that `bundle exec` does not require that an executable is
+available on your shell's `$PATH`.
+
+## BUNDLE INSTALL --BINSTUBS
+
+If you use the `--binstubs` flag in [bundle install(1)][bundle-install], Bundler will
+automatically create a directory (which defaults to `app_root/bin`)
+containing all of the executables available from gems in the bundle.
+
+After using `--binstubs`, `bin/rspec spec/my_spec.rb` is identical
+to `bundle exec rspec spec/my_spec.rb`.
+
+## ENVIRONMENT MODIFICATIONS
+
+`bundle exec` makes a number of changes to the shell environment,
+then executes the command you specify in full.
+
+* make sure that it's still possible to shell out to `bundle`
+  from inside a command invoked by `bundle exec` (using
+  `$BUNDLE_BIN_PATH`)
+* put the directory containing executables (like `rails`, `rspec`,
+  `rackup`) for your bundle on `$PATH`
+* make sure that if bundler is invoked in the subshell, it uses
+  the same `Gemfile` (by setting `BUNDLE_GEMFILE`)
+* add `-rbundler/setup` to `$RUBYOPT`, which makes sure that
+  Ruby programs invoked in the subshell can see the gems in
+  the bundle
+
+It also modifies Rubygems:
+
+* disallow loading additional gems not in the bundle
+* modify the `gem` method to be a no-op if a gem matching
+  the requirements is in the bundle, and to raise a
+  `Gem::LoadError` if it's not
+* Define `Gem.refresh` to be a no-op, since the source
+  index is always frozen when using bundler, and to
+  prevent gems from the system leaking into the environment
+* Override `Gem.bin_path` to use the gems in the bundle,
+  making system executables work
+* Add all gems in the bundle into Gem.loaded_specs
+
+### Shelling out
+
+When shelling out (using the `system` or backticks methods,
+for example), Bundler's environment changes will propagate to
+the subshell environment. If you desire to shell out without
+Bundler's environment changes, simply employ the `with_clean_env`
+method. It will restore all environment variables to what they
+were before Bundler was activated. For example:
+
+    Bundler.with_clean_env do
+      `brew install wget`
+    end
+
+## RUBYGEMS PLUGINS
+
+At present, the Rubygems plugin system requires all files
+named `rubygems_plugin.rb` on the load path of _any_ installed
+gem when any Ruby code requires `rubygems.rb`. This includes
+executables installed into the system, like `rails`, `rackup`,
+and `rspec`.
+
+Since Rubygems plugins can contain arbitrary Ruby code, they
+commonly end up activating themselves or their dependencies.
+
+For instance, the `gemcutter 0.5` gem depended on `json_pure`.
+If you had that version of gemcutter installed (even if
+you _also_ had a newer version without this problem), Rubygems
+would activate `gemcutter 0.5` and `json_pure <latest>`.
+
+If your Gemfile(5) also contained `json_pure` (or a gem
+with a dependency on `json_pure`), the latest version on
+your system might conflict with the version in your
+Gemfile(5), or the snapshot version in your `Gemfile.lock`.
+
+If this happens, bundler will say:
+
+    You have already activated json_pure 1.4.6 but your Gemfile
+    requires json_pure 1.4.3. Consider using bundle exec.
+
+In this situation, you almost certainly want to remove the
+underlying gem with the problematic gem plugin. In general,
+the authors of these plugins (in this case, the `gemcutter`
+gem) have released newer versions that are more careful in
+their plugins.
+
+You can find a list of all the gems containing gem plugins
+by running
+
+    ruby -rubygems -e "puts Gem.find_files('rubygems_plugin.rb')"
+
+At the very least, you should remove all but the newest
+version of each gem plugin, and also remove all gem plugins
+that you aren't using (`gem uninstall gem_name`).
diff --git a/misc/lib/bundler-1.3.5/man/bundle-install.ronn b/misc/lib/bundler-1.3.5/man/bundle-install.ronn
new file mode 100644
index 0000000..44f36a9
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/man/bundle-install.ronn
@@ -0,0 +1,350 @@
+bundle-install(1) -- Install the dependencies specified in your Gemfile
+=======================================================================
+
+## SYNOPSIS
+
+`bundle install` [--gemfile=GEMFILE]
+                 [--path PATH] [--system]
+                 [--without=GROUP1[ GROUP2...]]
+                 [--local] [--deployment]
+                 [--binstubs[=DIRECTORY]]
+                 [--standalone[=GROUP1[ GROUP2...]]]
+                 [--trust-policy=POLICY]
+                 [--no-cache]
+                 [--quiet]
+
+## DESCRIPTION
+
+Install the gems specified in your Gemfile(5). If this is the first
+time you run bundle install (and a `Gemfile.lock` does not exist),
+bundler will fetch all remote sources, resolve dependencies and
+install all needed gems.
+
+If a `Gemfile.lock` does exist, and you have not updated your Gemfile(5),
+bundler will fetch all remote sources, but use the dependencies
+specified in the `Gemfile.lock` instead of resolving dependencies.
+
+If a `Gemfile.lock` does exist, and you have updated your Gemfile(5),
+bundler will use the dependencies in the `Gemfile.lock` for all gems
+that you did not update, but will re-resolve the dependencies of
+gems that you did update. You can find more information about this
+update process below under [CONSERVATIVE UPDATING][].
+
+## OPTIONS
+
+* `--gemfile=<gemfile>`:
+  The location of the Gemfile(5) that bundler should use. This defaults
+  to a gemfile in the current working directory. In general, bundler
+  will assume that the location of the Gemfile(5) is also the project
+  root, and will look for the `Gemfile.lock` and `vendor/cache` relative
+  to it.
+
+* `--path=<path>`:
+  The location to install the gems in the bundle to. This defaults
+  to the gem home, which is the location that `gem install` installs
+  gems to. This means that, by default, gems installed without a
+  `--path` setting will show up in `gem list`. This setting is a
+  [remembered option][REMEMBERED OPTIONS].
+
+* `--system`:
+  Installs the gems in the bundle to the system location. This
+  overrides any previous [remembered][REMEMBERED OPTIONS] use of
+  `--path`.
+
+* `--without=<list>`:
+  A space-separated list of groups to skip installing. This is a
+  [remembered option][REMEMBERED OPTIONS].
+
+* `--local`:
+  Do not attempt to connect to `rubygems.org`, instead using just
+  the gems already present in Rubygems' cache or in `vendor/cache`.
+  Note that if a more appropriate platform-specific gem exists on
+  `rubygems.org`, it will not be found.
+
+* `--deployment`:
+  Switches bundler's defaults into [deployment mode][DEPLOYMENT MODE].
+  Do not use this flag on development machines.
+
+* `--binstubs[=<directory>]`:
+  Create a directory (defaults to `bin`) containing an executable
+  that runs in the context of the bundle. For instance, if the
+  `rails` gem comes with a `rails` executable, this flag will create
+  a `bin/rails` executable that ensures that all dependencies used
+  come from the bundled gems.
+
+* `--shebang ruby-install-name`:
+  Uses the ruby executable (usually `ruby`) provided to execute the scripts created
+  with --binstubs. For instance, if you use --binstubs with `--shebang jruby`,
+  all executables will be created to use jruby instead.
+
+* `--standalone[=<list>]`:
+  Make a bundle that can work without Ruby Gems or Bundler at runtime.
+  It takes a space separated list of groups to install. It creates a
+  `bundle` directory and installs the bundle there. It also generates
+  a `bundle/bundler/setup.rb` file to replace Bundler's own setup.
+
+* `--trust-policy=[<policy>]`:
+  Apply the Rubygems security policy named <policy>, where policy is one of
+  HighSecurity, MediumSecurity, LowSecurity, or NoSecurity. For more detail,
+  see the Rubygems signing documentation, linked below in [SEE ALSO][].
+
+* `--no-cache`:
+  Do not update the cache in `vendor/cache` with the newly bundled gems. This
+  does not remove any existing cached gems, only stops the newly bundled gems
+  from being cached during the install.
+
+* `--quiet`:
+  Do not print progress information to stdout. Instead, communicate the
+  success of the install operation via exit status code.
+
+## DEPLOYMENT MODE
+
+Bundler's defaults are optimized for development. To switch to
+defaults optimized for deployment, use the `--deployment` flag.
+Do not activate deployment mode on development machines, as it
+will cause in an error when the Gemfile is modified.
+
+1. A `Gemfile.lock` is required.
+
+   To ensure that the same versions of the gems you developed with
+   and tested with are also used in deployments, a `Gemfile.lock`
+   is required.
+
+   This is mainly to ensure that you remember to check your
+   `Gemfile.lock` into version control.
+
+2. The `Gemfile.lock` must be up to date
+
+   In development, you can modify your Gemfile(5) and re-run
+   `bundle install` to [conservatively update][CONSERVATIVE UPDATING]
+   your `Gemfile.lock` snapshot.
+
+   In deployment, your `Gemfile.lock` should be up-to-date with
+   changes made in your Gemfile(5).
+
+3. Gems are installed to `vendor/bundle` not your default system location
+
+   In development, it's convenient to share the gems used in your
+   application with other applications and other scripts run on
+   the system.
+
+   In deployment, isolation is a more important default. In addition,
+   the user deploying the application may not have permission to install
+   gems to the system, or the web server may not have permission to
+   read them.
+
+   As a result, `bundle install --deployment` installs gems to
+   the `vendor/bundle` directory in the application. This may be
+   overridden using the `--path` option.
+
+## SUDO USAGE
+
+By default, bundler installs gems to the same location as `gem install`.
+
+In some cases, that location may not be writable by your Unix user. In
+that case, bundler will stage everything in a temporary directory,
+then ask you for your `sudo` password in order to copy the gems into
+their system location.
+
+From your perspective, this is identical to installing them gems
+directly into the system.
+
+You should never use `sudo bundle install`. This is because several
+other steps in `bundle install` must be performed as the current user:
+
+* Updating your `Gemfile.lock`
+* Updating your `vendor/cache`, if necessary
+* Checking out private git repositories using your user's SSH keys
+
+Of these three, the first two could theoretically be performed by
+`chown`ing the resulting files to `$SUDO_USER`. The third, however,
+can only be performed by actually invoking the `git` command as
+the current user. Therefore, git gems are downloaded and installed
+into `~/.bundle` rather than $GEM_HOME or $BUNDLE_PATH.
+
+As a result, you should run `bundle install` as the current user,
+and bundler will ask for your password if it is needed to put the
+gems into their final location.
+
+## INSTALLING GROUPS
+
+By default, `bundle install` will install all gems in all groups
+in your Gemfile(5), except those declared for a different platform.
+
+However, you can explicitly tell bundler to skip installing
+certain groups with the `--without` option. This option takes
+a space-separated list of groups.
+
+While the `--without` option will skip _installing_ the gems in the
+specified groups, it will still _download_ those gems and use them to
+resolve the dependencies of every gem in your Gemfile(5).
+
+This is so that installing a different set of groups on another
+ machine (such as a production server) will not change the
+gems and versions that you have already developed and tested against.
+
+`Bundler offers a rock-solid guarantee that the third-party
+code you are running in development and testing is also the
+third-party code you are running in production. You can choose
+to exclude some of that code in different environments, but you
+will never be caught flat-footed by different versions of
+third-party code being used in different environments.`
+
+For a simple illustration, consider the following Gemfile(5):
+
+    source "https://rubygems.org"
+
+    gem "sinatra"
+
+    group :production do
+      gem "rack-perftools-profiler"
+    end
+
+In this case, `sinatra` depends on any version of Rack (`>= 1.0`, while
+`rack-perftools-profiler` depends on 1.x (`~> 1.0`).
+
+When you run `bundle install --without production` in development, we
+look at the dependencies of `rack-perftools-profiler` as well. That way,
+you do not spend all your time developing against Rack 2.0, using new
+APIs unavailable in Rack 1.x, only to have bundler switch to Rack 1.2
+when the `production` group _is_ used.
+
+This should not cause any problems in practice, because we do not
+attempt to `install` the gems in the excluded groups, and only evaluate
+as part of the dependency resolution process.
+
+This also means that you cannot include different versions of the same
+gem in different groups, because doing so would result in different
+sets of dependencies used in development and production. Because of
+the vagaries of the dependency resolution process, this usually
+affects more than just the gems you list in your Gemfile(5), and can
+(surprisingly) radically change the gems you are using.
+
+## REMEMBERED OPTIONS
+
+Some options (marked above in the [OPTIONS][] section) are remembered
+between calls to `bundle install`, and by the Bundler runtime.
+
+For instance, if you run `bundle install --without test`, a subsequent
+call to `bundle install` that does not include a `--without` flag will
+remember your previous choice.
+
+In addition, a call to `Bundler.setup` will not attempt to make the
+gems in those groups available on the Ruby load path, as they were
+not installed.
+
+The settings that are remembered are:
+
+* `--deployment`:
+  At runtime, this remembered setting will also result in Bundler
+  raising an exception if the `Gemfile.lock` is out of date.
+
+* `--path`:
+  Subsequent calls to `bundle install` will install gems to the
+  directory originally passed to `--path`. The Bundler runtime
+  will look for gems in that location. You can revert this
+  option by running `bundle install --system`.
+
+* `--binstubs`:
+  Bundler will update the executables every subsequent call to
+  `bundle install`.
+
+* `--without`:
+  As described above, Bundler will skip the gems specified by
+  `--without` in subsequent calls to `bundle install`. The
+  Bundler runtime will also not try to make the gems in the
+  skipped groups available.
+
+## THE GEMFILE.LOCK
+
+When you run `bundle install`, Bundler will persist the full names
+and versions of all gems that you used (including dependencies of
+the gems specified in the Gemfile(5)) into a file called `Gemfile.lock`.
+
+Bundler uses this file in all subsequent calls to `bundle install`,
+which guarantees that you always use the same exact code, even
+as your application moves across machines.
+
+Because of the way dependency resolution works, even a
+seemingly small change (for instance, an update to a point-release
+of a dependency of a gem in your Gemfile(5)) can result in radically
+different gems being needed to satisfy all dependencies.
+
+As a result, you `SHOULD` check your `Gemfile.lock` into version
+control. If you do not, every machine that checks out your
+repository (including your production server) will resolve all
+dependencies again, which will result in different versions of
+third-party code being used if `any` of the gems in the Gemfile(5)
+or any of their dependencies have been updated.
+
+## CONSERVATIVE UPDATING
+
+When you make a change to the Gemfile(5) and then run `bundle install`,
+Bundler will update only the gems that you modified.
+
+In other words, if a gem that you `did not modify` worked before
+you called `bundle install`, it will continue to use the exact
+same versions of all dependencies as it used before the update.
+
+Let's take a look at an example. Here's your original Gemfile(5):
+
+    source "https://rubygems.org"
+
+    gem "actionpack", "2.3.8"
+    gem "activemerchant"
+
+In this case, both `actionpack` and `activemerchant` depend on
+`activesupport`. The `actionpack` gem depends on `activesupport 2.3.8`
+and `rack ~> 1.1.0`, while the `activemerchant` gem depends on
+`activesupport >= 2.3.2`, `braintree >= 2.0.0`, and `builder >= 2.0.0`.
+
+When the dependencies are first resolved, Bundler will select
+`activesupport 2.3.8`, which satisfies the requirements of both
+gems in your Gemfile(5).
+
+Next, you modify your Gemfile(5) to:
+
+    source "https://rubygems.org"
+
+    gem "actionpack", "3.0.0.rc"
+    gem "activemerchant"
+
+The `actionpack 3.0.0.rc` gem has a number of new dependencies,
+and updates the `activesupport` dependency to `= 3.0.0.rc` and
+the `rack` dependency to `~> 1.2.1`.
+
+When you run `bundle install`, Bundler notices that you changed
+the `actionpack` gem, but not the `activemerchant` gem. It
+evaluates the gems currently being used to satisfy its requirements:
+
+  * `activesupport 2.3.8`:
+    also used to satisfy a dependency in `activemerchant`,
+    which is not being updated
+  * `rack ~> 1.1.0`:
+    not currently being used to satify another dependency
+
+Because you did not explicitly ask to update `activemerchant`,
+you would not expect it to suddenly stop working after updating
+`actionpack`. However, satisfying the new `activesupport 3.0.0.rc`
+dependency of actionpack requires updating one of its dependencies.
+
+Even though `activemerchant` declares a very loose dependency
+that theoretically matches `activesupport 3.0.0.rc`, bundler treats
+gems in your Gemfile(5) that have not changed as an atomic unit
+together with their dependencies. In this case, the `activemerchant`
+dependency is treated as `activemerchant 1.7.1 + activesupport 2.3.8`,
+so `bundle install` will report that it cannot update `actionpack`.
+
+To explicitly update `actionpack`, including its dependencies
+which other gems in the Gemfile(5) still depend on, run
+`bundle update actionpack` (see `bundle update(1)`).
+
+`Summary`: In general, after making a change to the Gemfile(5) , you
+should first try to run `bundle install`, which will guarantee that no
+other gems in the Gemfile(5) are impacted by the change. If that
+does not work, run [bundle update(1)][bundle-update].
+
+## SEE ALSO
+
+* Gem install docs: http://docs.rubygems.org/read/chapter/2
+* Rubygems signing docs: http://docs.rubygems.org/read/chapter/21
diff --git a/misc/lib/bundler-1.3.5/man/bundle-package.ronn b/misc/lib/bundler-1.3.5/man/bundle-package.ronn
new file mode 100644
index 0000000..610f820
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/man/bundle-package.ronn
@@ -0,0 +1,59 @@
+bundle-package(1) -- Package your needed `.gem` files into your application
+===========================================================================
+
+## SYNOPSIS
+
+`bundle package`
+
+## DESCRIPTION
+
+Copy all of the `.gem` files needed to run the application into the
+`vendor/cache` directory. In the future, when running [bundle install(1)][bundle-install],
+use the gems in the cache in preference to the ones on `rubygems.org`.
+
+## GIT AND PATH GEMS
+
+Since Bundler 1.2, the `bundle package` command can also package `:git` and
+`:path` dependencies besides .gem files. This needs to be explicitly enabled
+via the `--all` option. Once used, the `--all` option will be remembered.
+
+## REMOTE FETCHING
+
+By default, if you simply run [bundle install(1)][bundle-install] after running
+[bundle package(1)][bundle-package], bundler will still connect to `rubygems.org`
+to check whether a platform-specific gem exists for any of the gems
+in `vendor/cache`.
+
+For instance, consider this Gemfile(5):
+
+    source "https://rubygems.org"
+
+    gem "nokogiri"
+
+If you run `bundle package` under C Ruby, bundler will retrieve
+the version of `nokogiri` for the `"ruby"` platform. If you deploy
+to JRuby and run `bundle install`, bundler is forced to check to
+see whether a `"java"` platformed `nokogiri` exists.
+
+Even though the `nokogiri` gem for the Ruby platform is
+_technically_ acceptable on JRuby, it actually has a C extension
+that does not run on JRuby. As a result, bundler will, by default,
+still connect to `rubygems.org` to check whether it has a version
+of one of your gems more specific to your platform.
+
+This problem is also not just limited to the `"java"` platform.
+A similar (common) problem can happen when developing on Windows
+and deploying to Linux, or even when developing on OSX and
+deploying to Linux.
+
+If you know for sure that the gems packaged in `vendor/cache`
+are appropriate for the platform you are on, you can run
+`bundle install --local` to skip checking for more appropriate
+gems, and just use the ones in `vendor/cache`.
+
+One way to be sure that you have the right platformed versions
+of all your gems is to run `bundle package` on an identical
+machine and check in the gems. For instance, you can run
+`bundle package` on an identical staging box during your
+staging process, and check in the `vendor/cache` before
+deploying to production.
diff --git a/misc/lib/bundler-1.3.5/man/bundle-platform.ronn b/misc/lib/bundler-1.3.5/man/bundle-platform.ronn
new file mode 100644
index 0000000..922a9f1
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/man/bundle-platform.ronn
@@ -0,0 +1,42 @@
+bundle-platform(1) -- Displays platform compatibility information
+=================================================================
+
+## SYNOPSIS
+
+`bundle platform` [--ruby]
+
+## DESCRIPTION
+
+`platform` will display information from your Gemfile, Gemfile.lock, and Ruby
+VM about your platform.
+
+For instance, using this Gemfile(5):
+
+    source "https://rubygems.org"
+
+    ruby "1.9.3"
+
+    gem "rack"
+
+If you run `bundle platform` on Ruby 1.9.3, it will display the following output:
+
+    Your platform is: x86_64-linux
+
+    Your app has gems that work on these platforms:
+    * ruby
+
+    Your Gemfile specifies a Ruby version requirement:
+    * ruby 1.9.3
+
+    Your current platform satisfies the Ruby version requirement.
+
+`platform` will list all the platforms in your `Gemfile.lock` as well as the
+`ruby` directive if applicable from your Gemfile(5). It will also let you know
+if the `ruby` directive requirement has been met. If `ruby` directive doesn't
+match the running Ruby VM, it will tell you what part does not.
+
+## OPTIONS
+
+* `--ruby`:
+  It will just display the ruby directive information, so you don't have to
+  parse it from the Gemfile(5).
diff --git a/misc/lib/bundler-1.3.5/man/bundle-update.ronn b/misc/lib/bundler-1.3.5/man/bundle-update.ronn
new file mode 100644
index 0000000..56bf3a4
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/man/bundle-update.ronn
@@ -0,0 +1,176 @@
+bundle-update(1) -- Update your gems to the latest available versions
+=====================================================================
+
+## SYNOPSIS
+
+`bundle update` <*gems> [--source=NAME]
+
+## DESCRIPTION
+
+Update the gems specified (all gems, if none are specified), ignoring
+the previously installed gems specified in the `Gemfile.lock`. In
+general, you should use [bundle install(1)][bundle-install] to install the same exact
+gems and versions across machines.
+
+You would use `bundle update` to explicitly update the version of a
+gem.
+
+## OPTIONS
+
+* `--source=<name>`:
+  The name of a `:git` or `:path` source used in the Gemfile(5). For
+  instance, with a `:git` source of `http://github.com/rails/rails.git`,
+  you would call `bundle update --source rails`
+
+## UPDATING ALL GEMS
+
+If you run `bundle update` with no parameters, bundler will ignore
+any previously installed gems and resolve all dependencies again
+based on the latest versions of all gems available in the sources.
+
+Consider the following Gemfile(5):
+
+    source "https://rubygems.org"
+
+    gem "rails", "3.0.0.rc"
+    gem "nokogiri"
+
+When you run [bundle install(1)][bundle-install] the first time, bundler will resolve
+all of the dependencies, all the way down, and install what you need:
+
+    Fetching source index for https://rubygems.org/
+    Installing rake (10.0.2)
+    Installing abstract (1.0.0)
+    Installing activesupport (3.0.0.rc)
+    Installing builder (2.1.2)
+    Installing i18n (0.4.1)
+    Installing activemodel (3.0.0.rc)
+    Installing erubis (2.6.6)
+    Installing rack (1.2.1)
+    Installing rack-mount (0.6.9)
+    Installing rack-test (0.5.4)
+    Installing tzinfo (0.3.22)
+    Installing actionpack (3.0.0.rc)
+    Installing mime-types (1.16)
+    Installing polyglot (0.3.1)
+    Installing treetop (1.4.8)
+    Installing mail (2.2.5)
+    Installing actionmailer (3.0.0.rc)
+    Installing arel (0.4.0)
+    Installing activerecord (3.0.0.rc)
+    Installing activeresource (3.0.0.rc)
+    Installing bundler (1.0.0.rc.3)
+    Installing nokogiri (1.4.3.1) with native extensions
+    Installing thor (0.14.0)
+    Installing railties (3.0.0.rc)
+    Installing rails (3.0.0.rc)
+
+    Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
+
+As you can see, even though you have just two gems in the Gemfile(5), your application
+actually needs 25 different gems in order to run. Bundler remembers the exact versions
+it installed in `Gemfile.lock`. The next time you run [bundle install(1)][bundle-install], bundler skips
+the dependency resolution and installs the same gems as it installed last time.
+
+After checking in the `Gemfile.lock` into version control and cloning it on another
+machine, running [bundle install(1)][bundle-install] will _still_ install the gems that you installed
+last time. You don't need to worry that a new release of `erubis` or `mail` changes
+the gems you use.
+
+However, from time to time, you might want to update the gems you are using to the
+newest versions that still match the gems in your Gemfile(5).
+
+To do this, run `bundle update`, which will ignore the `Gemfile.lock`, and resolve
+all the dependencies again. Keep in mind that this process can result in a significantly
+different set of the 25 gems, based on the requirements of new gems that the gem
+authors released since the last time you ran `bundle update`.
+
+## UPDATING A LIST OF GEMS
+
+Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the
+gems that you specified locked to the versions in the `Gemfile.lock`.
+
+For instance, in the scenario above, imagine that `nokogiri` releases version `1.4.4`, and
+you want to update it _without_ updating Rails and all of its dependencies. To do this,
+run `bundle update nokogiri`.
+
+Bundler will update `nokogiri` and any of its dependencies, but leave alone Rails and
+its dependencies.
+
+## OVERLAPPING DEPENDENCIES
+
+Sometimes, multiple gems declared in your Gemfile(5) are satisfied by the same
+second-level dependency. For instance, consider the case of `thin` and
+`rack-perftools-profiler`.
+
+    source "https://rubygems.org"
+
+    gem "thin"
+    gem "rack-perftools-profiler"
+
+The `thin` gem depends on `rack >= 1.0`, while `rack-perftools-profiler` depends
+on `rack ~> 1.0`. If you run bundle install, you get:
+
+    Fetching source index for https://rubygems.org/
+    Installing daemons (1.1.0)
+    Installing eventmachine (0.12.10) with native extensions
+    Installing open4 (1.0.1)
+    Installing perftools.rb (0.4.7) with native extensions
+    Installing rack (1.2.1)
+    Installing rack-perftools_profiler (0.0.2)
+    Installing thin (1.2.7) with native extensions
+    Using bundler (1.0.0.rc.3)
+
+In this case, the two gems have their own set of dependencies, but they share
+`rack` in common. If you run `bundle update thin`, bundler will update `daemons`,
+`eventmachine` and `rack`, which are dependencies of `thin`, but not `open4` or
+`perftools.rb`, which are dependencies of `rack-perftools_profiler`. Note that
+`bundle update thin` will update `rack` even though it's _also_ a dependency of
+`rack-perftools_profiler`.
+
+`In short`, when you update a gem using `bundle update`, bundler will update all
+dependencies of that gem, including those that are also dependencies of another gem.
+
+In this scenario, updating the `thin` version manually in the Gemfile(5),
+and then running [bundle install(1)][bundle-install] will only update `daemons` and `eventmachine`,
+but not `rack`. For more information, see the `CONSERVATIVE UPDATING` section
+of [bundle install(1)][bundle-install].
+
+## RECOMMENDED WORKFLOW
+
+In general, when working with an application managed with bundler, you should
+use the following workflow:
+
+* After you create your Gemfile(5) for the first time, run
+
+    $ bundle install
+
+* Check the resulting `Gemfile.lock` into version control
+
+    $ git add Gemfile.lock
+
+* When checking out this repository on another development machine, run
+
+    $ bundle install
+
+* When checking out this repository on a deployment machine, run
+
+    $ bundle install --deployment
+
+* After changing the Gemfile(5) to reflect a new or update dependency, run
+
+    $ bundle install
+
+* Make sure to check the updated `Gemfile.lock` into version control
+
+    $ git add Gemfile.lock
+
+* If [bundle install(1)][bundle-install] reports a conflict, manually update the specific
+  gems that you changed in the Gemfile(5)
+
+    $ bundle update rails thin
+
+* If you want to update all the gems to the latest possible versions that
+  still match the gems listed in the Gemfile(5), run
+
+    $ bundle update
diff --git a/misc/lib/bundler-1.3.5/man/bundle.ronn b/misc/lib/bundler-1.3.5/man/bundle.ronn
new file mode 100644
index 0000000..593441c
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/man/bundle.ronn
@@ -0,0 +1,92 @@
+bundle(1) -- Ruby Dependency Management
+=======================================
+
+## SYNOPSIS
+
+`bundle` COMMAND [--no-color] [--verbose] [ARGS]
+
+## DESCRIPTION
+
+Bundler manages an `application's dependencies` through its entire life
+across many machines systematically and repeatably.
+
+See [the bundler website](http://gembundler.com) for information on getting
+started, and Gemfile(5) for more information on the `Gemfile` format.
+
+## OPTIONS
+
+* `--no-color`:
+  Prints all output without color
+
+* `--verbose`:
+  Prints out additional logging information
+
+## BUNDLE COMMANDS
+
+We divide `bundle` subcommands into primary commands and utilities.
+
+## PRIMARY COMMANDS
+
+* [bundle install(1)][bundle-install]:
+  Install the gems specified by the `Gemfile` or `Gemfile.lock`
+
+* [bundle update(1)][bundle-update]:
+  Update dependencies to their latest versions
+
+* [bundle package(1)][bundle-package]:
+  Package the .gem files required by your application into the
+  `vendor/cache` directory
+
+* [bundle exec(1)][bundle-exec]:
+  Execute a script in the context of the current bundle
+
+* [bundle config(1)][bundle-config]:
+  Specify and read configuration options for bundler
+
+* `bundle help(1)`:
+  Displays this help page
+
+## UTILITIES
+
+* `bundle check(1)`:
+  Determine whether the requirements for your application are installed
+  and available to bundler
+
+* `bundle list(1)`:
+  Show all of the gems in the current bundle
+
+* `bundle show(1)`:
+  Show the source location of a particular gem in the bundle
+
+* `bundle outdated(1)`:
+  Show all of the outdated gems in the current bundle
+
+* `bundle console(1)`:
+  Start an IRB session in the context of the current bundle
+
+* `bundle open(1)`:
+  Open an installed gem in the editor
+
+* `bundle viz(1)`:
+  Generate a visual representation of your dependencies
+
+* `bundle init(1)`:
+  Generate a simple `Gemfile`, placed in the current directory
+
+* `bundle gem(1)`:
+  Create a simple gem, suitable for development with bundler
+
+* [bundle platform(1)][bundle-platform]:
+  Displays platform compatibility information
+
+* `bundle clean(1)`:
+  Cleans up unused gems in your bundler directory
+
+## OBSOLETE
+
+These commands are obsolete and should no longer be used
+
+* `bundle lock(1)`
+* `bundle unlock(1)`
+* `bundle cache(1)`
+
diff --git a/misc/lib/bundler-1.3.5/man/gemfile.5.ronn b/misc/lib/bundler-1.3.5/man/gemfile.5.ronn
new file mode 100644
index 0000000..53c1c34
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/man/gemfile.5.ronn
@@ -0,0 +1,331 @@
+Gemfile(5) -- A format for describing gem dependencies for Ruby programs
+========================================================================
+
+## SYNOPSIS
+
+A `Gemfile` describes the gem dependencies required to execute associated
+Ruby code.
+
+Place the `Gemfile` in the root of the directory containing the associated
+code. For instance, in a Rails application, place the `Gemfile` in the same
+directory as the `Rakefile`.
+
+## SYNTAX
+
+A `Gemfile` is evaluated as Ruby code, in a context which makes available
+a number of methods used to describe the gem requirements.
+
+## SOURCES (#source)
+
+At the top of the `Gemfile`, add one line for each `Rubygems` source that
+might contain the gems listed in the `Gemfile`.
+
+    source "https://rubygems.org"
+    source "http://gems.github.com"
+
+Each of these _source_s `MUST` be a valid Rubygems repository. Sources are
+checked for gems following the heuristics described in [SOURCE PRIORITY][].
+
+## RUBY (#ruby)
+
+If your application requires a specific Ruby version or engine, specify your
+requirements using the `ruby` method, with the following arguments.
+All parameters are `OPTIONAL` unless otherwise specified.
+
+### VERSION (required)
+
+The version of Ruby that your application requires. If your application
+requires an alternate Ruby engine, such as JRuby or Rubinius, this should be
+the Ruby version that the engine is compatible with.
+
+    ruby "1.9.3"
+
+### ENGINE (:engine)
+
+Each application _may_ specify a Ruby engine. If an engine is specified, an
+engine version _must_ also be specified.
+
+### ENGINE VERSION (:engine_version)
+
+Each application _may_ specify a Ruby engine version. If an engine version is
+specified, an engine _must_ also be specified. If the engine is "ruby" the
+engine version specified _must_ match the Ruby version.
+
+    ruby "1.8.7", :engine => "jruby", :engine_version => "1.6.7"
+
+## GEMS (#gem)
+
+Specify gem requirements using the `gem` method, with the following arguments.
+All parameters are `OPTIONAL` unless otherwise specified.
+
+### NAME (required)
+
+For each gem requirement, list a single _gem_ line.
+
+    gem "nokogiri"
+
+### VERSION
+
+Each _gem_ `MAY` have one or more version specifiers.
+
+    gem "nokogiri", ">= 1.4.2"
+    gem "RedCloth", ">= 4.1.0", "< 4.2.0"
+
+### REQUIRE AS (:require)
+
+Each _gem_ `MAY` specify files that should be used when autorequiring via
+`Bundler.require`. You may pass an array with multiple files, or `false` to
+prevent any file from being autorequired.
+
+    gem "redis", :require => ["redis/connection/hiredis", "redis"]
+    gem "webmock", :require => false
+
+The argument defaults to the name of the gem. For example, these are identical:
+
+    gem "nokogiri"
+    gem "nokogiri", :require => "nokogiri"
+
+### GROUPS (:group or :groups)
+
+Each _gem_ `MAY` specify membership in one or more groups. Any _gem_ that does
+not specify membership in any group is placed in the `default` group.
+
+    gem "rspec", :group => :test
+    gem "wirble", :groups => [:development, :test]
+
+The Bundler runtime allows its two main methods, `Bundler.setup` and
+`Bundler.require`, to limit their impact to particular groups.
+
+    # setup adds gems to Ruby's load path
+    Bundler.setup                    # defaults to all groups
+    require "bundler/setup"          # same as Bundler.setup
+    Bundler.setup(:default)          # only set up the _default_ group
+    Bundler.setup(:test)             # only set up the _test_ group (but `not` _default_)
+    Bundler.setup(:default, :test)   # set up the _default_ and _test_ groups, but no others
+
+    # require requires all of the gems in the specified groups
+    Bundler.require                  # defaults to just the _default_ group
+    Bundler.require(:default)        # identical
+    Bundler.require(:default, :test) # requires the _default_ and _test_ groups
+    Bundler.require(:test)           # requires just the _test_ group
+
+The Bundler CLI allows you to specify a list of groups whose gems `bundle install` should
+not install with the `--without` option. To specify multiple groups to ignore, specify a
+list of groups separated by spaces.
+
+    bundle install --without test
+    bundle install --without development test
+
+After running `bundle install --without test`, bundler will remember that you excluded
+the test group in the last installation. The next time you run `bundle install`,
+without any `--without option`, bundler will recall it.
+
+Also, calling `Bundler.setup` with no parameters, or calling `require "bundler/setup"`
+will setup all groups except for the ones you excluded via `--without` (since they
+are obviously not available).
+
+Note that on `bundle install`, bundler downloads and evaluates all gems, in order to
+create a single canonical list of all of the required gems and their dependencies.
+This means that you cannot list different versions of the same gems in different
+groups. For more details, see [Understanding Bundler](http://gembundler.com/rationale.html).
+
+### PLATFORMS (:platforms)
+
+If a gem should only be used in a particular platform or set of platforms, you can
+specify them. Platforms are essentially identical to groups, except that you do not
+need to use the `--without` install-time flag to exclude groups of gems for other
+platforms.
+
+There are a number of `Gemfile` platforms:
+
+  * `ruby`:
+    C Ruby (MRI) or Rubinius, but `NOT` Windows
+  * `ruby_18`:
+    _ruby_ `AND` version 1.8
+  * `ruby_19`:
+    _ruby_ `AND` version 1.9
+  * `ruby_20`:
+    _ruby_ `AND` version 2.0
+  * `mri`:
+    Same as _ruby_, but not Rubinius
+  * `mri_18`:
+    _mri_ `AND` version 1.8
+  * `mri_19`:
+    _mri_ `AND` version 1.9
+  * `mri_20`:
+    _mri_ `AND` version 2.0
+  * `rbx`:
+    Same as _ruby_, but only Rubinius (not MRI)
+  * `jruby`:
+    JRuby
+  * `mswin`:
+    Windows
+  * `mingw`:
+    Windows 'mingw32' platform (aka RubyInstaller)
+  * `mingw_18`:
+    _mingw_ `AND` version 1.8
+  * `mingw_19`:
+    _mingw_ `AND` version 1.9
+  * `mingw_20`:
+    _mingw_ `AND` version 2.0
+
+As with groups, you can specify one or more platforms:
+
+    gem "weakling",   :platforms => :jruby
+    gem "ruby-debug", :platforms => :mri_18
+    gem "nokogiri",   :platforms => [:mri_18, :jruby]
+
+All operations involving groups (`bundle install`, `Bundler.setup`,
+`Bundler.require`) behave exactly the same as if any groups not
+matching the current platform were explicitly excluded.
+
+### GIT (:git)
+
+If necessary, you can specify that a gem is located at a particular
+git repository. The repository can be public (`http://github.com/rails/rails.git`)
+or private (`git at github.com:rails/rails.git`). If the repository is private,
+the user that you use to run `bundle install` `MUST` have the appropriate
+keys available in their `$HOME/.ssh`.
+
+Git repositories are specified using the `:git` parameter. The `group`,
+`platforms`, and `require` options are available and behave exactly the same
+as they would for a normal gem.
+
+    gem "rails", :git => "git://github.com/rails/rails.git"
+
+A git repository `SHOULD` have at least one file, at the root of the
+directory containing the gem, with the extension `.gemspec`. This file
+`MUST` contain a valid gem specification, as expected by the `gem build`
+command. It `MUST NOT` have any dependencies, other than on the files in
+the git repository itself and any built-in functionality of Ruby or Rubygems.
+
+If a git repository does not have a `.gemspec`, bundler will attempt to
+create one, but it will not contain any dependencies, executables, or
+C extension compilation instructions. As a result, it may fail to properly
+integrate into your application.
+
+If a git repository does have a `.gemspec` for the gem you attached it
+to, a version specifier, if provided, means that the git repository is
+only valid if the `.gemspec` specifies a version matching the version
+specifier. If not, bundler will print a warning.
+
+    gem "rails", "2.3.8", :git => "git://github.com/rails/rails.git"
+    # bundle install will fail, because the .gemspec in the rails
+    # repository's master branch specifies version 3.0.0
+
+If a git repository does `not` have a `.gemspec` for the gem you attached
+it to, a version specifier `MUST` be provided. Bundler will use this
+version in the simple `.gemspec` it creates.
+
+Git repositories support a number of additional options.
+
+  * `branch`, `tag`, and `ref`:
+    You `MUST` only specify at most one of these options. The default
+    is `:branch => "master"`
+  * `submodules`:
+    Specify `:submodules => true` to cause bundler to expand any
+    submodules included in the git repository
+
+If a git repository contains multiple `.gemspecs`, each `.gemspec`
+represents a gem located at the same place in the file system as
+the `.gemspec`.
+
+    |~rails                   [git root]
+    | |-rails.gemspec         [rails gem located here]
+    |~actionpack
+    | |-actionpack.gemspec    [actionpack gem located here]
+    |~activesupport
+    | |-activesupport.gemspec [activesupport gem located here]
+    |...
+
+To install a gem located in a git repository, bundler changes to
+the directory containing the gemspec, runs `gem build name.gemspec`
+and then installs the resulting gem. The `gem build` command,
+which comes standard with Rubygems, evaluates the `.gemspec` in
+the context of the directory in which it is located.
+
+### GITHUB (:github)
+
+If the git repository you want to use is hosted on GitHub and is public, you can use the
+:github shorthand to specify just the github username and repository name (without the
+trailing ".git"), separated by a slash. If both the username and repository name are the
+same, you can omit one.
+
+    gem "rails", :github => "rails/rails"
+    gem "rails", :github => "rails"
+
+Are both equivalent to
+
+    gem "rails", :git => "git://github.com/rails/rails.git"
+
+### PATH (:path)
+
+You can specify that a gem is located in a particular location
+on the file system. Relative paths are resolved relative to the
+directory containing the `Gemfile`.
+
+Similar to the semantics of the `:git` option, the `:path`
+option requires that the directory in question either contains
+a `.gemspec` for the gem, or that you specify an explicit
+version that bundler should use.
+
+Unlike `:git`, bundler does not compile C extensions for
+gems specified as paths.
+
+    gem "rails", :path => "vendor/rails"
+
+## BLOCK FORM OF GIT, PATH, GROUP and PLATFORMS
+
+The `:git`, `:path`, `:group`, and `:platforms` options may be
+applied to a group of gems by using block form.
+
+    git "git://github.com/rails/rails.git" do
+      gem "activesupport"
+      gem "actionpack"
+    end
+
+    platforms :ruby do
+      gem "ruby-debug"
+      gem "sqlite3"
+    end
+
+    group :development do
+      gem "wirble"
+      gem "faker"
+    end
+
+In the case of the `git` block form, the `:ref`, `:branch`, `:tag`,
+and `:submodules` options may be passed to the `git` method, and
+all gems in the block will inherit those options.
+
+## GEMSPEC (#gemspec)
+
+If you wish to use Bundler to help install dependencies for a gem while it is
+being developed, use the `gemspec` method to pull in the dependencies listed in
+the `.gemspec` file.
+
+The `gemspec` method adds any runtime dependencies as gem requirements in the
+default group. It also adds development dependencies as gem requirements in the
+`development` group. Finally, it adds a gem requirement on your project (`:path
+=> '.'`). In conjunction with `Bundler.setup`, this allows you to require project
+files in your test code as you would if the project were installed as a gem; you
+need not manipulate the load path manually or require project files via relative
+paths.
+
+The `gemspec` method supports optional `:path`, `:name`, and `:development_group`
+options, which control where bundler looks for the `.gemspec`, what named
+`.gemspec` it uses (if more than one is present), and which group development
+dependencies are included in.
+
+## SOURCE PRIORITY
+
+When attempting to locate a gem to satisfy a gem requirement,
+bundler uses the following priority order:
+
+  1. The source explicitly attached to the gem (using `:path` or `:git`)
+  2. For implicit gems (dependencies of explicit gems), any git or path
+     repository otherwise declared. This results in bundler prioritizing the
+     ActiveSupport gem from the Rails git repository over ones from
+     `rubygems.org`
+  3. The sources specified via `source`, searching each source in your `Gemfile`
+     from last added to first added.
diff --git a/misc/lib/bundler-1.3.5/man/index.txt b/misc/lib/bundler-1.3.5/man/index.txt
new file mode 100644
index 0000000..e31afb7
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/man/index.txt
@@ -0,0 +1,7 @@
+Gemfile(5)         gemfile.5
+bundle-install     bundle-install.1
+bundle-update      bundle-update.1
+bundle-package     bundle-package.1
+bundle-exec        bundle-exec.1
+bundle-config      bundle-config.1
+bundle-platform    bundle-platform.1
diff --git a/misc/lib/bundler-1.3.5/spec/bundler/bundler_spec.rb b/misc/lib/bundler-1.3.5/spec/bundler/bundler_spec.rb
new file mode 100644
index 0000000..6ebb0f3
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/bundler/bundler_spec.rb
@@ -0,0 +1,75 @@
+# encoding: utf-8
+require 'spec_helper'
+require 'bundler'
+
+describe Bundler do
+  describe "#load_gemspec_uncached" do
+
+    before do
+      @gemspec = tmp("test.gemspec")
+      @gemspec.open('wb') do |f|
+        f.write strip_whitespace(<<-GEMSPEC)
+          ---
+            {:!00 ao=gu\g1= 7~f
+        GEMSPEC
+      end
+    end
+
+    describe "on Ruby 1.8", :ruby => "1.8" do
+      it "should catch YAML syntax errors" do
+        expect { Bundler.load_gemspec_uncached(@gemspec) }.
+          to raise_error(Bundler::GemspecError)
+      end
+    end
+
+    context "on Ruby 1.9", :ruby => "1.9" do
+      context "with Syck as YAML::Engine" do
+        it "raises a GemspecError after YAML load throws ArgumentError" do
+          orig_yamler, YAML::ENGINE.yamler = YAML::ENGINE.yamler, 'syck'
+
+          expect { Bundler.load_gemspec_uncached(@gemspec) }.
+            to raise_error(Bundler::GemspecError)
+
+          YAML::ENGINE.yamler = orig_yamler
+        end
+      end
+
+      context "with Psych as YAML::Engine" do
+        it "raises a GemspecError after YAML load throws Psych::SyntaxError" do
+          orig_yamler, YAML::ENGINE.yamler = YAML::ENGINE.yamler, 'psych'
+
+          expect { Bundler.load_gemspec_uncached(@gemspec) }.
+            to raise_error(Bundler::GemspecError)
+
+          YAML::ENGINE.yamler = orig_yamler
+        end
+      end
+    end
+
+    it "can load a gemspec with unicode characters with default ruby encoding" do
+      # spec_helper forces the external encoding to UTF-8 but that's not the
+      # ruby default.
+      encoding = nil
+
+      if defined?(Encoding)
+        encoding = Encoding.default_external
+        Encoding.default_external = "ASCII"
+      end
+
+      File.open(tmp("test.gemspec"), "wb") do |file|
+        file.puts <<-G.gsub(/^\s+/, '')
+          # -*- encoding: utf-8 -*-
+          Gem::Specification.new do |gem|
+            gem.author = "André the Giant"
+          end
+        G
+      end
+
+      gemspec = Bundler.load_gemspec_uncached(tmp("test.gemspec"))
+      expect(gemspec.author).to eq("André the Giant")
+
+      Encoding.default_external = encoding if defined?(Encoding)
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/bundler/cli_rspec.rb b/misc/lib/bundler-1.3.5/spec/bundler/cli_rspec.rb
new file mode 100644
index 0000000..baf2f95
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/bundler/cli_rspec.rb
@@ -0,0 +1,9 @@
+require 'spec_helper'
+
+
+describe 'bundle executable' do
+  it 'returns non-zero exit status when passed unrecognized options' do
+    bundle '--invalid_argument', :exitstatus => true
+    expect(exitstatus).to_not be_zero
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/bundler/definition_spec.rb b/misc/lib/bundler-1.3.5/spec/bundler/definition_spec.rb
new file mode 100644
index 0000000..034a571
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/bundler/definition_spec.rb
@@ -0,0 +1,25 @@
+require 'spec_helper'
+require 'bundler/definition'
+
+describe Bundler::Definition do
+  before do
+    Bundler.stub(:settings){ Bundler::Settings.new(".") }
+  end
+
+  describe "#lock" do
+    context "when it's not possible to write to the file" do
+      subject{ Bundler::Definition.new(nil, [], [], []) }
+
+      before do
+        File.should_receive(:open).with("Gemfile.lock", "wb").
+          and_raise(Errno::EACCES)
+      end
+
+      it "raises an InstallError with explanation" do
+        expect{ subject.lock("Gemfile.lock") }.
+          to raise_error(Bundler::InstallError)
+      end
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/bundler/dsl_spec.rb b/misc/lib/bundler-1.3.5/spec/bundler/dsl_spec.rb
new file mode 100644
index 0000000..17ce524
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/bundler/dsl_spec.rb
@@ -0,0 +1,60 @@
+require 'spec_helper'
+
+describe Bundler::Dsl do
+  before do
+    @rubygems = mock("rubygems")
+    Bundler::Source::Rubygems.stub(:new){ @rubygems }
+  end
+
+  describe '#_normalize_options' do
+    it "converts :github to :git" do
+      subject.gem("sparks", :github => "indirect/sparks")
+      github_uri = "git://github.com/indirect/sparks.git"
+      expect(subject.dependencies.first.source.uri).to eq(github_uri)
+    end
+
+    it "converts numeric :gist to :git" do
+      subject.gem("not-really-a-gem", :gist => 2859988)
+      github_uri = "https://gist.github.com/2859988.git"
+      expect(subject.dependencies.first.source.uri).to eq(github_uri)
+    end
+
+    it "converts :gist to :git" do
+      subject.gem("not-really-a-gem", :gist => "2859988")
+      github_uri = "https://gist.github.com/2859988.git"
+      expect(subject.dependencies.first.source.uri).to eq(github_uri)
+    end
+
+    it "converts 'rails' to 'rails/rails'" do
+      subject.gem("rails", :github => "rails")
+      github_uri = "git://github.com/rails/rails.git"
+      expect(subject.dependencies.first.source.uri).to eq(github_uri)
+    end
+  end
+
+  describe '#method_missing' do
+    it 'raises an error for unknown DSL methods' do
+      Bundler.should_receive(:read_file).with("Gemfile").and_return("unknown")
+      error_msg = "Undefined local variable or method `unknown'" \
+        " for Gemfile\\s+from Gemfile:1"
+      expect { subject.eval_gemfile("Gemfile") }.
+        to raise_error(Bundler::GemfileError, Regexp.new(error_msg))
+    end
+  end
+
+  describe "#eval_gemfile" do
+    it "handles syntax errors with a useful message" do
+      Bundler.should_receive(:read_file).with("Gemfile").and_return("}")
+      expect { subject.eval_gemfile("Gemfile") }.
+        to raise_error(Bundler::GemfileError, /Gemfile syntax error/)
+    end
+  end
+
+  describe "syntax errors" do
+    it "raise a Bundler::GemfileError" do
+      gemfile "gem 'foo', :path => /unquoted/string/syntax/error"
+      expect { Bundler::Dsl.evaluate(bundled_app("Gemfile"), nil, true) }.
+        to raise_error(Bundler::GemfileError)
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/bundler/gem_helper_spec.rb b/misc/lib/bundler-1.3.5/spec/bundler/gem_helper_spec.rb
new file mode 100644
index 0000000..134fc87
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/bundler/gem_helper_spec.rb
@@ -0,0 +1,199 @@
+require "spec_helper"
+require 'rake'
+require 'bundler/gem_helper'
+
+describe "Bundler::GemHelper tasks" do
+  context "determining gemspec" do
+    it "interpolates the name when there is only one gemspec" do
+      bundle 'gem test'
+      app = bundled_app("test")
+      helper = Bundler::GemHelper.new(app.to_s)
+      expect(helper.gemspec.name).to eq('test')
+    end
+
+    it "interpolates the name for a hidden gemspec" do
+      bundle 'gem test'
+      app = bundled_app("test")
+      FileUtils.mv app.join('test.gemspec'), app.join('.gemspec')
+      helper = Bundler::GemHelper.new(app.to_s)
+      expect(helper.gemspec.name).to eq('test')
+    end
+
+    it "should fail when there is no gemspec" do
+      bundle 'gem test'
+      app = bundled_app("test")
+      FileUtils.rm(File.join(app.to_s, 'test.gemspec'))
+      expect { Bundler::GemHelper.new(app.to_s) }.to raise_error(/Unable to determine name/)
+    end
+
+    it "should fail when there are two gemspecs and the name isn't specified" do
+      bundle 'gem test'
+      app = bundled_app("test")
+      File.open(File.join(app.to_s, 'test2.gemspec'), 'w') {|f| f << ''}
+      expect { Bundler::GemHelper.new(app.to_s) }.to raise_error(/Unable to determine name/)
+    end
+
+    it "handles namespaces and converting to CamelCase" do
+      bundle 'gem test-foo_bar'
+      lib = bundled_app('test-foo_bar').join('lib/test/foo_bar.rb').read
+      expect(lib).to include("module Test")
+      expect(lib).to include("module FooBar")
+    end
+  end
+
+  context "gem management" do
+    def mock_confirm_message(message)
+      Bundler.ui.should_receive(:confirm).with(message)
+    end
+
+    def mock_build_message
+      mock_confirm_message "test 0.0.1 built to pkg/test-0.0.1.gem."
+    end
+
+    before(:each) do
+      bundle 'gem test'
+      @app = bundled_app("test")
+      @gemspec = File.read("#{@app.to_s}/test.gemspec")
+      File.open("#{@app.to_s}/test.gemspec", 'w'){|f| f << @gemspec.gsub('TODO: ', '') }
+      @helper = Bundler::GemHelper.new(@app.to_s)
+    end
+
+    it "uses a shell UI for output" do
+      expect(Bundler.ui).to be_a(Bundler::UI::Shell)
+    end
+
+    describe 'install_tasks' do
+      before(:each) do
+        @saved, Rake.application = Rake.application, Rake::Application.new
+      end
+
+      after(:each) do
+        Rake.application = @saved
+      end
+
+      it "defines Rake tasks" do
+        names = %w[build install release]
+
+        names.each { |name|
+          expect { Rake.application[name] }.to raise_error(/Don't know how to build task/)
+        }
+
+        @helper.install
+
+        names.each { |name|
+          expect { Rake.application[name] }.not_to raise_error
+          expect(Rake.application[name]).to be_instance_of Rake::Task
+        }
+      end
+
+      it "provides a way to access the gemspec object" do
+        @helper.install
+        expect(Bundler::GemHelper.gemspec.name).to eq('test')
+      end
+    end
+
+    describe 'build' do
+      it "builds" do
+        mock_build_message
+        @helper.build_gem
+        expect(bundled_app('test/pkg/test-0.0.1.gem')).to exist
+      end
+
+      it "raises an appropriate error when the build fails" do
+        # break the gemspec by adding back the TODOs...
+        File.open("#{@app.to_s}/test.gemspec", 'w'){|f| f << @gemspec }
+        expect { @helper.build_gem }.to raise_error(/TODO/)
+      end
+    end
+
+    describe 'install' do
+      it "installs" do
+        mock_build_message
+        mock_confirm_message "test (0.0.1) installed."
+        @helper.install_gem
+        expect(bundled_app('test/pkg/test-0.0.1.gem')).to exist
+        expect(%x{gem list}).to include("test (0.0.1)")
+      end
+
+      it "raises an appropriate error when the install fails" do
+        @helper.should_receive(:build_gem) do
+          # write an invalid gem file, so we can simulate install failure...
+          FileUtils.mkdir_p(File.join(@app.to_s, 'pkg'))
+          path = "#{@app.to_s}/pkg/test-0.0.1.gem"
+          File.open(path, 'w'){|f| f << "not actually a gem"}
+          path
+        end
+        expect { @helper.install_gem }.to raise_error
+      end
+    end
+
+    describe 'release' do
+      it "shouldn't push if there are unstaged files" do
+        expect { @helper.release_gem }.to raise_error(/files that need to be committed/)
+      end
+
+      it "shouldn't push if there are uncommitted files" do
+        %x{cd test; git add .}
+        expect { @helper.release_gem }.to raise_error(/files that need to be committed/)
+      end
+
+      it 'raises an appropriate error if there is no git remote' do
+        Bundler.ui.stub(:confirm => nil, :error => nil) # silence messages
+
+        Dir.chdir(gem_repo1) {
+          `git init --bare`
+        }
+        Dir.chdir(@app) {
+          `git init`
+          `git config user.email "you at example.com"`
+          `git config user.name "name"`
+          `git commit -a -m "initial commit"`
+        }
+
+        expect { @helper.release_gem }.to raise_error
+      end
+
+      it "releases" do
+        mock_build_message
+        mock_confirm_message(/Tagged v0.0.1/)
+        mock_confirm_message("Pushed git commits and tags.")
+
+        @helper.should_receive(:rubygem_push).with(bundled_app('test/pkg/test-0.0.1.gem').to_s)
+
+        Dir.chdir(gem_repo1) {
+          `git init --bare`
+        }
+        Dir.chdir(@app) {
+          `git init`
+          `git config user.email "you at example.com"`
+          `git config user.name "name"`
+          `git remote add origin file://#{gem_repo1}`
+          `git commit -a -m "initial commit"`
+          sys_exec("git push origin master", true)
+          `git commit -a -m "another commit"`
+        }
+        @helper.release_gem
+      end
+
+      it "releases even if tag already exists" do
+        mock_build_message
+        mock_confirm_message("Tag v0.0.1 has already been created.")
+
+        @helper.should_receive(:rubygem_push).with(bundled_app('test/pkg/test-0.0.1.gem').to_s)
+
+        Dir.chdir(gem_repo1) {
+          `git init --bare`
+        }
+        Dir.chdir(@app) {
+          `git init`
+          `git config user.email "you at example.com"`
+          `git config user.name "name"`
+          `git commit -a -m "another commit"`
+          `git tag -a -m \"Version 0.0.1\" v0.0.1`
+        }
+        @helper.release_gem
+      end
+
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/bundler/psyched_yaml_spec.rb b/misc/lib/bundler-1.3.5/spec/bundler/psyched_yaml_spec.rb
new file mode 100644
index 0000000..5f3c47b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/bundler/psyched_yaml_spec.rb
@@ -0,0 +1,8 @@
+require 'spec_helper'
+require 'bundler/psyched_yaml'
+
+describe Bundler::YamlSyntaxError do
+  it "is raised on YAML parse errors" do
+    expect{ YAML.parse "{foo" }.to raise_error(Bundler::YamlSyntaxError)
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/bundler/source_spec.rb b/misc/lib/bundler-1.3.5/spec/bundler/source_spec.rb
new file mode 100644
index 0000000..c51d4b9
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/bundler/source_spec.rb
@@ -0,0 +1,25 @@
+require 'spec_helper'
+
+describe Bundler::Source::Rubygems do
+  before do
+    Bundler.stub(:root){ Pathname.new("root") }
+  end
+
+  describe "caches" do
+    it "should include Bundler.app_cache" do
+      expect(subject.caches).to include(Bundler.app_cache)
+    end
+
+    it "should include GEM_PATH entries" do
+      Gem.path.each do |path|
+        expect(subject.caches).to include(File.expand_path("#{path}/cache"))
+      end
+    end
+
+    it "should be an array of strings or pathnames" do
+      subject.caches.each do |cache|
+        expect([String, Pathname]).to include(cache.class)
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/cache/gems_spec.rb b/misc/lib/bundler-1.3.5/spec/cache/gems_spec.rb
new file mode 100644
index 0000000..8f41701
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/cache/gems_spec.rb
@@ -0,0 +1,239 @@
+require "spec_helper"
+
+describe "bundle cache" do
+
+  describe "when there are only gemsources" do
+    before :each do
+      gemfile <<-G
+        gem 'rack'
+      G
+
+      system_gems "rack-1.0.0"
+      bundle :cache
+    end
+
+    it "copies the .gem file to vendor/cache" do
+      expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
+    end
+
+    it "uses the cache as a source when installing gems" do
+      build_gem "omg", :path => bundled_app('vendor/cache')
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "omg"
+      G
+
+      should_be_installed "omg 1.0.0"
+    end
+
+    it "uses the cache as a source when installing gems with --local" do
+      system_gems []
+      bundle "install --local"
+
+      should_be_installed("rack 1.0.0")
+    end
+
+    it "does not reinstall gems from the cache if they exist on the system" do
+      build_gem "rack", "1.0.0", :path => bundled_app('vendor/cache') do |s|
+        s.write "lib/rack.rb", "RACK = 'FAIL'"
+      end
+
+      install_gemfile <<-G
+        gem "rack"
+      G
+
+      should_be_installed("rack 1.0.0")
+    end
+
+    it "does not reinstall gems from the cache if they exist in the bundle" do
+      system_gems "rack-1.0.0"
+
+      gemfile <<-G
+        gem "rack"
+      G
+
+      build_gem "rack", "1.0.0", :path => bundled_app('vendor/cache') do |s|
+        s.write "lib/rack.rb", "RACK = 'FAIL'"
+      end
+
+      bundle "install --local"
+      should_be_installed("rack 1.0.0")
+    end
+
+    it "creates a lockfile" do
+      cache_gems "rack-1.0.0"
+
+      gemfile <<-G
+        gem "rack"
+      G
+
+      bundle "cache"
+
+      expect(bundled_app("Gemfile.lock")).to exist
+    end
+  end
+
+  describe "when there are also git sources" do
+    before do
+      build_git "foo"
+      system_gems "rack-1.0.0"
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        git "#{lib_path("foo-1.0")}" do
+          gem 'foo'
+        end
+        gem 'rack'
+      G
+    end
+
+    it "still works" do
+      bundle :cache
+
+      system_gems []
+      bundle "install --local"
+
+      should_be_installed("rack 1.0.0", "foo 1.0")
+    end
+
+    it "should not explode if the lockfile is not present" do
+      FileUtils.rm(bundled_app("Gemfile.lock"))
+
+      bundle :cache
+
+      expect(bundled_app("Gemfile.lock")).to exist
+    end
+  end
+
+  describe "when previously cached" do
+    before :each do
+      build_repo2
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rack"
+        gem "actionpack"
+      G
+      bundle :cache
+      expect(cached_gem("rack-1.0.0")).to exist
+      expect(cached_gem("actionpack-2.3.2")).to exist
+      expect(cached_gem("activesupport-2.3.2")).to exist
+    end
+
+    it "re-caches during install" do
+      cached_gem("rack-1.0.0").rmtree
+      bundle :install
+      expect(out).to include("Updating files in vendor/cache")
+      expect(cached_gem("rack-1.0.0")).to exist
+    end
+
+    it "adds and removes when gems are updated" do
+      update_repo2
+      bundle 'update'
+      expect(cached_gem("rack-1.2")).to exist
+      expect(cached_gem("rack-1.0.0")).not_to exist
+    end
+
+    it "adds new gems and dependencies" do
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rails"
+      G
+      expect(cached_gem("rails-2.3.2")).to exist
+      expect(cached_gem("activerecord-2.3.2")).to exist
+    end
+
+    it "removes .gems for removed gems and dependencies" do
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rack"
+      G
+      expect(cached_gem("rack-1.0.0")).to exist
+      expect(cached_gem("actionpack-2.3.2")).not_to exist
+      expect(cached_gem("activesupport-2.3.2")).not_to exist
+    end
+
+    it "removes .gems when gem changes to git source" do
+      build_git "rack"
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rack", :git => "#{lib_path("rack-1.0")}"
+        gem "actionpack"
+      G
+      expect(cached_gem("rack-1.0.0")).not_to exist
+      expect(cached_gem("actionpack-2.3.2")).to exist
+      expect(cached_gem("activesupport-2.3.2")).to exist
+    end
+
+
+    it "doesn't remove gems that are for another platform" do
+      simulate_platform "java" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "platform_specific"
+        G
+
+        bundle :cache
+        expect(cached_gem("platform_specific-1.0-java")).to exist
+      end
+
+      simulate_new_machine
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "platform_specific"
+      G
+
+      expect(cached_gem("platform_specific-1.0-#{Gem::Platform.local}")).to exist
+      expect(cached_gem("platform_specific-1.0-java")).to exist
+    end
+
+    it "doesn't remove gems with mismatched :rubygems_version or :date" do
+      cached_gem("rack-1.0.0").rmtree
+      build_gem "rack", "1.0.0",
+        :path => bundled_app('vendor/cache'),
+        :rubygems_version => "1.3.2"
+      simulate_new_machine
+
+      bundle :install
+      expect(cached_gem("rack-1.0.0")).to exist
+    end
+
+    it "handles directories and non .gem files in the cache" do
+      bundled_app("vendor/cache/foo").mkdir
+      File.open(bundled_app("vendor/cache/bar"), 'w'){|f| f.write("not a gem") }
+      bundle :cache
+    end
+
+    it "does not say that it is removing gems when it isn't actually doing so" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+      bundle "cache"
+      bundle "install"
+      expect(out).not_to match(/removing/i)
+    end
+
+    it "does not warn about all if it doesn't have any git/path dependency" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+      bundle "cache"
+      expect(out).not_to match(/\-\-all/)
+    end
+
+    it "should install gems with the name bundler in them (that aren't bundler)" do
+      build_gem "foo-bundler", "1.0",
+        :path => bundled_app('vendor/cache')
+
+      install_gemfile <<-G
+        gem "foo-bundler"
+      G
+
+      should_be_installed "foo-bundler 1.0"
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/cache/git_spec.rb b/misc/lib/bundler-1.3.5/spec/cache/git_spec.rb
new file mode 100644
index 0000000..b369504
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/cache/git_spec.rb
@@ -0,0 +1,188 @@
+require "spec_helper"
+
+describe "git base name" do
+  it "base_name should strip private repo uris" do
+    source  = Bundler::Source::Git.new("uri" => "git at github.com:bundler.git")
+    expect(source.send(:base_name)).to eq("bundler")
+  end
+
+  it "base_name should strip network share paths" do
+    source = Bundler::Source::Git.new("uri" => "//MachineName/ShareFolder")
+    expect(source.send(:base_name)).to eq("ShareFolder")
+  end
+end
+
+%w(cache package).each do |cmd|
+  describe "bundle #{cmd} with git" do
+    it "copies repository to vendor cache and uses it" do
+      git = build_git "foo"
+      ref = git.ref_for("master", 11)
+
+      install_gemfile <<-G
+        gem "foo", :git => '#{lib_path("foo-1.0")}'
+      G
+
+      bundle "#{cmd} --all"
+      expect(bundled_app("vendor/cache/foo-1.0-#{ref}")).to exist
+      expect(bundled_app("vendor/cache/foo-1.0-#{ref}/.git")).not_to exist
+      expect(bundled_app("vendor/cache/foo-1.0-#{ref}/.bundlecache")).to be_file
+
+      FileUtils.rm_rf lib_path("foo-1.0")
+      should_be_installed "foo 1.0"
+    end
+
+    it "copies repository to vendor cache and uses it even when installed with bundle --path" do
+      git = build_git "foo"
+      ref = git.ref_for("master", 11)
+
+      install_gemfile <<-G
+        gem "foo", :git => '#{lib_path("foo-1.0")}'
+      G
+
+      bundle "install --path vendor/bundle"
+      bundle "#{cmd} --all"
+
+      expect(bundled_app("vendor/cache/foo-1.0-#{ref}")).to exist
+      expect(bundled_app("vendor/cache/foo-1.0-#{ref}/.git")).not_to exist
+
+      FileUtils.rm_rf lib_path("foo-1.0")
+      should_be_installed "foo 1.0"
+    end
+
+    it "runs twice without exploding" do
+      build_git "foo"
+
+      install_gemfile <<-G
+        gem "foo", :git => '#{lib_path("foo-1.0")}'
+      G
+
+      bundle "#{cmd} --all"
+      bundle "#{cmd} --all"
+
+      expect(err).to eq("")
+      FileUtils.rm_rf lib_path("foo-1.0")
+      should_be_installed "foo 1.0"
+    end
+
+    it "tracks updates" do
+      git = build_git "foo"
+      old_ref = git.ref_for("master", 11)
+
+      install_gemfile <<-G
+        gem "foo", :git => '#{lib_path("foo-1.0")}'
+      G
+
+      bundle "#{cmd} --all"
+
+      update_git "foo" do |s|
+        s.write "lib/foo.rb", "puts :CACHE"
+      end
+
+      ref = git.ref_for("master", 11)
+      expect(ref).not_to eq(old_ref)
+
+      bundle "update"
+      bundle "#{cmd} --all"
+
+      expect(bundled_app("vendor/cache/foo-1.0-#{ref}")).to exist
+      expect(bundled_app("vendor/cache/foo-1.0-#{old_ref}")).not_to exist
+
+      FileUtils.rm_rf lib_path("foo-1.0")
+      run "require 'foo'"
+      expect(out).to eq("CACHE")
+    end
+
+    it "uses the local repository to generate the cache" do
+      git = build_git "foo"
+      ref = git.ref_for("master", 11)
+
+      gemfile <<-G
+        gem "foo", :git => '#{lib_path("foo-invalid")}', :branch => :master
+      G
+
+      bundle %|config local.foo #{lib_path('foo-1.0')}|
+      bundle "install"
+      bundle "#{cmd} --all"
+
+      expect(bundled_app("vendor/cache/foo-invalid-#{ref}")).to exist
+
+      # Updating the local still uses the local.
+      update_git "foo" do |s|
+        s.write "lib/foo.rb", "puts :LOCAL"
+      end
+
+      run "require 'foo'"
+      expect(out).to eq("LOCAL")
+    end
+
+    it "copies repository to vendor cache, including submodules" do
+      build_git "submodule", "1.0"
+
+      git = build_git "has_submodule", "1.0" do |s|
+        s.add_dependency "submodule"
+      end
+
+      Dir.chdir(lib_path('has_submodule-1.0')) do
+        `git submodule add #{lib_path('submodule-1.0')} submodule-1.0`
+        `git commit -m "submodulator"`
+      end
+
+      install_gemfile <<-G
+        git "#{lib_path('has_submodule-1.0')}", :submodules => true do
+          gem "has_submodule"
+        end
+      G
+
+      ref = git.ref_for("master", 11)
+      bundle "#{cmd} --all"
+
+      expect(bundled_app("vendor/cache/has_submodule-1.0-#{ref}")).to exist
+      expect(bundled_app("vendor/cache/has_submodule-1.0-#{ref}/submodule-1.0")).to exist
+      should_be_installed "has_submodule 1.0"
+    end
+
+    it "displays warning message when detecting git repo in Gemfile" do
+      build_git "foo"
+
+      install_gemfile <<-G
+        gem "foo", :git => '#{lib_path("foo-1.0")}'
+      G
+
+      bundle "#{cmd}"
+
+      expect(out).to include("Your Gemfile contains path and git dependencies.")
+    end
+
+    it "does not display warning message if cache_all is set in bundle config" do
+      build_git "foo"
+
+      install_gemfile <<-G
+        gem "foo", :git => '#{lib_path("foo-1.0")}'
+      G
+
+      bundle "#{cmd} --all"
+      bundle "#{cmd}"
+
+      expect(out).not_to include("Your Gemfile contains path and git dependencies.")
+    end
+
+    it "caches pre-evaluated gemspecs" do
+      git = build_git "foo"
+
+      # Insert a gemspec method that shells out
+      spec_lines = lib_path("foo-1.0/foo.gemspec").read.split("\n")
+      spec_lines.insert(-2, "s.description = `echo bob`")
+      update_git("foo"){ |s| s.write "foo.gemspec", spec_lines.join("\n") }
+
+      install_gemfile <<-G
+        gem "foo", :git => '#{lib_path("foo-1.0")}'
+      G
+      bundle "#{cmd} --all"
+
+      ref = git.ref_for("master", 11)
+      gemspec = bundled_app("vendor/cache/foo-1.0-#{ref}/foo.gemspec").read
+      expect(gemspec).to_not match("`echo bob`")
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/cache/path_spec.rb b/misc/lib/bundler-1.3.5/spec/cache/path_spec.rb
new file mode 100644
index 0000000..324e1f1
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/cache/path_spec.rb
@@ -0,0 +1,121 @@
+require "spec_helper"
+
+%w(cache package).each do |cmd|
+  describe "bundle #{cmd} with path" do
+    it "is no-op when the path is within the bundle" do
+      build_lib "foo", :path => bundled_app("lib/foo")
+
+      install_gemfile <<-G
+        gem "foo", :path => '#{bundled_app("lib/foo")}'
+      G
+
+      bundle "#{cmd} --all"
+      expect(bundled_app("vendor/cache/foo-1.0")).not_to exist
+      should_be_installed "foo 1.0"
+    end
+
+    it "copies when the path is outside the bundle " do
+      build_lib "foo"
+
+      install_gemfile <<-G
+        gem "foo", :path => '#{lib_path("foo-1.0")}'
+      G
+
+      bundle "#{cmd} --all"
+      expect(bundled_app("vendor/cache/foo-1.0")).to exist
+      expect(bundled_app("vendor/cache/foo-1.0/.bundlecache")).to be_file
+
+      FileUtils.rm_rf lib_path("foo-1.0")
+      should_be_installed "foo 1.0"
+    end
+
+    it "updates the path on each cache" do
+      build_lib "foo"
+
+      install_gemfile <<-G
+        gem "foo", :path => '#{lib_path("foo-1.0")}'
+      G
+
+      bundle "#{cmd} --all"
+
+      build_lib "foo" do |s|
+        s.write "lib/foo.rb", "puts :CACHE"
+      end
+
+      bundle "#{cmd} --all"
+
+      expect(bundled_app("vendor/cache/foo-1.0")).to exist
+      FileUtils.rm_rf lib_path("foo-1.0")
+
+      run "require 'foo'"
+      expect(out).to eq("CACHE")
+    end
+
+    it "removes stale entries cache" do
+      build_lib "foo"
+
+      install_gemfile <<-G
+        gem "foo", :path => '#{lib_path("foo-1.0")}'
+      G
+
+      bundle "#{cmd} --all"
+
+      install_gemfile <<-G
+        gem "bar", :path => '#{lib_path("bar-1.0")}'
+      G
+
+      bundle "#{cmd} --all"
+      expect(bundled_app("vendor/cache/bar-1.0")).not_to exist
+    end
+
+    it "raises a warning without --all" do
+      build_lib "foo"
+
+      install_gemfile <<-G
+        gem "foo", :path => '#{lib_path("foo-1.0")}'
+      G
+
+      bundle cmd
+      expect(out).to match(/please pass the \-\-all flag/)
+      expect(bundled_app("vendor/cache/foo-1.0")).not_to exist
+    end
+
+    it "stores the given flag" do
+      build_lib "foo"
+
+      install_gemfile <<-G
+        gem "foo", :path => '#{lib_path("foo-1.0")}'
+      G
+
+      bundle "#{cmd} --all"
+      build_lib "bar"
+
+      install_gemfile <<-G
+        gem "foo", :path => '#{lib_path("foo-1.0")}'
+        gem "bar", :path => '#{lib_path("bar-1.0")}'
+      G
+
+      bundle cmd
+      expect(bundled_app("vendor/cache/bar-1.0")).to exist
+    end
+
+    it "can rewind chosen configuration" do
+      build_lib "foo"
+
+      install_gemfile <<-G
+        gem "foo", :path => '#{lib_path("foo-1.0")}'
+      G
+
+      bundle "#{cmd} --all"
+      build_lib "baz"
+
+      gemfile <<-G
+        gem "foo", :path => '#{lib_path("foo-1.0")}'
+        gem "baz", :path => '#{lib_path("baz-1.0")}'
+      G
+
+      bundle "#{cmd} --no-all"
+      expect(bundled_app("vendor/cache/baz-1.0")).not_to exist
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/cache/platform_spec.rb b/misc/lib/bundler-1.3.5/spec/cache/platform_spec.rb
new file mode 100644
index 0000000..f5416b8
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/cache/platform_spec.rb
@@ -0,0 +1,57 @@
+require "spec_helper"
+
+describe "bundle cache with multiple platforms" do
+  before :each do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      platforms :ruby, :ruby_18, :ruby_19, :ruby_20 do
+        gem "rack", "1.0.0"
+      end
+
+      platforms :jruby do
+        gem "activesupport", "2.3.5"
+      end
+
+      platforms :mri, :mri_18, :mri_19, :mri_20 do
+        gem "activerecord", "2.3.2"
+      end
+    G
+
+    lockfile <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (1.0.0)
+          activesupport (2.3.5)
+          activerecord (2.3.2)
+
+      PLATFORMS
+        ruby
+        java
+
+      DEPENDENCIES
+        rack (1.0.0)
+        activesupport (2.3.5)
+        activerecord (2.3.2)
+    G
+
+    cache_gems "rack-1.0.0", "activesupport-2.3.5", "activerecord-2.3.2"
+  end
+
+  it "ensures that bundle install does not delete gems for other platforms" do
+    bundle "install"
+
+    expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
+    expect(bundled_app("vendor/cache/activesupport-2.3.5.gem")).to exist
+    expect(bundled_app("vendor/cache/activerecord-2.3.2.gem")).to exist
+  end
+
+  it "ensures that bundle update does not delete gems for other platforms" do
+    bundle "update"
+
+    expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
+    expect(bundled_app("vendor/cache/activesupport-2.3.5.gem")).to exist
+    expect(bundled_app("vendor/cache/activerecord-2.3.2.gem")).to exist
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/deploy_spec.rb b/misc/lib/bundler-1.3.5/spec/install/deploy_spec.rb
new file mode 100644
index 0000000..fdfe64b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/deploy_spec.rb
@@ -0,0 +1,225 @@
+require "spec_helper"
+
+describe "install with --deployment or --frozen" do
+  before do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+  end
+
+  it "fails without a lockfile and says that --deployment requires a lock" do
+    bundle "install --deployment"
+    expect(out).to include("The --deployment flag requires a Gemfile.lock")
+  end
+
+  it "fails without a lockfile and says that --frozen requires a lock" do
+    bundle "install --frozen"
+    expect(out).to include("The --frozen flag requires a Gemfile.lock")
+  end
+
+  it "works after you try to deploy without a lock" do
+    bundle "install --deployment"
+    bundle :install, :exitstatus => true
+    expect(exitstatus).to eq(0)
+    should_be_installed "rack 1.0"
+  end
+
+  it "still works if you are not in the app directory and specify --gemfile" do
+    bundle "install"
+    Dir.chdir tmp
+    simulate_new_machine
+    bundle "install --gemfile #{tmp}/bundled_app/Gemfile --deployment"
+    Dir.chdir bundled_app
+    should_be_installed "rack 1.0"
+  end
+
+  it "works if you exclude a group with a git gem" do
+    build_git "foo"
+    gemfile <<-G
+      group :test do
+        gem "foo", :git => "#{lib_path('foo-1.0')}"
+      end
+    G
+    bundle :install
+    bundle "install --deployment --without test", :exitstatus => true
+    expect(exitstatus).to eq(0)
+  end
+
+  it "works when you bundle exec bundle" do
+    bundle :install
+    bundle "install --deployment"
+    bundle "exec bundle check", :exitstatus => true
+    expect(exitstatus).to eq(0)
+  end
+
+  it "works when using path gems from the same path and the version is specified" do
+    build_lib "foo", :path => lib_path("nested/foo")
+    build_lib "bar", :path => lib_path("nested/bar")
+    gemfile <<-G
+      gem "foo", "1.0", :path => "#{lib_path("nested")}"
+      gem "bar", :path => "#{lib_path("nested")}"
+    G
+
+    bundle :install
+    bundle "install --deployment", :exitstatus => true
+
+    expect(exitstatus).to eq(0)
+  end
+
+  describe "with an existing lockfile" do
+    before do
+      bundle "install"
+    end
+
+    it "works with the --deployment flag if you didn't change anything" do
+      bundle "install --deployment", :exitstatus => true
+      expect(exitstatus).to eq(0)
+    end
+
+    it "works with the --frozen flag if you didn't change anything" do
+      bundle "install --frozen", :exitstatus => true
+      expect(exitstatus).to eq(0)
+    end
+
+    it "explodes with the --deployment flag if you make a change and don't check in the lockfile" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "rack-obama"
+      G
+
+      bundle "install --deployment"
+      expect(out).to include("deployment mode")
+      expect(out).to include("You have added to the Gemfile")
+      expect(out).to include("* rack-obama")
+      expect(out).not_to include("You have deleted from the Gemfile")
+      expect(out).not_to include("You have changed in the Gemfile")
+    end
+
+    it "can have --frozen set via an environment variable" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "rack-obama"
+      G
+
+      ENV['BUNDLE_FROZEN'] = '1'
+      bundle "install"
+      expect(out).to include("deployment mode")
+      expect(out).to include("You have added to the Gemfile")
+      expect(out).to include("* rack-obama")
+      expect(out).not_to include("You have deleted from the Gemfile")
+      expect(out).not_to include("You have changed in the Gemfile")
+    end
+
+    it "can have --frozen set to false via an environment variable" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "rack-obama"
+      G
+
+      ENV['BUNDLE_FROZEN'] = "false"
+      bundle "install"
+      expect(out).not_to include("deployment mode")
+      expect(out).not_to include("You have added to the Gemfile")
+      expect(out).not_to include("* rack-obama")
+    end
+
+    it "explodes with the --frozen flag if you make a change and don't check in the lockfile" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "rack-obama"
+      G
+
+      bundle "install --frozen"
+      expect(out).to include("deployment mode")
+      expect(out).to include("You have added to the Gemfile")
+      expect(out).to include("* rack-obama")
+      expect(out).not_to include("You have deleted from the Gemfile")
+      expect(out).not_to include("You have changed in the Gemfile")
+    end
+
+    it "explodes if you remove a gem and don't check in the lockfile" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "activesupport"
+      G
+
+      bundle "install --deployment"
+      expect(out).to include("deployment mode")
+      expect(out).to include("You have added to the Gemfile:\n* activesupport\n\n")
+      expect(out).to include("You have deleted from the Gemfile:\n* rack")
+      expect(out).not_to include("You have changed in the Gemfile")
+    end
+
+    it "explodes if you add a source" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "git://hubz.com"
+      G
+
+      bundle "install --deployment"
+      expect(out).to include("deployment mode")
+      expect(out).to include("You have added to the Gemfile:\n* source: git://hubz.com (at master)")
+      expect(out).not_to include("You have changed in the Gemfile")
+    end
+
+    it "explodes if you unpin a source" do
+      build_git "rack"
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path("rack-1.0")}"
+      G
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      bundle "install --deployment"
+      expect(out).to include("deployment mode")
+      expect(out).to include("You have deleted from the Gemfile:\n* source: #{lib_path("rack-1.0")} (at master)")
+      expect(out).not_to include("You have added to the Gemfile")
+      expect(out).not_to include("You have changed in the Gemfile")
+    end
+
+    it "explodes if you unpin a source, leaving it pinned somewhere else" do
+      build_lib "foo", :path => lib_path("rack/foo")
+      build_git "rack", :path => lib_path("rack")
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path("rack")}"
+        gem "foo", :git => "#{lib_path("rack")}"
+      G
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "foo", :git => "#{lib_path("rack")}"
+      G
+
+      bundle "install --deployment"
+      expect(out).to include("deployment mode")
+      expect(out).to include("You have changed in the Gemfile:\n* rack from `no specified source` to `#{lib_path("rack")} (at master)`")
+      expect(out).not_to include("You have added to the Gemfile")
+      expect(out).not_to include("You have deleted from the Gemfile")
+    end
+
+    it "remembers that the bundle is frozen at runtime" do
+      bundle "install --deployment"
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", "1.0.0"
+        gem "rack-obama"
+      G
+
+      should_be_installed "rack 1.0.0"
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/c_ext_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/c_ext_spec.rb
new file mode 100644
index 0000000..6f9fe22
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/c_ext_spec.rb
@@ -0,0 +1,48 @@
+require "spec_helper"
+
+describe "installing a gem with C extensions" do
+  it "installs" do
+    build_repo2 do
+      build_gem "c_extension" do |s|
+        s.extensions = ["ext/extconf.rb"]
+        s.write "ext/extconf.rb", <<-E
+          require "mkmf"
+          name = "c_extension_bundle"
+          dir_config(name)
+          raise "OMG" unless with_config("c_extension") == "hello"
+          create_makefile(name)
+        E
+
+        s.write "ext/c_extension.c", <<-C
+          #include "ruby.h"
+
+          VALUE c_extension_true(VALUE self) {
+            return Qtrue;
+          }
+
+          void Init_c_extension_bundle() {
+            VALUE c_Extension = rb_define_class("CExtension", rb_cObject);
+            rb_define_method(c_Extension, "its_true", c_extension_true, 0);
+          }
+        C
+
+        s.write "lib/c_extension.rb", <<-C
+          require "c_extension_bundle"
+        C
+      end
+    end
+
+    gemfile <<-G
+      source "file://#{gem_repo2}"
+      gem "c_extension"
+    G
+
+    bundle "config build.c_extension --with-c_extension=hello"
+    bundle "install"
+
+    expect(out).not_to include("extconf.rb failed")
+
+    run "Bundler.require; puts CExtension.new.its_true"
+    expect(out).to eq("true")
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/dependency_api_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/dependency_api_spec.rb
new file mode 100644
index 0000000..c88fdcc
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/dependency_api_spec.rb
@@ -0,0 +1,492 @@
+require "spec_helper"
+
+describe "gemcutter's dependency API" do
+  let(:source_uri) { "http://localgemserver.test" }
+
+  it "should use the API" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem "rack"
+    G
+
+    bundle :install, :artifice => "endpoint"
+    expect(out).to include("Fetching gem metadata from #{source_uri}")
+    should_be_installed "rack 1.0.0"
+  end
+
+  it "should URI encode gem names" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem " sinatra"
+    G
+
+    bundle :install, :artifice => "endpoint"
+    expect(out).to include("Could not find gem ' sinatra")
+  end
+
+  it "should handle nested dependencies" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem "rails"
+    G
+
+    bundle :install, :artifice => "endpoint"
+    expect(out).to include("Fetching gem metadata from #{source_uri}/...")
+    should_be_installed(
+      "rails 2.3.2",
+      "actionpack 2.3.2",
+      "activerecord 2.3.2",
+      "actionmailer 2.3.2",
+      "activeresource 2.3.2",
+      "activesupport 2.3.2")
+  end
+
+  it "should handle multiple gem dependencies on the same gem" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem "net-sftp"
+    G
+
+    bundle :install, :artifice => "endpoint"
+    should_be_installed "net-sftp 1.1.1"
+  end
+
+  it "should use the endpoint when using --deployment" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem "rack"
+    G
+    bundle :install, :artifice => "endpoint"
+
+    bundle "install --deployment", :artifice => "endpoint"
+    expect(out).to include("Fetching gem metadata from #{source_uri}")
+    should_be_installed "rack 1.0.0"
+  end
+
+  it "handles git dependencies that are in rubygems" do
+    build_git "foo" do |s|
+      s.executables = "foobar"
+      s.add_dependency "rails", "2.3.2"
+    end
+
+    gemfile <<-G
+      source "#{source_uri}"
+      git "file:///#{lib_path('foo-1.0')}" do
+        gem 'foo'
+      end
+    G
+
+    bundle :install, :artifice => "endpoint"
+
+    should_be_installed("rails 2.3.2")
+  end
+
+  it "handles git dependencies that are in rubygems using --deployment" do
+    build_git "foo" do |s|
+      s.executables = "foobar"
+      s.add_dependency "rails", "2.3.2"
+    end
+
+    gemfile <<-G
+      source "#{source_uri}"
+      gem 'foo', :git => "file:///#{lib_path('foo-1.0')}"
+    G
+
+    bundle :install, :artifice => "endpoint"
+
+    bundle "install --deployment", :artifice => "endpoint"
+
+    should_be_installed("rails 2.3.2")
+  end
+
+  it "doesn't fail if you only have a git gem with no deps when using --deployment" do
+    build_git "foo"
+    gemfile <<-G
+      source "#{source_uri}"
+      gem 'foo', :git => "file:///#{lib_path('foo-1.0')}"
+    G
+
+    bundle "install", :artifice => "endpoint"
+    bundle "install --deployment", :artifice => "endpoint", :exitstatus => true
+
+    expect(exitstatus).to eq(0)
+    should_be_installed("foo 1.0")
+  end
+
+  it "falls back when the API errors out" do
+    simulate_platform mswin
+
+    gemfile <<-G
+      source "#{source_uri}"
+      gem "rcov"
+    G
+
+    bundle :install, :fakeweb => "windows"
+    expect(out).to include("Fetching source index from #{source_uri}")
+    should_be_installed "rcov 1.0.0"
+  end
+
+  it "falls back when hitting the Gemcutter Dependency Limit" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem "activesupport"
+      gem "actionpack"
+      gem "actionmailer"
+      gem "activeresource"
+      gem "thin"
+      gem "rack"
+      gem "rails"
+    G
+    bundle :install, :artifice => "endpoint_fallback"
+    expect(out).to include("Fetching source index from #{source_uri}")
+
+    should_be_installed(
+      "activesupport 2.3.2",
+      "actionpack 2.3.2",
+      "actionmailer 2.3.2",
+      "activeresource 2.3.2",
+      "activesupport 2.3.2",
+      "thin 1.0.0",
+      "rack 1.0.0",
+      "rails 2.3.2")
+  end
+
+  it "falls back when Gemcutter API doesn't return proper Marshal format" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem "rack"
+    G
+
+    bundle :install, :artifice => "endpoint_marshal_fail"
+    expect(out).to include("Fetching source index from #{source_uri}")
+    should_be_installed "rack 1.0.0"
+  end
+
+  it "timeouts when Bundler::Fetcher redirects too much" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem "rack"
+    G
+
+    bundle :install, :artifice => "endpoint_redirect"
+    expect(out).to match(/Too many redirects/)
+  end
+
+  context "when --full-index is specified" do
+    it "should use the modern index for install" do
+      gemfile <<-G
+        source "#{source_uri}"
+        gem "rack"
+      G
+
+      bundle "install --full-index", :artifice => "endpoint"
+      expect(out).to include("Fetching source index from #{source_uri}")
+      should_be_installed "rack 1.0.0"
+    end
+
+    it "should use the modern index for update" do
+      gemfile <<-G
+        source "#{source_uri}"
+        gem "rack"
+      G
+
+      bundle "update --full-index", :artifice => "endpoint"
+      expect(out).to include("Fetching source index from #{source_uri}")
+      should_be_installed "rack 1.0.0"
+    end
+  end
+
+  it "fetches again when more dependencies are found in subsequent sources" do
+    build_repo2 do
+      build_gem "back_deps" do |s|
+        s.add_dependency "foo"
+      end
+      FileUtils.rm_rf Dir[gem_repo2("gems/foo-*.gem")]
+    end
+
+    gemfile <<-G
+      source "#{source_uri}"
+      source "#{source_uri}/extra"
+      gem "back_deps"
+    G
+
+    bundle :install, :artifice => "endpoint_extra"
+    should_be_installed "back_deps 1.0"
+  end
+
+  it "prints API output properly with back deps" do
+    build_repo2 do
+      build_gem "back_deps" do |s|
+        s.add_dependency "foo"
+      end
+      FileUtils.rm_rf Dir[gem_repo2("gems/foo-*.gem")]
+    end
+
+    gemfile <<-G
+      source "#{source_uri}"
+      source "#{source_uri}/extra"
+      gem "back_deps"
+    G
+
+    bundle :install, :artifice => "endpoint_extra"
+
+    expect(out).to include("Fetching gem metadata from http://localgemserver.test/..")
+    expect(out).to include("Fetching source index from http://localgemserver.test/extra")
+  end
+
+  it "does not fetch every specs if the index of gems is large when doing back deps" do
+    build_repo2 do
+      build_gem "back_deps" do |s|
+        s.add_dependency "foo"
+      end
+      build_gem "missing"
+      # need to hit the limit
+      1.upto(Bundler::Source::Rubygems::API_REQUEST_LIMIT) do |i|
+        build_gem "gem#{i}"
+      end
+
+      FileUtils.rm_rf Dir[gem_repo2("gems/foo-*.gem")]
+    end
+
+    gemfile <<-G
+      source "#{source_uri}"
+      source "#{source_uri}/extra"
+      gem "back_deps"
+    G
+
+    bundle :install, :artifice => "endpoint_extra_missing"
+    should_be_installed "back_deps 1.0"
+  end
+
+  it "uses the endpoint if all sources support it" do
+    gemfile <<-G
+      source "#{source_uri}"
+
+      gem 'foo'
+    G
+
+    bundle :install, :artifice => "endpoint_api_missing"
+    should_be_installed "foo 1.0"
+  end
+
+  it "fetches again when more dependencies are found in subsequent sources using --deployment" do
+    build_repo2 do
+      build_gem "back_deps" do |s|
+        s.add_dependency "foo"
+      end
+      FileUtils.rm_rf Dir[gem_repo2("gems/foo-*.gem")]
+    end
+
+    gemfile <<-G
+      source "#{source_uri}"
+      source "#{source_uri}/extra"
+      gem "back_deps"
+    G
+
+    bundle :install, :artifice => "endpoint_extra"
+
+    bundle "install --deployment", :artifice => "endpoint_extra"
+    should_be_installed "back_deps 1.0"
+  end
+
+  it "does not refetch if the only unmet dependency is bundler" do
+    gemfile <<-G
+      source "#{source_uri}"
+
+      gem "bundler_dep"
+    G
+
+    bundle :install, :artifice => "endpoint"
+    expect(out).to include("Fetching gem metadata from #{source_uri}")
+  end
+
+  fit "should install when EndpointSpecification with a bin dir owned by root", :sudo => true do
+    sudo "mkdir -p #{system_gem_path("bin")}"
+    sudo "chown -R root #{system_gem_path("bin")}"
+
+    gemfile <<-G
+      source "#{source_uri}"
+      gem "rails"
+    G
+    bundle :install, :artifice => "endpoint"
+    puts out, err
+    should_be_installed "rails 2.3.2"
+  end
+
+  it "installs the binstubs" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem "rack"
+    G
+
+    bundle "install --binstubs", :artifice => "endpoint"
+
+    gembin "rackup"
+    expect(out).to eq("1.0.0")
+  end
+
+  it "installs the bins when using --path and uses autoclean" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem "rack"
+    G
+
+    bundle "install --path vendor/bundle", :artifice => "endpoint"
+
+    expect(vendored_gems("bin/rackup")).to exist
+  end
+
+  it "installs the bins when using --path and uses bundle clean" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem "rack"
+    G
+
+    bundle "install --path vendor/bundle --no-clean", :artifice => "endpoint"
+
+    expect(vendored_gems("bin/rackup")).to exist
+  end
+
+  it "prints post_install_messages" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem 'rack-obama'
+    G
+
+    bundle :install, :artifice => "endpoint"
+    expect(out).to include("Post-install message from rack:")
+  end
+
+  it "should display the post install message for a dependency" do
+    gemfile <<-G
+      source "#{source_uri}"
+      gem 'rack_middleware'
+    G
+
+    bundle :install, :artifice => "endpoint"
+    expect(out).to include("Post-install message from rack:")
+    expect(out).to include("Rack's post install message")
+  end
+
+  context "when using basic authentication" do
+    let(:user)     { "user" }
+    let(:password) { "pass" }
+    let(:basic_auth_source_uri) do
+      uri          = URI.parse(source_uri)
+      uri.user     = user
+      uri.password = password
+
+      uri
+    end
+
+    it "passes basic authentication details and strips out creds" do
+      gemfile <<-G
+        source "#{basic_auth_source_uri}"
+        gem "rack"
+      G
+
+      bundle :install, :artifice => "endpoint_basic_authentication"
+      expect(out).not_to include("#{user}:#{password}")
+      should_be_installed "rack 1.0.0"
+    end
+
+    it "strips http basic authentication creds for modern index" do
+      gemfile <<-G
+        source "#{basic_auth_source_uri}"
+        gem "rack"
+      G
+
+      bundle :install, :artifice => "endopint_marshal_fail_basic_authentication"
+      expect(out).not_to include("#{user}:#{password}")
+      should_be_installed "rack 1.0.0"
+    end
+
+    it "strips http basic auth creds when it can't reach the server" do
+      gemfile <<-G
+        source "#{basic_auth_source_uri}"
+        gem "rack"
+      G
+
+      bundle :install, :artifice => "endpoint_500"
+      expect(out).not_to include("#{user}:#{password}")
+    end
+
+    it "does not pass the user / password to different hosts on redirect" do
+      gemfile <<-G
+        source "#{basic_auth_source_uri}"
+        gem "rack"
+      G
+
+      bundle :install, :artifice => "endpoint_creds_diff_host"
+      should_be_installed "rack 1.0.0"
+    end
+  end
+
+  context "when ruby is compiled without openssl" do
+    before do
+      # Install a monkeypatch that reproduces the effects of openssl being
+      # missing when the fetcher runs, as happens in real life. The reason
+      # we can't just overwrite openssl.rb is that Artifice uses it.
+      bundled_app("broken_ssl").mkpath
+      bundled_app("broken_ssl/openssl.rb").open("w") do |f|
+        f.write <<-RUBY
+          raise LoadError, "cannot load such file -- openssl"
+        RUBY
+      end
+    end
+
+    it "explains what to do to get it" do
+      gemfile <<-G
+        source "#{source_uri.gsub(/http/, 'https')}"
+        gem "rack"
+      G
+
+      bundle :install, :env => {"RUBYOPT" => "-I#{bundled_app("broken_ssl")}"}
+      expect(out).to include("OpenSSL")
+    end
+  end
+
+  context "when SSL certificate verification fails" do
+    it "explains what happened" do
+      # Install a monkeypatch that reproduces the effects of openssl raising
+      # a certificate validation error when Rubygems tries to connect.
+      gemfile <<-G
+        class Net::HTTP
+          def start
+            raise OpenSSL::SSL::SSLError, "certificate verify failed"
+          end
+        end
+
+        source "#{source_uri.gsub(/http/, 'https')}"
+        gem "rack"
+      G
+
+      bundle :install
+      expect(out).to match(/could not verify the SSL certificate/i)
+    end
+  end
+
+  context ".gemrc with sources is present" do
+    before do
+      File.open(home('.gemrc'), 'w') do |file|
+        file.puts({:sources => ["https://rubygems.org"]}.to_yaml)
+      end
+    end
+
+    after do
+      home('.gemrc').rmtree
+    end
+
+    it "uses other sources declared in the Gemfile" do
+      gemfile <<-G
+        source "#{source_uri}"
+        gem 'rack'
+      G
+
+      bundle "install", :exitstatus => true, :artifice => "endpoint_marshal_fail"
+
+      expect(exitstatus).to eq(0)
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/env_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/env_spec.rb
new file mode 100644
index 0000000..235a1ce
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/env_spec.rb
@@ -0,0 +1,107 @@
+require "spec_helper"
+
+describe "bundle install with ENV conditionals" do
+  describe "when just setting an ENV key as a string" do
+    before :each do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+
+        env "BUNDLER_TEST" do
+          gem "rack"
+        end
+      G
+    end
+
+    it "excludes the gems when the ENV variable is not set" do
+      bundle :install
+      should_not_be_installed "rack"
+    end
+
+    it "includes the gems when the ENV variable is set" do
+      ENV['BUNDLER_TEST'] = '1'
+      bundle :install
+      should_be_installed "rack 1.0"
+    end
+  end
+
+  describe "when just setting an ENV key as a symbol" do
+    before :each do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+
+        env :BUNDLER_TEST do
+          gem "rack"
+        end
+      G
+    end
+
+    it "excludes the gems when the ENV variable is not set" do
+      bundle :install
+      should_not_be_installed "rack"
+    end
+
+    it "includes the gems when the ENV variable is set" do
+      ENV['BUNDLER_TEST'] = '1'
+      bundle :install
+      should_be_installed "rack 1.0"
+    end
+  end
+
+  describe "when setting a string to match the env" do
+    before :each do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+
+        env "BUNDLER_TEST" => "foo" do
+          gem "rack"
+        end
+      G
+    end
+
+    it "excludes the gems when the ENV variable is not set" do
+      bundle :install
+      should_not_be_installed "rack"
+    end
+
+    it "excludes the gems when the ENV variable is set but does not match the condition" do
+      ENV['BUNDLER_TEST'] = '1'
+      bundle :install
+      should_not_be_installed "rack"
+    end
+
+    it "includes the gems when the ENV variable is set and matches the condition" do
+      ENV['BUNDLER_TEST'] = 'foo'
+      bundle :install
+      should_be_installed "rack 1.0"
+    end
+  end
+
+  describe "when setting a regex to match the env" do
+    before :each do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+
+        env "BUNDLER_TEST" => /foo/ do
+          gem "rack"
+        end
+      G
+    end
+
+    it "excludes the gems when the ENV variable is not set" do
+      bundle :install
+      should_not_be_installed "rack"
+    end
+
+    it "excludes the gems when the ENV variable is set but does not match the condition" do
+      ENV['BUNDLER_TEST'] = 'fo'
+      bundle :install
+      should_not_be_installed "rack"
+    end
+
+    it "includes the gems when the ENV variable is set and matches the condition" do
+      ENV['BUNDLER_TEST'] = 'foobar'
+      bundle :install
+      should_be_installed "rack 1.0"
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/flex_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/flex_spec.rb
new file mode 100644
index 0000000..9a837e9
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/flex_spec.rb
@@ -0,0 +1,314 @@
+require "spec_helper"
+
+describe "bundle flex_install" do
+  it "installs the gems as expected" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem 'rack'
+    G
+
+    should_be_installed "rack 1.0.0"
+    should_be_locked
+  end
+
+  it "installs even when the lockfile is invalid" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem 'rack'
+    G
+
+    should_be_installed "rack 1.0.0"
+    should_be_locked
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem 'rack', '1.0'
+    G
+
+    bundle :install
+    should_be_installed "rack 1.0.0"
+    should_be_locked
+  end
+
+  it "keeps child dependencies at the same version" do
+    build_repo2
+
+    install_gemfile <<-G
+      source "file://#{gem_repo2}"
+      gem "rack-obama"
+    G
+
+    should_be_installed "rack 1.0.0", "rack-obama 1.0.0"
+
+    update_repo2
+    install_gemfile <<-G
+      source "file://#{gem_repo2}"
+      gem "rack-obama", "1.0"
+    G
+
+    should_be_installed "rack 1.0.0", "rack-obama 1.0.0"
+  end
+
+  describe "adding new gems" do
+    it "installs added gems without updating previously installed gems" do
+      build_repo2
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem 'rack'
+      G
+
+      update_repo2
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem 'rack'
+        gem 'activesupport', '2.3.5'
+      G
+
+      should_be_installed "rack 1.0.0", 'activesupport 2.3.5'
+    end
+
+    it "keeps child dependencies pinned" do
+      build_repo2
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rack-obama"
+      G
+
+      update_repo2
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rack-obama"
+        gem "thin"
+      G
+
+      should_be_installed "rack 1.0.0", 'rack-obama 1.0', 'thin 1.0'
+    end
+  end
+
+  describe "removing gems" do
+    it "removes gems without changing the versions of remaining gems" do
+      build_repo2
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem 'rack'
+        gem 'activesupport', '2.3.5'
+      G
+
+      update_repo2
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem 'rack'
+      G
+
+      should_be_installed "rack 1.0.0"
+      should_not_be_installed "activesupport 2.3.5"
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem 'rack'
+        gem 'activesupport', '2.3.2'
+      G
+
+      should_be_installed "rack 1.0.0", 'activesupport 2.3.2'
+    end
+
+    it "removes top level dependencies when removed from the Gemfile while leaving other dependencies intact" do
+      build_repo2
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem 'rack'
+        gem 'activesupport', '2.3.5'
+      G
+
+      update_repo2
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem 'rack'
+      G
+
+      should_not_be_installed "activesupport 2.3.5"
+    end
+
+    it "removes child dependencies" do
+      build_repo2
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem 'rack-obama'
+        gem 'activesupport'
+      G
+
+      should_be_installed "rack 1.0.0", "rack-obama 1.0.0", "activesupport 2.3.5"
+
+      update_repo2
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem 'activesupport'
+      G
+
+      should_be_installed 'activesupport 2.3.5'
+      should_not_be_installed "rack-obama", "rack"
+    end
+  end
+
+  describe "when Gemfile conflicts with lockfile" do
+    before(:each) do
+      build_repo2
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rack_middleware"
+      G
+
+      should_be_installed "rack_middleware 1.0", "rack 0.9.1"
+
+      build_repo2
+      update_repo2 do
+        build_gem "rack-obama", "2.0" do |s|
+          s.add_dependency "rack", "=1.2"
+        end
+        build_gem "rack_middleware", "2.0" do |s|
+          s.add_dependency "rack", ">=1.0"
+        end
+      end
+
+      gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rack-obama", "2.0"
+        gem "rack_middleware"
+      G
+    end
+
+    it "does not install gems whose dependencies are not met" do
+      bundle :install
+      ruby <<-RUBY, :expect_err => true
+        require 'bundler/setup'
+      RUBY
+      expect(err).to match(/could not find gem 'rack-obama/i)
+    end
+
+    it "suggests bundle update when the Gemfile requires different versions than the lock" do
+      nice_error = <<-E.strip.gsub(/^ {8}/, '')
+        Fetching source index from file:#{gem_repo2}/
+        Resolving dependencies...
+        Bundler could not find compatible versions for gem "rack":
+          In snapshot (Gemfile.lock):
+            rack (0.9.1)
+
+          In Gemfile:
+            rack-obama (= 2.0) ruby depends on
+              rack (= 1.2) ruby
+
+        Running `bundle update` will rebuild your snapshot from scratch, using only
+        the gems in your Gemfile, which may resolve the conflict.
+      E
+
+      bundle :install
+      expect(out).to eq(nice_error)
+    end
+  end
+
+  describe "subtler cases" do
+    before :each do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "rack-obama"
+      G
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", "0.9.1"
+        gem "rack-obama"
+      G
+    end
+
+    it "does something" do
+      expect {
+        bundle "install"
+      }.not_to change { File.read(bundled_app('Gemfile.lock')) }
+
+      expect(out).to include('rack = 0.9.1')
+      expect(out).to include('locked at 1.0.0')
+      expect(out).to include('bundle update rack')
+    end
+
+    it "should work when you update" do
+      bundle "update rack"
+    end
+  end
+
+  describe "when adding a new source" do
+    it "updates the lockfile" do
+      build_repo2
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        source "file://#{gem_repo2}"
+        gem "rack"
+      G
+
+      lockfile_should_be <<-L
+      GEM
+        remote: file:#{gem_repo1}/
+        remote: file:#{gem_repo2}/
+        specs:
+          rack (1.0.0)
+
+      PLATFORMS
+        ruby
+
+      DEPENDENCIES
+        rack
+      L
+    end
+  end
+
+  # This was written to test github issue #636, but it passed.
+  # It's insanoly slow (3.36s) so I'm not going to run it
+  # describe "when a locked child dependency conflicts" do
+  #   before(:each) do
+  #     build_repo2 do
+  #       build_gem "capybara", "0.3.9" do |s|
+  #         s.add_dependency "rack", ">= 1.0.0"
+  #       end
+  #
+  #       build_gem "rack", "1.1.0"
+  #       build_gem "rails", "3.0.0.rc4" do |s|
+  #         s.add_dependency "rack", "~> 1.1.0"
+  #       end
+  #
+  #       build_gem "rack", "1.2.1"
+  #       build_gem "rails", "3.0.0" do |s|
+  #         s.add_dependency "rack", "~> 1.2.1"
+  #       end
+  #     end
+  #   end
+  #
+  #   it "prints the correct error message" do
+  #     # install Rails 3.0.0.rc
+  #     install_gemfile <<-G
+  #       source "file://#{gem_repo2}"
+  #       gem "rails", "3.0.0.rc4"
+  #       gem "capybara", "0.3.9"
+  #     G
+  #
+  #     # upgrade Rails to 3.0.0 and then install again
+  #     install_gemfile <<-G
+  #       source "file://#{gem_repo2}"
+  #       gem "rails", "3.0.0"
+  #       gem "capybara", "0.3.9"
+  #     G
+  #
+  #     out.should match(/Gemfile.lock/)
+  #   end
+  # end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/groups_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/groups_spec.rb
new file mode 100644
index 0000000..70b571c
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/groups_spec.rb
@@ -0,0 +1,249 @@
+require "spec_helper"
+
+describe "bundle install with gem sources" do
+  describe "with groups" do
+    describe "installing with no options" do
+      before :each do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rack"
+          group :emo do
+            gem "activesupport", "2.3.5"
+          end
+          gem "thin", :groups => [:emo]
+        G
+      end
+
+      it "installs gems in the default group" do
+        should_be_installed "rack 1.0.0"
+      end
+
+      it "installs gems in a group block into that group" do
+        should_be_installed "activesupport 2.3.5"
+
+        load_error_run <<-R, 'activesupport', :default
+          require 'activesupport'
+          puts ACTIVESUPPORT
+        R
+
+        expect(err).to eq("ZOMG LOAD ERROR")
+      end
+
+      it "installs gems with inline :groups into those groups" do
+        should_be_installed "thin 1.0"
+
+        load_error_run <<-R, 'thin', :default
+          require 'thin'
+          puts THIN
+        R
+
+        expect(err).to eq("ZOMG LOAD ERROR")
+      end
+
+      it "sets up everything if Bundler.setup is used with no groups" do
+        out = run("require 'rack'; puts RACK")
+        expect(out).to eq('1.0.0')
+
+        out = run("require 'activesupport'; puts ACTIVESUPPORT")
+        expect(out).to eq('2.3.5')
+
+        out = run("require 'thin'; puts THIN")
+        expect(out).to eq('1.0')
+      end
+
+      it "removes old groups when new groups are set up" do
+        load_error_run <<-RUBY, 'thin', :emo
+          Bundler.setup(:default)
+          require 'thin'
+          puts THIN
+        RUBY
+
+        expect(err).to eq("ZOMG LOAD ERROR")
+      end
+
+      it "sets up old groups when they have previously been removed" do
+        out = run <<-RUBY, :emo
+          Bundler.setup(:default)
+          Bundler.setup(:default, :emo)
+          require 'thin'; puts THIN
+        RUBY
+        expect(out).to eq('1.0')
+      end
+    end
+
+    describe "installing --without" do
+      describe "with gems assigned to a single group" do
+        before :each do
+          gemfile <<-G
+            source "file://#{gem_repo1}"
+            gem "rack"
+            group :emo do
+              gem "activesupport", "2.3.5"
+            end
+          G
+        end
+
+        it "installs gems in the default group" do
+          bundle :install, :without => "emo"
+          should_be_installed "rack 1.0.0", :groups => [:default]
+        end
+
+        it "does not install gems from the excluded group" do
+          bundle :install, :without => "emo"
+          should_not_be_installed "activesupport 2.3.5", :groups => [:default]
+        end
+
+        it "does not install gems from the previously excluded group" do
+          bundle :install, :without => "emo"
+          should_not_be_installed "activesupport 2.3.5"
+          bundle :install
+          should_not_be_installed "activesupport 2.3.5"
+        end
+
+        it "does not say it installed gems from the excluded group" do
+          bundle :install, :without => "emo"
+          expect(out).not_to include("activesupport")
+        end
+
+        it "allows Bundler.setup for specific groups" do
+          bundle :install, :without => "emo"
+          run("require 'rack'; puts RACK", :default)
+          expect(out).to eq('1.0.0')
+        end
+
+        it "does not effect the resolve" do
+          gemfile <<-G
+            source "file://#{gem_repo1}"
+            gem "activesupport"
+            group :emo do
+              gem "rails", "2.3.2"
+            end
+          G
+
+          bundle :install, :without => "emo"
+          should_be_installed "activesupport 2.3.2", :groups => [:default]
+        end
+
+        it "still works on a different machine and excludes gems" do
+          bundle :install, :without => "emo"
+
+          simulate_new_machine
+          bundle :install, :without => "emo"
+
+          should_be_installed "rack 1.0.0", :groups => [:default]
+          should_not_be_installed "activesupport 2.3.5", :groups => [:default]
+        end
+
+        it "still works when BUNDLE_WITHOUT is set" do
+          ENV["BUNDLE_WITHOUT"] = "emo"
+
+          bundle :install
+          expect(out).not_to include("activesupport")
+
+          should_be_installed "rack 1.0.0", :groups => [:default]
+          should_not_be_installed "activesupport 2.3.5", :groups => [:default]
+
+          ENV["BUNDLE_WITHOUT"] = nil
+        end
+
+        it "clears without when passed an empty list" do
+          bundle :install, :without => "emo"
+
+          bundle 'install --without ""'
+          should_be_installed "activesupport 2.3.5"
+        end
+
+        it "doesn't clear without when nothing is passed" do
+          bundle :install, :without => "emo"
+
+          bundle :install
+          should_not_be_installed "activesupport 2.3.5"
+        end
+      end
+
+      describe "with gems assigned to multiple groups" do
+        before :each do
+          gemfile <<-G
+            source "file://#{gem_repo1}"
+            gem "rack"
+            group :emo, :lolercoaster do
+              gem "activesupport", "2.3.5"
+            end
+          G
+        end
+
+        it "installs gems in the default group" do
+          bundle :install, :without => "emo lolercoaster"
+          should_be_installed "rack 1.0.0"
+        end
+
+        it "installs the gem if any of its groups are installed" do
+          bundle "install --without emo"
+          should_be_installed "rack 1.0.0", "activesupport 2.3.5"
+        end
+
+        describe "with a gem defined multiple times in different groups" do
+          before :each do
+            gemfile <<-G
+              source "file://#{gem_repo1}"
+              gem "rack"
+
+              group :emo do
+                gem "activesupport", "2.3.5"
+              end
+
+              group :lolercoaster do
+                gem "activesupport", "2.3.5"
+              end
+            G
+          end
+
+          it "installs the gem w/ option --without emo" do
+            bundle "install --without emo"
+            should_be_installed "activesupport 2.3.5"
+          end
+
+          it "installs the gem w/ option --without lolercoaster" do
+            bundle "install --without lolercoaster"
+            should_be_installed "activesupport 2.3.5"
+          end
+
+          it "does not install the gem w/ option --without emo lolercoaster" do
+            bundle "install --without emo lolercoaster"
+            should_not_be_installed "activesupport 2.3.5"
+          end
+
+          it "does not install the gem w/ option --without 'emo lolercoaster'" do
+            bundle "install --without 'emo lolercoaster'"
+            should_not_be_installed "activesupport 2.3.5"
+          end
+        end
+      end
+
+      describe "nesting groups" do
+        before :each do
+          gemfile <<-G
+            source "file://#{gem_repo1}"
+            gem "rack"
+            group :emo do
+              group :lolercoaster do
+                gem "activesupport", "2.3.5"
+              end
+            end
+          G
+        end
+
+        it "installs gems in the default group" do
+          bundle :install, :without => "emo lolercoaster"
+          should_be_installed "rack 1.0.0"
+        end
+
+        it "installs the gem if any of its groups are installed" do
+          bundle "install --without emo"
+          should_be_installed "rack 1.0.0", "activesupport 2.3.5"
+        end
+
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/packed_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/packed_spec.rb
new file mode 100644
index 0000000..cce3b4a
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/packed_spec.rb
@@ -0,0 +1,84 @@
+require "spec_helper"
+
+describe "bundle install with gem sources" do
+  describe "when cached and locked" do
+    it "does not hit the remote at all" do
+      build_repo2
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rack"
+      G
+
+      bundle :pack
+      simulate_new_machine
+      FileUtils.rm_rf gem_repo2
+
+      bundle "install --local"
+      should_be_installed "rack 1.0.0"
+    end
+
+    it "does not hit the remote at all" do
+      build_repo2
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rack"
+      G
+
+      bundle :pack
+      simulate_new_machine
+      FileUtils.rm_rf gem_repo2
+
+      bundle "install --deployment"
+      should_be_installed "rack 1.0.0"
+    end
+
+    it "does not reinstall already-installed gems" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+      bundle :pack
+
+      build_gem "rack", "1.0.0", :path => bundled_app('vendor/cache') do |s|
+        s.write "lib/rack.rb", "raise 'omg'"
+      end
+
+      bundle :install
+      expect(err).to be_empty
+      should_be_installed "rack 1.0"
+    end
+
+    it "ignores cached gems for the wrong platform" do
+      simulate_platform "java" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "platform_specific"
+        G
+        bundle :pack
+      end
+
+      simulate_new_machine
+
+      simulate_platform "ruby" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "platform_specific"
+        G
+        run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
+        expect(out).to eq("1.0.0 RUBY")
+      end
+    end
+
+    it "does not update the cache if --no-cache is passed" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+      bundled_app("vendor/cache").mkpath
+      expect(bundled_app("vendor/cache").children).to be_empty
+
+      bundle "install --no-cache"
+      expect(bundled_app("vendor/cache").children).to be_empty
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/platform_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/platform_spec.rb
new file mode 100644
index 0000000..1138488
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/platform_spec.rb
@@ -0,0 +1,208 @@
+require "spec_helper"
+
+describe "bundle install across platforms" do
+  it "maintains the same lockfile if all gems are compatible across platforms" do
+    lockfile <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (0.9.1)
+
+      PLATFORMS
+        #{not_local}
+
+      DEPENDENCIES
+        rack
+    G
+
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack"
+    G
+
+    should_be_installed "rack 0.9.1"
+  end
+
+  it "pulls in the correct platform specific gem" do
+    lockfile <<-G
+      GEM
+        remote: file:#{gem_repo1}
+        specs:
+          platform_specific (1.0)
+          platform_specific (1.0-java)
+          platform_specific (1.0-x86-mswin32)
+
+      PLATFORMS
+        ruby
+
+      DEPENDENCIES
+        platform_specific
+    G
+
+    simulate_platform "java"
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "platform_specific"
+    G
+
+    should_be_installed "platform_specific 1.0 JAVA"
+  end
+
+  it "works with gems that have different dependencies" do
+    simulate_platform "java"
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "nokogiri"
+    G
+
+    should_be_installed "nokogiri 1.4.2 JAVA", "weakling 0.0.3"
+
+    simulate_new_machine
+
+    simulate_platform "ruby"
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "nokogiri"
+    G
+
+    should_be_installed "nokogiri 1.4.2"
+    should_not_be_installed "weakling"
+  end
+
+  it "works the other way with gems that have different dependencies" do
+    simulate_platform "ruby"
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "nokogiri"
+    G
+
+    simulate_platform "java"
+    bundle "install"
+
+    should_be_installed "nokogiri 1.4.2 JAVA", "weakling 0.0.3"
+  end
+
+  it "fetches gems again after changing the version of Ruby" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack", "1.0.0"
+    G
+
+    bundle "install --path vendor/bundle"
+
+    expect(vendored_gems("gems/rack-1.0.0")).to exist
+  end
+
+  it "works after switching Rubies" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack", "1.0.0"
+    G
+
+    bundle "install --path vendor/bundle"
+
+    new_version = Gem::ConfigMap[:ruby_version] == "1.8" ? "1.9.1" : "1.8"
+    FileUtils.mv(vendored_gems, bundled_app("vendor/bundle", Gem.ruby_engine, new_version))
+
+    bundle "install --path ./vendor/bundle"
+    expect(vendored_gems("gems/rack-1.0.0")).to exist
+  end
+end
+
+describe "bundle install with platform conditionals" do
+  it "installs gems tagged w/ the current platforms" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      platforms :#{local_tag} do
+        gem "nokogiri"
+      end
+    G
+
+    should_be_installed "nokogiri 1.4.2"
+  end
+
+  it "does not install gems tagged w/ another platforms" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+      platforms :#{not_local_tag} do
+        gem "nokogiri"
+      end
+    G
+
+    should_be_installed     "rack 1.0"
+    should_not_be_installed "nokogiri 1.4.2"
+  end
+
+  it "installs gems tagged w/ the current platforms inline" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "nokogiri", :platforms => :#{local_tag}
+    G
+    should_be_installed "nokogiri 1.4.2"
+  end
+
+  it "does not install gems tagged w/ another platforms inline" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+      gem "nokogiri", :platforms => :#{not_local_tag}
+    G
+    should_be_installed     "rack 1.0"
+    should_not_be_installed "nokogiri 1.4.2"
+  end
+
+  it "installs gems tagged w/ the current platform inline" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "nokogiri", :platform => :#{local_tag}
+    G
+    should_be_installed "nokogiri 1.4.2"
+  end
+
+  it "doesn't install gems tagged w/ another platform inline" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "nokogiri", :platform => :#{not_local_tag}
+    G
+    should_not_be_installed "nokogiri 1.4.2"
+  end
+
+  it "does not blow up on sources with all platform-excluded specs" do
+    build_git "foo"
+
+    install_gemfile <<-G
+      platform :#{not_local_tag} do
+        gem "foo", :git => "#{lib_path('foo-1.0')}"
+      end
+    G
+
+    bundle :show, :exitstatus => true
+    expect(exitstatus).to eq(0)
+  end
+
+end
+
+describe "when a gem has an architecture in its platform" do
+  it "still installs correctly" do
+    simulate_platform mswin
+
+    gemfile <<-G
+      # Try to install gem with nil arch
+      source "http://localgemserver.test/"
+      gem "rcov"
+    G
+
+    bundle :install, :fakeweb => "windows"
+    should_be_installed "rcov 1.0.0"
+  end
+end
+
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/post_install_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/post_install_spec.rb
new file mode 100644
index 0000000..f7cad66
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/post_install_spec.rb
@@ -0,0 +1,47 @@
+require 'spec_helper'
+
+describe 'bundle install with gem sources' do
+  describe 'when gems include post install messages' do
+    it "should display the post-install messages after installing" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem 'rack'
+        gem 'thin'
+        gem 'rack-obama'
+      G
+
+      bundle :install
+      expect(out).to include("Post-install message from rack:")
+      expect(out).to include("Rack's post install message")
+      expect(out).to include("Post-install message from thin:")
+      expect(out).to include("Thin's post install message")
+      expect(out).to include("Post-install message from rack-obama:")
+      expect(out).to include("Rack-obama's post install message")
+    end
+  end
+
+  describe 'when gems do not include post install messages' do
+    it "should not display any post-install messages" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "activesupport"
+      G
+
+      bundle :install
+      expect(out).not_to include("Post-install message")
+    end
+  end
+
+  describe "when a dependecy includes a post install message" do
+    it "should display the post install message" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem 'rack_middleware'
+      G
+
+      bundle :install
+      expect(out).to include("Post-install message from rack:")
+      expect(out).to include("Rack's post install message")
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/resolving_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/resolving_spec.rb
new file mode 100644
index 0000000..edf8b32
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/resolving_spec.rb
@@ -0,0 +1,91 @@
+require "spec_helper"
+
+describe "bundle install with gem sources" do
+  describe "install time dependencies" do
+    it "installs gems with implicit rake dependencies" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "with_implicit_rake_dep"
+        gem "another_implicit_rake_dep"
+        gem "rake"
+      G
+
+      run <<-R
+        require 'implicit_rake_dep'
+        require 'another_implicit_rake_dep'
+        puts IMPLICIT_RAKE_DEP
+        puts ANOTHER_IMPLICIT_RAKE_DEP
+      R
+      expect(out).to eq("YES\nYES")
+    end
+
+    it "installs gems with a dependency with no type" do
+      build_repo2
+
+      path = "#{gem_repo2}/#{Gem::MARSHAL_SPEC_DIR}/actionpack-2.3.2.gemspec.rz"
+      spec = Marshal.load(Gem.inflate(File.read(path)))
+      spec.dependencies.each do |d|
+        d.instance_variable_set(:@type, :fail)
+      end
+      File.open(path, 'w') do |f|
+        f.write Gem.deflate(Marshal.dump(spec))
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "actionpack", "2.3.2"
+      G
+
+      should_be_installed "actionpack 2.3.2", "activesupport 2.3.2"
+    end
+
+    describe "with crazy rubygem plugin stuff" do
+      it "installs plugins" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "net_b"
+        G
+
+        should_be_installed "net_b 1.0"
+      end
+
+      it "installs plugins depended on by other plugins" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "net_a"
+        G
+
+        should_be_installed "net_a 1.0", "net_b 1.0"
+      end
+
+      it "installs multiple levels of dependencies" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "net_c"
+          gem "net_e"
+        G
+
+        should_be_installed "net_a 1.0", "net_b 1.0", "net_c 1.0", "net_d 1.0", "net_e 1.0"
+      end
+    end
+
+    describe "when some gems require a different version of ruby" do
+      it "does not try to install those gems" do
+        pending "waiting for a rubygems index that includes ruby version"
+
+        update_repo gem_repo1 do
+          build_gem "require_ruby" do |s|
+            s.required_ruby_version = "> 9000"
+          end
+        end
+
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem 'require_ruby'
+        G
+
+        expect(out).to_not include("Gem::InstallError: require_ruby requires Ruby version > 9000")
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/simple_case_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/simple_case_spec.rb
new file mode 100644
index 0000000..4c38e77
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/simple_case_spec.rb
@@ -0,0 +1,817 @@
+require "spec_helper"
+
+describe "bundle install with gem sources" do
+  describe "the simple case" do
+    it "prints output and returns if no dependencies are specified" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+      G
+
+      bundle :install
+      expect(out).to match(/no dependencies/)
+    end
+
+    it "does not make a lockfile if the install fails" do
+      install_gemfile <<-G, :expect_err => true
+        raise StandardError, "FAIL"
+      G
+
+      expect(err).to match(/FAIL \(StandardError\)/)
+      expect(bundled_app("Gemfile.lock")).not_to exist
+    end
+
+    it "creates a Gemfile.lock" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      expect(bundled_app('Gemfile.lock')).to exist
+    end
+
+    it "creates lock files based on the Gemfile name" do
+      gemfile bundled_app('OmgFile'), <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", "1.0"
+      G
+
+      bundle 'install --gemfile OmgFile'
+
+      expect(bundled_app("OmgFile.lock")).to exist
+    end
+
+    it "doesn't delete the lockfile if one already exists" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem 'rack'
+      G
+
+      lockfile = File.read(bundled_app("Gemfile.lock"))
+
+      install_gemfile <<-G, :expect_err => true
+        raise StandardError, "FAIL"
+      G
+
+      expect(File.read(bundled_app("Gemfile.lock"))).to eq(lockfile)
+    end
+
+    it "does not touch the lockfile if nothing changed" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      expect { run '1' }.not_to change { File.mtime(bundled_app('Gemfile.lock')) }
+    end
+
+    it "fetches gems" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem 'rack'
+      G
+
+      expect(default_bundle_path("gems/rack-1.0.0")).to exist
+      should_be_installed("rack 1.0.0")
+    end
+
+    it "fetches gems when multiple versions are specified" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem 'rack', "> 0.9", "< 1.0"
+      G
+
+      expect(default_bundle_path("gems/rack-0.9.1")).to exist
+      should_be_installed("rack 0.9.1")
+    end
+
+    it "fetches gems when multiple versions are specified take 2" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem 'rack', "< 1.0", "> 0.9"
+      G
+
+      expect(default_bundle_path("gems/rack-0.9.1")).to exist
+      should_be_installed("rack 0.9.1")
+    end
+
+    it "raises an appropriate error when gems are specified using symbols" do
+      status = install_gemfile(<<-G, :exitstatus => true)
+        source "file://#{gem_repo1}"
+        gem :rack
+      G
+      expect(status).to eq(4)
+    end
+
+    it "pulls in dependencies" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rails"
+      G
+
+      should_be_installed "actionpack 2.3.2", "rails 2.3.2"
+    end
+
+    it "does the right version" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", "0.9.1"
+      G
+
+      should_be_installed "rack 0.9.1"
+    end
+
+    it "does not install the development dependency" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "with_development_dependency"
+      G
+
+      should_be_installed "with_development_dependency 1.0.0"
+      should_not_be_installed "activesupport 2.3.5"
+    end
+
+    it "resolves correctly" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "activemerchant"
+        gem "rails"
+      G
+
+      should_be_installed "activemerchant 1.0", "activesupport 2.3.2", "actionpack 2.3.2"
+    end
+
+    it "activates gem correctly according to the resolved gems" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "activesupport", "2.3.5"
+      G
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "activemerchant"
+        gem "rails"
+      G
+
+      should_be_installed "activemerchant 1.0", "activesupport 2.3.2", "actionpack 2.3.2"
+    end
+
+    it "does not reinstall any gem that is already available locally" do
+      system_gems "activesupport-2.3.2"
+
+      build_repo2 do
+        build_gem "activesupport", "2.3.2" do |s|
+          s.write "lib/activesupport.rb", "ACTIVESUPPORT = 'fail'"
+        end
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "activerecord", "2.3.2"
+      G
+
+      should_be_installed "activesupport 2.3.2"
+    end
+
+    it "works when the gemfile specifies gems that only exist in the system" do
+      build_gem "foo", :to_system => true
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "foo"
+      G
+
+      should_be_installed "rack 1.0.0", "foo 1.0.0"
+    end
+
+    it "prioritizes local gems over remote gems" do
+      build_gem 'rack', '1.0.0', :to_system => true do |s|
+        s.add_dependency "activesupport", "2.3.5"
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      should_be_installed "rack 1.0.0", "activesupport 2.3.5"
+    end
+
+    describe "with a gem that installs multiple platforms" do
+      it "installs gems for the local platform as first choice" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "platform_specific"
+        G
+
+        run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
+        expect(out).to eq("1.0.0 #{Gem::Platform.local}")
+      end
+
+      it "falls back on plain ruby" do
+        simulate_platform "foo-bar-baz"
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "platform_specific"
+        G
+
+        run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
+        expect(out).to eq("1.0.0 RUBY")
+      end
+
+      it "installs gems for java" do
+        simulate_platform "java"
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "platform_specific"
+        G
+
+        run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
+        expect(out).to eq("1.0.0 JAVA")
+      end
+
+      it "installs gems for windows" do
+        simulate_platform mswin
+
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "platform_specific"
+        G
+
+        run "require 'platform_specific' ; puts PLATFORM_SPECIFIC"
+        expect(out).to eq("1.0.0 MSWIN")
+      end
+    end
+
+    describe "doing bundle install foo" do
+      before do
+        gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rack"
+        G
+      end
+
+      it "works" do
+        bundle "install --path vendor"
+        should_be_installed "rack 1.0"
+      end
+
+      it "allows running bundle install --system without deleting foo" do
+        bundle "install --path vendor"
+        bundle "install --system"
+        FileUtils.rm_rf(bundled_app("vendor"))
+        should_be_installed "rack 1.0"
+      end
+
+      it "allows running bundle install --system after deleting foo" do
+        bundle "install --path vendor"
+        FileUtils.rm_rf(bundled_app("vendor"))
+        bundle "install --system"
+        should_be_installed "rack 1.0"
+      end
+    end
+
+    it "finds gems in multiple sources" do
+      build_repo2
+      update_repo2
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        source "file://#{gem_repo2}"
+
+        gem "activesupport", "1.2.3"
+        gem "rack", "1.2"
+      G
+
+      should_be_installed "rack 1.2", "activesupport 1.2.3"
+    end
+
+    it "gives a useful error if no sources are set" do
+      install_gemfile <<-G
+        gem "rack"
+      G
+
+      bundle :install, :expect_err => true
+      expect(out).to match(/Your Gemfile has no gem server sources/i)
+    end
+
+    it "creates a Gemfile.lock on a blank Gemfile" do
+      install_gemfile <<-G
+      G
+
+      expect(File.exists?(bundled_app("Gemfile.lock"))).to be_true
+    end
+
+    it "gracefully handles error when rubygems server is unavailable" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        source "http://localhost:9384"
+
+        gem 'foo'
+      G
+
+      bundle :install
+      expect(out).to include("Could not fetch specs from http://localhost:9384/")
+      expect(out).not_to include("file://")
+    end
+
+    it "doesn't blow up when the local .bundle/config is empty" do
+      FileUtils.mkdir_p(bundled_app(".bundle"))
+      FileUtils.touch(bundled_app(".bundle/config"))
+
+      install_gemfile(<<-G, :exitstatus => true)
+        source "file://#{gem_repo1}"
+
+        gem 'foo'
+      G
+      expect(exitstatus).to eq(0)
+    end
+
+    it "doesn't blow up when the global .bundle/config is empty" do
+      FileUtils.mkdir_p("#{Bundler.rubygems.user_home}/.bundle")
+      FileUtils.touch("#{Bundler.rubygems.user_home}/.bundle/config")
+
+      install_gemfile(<<-G, :exitstatus => true)
+        source "file://#{gem_repo1}"
+
+        gem 'foo'
+      G
+      expect(exitstatus).to eq(0)
+    end
+  end
+
+  describe "when Bundler root contains regex chars" do
+    before do
+      root_dir = tmp("foo[]bar")
+
+      FileUtils.mkdir_p(root_dir)
+      in_app_root_custom(root_dir)
+    end
+
+    it "doesn't blow up" do
+      build_lib "foo"
+      gemfile = <<-G
+        gem 'foo', :path => "#{lib_path('foo-1.0')}"
+      G
+      File.open('Gemfile', 'w') do |file|
+        file.puts gemfile
+      end
+
+      bundle :install, :exitstatus => true
+
+      expect(exitstatus).to eq(0)
+    end
+  end
+
+  describe "when prerelease gems are available" do
+    it "finds prereleases" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "not_released"
+      G
+      should_be_installed "not_released 1.0.pre"
+    end
+
+    it "uses regular releases if available" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "has_prerelease"
+      G
+      should_be_installed "has_prerelease 1.0"
+    end
+
+    it "uses prereleases if requested" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "has_prerelease", "1.1.pre"
+      G
+      should_be_installed "has_prerelease 1.1.pre"
+    end
+  end
+
+  describe "when prerelease gems are not available" do
+    it "still works" do
+      build_repo3
+      install_gemfile <<-G
+        source "file://#{gem_repo3}"
+        gem "rack"
+      G
+
+      should_be_installed "rack 1.0"
+    end
+  end
+
+  describe "when BUNDLE_PATH or the global path config is set" do
+    before :each do
+      build_lib "rack", "1.0.0", :to_system => true do |s|
+        s.write "lib/rack.rb", "raise 'FAIL'"
+      end
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+    end
+
+    def set_bundle_path(type, location)
+      if type == :env
+        ENV["BUNDLE_PATH"] = location
+      elsif type == :global
+        bundle "config path #{location}", "no-color" => nil
+      end
+    end
+
+    [:env, :global].each do |type|
+      it "installs gems to a path if one is specified" do
+        set_bundle_path(type, bundled_app("vendor2").to_s)
+        bundle "install --path vendor/bundle"
+
+        expect(vendored_gems("gems/rack-1.0.0")).to be_directory
+        expect(bundled_app("vendor2")).not_to be_directory
+        should_be_installed "rack 1.0.0"
+      end
+
+      it "installs gems to BUNDLE_PATH with #{type}" do
+        set_bundle_path(type, bundled_app("vendor").to_s)
+
+        bundle :install
+
+        expect(bundled_app('vendor/gems/rack-1.0.0')).to be_directory
+        should_be_installed "rack 1.0.0"
+      end
+
+      it "installs gems to BUNDLE_PATH relative to root when relative" do
+        set_bundle_path(type, "vendor")
+
+        FileUtils.mkdir_p bundled_app('lol')
+        Dir.chdir(bundled_app('lol')) do
+          bundle :install
+        end
+
+        expect(bundled_app('vendor/gems/rack-1.0.0')).to be_directory
+        should_be_installed "rack 1.0.0"
+      end
+    end
+
+    it "installs gems to BUNDLE_PATH from .bundle/config" do
+      config "BUNDLE_PATH" => bundled_app("vendor/bundle").to_s
+
+      bundle :install
+
+      expect(vendored_gems('gems/rack-1.0.0')).to be_directory
+      should_be_installed "rack 1.0.0"
+    end
+
+    it "sets BUNDLE_PATH as the first argument to bundle install" do
+      bundle "install --path ./vendor/bundle"
+
+      expect(vendored_gems('gems/rack-1.0.0')).to be_directory
+      should_be_installed "rack 1.0.0"
+    end
+
+    it "disables system gems when passing a path to install" do
+      # This is so that vendored gems can be distributed to others
+      build_gem "rack", "1.1.0", :to_system => true
+      bundle "install --path ./vendor/bundle"
+
+      expect(vendored_gems('gems/rack-1.0.0')).to be_directory
+      should_be_installed "rack 1.0.0"
+    end
+  end
+
+  describe "when passing in a Gemfile via --gemfile" do
+    it "finds the gemfile" do
+      gemfile bundled_app("NotGemfile"), <<-G
+        source "file://#{gem_repo1}"
+        gem 'rack'
+      G
+
+      bundle :install, :gemfile => bundled_app("NotGemfile")
+
+      ENV['BUNDLE_GEMFILE'] = "NotGemfile"
+      should_be_installed "rack 1.0.0"
+    end
+  end
+
+  describe "when requesting a quiet install via --quiet" do
+    it "should be quiet if there are no warnings" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem 'rack'
+      G
+
+      bundle :install, :quiet => true
+      expect(out).to eq("")
+    end
+
+    it "should still display warnings" do
+      gemfile <<-G
+        gem 'rack'
+      G
+
+      bundle :install, :quiet => true
+      expect(out).to match(/Your Gemfile has no gem server sources/)
+    end
+  end
+
+  describe "when disabling system gems" do
+    before :each do
+      build_gem "rack", "1.0.0", :to_system => true do |s|
+        s.write "lib/rack.rb", "puts 'FAIL'"
+      end
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+    end
+
+    it "behaves like bundle install vendor/bundle with --deployment" do
+      bundle "install"
+      bundle "install --deployment"
+      expect(out).to include("It was installed into ./vendor/bundle")
+      should_be_installed "rack 1.0.0"
+      expect(bundled_app("vendor/bundle")).to exist
+    end
+
+    it "does not use available system gems with bundle --path vendor/bundle" do
+      bundle "install --path vendor/bundle"
+      should_be_installed "rack 1.0.0"
+    end
+
+    it "handles paths with regex characters in them" do
+      dir = bundled_app("bun++dle")
+      dir.mkpath
+
+      Dir.chdir(dir) do
+        bundle "install --path vendor/bundle"
+        expect(out).to include("installed into ./vendor/bundle")
+      end
+
+      dir.rmtree
+    end
+
+    it "prints a warning to let the user know what has happened with bundle --path vendor/bundle" do
+      bundle "install --path vendor/bundle"
+      expect(out).to include("It was installed into ./vendor")
+    end
+
+    it "disallows --path vendor/bundle --system" do
+      bundle "install --path vendor/bundle --system"
+      expect(out).to include("Please choose.")
+    end
+
+    it "remembers to disable system gems after the first time with bundle --path vendor/bundle" do
+      bundle "install --path vendor/bundle"
+      FileUtils.rm_rf bundled_app('vendor')
+      bundle "install"
+
+      expect(vendored_gems('gems/rack-1.0.0')).to be_directory
+      should_be_installed "rack 1.0.0"
+    end
+  end
+
+  describe "when loading only the default group" do
+    it "should not load all groups" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "activesupport", :groups => :development
+      G
+
+      ruby <<-R
+        require "bundler"
+        Bundler.setup :default
+        Bundler.require :default
+        puts RACK
+        begin
+          require "activesupport"
+        rescue LoadError
+          puts "no activesupport"
+        end
+      R
+
+      expect(out).to include("1.0")
+      expect(out).to include("no activesupport")
+    end
+  end
+
+  describe "when a gem has a YAML gemspec" do
+    before :each do
+      build_repo2 do
+        build_gem "yaml_spec", :gemspec => :yaml
+      end
+    end
+
+    it "still installs correctly" do
+      gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "yaml_spec"
+      G
+      bundle :install
+      expect(err).to be_empty
+    end
+
+    it "still installs correctly when using path" do
+      build_lib 'yaml_spec', :gemspec => :yaml
+
+      install_gemfile <<-G
+        gem 'yaml_spec', :path => "#{lib_path('yaml_spec-1.0')}"
+      G
+      expect(err).to eq("")
+    end
+  end
+
+  describe "bundler dependencies" do
+    before(:each) do
+      build_repo2 do
+        build_gem "rails", "3.0" do |s|
+          s.add_dependency "bundler", ">= 0.9.0.pre"
+        end
+        build_gem "bundler", "0.9.1"
+        build_gem "bundler", Bundler::VERSION
+      end
+    end
+
+    it "are forced to the current bundler version" do
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rails", "3.0"
+      G
+
+      should_be_installed "bundler #{Bundler::VERSION}"
+    end
+
+    it "are not added if not already present" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+      should_not_be_installed "bundler #{Bundler::VERSION}"
+    end
+
+    it "causes a conflict if explicitly requesting a different version" do
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rails", "3.0"
+        gem "bundler", "0.9.2"
+      G
+
+      nice_error = <<-E.strip.gsub(/^ {8}/, '')
+        Fetching source index from file:#{gem_repo2}/
+        Resolving dependencies...
+        Bundler could not find compatible versions for gem "bundler":
+          In Gemfile:
+            bundler (= 0.9.2) ruby
+
+          Current Bundler version:
+            bundler (#{Bundler::VERSION})
+        E
+      expect(out).to include(nice_error)
+    end
+
+    it "works for gems with multiple versions in its dependencies" do
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+
+        gem "multiple_versioned_deps"
+      G
+
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+
+        gem "multiple_versioned_deps"
+        gem "rack"
+      G
+
+      should_be_installed "multiple_versioned_deps 1.0.0"
+    end
+
+    it "includes bundler in the bundle when it's a child dependency" do
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rails", "3.0"
+      G
+
+      run "begin; gem 'bundler'; puts 'WIN'; rescue Gem::LoadError; puts 'FAIL'; end"
+      expect(out).to eq("WIN")
+    end
+
+    it "allows gem 'bundler' when Bundler is not in the Gemfile or its dependencies" do
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rack"
+      G
+
+      run "begin; gem 'bundler'; puts 'WIN'; rescue Gem::LoadError => e; puts e.backtrace; end"
+      expect(out).to eq("WIN")
+    end
+
+    it "causes a conflict if child dependencies conflict" do
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "activemerchant"
+        gem "rails_fail"
+      G
+
+      nice_error = <<-E.strip.gsub(/^ {8}/, '')
+        Fetching source index from file:#{gem_repo2}/
+        Resolving dependencies...
+        Bundler could not find compatible versions for gem "activesupport":
+          In Gemfile:
+            activemerchant (>= 0) ruby depends on
+              activesupport (>= 2.0.0) ruby
+
+            rails_fail (>= 0) ruby depends on
+              activesupport (1.2.3)
+      E
+      expect(out).to eq(nice_error)
+    end
+
+    it "causes a conflict if a child dependency conflicts with the Gemfile" do
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rails_fail"
+        gem "activesupport", "2.3.5"
+      G
+
+      nice_error = <<-E.strip.gsub(/^ {8}/, '')
+        Fetching source index from file:#{gem_repo2}/
+        Resolving dependencies...
+        Bundler could not find compatible versions for gem "activesupport":
+          In Gemfile:
+            rails_fail (>= 0) ruby depends on
+              activesupport (= 1.2.3) ruby
+
+            activesupport (2.3.5)
+      E
+      expect(out).to eq(nice_error)
+    end
+
+    it "can install dependencies even if " do
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rails", "3.0"
+      G
+
+      simulate_bundler_version "10.0.0"
+      #simulate_new_machine
+
+      bundle "check"
+      expect(out).to eq("The Gemfile's dependencies are satisfied")
+    end
+  end
+
+  describe "when locked and installed with --without" do
+    before(:each) do
+      build_repo2
+      system_gems "rack-0.9.1" do
+        install_gemfile <<-G, :without => :rack
+          source "file://#{gem_repo2}"
+          gem "rack"
+
+          group :rack do
+            gem "rack_middleware"
+          end
+        G
+      end
+    end
+
+    it "uses the correct versions even if --without was used on the original" do
+      should_be_installed "rack 0.9.1"
+      should_not_be_installed "rack_middleware 1.0"
+      simulate_new_machine
+
+      bundle :install
+
+      should_be_installed "rack 0.9.1"
+      should_be_installed "rack_middleware 1.0"
+    end
+
+    it "does not hit the remote a second time" do
+      FileUtils.rm_rf gem_repo2
+      bundle "install --without rack"
+      expect(err).to be_empty
+    end
+  end
+
+  describe "when system_bindir is set" do
+    # On OS X, Gem.bindir defaults to /usr/bin, so system_bindir is useful if
+    # you want to avoid sudo installs for system gems with OS X's default ruby
+    it "overrides Gem.bindir" do
+      expect(Pathname.new("/usr/bin")).not_to be_writable unless Process::euid == 0
+      gemfile <<-G
+        require 'rubygems'
+        def Gem.bindir; "/usr/bin"; end
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      config "BUNDLE_SYSTEM_BINDIR" => system_gem_path('altbin').to_s
+      bundle :install
+      should_be_installed "rack 1.0.0"
+      expect(system_gem_path("altbin/rackup")).to exist
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/standalone_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/standalone_spec.rb
new file mode 100644
index 0000000..c666120
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/standalone_spec.rb
@@ -0,0 +1,260 @@
+require "spec_helper"
+
+describe "bundle install --standalone" do
+  describe "with simple gems" do
+    before do
+      install_gemfile <<-G, :standalone => true
+        source "file://#{gem_repo1}"
+        gem "rails"
+      G
+    end
+
+    it "still makes the gems available to normal bundler" do
+      should_be_installed "actionpack 2.3.2", "rails 2.3.2"
+    end
+
+    it "generates a bundle/bundler/setup.rb" do
+      expect(bundled_app("bundle/bundler/setup.rb")).to exist
+    end
+
+    it "makes the gems available without bundler" do
+      ruby <<-RUBY, :no_lib => true
+        $:.unshift File.expand_path("bundle")
+        require "bundler/setup"
+
+        require "actionpack"
+        puts ACTIONPACK
+      RUBY
+
+      expect(out).to eq("2.3.2")
+    end
+
+    it "works on a different system" do
+      FileUtils.mv(bundled_app, "#{bundled_app}2")
+      Dir.chdir("#{bundled_app}2")
+
+      ruby <<-RUBY, :no_lib => true
+        $:.unshift File.expand_path("bundle")
+        require "bundler/setup"
+
+        require "actionpack"
+        puts ACTIONPACK
+      RUBY
+
+      expect(out).to eq("2.3.2")
+    end
+  end
+
+  describe "with a combination of gems and git repos" do
+    before do
+      build_git "devise", "1.0"
+
+      install_gemfile <<-G, :standalone => true
+        source "file://#{gem_repo1}"
+        gem "rails"
+        gem "devise", :git => "#{lib_path('devise-1.0')}"
+      G
+    end
+
+    it "still makes the gems available to normal bundler" do
+      should_be_installed "actionpack 2.3.2", "rails 2.3.2", "devise 1.0"
+    end
+
+    it "generates a bundle/bundler/setup.rb" do
+      expect(bundled_app("bundle/bundler/setup.rb")).to exist
+    end
+
+    it "makes the gems available without bundler" do
+      ruby <<-RUBY, :no_lib => true
+        $:.unshift File.expand_path("bundle")
+        require "bundler/setup"
+
+        require "devise"
+        require "actionpack"
+        puts DEVISE
+        puts ACTIONPACK
+      RUBY
+
+      expect(out).to eq("1.0\n2.3.2")
+    end
+  end
+
+  describe "with groups" do
+    before do
+      build_git "devise", "1.0"
+
+      install_gemfile <<-G, :standalone => true
+        source "file://#{gem_repo1}"
+        gem "rails"
+
+        group :test do
+          gem "rspec"
+          gem "rack-test"
+        end
+      G
+    end
+
+    it "makes the gems available without bundler" do
+      ruby <<-RUBY, :no_lib => true
+        $:.unshift File.expand_path("bundle")
+        require "bundler/setup"
+
+        require "actionpack"
+        require "spec"
+        require "rack/test"
+        puts ACTIONPACK
+        puts SPEC
+        puts RACK_TEST
+      RUBY
+
+      expect(out).to eq("2.3.2\n1.2.7\n1.0")
+    end
+
+    it "allows creating a standalone file with limited groups" do
+      bundle "install --standalone default"
+
+      load_error_ruby <<-RUBY, 'spec', :no_lib => true
+        $:.unshift File.expand_path("bundle")
+        require "bundler/setup"
+
+        require "actionpack"
+        puts ACTIONPACK
+        require "spec"
+      RUBY
+
+      expect(out).to eq("2.3.2")
+      expect(err).to eq("ZOMG LOAD ERROR")
+    end
+
+    it "allows --without to limit the groups used in a standalone" do
+      bundle "install --standalone --without test"
+
+      load_error_ruby <<-RUBY, 'spec', :no_lib => true
+        $:.unshift File.expand_path("bundle")
+        require "bundler/setup"
+
+        require "actionpack"
+        puts ACTIONPACK
+        require "spec"
+      RUBY
+
+      expect(out).to eq("2.3.2")
+      expect(err).to eq("ZOMG LOAD ERROR")
+    end
+
+    it "allows --path to change the location of the standalone bundle" do
+      bundle "install --standalone --path path/to/bundle"
+
+      ruby <<-RUBY, :no_lib => true, :expect_err => false
+        $:.unshift File.expand_path("path/to/bundle")
+        require "bundler/setup"
+
+        require "actionpack"
+        puts ACTIONPACK
+      RUBY
+
+      expect(out).to eq("2.3.2")
+    end
+
+    it "allows remembered --without to limit the groups used in a standalone" do
+      bundle "install --without test"
+      bundle "install --standalone"
+
+      load_error_ruby <<-RUBY, 'spec', :no_lib => true
+        $:.unshift File.expand_path("bundle")
+        require "bundler/setup"
+
+        require "actionpack"
+        puts ACTIONPACK
+        require "spec"
+      RUBY
+
+      expect(out).to eq("2.3.2")
+      expect(err).to eq("ZOMG LOAD ERROR")
+    end
+  end
+
+  describe "with gemcutter's dependency API" do
+    let(:source_uri) { "http://localgemserver.test" }
+
+    describe "simple gems" do
+      before do
+        gemfile <<-G
+          source "#{source_uri}"
+          gem "rails"
+        G
+      end
+
+      it "should run without errors" do
+        bundle "install --standalone", :artifice => "endpoint", :exitstatus => true
+
+        expect(@exitstatus).to eq(0)
+      end
+
+      it "still makes the gems available to normal bundler" do
+        bundle "install --standalone", :artifice => "endpoint"
+
+        should_be_installed "actionpack 2.3.2", "rails 2.3.2"
+      end
+
+      it "generates a bundle/bundler/setup.rb" do
+        bundle "install --standalone", :artifice => "endpoint"
+
+        expect(bundled_app("bundle/bundler/setup.rb")).to exist
+      end
+
+      it "makes the gems available without bundler" do
+        bundle "install --standalone", :artifice => "endpoint"
+
+        ruby <<-RUBY, :no_lib => true
+          $:.unshift File.expand_path("bundle")
+          require "bundler/setup"
+
+          require "actionpack"
+          puts ACTIONPACK
+        RUBY
+
+        expect(out).to eq("2.3.2")
+      end
+
+      it "works on a different system" do
+        bundle "install --standalone", :artifice => "endpoint"
+
+        FileUtils.mv(bundled_app, "#{bundled_app}2")
+        Dir.chdir("#{bundled_app}2")
+
+        ruby <<-RUBY, :no_lib => true
+          $:.unshift File.expand_path("bundle")
+          require "bundler/setup"
+
+          require "actionpack"
+          puts ACTIONPACK
+        RUBY
+
+        expect(out).to eq("2.3.2")
+      end
+    end
+  end
+
+  describe "with --binstubs" do
+    before do
+      install_gemfile <<-G, :standalone => true, :binstubs => true
+        source "file://#{gem_repo1}"
+        gem "rails"
+      G
+    end
+
+    it "creates stubs that use the standalone load path" do
+      Dir.chdir(bundled_app) do
+        expect(`bin/rails -v`.chomp).to eql "2.3.2"
+      end
+    end
+
+    it "creates stubs that can be executed from anywhere" do
+      require 'tmpdir'
+      Dir.chdir(Dir.tmpdir) do
+        expect(`#{bundled_app}/bin/rails -v`.chomp).to eql "2.3.2"
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/sudo_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/sudo_spec.rb
new file mode 100644
index 0000000..7ff564c
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/sudo_spec.rb
@@ -0,0 +1,102 @@
+require "spec_helper"
+
+describe "when using sudo", :sudo => true do
+  describe "and BUNDLE_PATH is writable" do
+    context "but BUNDLE_PATH/build_info is not writable" do
+      before do
+        subdir = system_gem_path('cache')
+        subdir.mkpath
+        sudo "chmod u-w #{subdir}"
+      end
+
+      it "installs" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rack"
+        G
+
+        expect(out).to_not match(/an error occurred/i)
+        expect(system_gem_path("cache/rack-1.0.0.gem")).to exist
+        should_be_installed "rack 1.0"
+      end
+    end
+  end
+
+  describe "and GEM_HOME is owned by root" do
+    before :each do
+      chown_system_gems_to_root
+    end
+
+    it "installs" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", '1.0'
+        gem "thin"
+      G
+
+      expect(system_gem_path("gems/rack-1.0.0")).to exist
+      expect(system_gem_path("gems/rack-1.0.0").stat.uid).to eq(0)
+      should_be_installed "rack 1.0"
+    end
+
+    it "installs rake and a gem dependent on rake in the same session" do
+        gemfile <<-G
+            source "file://#{gem_repo1}"
+            gem "rake"
+            gem "another_implicit_rake_dep"
+          G
+         bundle "install"
+         expect(system_gem_path("gems/another_implicit_rake_dep-1.0")).to exist
+    end
+
+
+    it "installs when BUNDLE_PATH is owned by root" do
+      bundle_path = tmp("owned_by_root")
+      FileUtils.mkdir_p bundle_path
+      sudo "chown -R root #{bundle_path}"
+
+      ENV['BUNDLE_PATH'] = bundle_path.to_s
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", '1.0'
+      G
+
+      expect(bundle_path.join("gems/rack-1.0.0")).to exist
+      expect(bundle_path.join("gems/rack-1.0.0").stat.uid).to eq(0)
+      should_be_installed "rack 1.0"
+    end
+
+    it "installs when BUNDLE_PATH does not exist"
+  end
+
+  describe "and BUNDLE_PATH is not writable" do
+    it "installs" do
+      sudo "chmod ugo-w #{default_bundle_path}"
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", '1.0'
+      G
+
+      expect(default_bundle_path("gems/rack-1.0.0")).to exist
+      should_be_installed "rack 1.0"
+    end
+  end
+
+  describe "and GEM_HOME is not writable" do
+    it "installs" do
+      gem_home = tmp('sudo_gem_home')
+      sudo "mkdir -p #{gem_home}"
+      sudo "chmod ugo-w #{gem_home}"
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", '1.0'
+      G
+
+      bundle :install, :env => {'GEM_HOME' => gem_home.to_s, 'GEM_PATH' => nil}
+      expect(gem_home.join('bin/rackup')).to exist
+      should_be_installed "rack 1.0", :env => {'GEM_HOME' => gem_home.to_s, 'GEM_PATH' => nil}
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gems/win32_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gems/win32_spec.rb
new file mode 100644
index 0000000..771d3fa
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gems/win32_spec.rb
@@ -0,0 +1,26 @@
+require 'spec_helper'
+
+describe "bundle install with win32-generated lockfile" do
+  it 'should read lockfile' do
+    File.open(bundled_app('Gemfile.lock'), 'wb') do |f|
+      f << "GEM\r\n"
+      f << "  remote: file:#{gem_repo1}/\r\n"
+      f << "  specs:\r\n"
+      f << "\r\n"
+      f << "    rack (1.0.0)\r\n"
+      f << "\r\n"
+      f << "PLATFORMS\r\n"
+      f << "  ruby\r\n"
+      f << "\r\n"
+      f << "DEPENDENCIES\r\n"
+      f << "  rack\r\n"
+    end
+
+    install_gemfile <<-G, :exitstatus => true
+      source "file://#{gem_repo1}"
+
+      gem "rack"
+    G
+    expect(@exitstatus).to eq(0)
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/gemspec_spec.rb b/misc/lib/bundler-1.3.5/spec/install/gemspec_spec.rb
new file mode 100644
index 0000000..7746e45
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/gemspec_spec.rb
@@ -0,0 +1,170 @@
+require "spec_helper"
+
+describe "bundle install from an existing gemspec" do
+
+  before(:each) do
+    build_gem "bar", :to_system => true
+    build_gem "bar-dev", :to_system => true
+  end
+
+  it "should install runtime and development dependencies" do
+    build_lib("foo", :path => tmp.join("foo")) do |s|
+      s.write("Gemfile", "source :rubygems\ngemspec")
+      s.add_dependency "bar", "=1.0.0"
+      s.add_development_dependency "bar-dev", '=1.0.0'
+    end
+    install_gemfile <<-G
+      source "file://#{gem_repo2}"
+      gemspec :path => '#{tmp.join("foo")}'
+    G
+
+    should_be_installed "bar 1.0.0"
+    should_be_installed "bar-dev 1.0.0", :groups => :development
+  end
+
+  it "that is hidden should install runtime and development dependencies" do
+    build_lib("foo", :path => tmp.join("foo")) do |s|
+      s.write("Gemfile", "source :rubygems\ngemspec")
+      s.add_dependency "bar", "=1.0.0"
+      s.add_development_dependency "bar-dev", '=1.0.0'
+    end
+    FileUtils.mv tmp.join('foo', 'foo.gemspec'), tmp.join('foo', '.gemspec')
+
+    install_gemfile <<-G
+      source "file://#{gem_repo2}"
+      gemspec :path => '#{tmp.join("foo")}'
+    G
+
+    should_be_installed "bar 1.0.0"
+    should_be_installed "bar-dev 1.0.0", :groups => :development
+  end
+
+  it "should handle a list of requirements" do
+    build_gem "baz", "1.0", :to_system => true
+    build_gem "baz", "1.1", :to_system => true
+
+    build_lib("foo", :path => tmp.join("foo")) do |s|
+      s.write("Gemfile", "source :rubygems\ngemspec")
+      s.add_dependency "baz", ">= 1.0", "< 1.1"
+    end
+    install_gemfile <<-G
+      source "file://#{gem_repo2}"
+      gemspec :path => '#{tmp.join("foo")}'
+    G
+
+    should_be_installed "baz 1.0"
+  end
+
+  it "should raise if there are no gemspecs available" do
+    build_lib("foo", :path => tmp.join("foo"), :gemspec => false)
+
+    error = install_gemfile(<<-G, :expect_err => true)
+      source "file://#{gem_repo2}"
+      gemspec :path => '#{tmp.join("foo")}'
+    G
+    expect(error).to match(/There are no gemspecs at #{tmp.join('foo')}/)
+  end
+
+  it "should raise if there are too many gemspecs available" do
+    build_lib("foo", :path => tmp.join("foo")) do |s|
+      s.write("foo2.gemspec", "")
+    end
+
+    error = install_gemfile(<<-G, :expect_err => true)
+      source "file://#{gem_repo2}"
+      gemspec :path => '#{tmp.join("foo")}'
+    G
+    expect(error).to match(/There are multiple gemspecs at #{tmp.join('foo')}/)
+  end
+
+  it "should pick a specific gemspec" do
+    build_lib("foo", :path => tmp.join("foo")) do |s|
+      s.write("foo2.gemspec", "")
+      s.add_dependency "bar", "=1.0.0"
+      s.add_development_dependency "bar-dev", '=1.0.0'
+    end
+
+    install_gemfile(<<-G, :expect_err => true)
+      source "file://#{gem_repo2}"
+      gemspec :path => '#{tmp.join("foo")}', :name => 'foo'
+    G
+
+    should_be_installed "bar 1.0.0"
+    should_be_installed "bar-dev 1.0.0", :groups => :development
+  end
+
+  it "should use a specific group for development dependencies" do
+    build_lib("foo", :path => tmp.join("foo")) do |s|
+      s.write("foo2.gemspec", "")
+      s.add_dependency "bar", "=1.0.0"
+      s.add_development_dependency "bar-dev", '=1.0.0'
+    end
+
+    install_gemfile(<<-G, :expect_err => true)
+      source "file://#{gem_repo2}"
+      gemspec :path => '#{tmp.join("foo")}', :name => 'foo', :development_group => :dev
+    G
+
+    should_be_installed "bar 1.0.0"
+    should_not_be_installed "bar-dev 1.0.0", :groups => :development
+    should_be_installed "bar-dev 1.0.0", :groups => :dev
+  end
+
+  it "should match a lockfile even if the gemspec defines development dependencies" do
+    build_lib("foo", :path => tmp.join("foo")) do |s|
+      s.write("Gemfile", "source 'file://#{gem_repo1}'\ngemspec")
+      s.add_dependency "actionpack", "=2.3.2"
+      s.add_development_dependency "rake", '=10.0.2'
+    end
+
+    Dir.chdir(tmp.join("foo")) do
+      bundle "install"
+      # This should really be able to rely on $stderr, but, it's not written
+      # right, so we can't. In fact, this is a bug negation test, and so it'll
+      # ghost pass in future, and will only catch a regression if the message
+      # doesn't change. Exit codes should be used correctly (they can be more
+      # than just 0 and 1).
+      output = bundle("install --deployment")
+      expect(output).not_to match(/You have added to the Gemfile/)
+      expect(output).not_to match(/You have deleted from the Gemfile/)
+      expect(output).not_to match(/install in deployment mode after changing/)
+    end
+  end
+
+  it "should evaluate the gemspec in its directory" do
+    build_lib("foo", :path => tmp.join("foo"))
+    File.open(tmp.join("foo/foo.gemspec"), "w") do |s|
+      s.write "raise 'ahh' unless Dir.pwd == '#{tmp.join("foo")}'"
+    end
+
+    install_gemfile <<-G, :expect_err => true
+      gemspec :path => '#{tmp.join("foo")}'
+    G
+    expect(@err).not_to match(/ahh/)
+  end
+
+  context "when child gemspecs conflict with a released gemspec" do
+    before do
+      # build the "parent" gem that depends on another gem in the same repo
+      build_lib "source_conflict", :path => bundled_app do |s|
+        s.add_dependency "rack_middleware"
+      end
+
+      # build the "child" gem that is the same version as a released gem, but
+      # has completely different and conflicting dependency requirements
+      build_lib "rack_middleware", "1.0", :path => bundled_app("rack_middleware") do |s|
+        s.add_dependency "rack", "1.0" # anything other than 0.9.1
+      end
+    end
+
+    it "should install the child gemspec's deps" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gemspec
+      G
+
+      should_be_installed "rack 1.0"
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/git_spec.rb b/misc/lib/bundler-1.3.5/spec/install/git_spec.rb
new file mode 100644
index 0000000..f970504
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/git_spec.rb
@@ -0,0 +1,858 @@
+require "spec_helper"
+
+describe "bundle install with git sources" do
+  describe "when floating on master" do
+    before :each do
+      build_git "foo" do |s|
+        s.executables = "foobar"
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        git "#{lib_path('foo-1.0')}" do
+          gem 'foo'
+        end
+      G
+    end
+
+    it "fetches gems" do
+      should_be_installed("foo 1.0")
+
+      run <<-RUBY
+        require 'foo'
+        puts "WIN" unless defined?(FOO_PREV_REF)
+      RUBY
+
+      expect(out).to eq("WIN")
+    end
+
+    it "caches the git repo" do
+      expect(Dir["#{default_bundle_path}/cache/bundler/git/foo-1.0-*"]).to have(1).item
+    end
+
+    it "caches the evaluated gemspec" do
+      git = update_git "foo" do |s|
+        s.executables = ["foobar"] # we added this the first time, so keep it now
+        s.files = ["bin/foobar"] # updating git nukes the files list
+        foospec = s.to_ruby.gsub(/s\.files.*/, 's.files = `git ls-files`.split("\n")')
+        s.write "foo.gemspec", foospec
+      end
+
+      bundle "update foo"
+
+      sha = git.ref_for("master", 11)
+      spec_file = default_bundle_path.join("bundler/gems/foo-1.0-#{sha}/foo.gemspec").to_s
+      ruby_code = Gem::Specification.load(spec_file).to_ruby
+      file_code = File.read(spec_file)
+      expect(file_code).to eq(ruby_code)
+    end
+
+    it "does not update the git source implicitly" do
+      update_git "foo"
+
+      in_app_root2 do
+        install_gemfile bundled_app2("Gemfile"), <<-G
+          git "#{lib_path('foo-1.0')}" do
+            gem 'foo'
+          end
+        G
+      end
+
+      in_app_root do
+        run <<-RUBY
+          require 'foo'
+          puts "fail" if defined?(FOO_PREV_REF)
+        RUBY
+
+        expect(out).to be_empty
+      end
+    end
+
+    it "sets up git gem executables on the path" do
+      pending_jruby_shebang_fix
+      bundle "exec foobar"
+      expect(out).to eq("1.0")
+    end
+
+    it "complains if pinned specs don't exist in the git repo" do
+      build_git "foo"
+
+      install_gemfile <<-G
+        gem "foo", "1.1", :git => "#{lib_path('foo-1.0')}"
+      G
+
+      expect(out).to include("Source contains 'foo' at: 1.0")
+    end
+
+    it "still works after moving the application directory" do
+      bundle "install --path vendor/bundle"
+      FileUtils.mv bundled_app, tmp('bundled_app.bck')
+
+      Dir.chdir tmp('bundled_app.bck')
+      should_be_installed "foo 1.0"
+    end
+
+    it "can still install after moving the application directory" do
+      bundle "install --path vendor/bundle"
+      FileUtils.mv bundled_app, tmp('bundled_app.bck')
+
+      update_git "foo", "1.1", :path => lib_path("foo-1.0")
+
+      Dir.chdir tmp('bundled_app.bck')
+      gemfile tmp('bundled_app.bck/Gemfile'), <<-G
+        source "file://#{gem_repo1}"
+        git "#{lib_path('foo-1.0')}" do
+          gem 'foo'
+        end
+
+        gem "rack", "1.0"
+      G
+
+      bundle "update foo"
+
+      should_be_installed "foo 1.1", "rack 1.0"
+    end
+
+  end
+
+  describe "with an empty git block" do
+    before do
+      build_git "foo"
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+
+        git "#{lib_path("foo-1.0")}" do
+          # this page left intentionally blank
+        end
+      G
+    end
+
+    it "does not explode" do
+      bundle "install"
+      should_be_installed "rack 1.0"
+    end
+  end
+
+  describe "when specifying a revision" do
+    before(:each) do
+      build_git "foo"
+      @revision = revision_for(lib_path("foo-1.0"))
+      update_git "foo"
+    end
+
+    it "works" do
+      install_gemfile <<-G
+        git "#{lib_path('foo-1.0')}", :ref => "#{@revision}" do
+          gem "foo"
+        end
+      G
+
+      run <<-RUBY
+        require 'foo'
+        puts "WIN" unless defined?(FOO_PREV_REF)
+      RUBY
+
+      expect(out).to eq("WIN")
+    end
+
+    it "works when the revision is a symbol" do
+      install_gemfile <<-G
+        git "#{lib_path('foo-1.0')}", :ref => #{@revision.to_sym.inspect} do
+          gem "foo"
+        end
+      G
+      expect(err).to eq("")
+
+      run <<-RUBY
+        require 'foo'
+        puts "WIN" unless defined?(FOO_PREV_REF)
+      RUBY
+
+      expect(out).to eq("WIN")
+    end
+  end
+
+  describe "when specifying local override" do
+    it "uses the local repository instead of checking a new one out" do
+      # We don't generate it because we actually don't need it
+      # build_git "rack", "0.8"
+
+      build_git "rack", "0.8", :path => lib_path('local-rack') do |s|
+        s.write "lib/rack.rb", "puts :LOCAL"
+      end
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :branch => "master"
+      G
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      bundle :install
+      expect(out).to match(/at #{lib_path('local-rack')}/)
+
+      run "require 'rack'"
+      expect(out).to eq("LOCAL")
+    end
+
+    it "chooses the local repository on runtime" do
+      build_git "rack", "0.8"
+
+      FileUtils.cp_r("#{lib_path('rack-0.8')}/.", lib_path('local-rack'))
+
+      update_git "rack", "0.8", :path => lib_path('local-rack') do |s|
+        s.write "lib/rack.rb", "puts :LOCAL"
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :branch => "master"
+      G
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      run "require 'rack'"
+      expect(out).to eq("LOCAL")
+    end
+
+    it "updates specs on runtime" do
+      system_gems "nokogiri-1.4.2"
+
+      build_git "rack", "0.8"
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :branch => "master"
+      G
+
+      lockfile0 = File.read(bundled_app("Gemfile.lock"))
+
+      FileUtils.cp_r("#{lib_path('rack-0.8')}/.", lib_path('local-rack'))
+      update_git "rack", "0.8", :path => lib_path('local-rack') do |s|
+        s.add_dependency "nokogiri", "1.4.2"
+      end
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      run "require 'rack'"
+
+      lockfile1 = File.read(bundled_app("Gemfile.lock"))
+      expect(lockfile1).not_to eq(lockfile0)
+    end
+
+    it "updates ref on install" do
+      build_git "rack", "0.8"
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :branch => "master"
+      G
+
+      lockfile0 = File.read(bundled_app("Gemfile.lock"))
+
+      FileUtils.cp_r("#{lib_path('rack-0.8')}/.", lib_path('local-rack'))
+      update_git "rack", "0.8", :path => lib_path('local-rack')
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      bundle :install
+
+      lockfile1 = File.read(bundled_app("Gemfile.lock"))
+      expect(lockfile1).not_to eq(lockfile0)
+    end
+
+    it "explodes if given path does not exist on install" do
+      build_git "rack", "0.8"
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :branch => "master"
+      G
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      bundle :install
+      expect(out).to match(/Cannot use local override for rack-0.8 because #{Regexp.escape(lib_path('local-rack').to_s)} does not exist/)
+    end
+
+    it "explodes if branch is not given on install" do
+      build_git "rack", "0.8"
+      FileUtils.cp_r("#{lib_path('rack-0.8')}/.", lib_path('local-rack'))
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}"
+      G
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      bundle :install
+      expect(out).to match(/cannot use local override/i)
+    end
+
+    it "does not explode if disable_local_branch_check is given" do
+      build_git "rack", "0.8"
+      FileUtils.cp_r("#{lib_path('rack-0.8')}/.", lib_path('local-rack'))
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}"
+      G
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      bundle %|config disable_local_branch_check true|
+      bundle :install
+      expect(out).to match(/Your bundle is complete!/)
+    end
+
+    it "explodes on different branches on install" do
+      build_git "rack", "0.8"
+
+      FileUtils.cp_r("#{lib_path('rack-0.8')}/.", lib_path('local-rack'))
+
+      update_git "rack", "0.8", :path => lib_path('local-rack'), :branch => "another" do |s|
+        s.write "lib/rack.rb", "puts :LOCAL"
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :branch => "master"
+      G
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      bundle :install
+      expect(out).to match(/is using branch another but Gemfile specifies master/)
+    end
+
+    it "explodes on invalid revision on install" do
+      build_git "rack", "0.8"
+
+      build_git "rack", "0.8", :path => lib_path('local-rack') do |s|
+        s.write "lib/rack.rb", "puts :LOCAL"
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :branch => "master"
+      G
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      bundle :install
+      expect(out).to match(/The Gemfile lock is pointing to revision \w+/)
+    end
+  end
+
+  describe "specified inline" do
+    # TODO: Figure out how to write this test so that it is not flaky depending
+    #       on the current network situation.
+    # it "supports private git URLs" do
+    #   gemfile <<-G
+    #     gem "thingy", :git => "git at notthere.fallingsnow.net:somebody/thingy.git"
+    #   G
+    #
+    #   bundle :install, :expect_err => true
+    #
+    #   # p out
+    #   # p err
+    #   puts err unless err.empty? # This spec fails randomly every so often
+    #   err.should include("notthere.fallingsnow.net")
+    #   err.should include("ssh")
+    # end
+
+    it "installs from git even if a newer gem is available elsewhere" do
+      build_git "rack", "0.8"
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}"
+      G
+
+      should_be_installed "rack 0.8"
+    end
+
+    it "installs dependencies from git even if a newer gem is available elsewhere" do
+      system_gems "rack-1.0.0"
+
+      build_lib "rack", "1.0", :path => lib_path('nested/bar') do |s|
+        s.write "lib/rack.rb", "puts 'WIN OVERRIDE'"
+      end
+
+      build_git "foo", :path => lib_path('nested') do |s|
+        s.add_dependency "rack", "= 1.0"
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "foo", :git => "#{lib_path('nested')}"
+      G
+
+      run "require 'rack'"
+      expect(out).to eq('WIN OVERRIDE')
+    end
+
+    it "correctly unlocks when changing to a git source" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", "0.9.1"
+      G
+
+      build_git "rack", :path => lib_path("rack")
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", "1.0.0", :git => "#{lib_path('rack')}"
+      G
+
+      should_be_installed "rack 1.0.0"
+    end
+
+    it "correctly unlocks when changing to a git source without versions" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      build_git "rack", "1.2", :path => lib_path("rack")
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack')}"
+      G
+
+      should_be_installed "rack 1.2"
+    end
+  end
+
+  describe "block syntax" do
+    it "pulls all gems from a git block" do
+      build_lib "omg", :path => lib_path('hi2u/omg')
+      build_lib "hi2u", :path => lib_path('hi2u')
+
+      install_gemfile <<-G
+        path "#{lib_path('hi2u')}" do
+          gem "omg"
+          gem "hi2u"
+        end
+      G
+
+      should_be_installed "omg 1.0", "hi2u 1.0"
+    end
+  end
+
+  it "uses a ref if specified" do
+    build_git "foo"
+    @revision = revision_for(lib_path("foo-1.0"))
+    update_git "foo"
+
+    install_gemfile <<-G
+      gem "foo", :git => "#{lib_path('foo-1.0')}", :ref => "#{@revision}"
+    G
+
+    run <<-RUBY
+      require 'foo'
+      puts "WIN" unless defined?(FOO_PREV_REF)
+    RUBY
+
+    expect(out).to eq("WIN")
+  end
+
+  it "correctly handles cases with invalid gemspecs" do
+    build_git "foo" do |s|
+      s.summary = nil
+    end
+
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "foo", :git => "#{lib_path('foo-1.0')}"
+      gem "rails", "2.3.2"
+    G
+
+    should_be_installed "foo 1.0"
+    should_be_installed "rails 2.3.2"
+  end
+
+  it "runs the gemspec in the context of its parent directory" do
+    build_lib "bar", :path => lib_path("foo/bar"), :gemspec => false do |s|
+      s.write lib_path("foo/bar/lib/version.rb"), %{BAR_VERSION = '1.0'}
+      s.write "bar.gemspec", <<-G
+        $:.unshift Dir.pwd # For 1.9
+        require 'lib/version'
+        Gem::Specification.new do |s|
+          s.name        = 'bar'
+          s.version     = BAR_VERSION
+          s.summary     = 'Bar'
+          s.files       = Dir["lib/**/*.rb"]
+        end
+      G
+    end
+
+    build_git "foo", :path => lib_path("foo") do |s|
+      s.write "bin/foo", ""
+    end
+
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "bar", :git => "#{lib_path("foo")}"
+      gem "rails", "2.3.2"
+    G
+
+    should_be_installed "bar 1.0"
+    should_be_installed "rails 2.3.2"
+  end
+
+  it "installs from git even if a rubygems gem is present" do
+    build_gem "foo", "1.0", :path => lib_path('fake_foo'), :to_system => true do |s|
+      s.write "lib/foo.rb", "raise 'FAIL'"
+    end
+
+    build_git "foo", "1.0"
+
+    install_gemfile <<-G
+      gem "foo", "1.0", :git => "#{lib_path('foo-1.0')}"
+    G
+
+    should_be_installed "foo 1.0"
+  end
+
+  it "fakes the gem out if there is no gemspec" do
+    build_git "foo", :gemspec => false
+
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "foo", "1.0", :git => "#{lib_path('foo-1.0')}"
+      gem "rails", "2.3.2"
+    G
+
+    should_be_installed("foo 1.0")
+    should_be_installed("rails 2.3.2")
+  end
+
+  it "catches git errors and spits out useful output" do
+    gemfile <<-G
+      gem "foo", "1.0", :git => "omgomg"
+    G
+
+    bundle :install, :expect_err => true
+
+    expect(out).to include("Git error:")
+    expect(err).to include("fatal")
+    expect(err).to include("omgomg")
+  end
+
+  it "works when the gem path has spaces in it" do
+    build_git "foo", :path => lib_path('foo space-1.0')
+
+    install_gemfile <<-G
+      gem "foo", :git => "#{lib_path('foo space-1.0')}"
+    G
+
+    should_be_installed "foo 1.0"
+  end
+
+  it "handles repos that have been force-pushed" do
+    build_git "forced", "1.0"
+
+    install_gemfile <<-G
+      git "#{lib_path('forced-1.0')}" do
+        gem 'forced'
+      end
+    G
+    should_be_installed "forced 1.0"
+
+    update_git "forced" do |s|
+      s.write "lib/forced.rb", "FORCED = '1.1'"
+    end
+
+    bundle "update"
+    should_be_installed "forced 1.1"
+
+    Dir.chdir(lib_path('forced-1.0')) do
+      `git reset --hard HEAD^`
+    end
+
+    bundle "update"
+    should_be_installed "forced 1.0"
+  end
+
+  it "ignores submodules if :submodule is not passed" do
+    build_git "submodule", "1.0"
+    build_git "has_submodule", "1.0" do |s|
+      s.add_dependency "submodule"
+    end
+    Dir.chdir(lib_path('has_submodule-1.0')) do
+      `git submodule add #{lib_path('submodule-1.0')} submodule-1.0`
+      `git commit -m "submodulator"`
+    end
+
+    install_gemfile <<-G, :expect_err => true
+      git "#{lib_path('has_submodule-1.0')}" do
+        gem "has_submodule"
+      end
+    G
+    expect(out).to match(/could not find gem 'submodule/i)
+
+    should_not_be_installed "has_submodule 1.0", :expect_err => true
+  end
+
+  it "handles repos with submodules" do
+    build_git "submodule", "1.0"
+    build_git "has_submodule", "1.0" do |s|
+      s.add_dependency "submodule"
+    end
+    Dir.chdir(lib_path('has_submodule-1.0')) do
+      `git submodule add #{lib_path('submodule-1.0')} submodule-1.0`
+      `git commit -m "submodulator"`
+    end
+
+    install_gemfile <<-G
+      git "#{lib_path('has_submodule-1.0')}", :submodules => true do
+        gem "has_submodule"
+      end
+    G
+
+    should_be_installed "has_submodule 1.0"
+  end
+
+  it "handles implicit updates when modifying the source info" do
+    git = build_git "foo"
+
+    install_gemfile <<-G
+      git "#{lib_path('foo-1.0')}" do
+        gem "foo"
+      end
+    G
+
+    update_git "foo"
+    update_git "foo"
+
+    install_gemfile <<-G
+      git "#{lib_path('foo-1.0')}", :ref => "#{git.ref_for('HEAD^')}" do
+        gem "foo"
+      end
+    G
+
+    run <<-RUBY
+      require 'foo'
+      puts "WIN" if FOO_PREV_REF == '#{git.ref_for("HEAD^^")}'
+    RUBY
+
+    expect(out).to eq("WIN")
+  end
+
+  it "does not to a remote fetch if the revision is cached locally" do
+    build_git "foo"
+
+    install_gemfile <<-G
+      gem "foo", :git => "#{lib_path('foo-1.0')}"
+    G
+
+    FileUtils.rm_rf(lib_path('foo-1.0'))
+
+    bundle "install"
+    expect(out).not_to match(/updating/i)
+  end
+
+  it "doesn't blow up if bundle install is run twice in a row" do
+    build_git "foo"
+
+    gemfile <<-G
+      gem "foo", :git => "#{lib_path('foo-1.0')}"
+    G
+
+    bundle "install"
+    bundle "install", :exitstatus => true
+    expect(exitstatus).to eq(0)
+  end
+
+  it "does not duplicate git gem sources" do
+    build_lib "foo", :path => lib_path('nested/foo')
+    build_lib "bar", :path => lib_path('nested/bar')
+
+    build_git "foo", :path => lib_path('nested')
+    build_git "bar", :path => lib_path('nested')
+
+    gemfile <<-G
+      gem "foo", :git => "#{lib_path('nested')}"
+      gem "bar", :git => "#{lib_path('nested')}"
+    G
+
+    bundle "install"
+    expect(File.read(bundled_app("Gemfile.lock")).scan('GIT').size).to eq(1)
+  end
+
+  describe "switching sources" do
+    it "doesn't explode when switching Path to Git sources" do
+      build_gem "foo", "1.0", :to_system => true do |s|
+        s.write "lib/foo.rb", "raise 'fail'"
+      end
+      build_lib "foo", "1.0", :path => lib_path('bar/foo')
+      build_git "bar", "1.0", :path => lib_path('bar') do |s|
+        s.add_dependency 'foo'
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "bar", :path => "#{lib_path('bar')}"
+      G
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "bar", :git => "#{lib_path('bar')}"
+      G
+
+      should_be_installed "foo 1.0", "bar 1.0"
+    end
+
+    it "doesn't explode when switching Gem to Git source" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack-obama"
+        gem "rack", "1.0.0"
+      G
+
+      build_git "rack", "1.0" do |s|
+        s.write "lib/new_file.rb", "puts 'USING GIT'"
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack-obama"
+        gem "rack", "1.0.0", :git => "#{lib_path("rack-1.0")}"
+      G
+
+      run "require 'new_file'"
+      expect(out).to eq("USING GIT")
+    end
+  end
+
+  describe "bundle install after the remote has been updated" do
+    it "installs" do
+      build_git "valim"
+
+      install_gemfile <<-G
+        gem "valim", :git => "file://#{lib_path("valim-1.0")}"
+      G
+
+      old_revision = revision_for(lib_path("valim-1.0"))
+      update_git "valim"
+      new_revision = revision_for(lib_path("valim-1.0"))
+
+      lockfile = File.read(bundled_app("Gemfile.lock"))
+      File.open(bundled_app("Gemfile.lock"), "w") do |file|
+        file.puts lockfile.gsub(/revision: #{old_revision}/, "revision: #{new_revision}")
+      end
+
+      bundle "install"
+
+      run <<-R
+        require "valim"
+        puts VALIM_PREV_REF
+      R
+
+      expect(out).to eq(old_revision)
+    end
+  end
+
+  describe "bundle install --deployment with git sources" do
+    it "works" do
+      build_git "valim", :path => lib_path('valim')
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "valim", "= 1.0", :git => "#{lib_path('valim')}"
+      G
+
+      simulate_new_machine
+
+      bundle "install --deployment", :exitstatus => true
+      expect(exitstatus).to eq(0)
+    end
+  end
+
+  describe "gem install hooks" do
+    it "runs pre-install hooks" do
+      build_git "foo"
+      gemfile <<-G
+        gem "foo", :git => "#{lib_path('foo-1.0')}"
+      G
+
+      File.open(lib_path("install_hooks.rb"), "w") do |h|
+        h.write <<-H
+          require 'rubygems'
+          Gem.pre_install_hooks << lambda do |inst|
+            STDERR.puts "Ran pre-install hook: \#{inst.spec.full_name}"
+          end
+        H
+      end
+
+      bundle :install, :expect_err => true,
+        :requires => [lib_path('install_hooks.rb')]
+      expect(err).to eq("Ran pre-install hook: foo-1.0")
+    end
+
+    it "runs post-install hooks" do
+      build_git "foo"
+      gemfile <<-G
+        gem "foo", :git => "#{lib_path('foo-1.0')}"
+      G
+
+      File.open(lib_path("install_hooks.rb"), "w") do |h|
+        h.write <<-H
+          require 'rubygems'
+          Gem.post_install_hooks << lambda do |inst|
+            STDERR.puts "Ran post-install hook: \#{inst.spec.full_name}"
+          end
+        H
+      end
+
+      bundle :install, :expect_err => true,
+        :requires => [lib_path('install_hooks.rb')]
+      expect(err).to eq("Ran post-install hook: foo-1.0")
+    end
+
+    it "complains if the install hook fails" do
+      build_git "foo"
+      gemfile <<-G
+        gem "foo", :git => "#{lib_path('foo-1.0')}"
+      G
+
+      File.open(lib_path("install_hooks.rb"), "w") do |h|
+        h.write <<-H
+          require 'rubygems'
+          Gem.pre_install_hooks << lambda do |inst|
+            false
+          end
+        H
+      end
+
+      bundle :install, :expect_err => true,
+        :requires => [lib_path('install_hooks.rb')]
+      expect(out).to include("failed for foo-1.0")
+    end
+  end
+
+  context "with an extension" do
+    it "installs the extension" do
+      build_git "foo" do |s|
+        s.add_dependency "rake"
+        s.extensions << "Rakefile"
+        s.write "Rakefile", <<-RUBY
+          task :default do
+            path = File.expand_path("../lib", __FILE__)
+            FileUtils.mkdir_p(path)
+            File.open("\#{path}/foo.rb", "w") do |f|
+              f.puts "FOO = 'YES'"
+            end
+          end
+        RUBY
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "foo", :git => "#{lib_path('foo-1.0')}"
+      G
+
+      run <<-R
+        require 'foo'
+        puts FOO
+      R
+      expect(out).to eq("YES")
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/invalid_spec.rb b/misc/lib/bundler-1.3.5/spec/install/invalid_spec.rb
new file mode 100644
index 0000000..fbf41bf
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/invalid_spec.rb
@@ -0,0 +1,35 @@
+require "spec_helper"
+
+describe "bundle install with deprecated features" do
+  before :each do
+    in_app_root
+  end
+
+  it "reports that lib is an invalid option" do
+    gemfile <<-G
+      gem "rack", :lib => "rack"
+    G
+
+    bundle :install
+    expect(out).to match(/You passed :lib as an option for gem 'rack', but it is invalid/)
+  end
+
+end
+
+describe "bundle install to a dead symlink" do
+  before do
+    in_app_root do
+      `ln -s /tmp/idontexist bundle`
+    end
+  end
+
+  it "reports the symlink is dead" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+
+    bundle "install --path bundle"
+    expect(out).to match(/invalid symlink/)
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/path_spec.rb b/misc/lib/bundler-1.3.5/spec/install/path_spec.rb
new file mode 100644
index 0000000..a347e5b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/path_spec.rb
@@ -0,0 +1,468 @@
+require "spec_helper"
+
+describe "bundle install with explicit source paths" do
+  it "fetches gems" do
+    build_lib "foo"
+
+    install_gemfile <<-G
+      path "#{lib_path('foo-1.0')}"
+      gem 'foo'
+    G
+
+    should_be_installed("foo 1.0")
+  end
+
+  it "supports pinned paths" do
+    build_lib "foo"
+
+    install_gemfile <<-G
+      gem 'foo', :path => "#{lib_path('foo-1.0')}"
+    G
+
+    should_be_installed("foo 1.0")
+  end
+
+  it "supports relative paths" do
+    build_lib "foo"
+
+    relative_path = lib_path('foo-1.0').relative_path_from(Pathname.new(Dir.pwd))
+
+    install_gemfile <<-G
+      gem 'foo', :path => "#{relative_path}"
+    G
+
+    should_be_installed("foo 1.0")
+  end
+
+  it "expands paths" do
+    build_lib "foo"
+
+    relative_path = lib_path('foo-1.0').relative_path_from(Pathname.new('~').expand_path)
+
+    install_gemfile <<-G
+      gem 'foo', :path => "~/#{relative_path}"
+    G
+
+    should_be_installed("foo 1.0")
+  end
+
+  it "expands paths relative to Bundler.root" do
+    build_lib "foo", :path => bundled_app("foo-1.0")
+
+    install_gemfile <<-G
+      gem 'foo', :path => "./foo-1.0"
+    G
+
+    bundled_app("subdir").mkpath
+    Dir.chdir(bundled_app("subdir")) do
+      should_be_installed("foo 1.0")
+    end
+  end
+
+  it "expands paths when comparing locked paths to Gemfile paths" do
+    build_lib "foo", :path => bundled_app("foo-1.0")
+
+    install_gemfile <<-G
+      gem 'foo', :path => File.expand_path("../foo-1.0", __FILE__)
+    G
+
+    bundle "install --frozen", :exitstatus => true
+    expect(exitstatus).to eq(0)
+  end
+
+  it "installs dependencies from the path even if a newer gem is available elsewhere" do
+    system_gems "rack-1.0.0"
+
+    build_lib "rack", "1.0", :path => lib_path('nested/bar') do |s|
+      s.write "lib/rack.rb", "puts 'WIN OVERRIDE'"
+    end
+
+    build_lib "foo", :path => lib_path('nested') do |s|
+      s.add_dependency "rack", "= 1.0"
+    end
+
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "foo", :path => "#{lib_path('nested')}"
+    G
+
+    run "require 'rack'"
+    expect(out).to eq('WIN OVERRIDE')
+  end
+
+  it "works" do
+    build_gem "foo", "1.0.0", :to_system => true do |s|
+      s.write "lib/foo.rb", "puts 'FAIL'"
+    end
+
+    build_lib "omg", "1.0", :path => lib_path("omg") do |s|
+      s.add_dependency "foo"
+    end
+
+    build_lib "foo", "1.0.0", :path => lib_path("omg/foo")
+
+    install_gemfile <<-G
+      gem "omg", :path => "#{lib_path('omg')}"
+    G
+
+    should_be_installed "foo 1.0"
+  end
+
+  it "supports gemspec syntax" do
+    build_lib "foo", "1.0", :path => lib_path("foo") do |s|
+      s.add_dependency "rack", "1.0"
+    end
+
+    gemfile = <<-G
+      source "file://#{gem_repo1}"
+      gemspec
+    G
+
+    File.open(lib_path("foo/Gemfile"), "w") {|f| f.puts gemfile }
+
+    Dir.chdir(lib_path("foo")) do
+      bundle "install"
+      should_be_installed "foo 1.0"
+      should_be_installed "rack 1.0"
+    end
+  end
+
+  it "supports gemspec syntax with an alternative path" do
+    build_lib "foo", "1.0", :path => lib_path("foo") do |s|
+      s.add_dependency "rack", "1.0"
+    end
+
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gemspec :path => "#{lib_path("foo")}"
+    G
+
+    should_be_installed "foo 1.0"
+    should_be_installed "rack 1.0"
+  end
+
+  it "doesn't automatically unlock dependencies when using the gemspec syntax" do
+    build_lib "foo", "1.0", :path => lib_path("foo") do |s|
+      s.add_dependency "rack", ">= 1.0"
+    end
+
+    Dir.chdir lib_path("foo")
+
+    install_gemfile lib_path("foo/Gemfile"), <<-G
+      source "file://#{gem_repo1}"
+      gemspec
+    G
+
+    build_gem "rack", "1.0.1", :to_system => true
+
+    bundle "install"
+
+    should_be_installed "foo 1.0"
+    should_be_installed "rack 1.0"
+  end
+
+  it "doesn't automatically unlock dependencies when using the gemspec syntax and the gem has development dependencies" do
+    build_lib "foo", "1.0", :path => lib_path("foo") do |s|
+      s.add_dependency "rack", ">= 1.0"
+      s.add_development_dependency "activesupport"
+    end
+
+    Dir.chdir lib_path("foo")
+
+    install_gemfile lib_path("foo/Gemfile"), <<-G
+      source "file://#{gem_repo1}"
+      gemspec
+    G
+
+    build_gem "rack", "1.0.1", :to_system => true
+
+    bundle "install"
+
+    should_be_installed "foo 1.0"
+    should_be_installed "rack 1.0"
+  end
+
+  it "raises if there are multiple gemspecs" do
+    build_lib "foo", "1.0", :path => lib_path("foo") do |s|
+      s.write "bar.gemspec"
+    end
+
+    install_gemfile <<-G, :exitstatus => true
+      gemspec :path => "#{lib_path("foo")}"
+    G
+
+    expect(exitstatus).to eq(15)
+    expect(out).to match(/There are multiple gemspecs/)
+  end
+
+  it "allows :name to be specified to resolve ambiguity" do
+    build_lib "foo", "1.0", :path => lib_path("foo") do |s|
+      s.write "bar.gemspec"
+    end
+
+    install_gemfile <<-G, :exitstatus => true
+      gemspec :path => "#{lib_path("foo")}", :name => "foo"
+    G
+
+    should_be_installed "foo 1.0"
+  end
+
+  it "sets up executables" do
+    pending_jruby_shebang_fix
+
+    build_lib "foo" do |s|
+      s.executables = "foobar"
+    end
+
+    install_gemfile <<-G
+      path "#{lib_path('foo-1.0')}"
+      gem 'foo'
+    G
+
+    bundle "exec foobar"
+    expect(out).to eq("1.0")
+  end
+
+  it "handles directories in bin/" do
+    build_lib "foo"
+    lib_path("foo-1.0").join("foo.gemspec").rmtree
+    lib_path("foo-1.0").join("bin/performance").mkpath
+
+    install_gemfile <<-G
+      gem 'foo', '1.0', :path => "#{lib_path('foo-1.0')}"
+    G
+    expect(err).to eq("")
+  end
+
+  it "removes the .gem file after installing" do
+    build_lib "foo"
+
+    install_gemfile <<-G
+      gem 'foo', :path => "#{lib_path('foo-1.0')}"
+    G
+
+    expect(lib_path('foo-1.0').join('foo-1.0.gem')).not_to exist
+  end
+
+  describe "block syntax" do
+    it "pulls all gems from a path block" do
+      build_lib "omg"
+      build_lib "hi2u"
+
+      install_gemfile <<-G
+        path "#{lib_path}" do
+          gem "omg"
+          gem "hi2u"
+        end
+      G
+
+      should_be_installed "omg 1.0", "hi2u 1.0"
+    end
+  end
+
+  it "keeps source pinning" do
+    build_lib "foo", "1.0", :path => lib_path('foo')
+    build_lib "omg", "1.0", :path => lib_path('omg')
+    build_lib "foo", "1.0", :path => lib_path('omg/foo') do |s|
+      s.write "lib/foo.rb", "puts 'FAIL'"
+    end
+
+    install_gemfile <<-G
+      gem "foo", :path => "#{lib_path('foo')}"
+      gem "omg", :path => "#{lib_path('omg')}"
+    G
+
+    should_be_installed "foo 1.0"
+  end
+
+  it "works when the path does not have a gemspec" do
+    build_lib "foo", :gemspec => false
+
+    gemfile <<-G
+      gem "foo", "1.0", :path => "#{lib_path('foo-1.0')}"
+    G
+
+    should_be_installed "foo 1.0"
+
+    should_be_installed "foo 1.0"
+  end
+
+  it "installs executable stubs" do
+    build_lib "foo" do |s|
+      s.executables = ['foo']
+    end
+
+    install_gemfile <<-G
+      gem "foo", :path => "#{lib_path('foo-1.0')}"
+    G
+
+    bundle "exec foo"
+    expect(out).to eq("1.0")
+  end
+
+  describe "when the gem version in the path is updated" do
+    before :each do
+      build_lib "foo", "1.0", :path => lib_path("foo") do |s|
+        s.add_dependency "bar"
+      end
+      build_lib "bar", "1.0", :path => lib_path("foo/bar")
+
+      install_gemfile <<-G
+        gem "foo", :path => "#{lib_path('foo')}"
+      G
+    end
+
+    it "unlocks all gems when the top level gem is updated" do
+      build_lib "foo", "2.0", :path => lib_path("foo") do |s|
+        s.add_dependency "bar"
+      end
+
+      bundle "install"
+
+      should_be_installed "foo 2.0", "bar 1.0"
+    end
+
+    it "unlocks all gems when a child dependency gem is updated" do
+      build_lib "bar", "2.0", :path => lib_path("foo/bar")
+
+      bundle "install"
+
+      should_be_installed "foo 1.0", "bar 2.0"
+    end
+  end
+
+  describe "when dependencies in the path are updated" do
+    before :each do
+      build_lib "foo", "1.0", :path => lib_path("foo")
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "foo", :path => "#{lib_path('foo')}"
+      G
+    end
+
+    it "gets dependencies that are updated in the path" do
+      build_lib "foo", "1.0", :path => lib_path("foo") do |s|
+        s.add_dependency "rack"
+      end
+
+      bundle "install"
+
+      should_be_installed "rack 1.0.0"
+    end
+  end
+
+  describe "switching sources" do
+    it "doesn't switch pinned git sources to rubygems when pinning the parent gem to a path source" do
+      build_gem "foo", "1.0", :to_system => true do |s|
+        s.write "lib/foo.rb", "raise 'fail'"
+      end
+      build_lib "foo", "1.0", :path => lib_path('bar/foo')
+      build_git "bar", "1.0", :path => lib_path('bar') do |s|
+        s.add_dependency 'foo'
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "bar", :git => "#{lib_path('bar')}"
+      G
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "bar", :path => "#{lib_path('bar')}"
+      G
+
+      should_be_installed "foo 1.0", "bar 1.0"
+    end
+
+    it "switches the source when the gem existed in rubygems and the path was already being used for another gem" do
+      build_lib "foo", "1.0", :path => lib_path("foo")
+      build_gem "bar", "1.0", :to_system => true do |s|
+        s.write "lib/bar.rb", "raise 'fail'"
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "bar"
+        path "#{lib_path('foo')}" do
+          gem "foo"
+        end
+      G
+
+      build_lib "bar", "1.0", :path => lib_path("foo/bar")
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        path "#{lib_path('foo')}" do
+          gem "foo"
+          gem "bar"
+        end
+      G
+
+      should_be_installed "bar 1.0"
+    end
+  end
+
+  describe "gem install hooks" do
+    it "runs pre-install hooks" do
+      build_git "foo"
+      gemfile <<-G
+        gem "foo", :git => "#{lib_path('foo-1.0')}"
+      G
+
+      File.open(lib_path("install_hooks.rb"), "w") do |h|
+        h.write <<-H
+          require 'rubygems'
+          Gem.pre_install_hooks << lambda do |inst|
+            STDERR.puts "Ran pre-install hook: \#{inst.spec.full_name}"
+          end
+        H
+      end
+
+      bundle :install, :expect_err => true,
+        :requires => [lib_path('install_hooks.rb')]
+      expect(err).to eq("Ran pre-install hook: foo-1.0")
+    end
+
+    it "runs post-install hooks" do
+      build_git "foo"
+      gemfile <<-G
+        gem "foo", :git => "#{lib_path('foo-1.0')}"
+      G
+
+      File.open(lib_path("install_hooks.rb"), "w") do |h|
+        h.write <<-H
+          require 'rubygems'
+          Gem.post_install_hooks << lambda do |inst|
+            STDERR.puts "Ran post-install hook: \#{inst.spec.full_name}"
+          end
+        H
+      end
+
+      bundle :install, :expect_err => true,
+        :requires => [lib_path('install_hooks.rb')]
+      expect(err).to eq("Ran post-install hook: foo-1.0")
+    end
+
+    it "complains if the install hook fails" do
+      build_git "foo"
+      gemfile <<-G
+        gem "foo", :git => "#{lib_path('foo-1.0')}"
+      G
+
+      File.open(lib_path("install_hooks.rb"), "w") do |h|
+        h.write <<-H
+          require 'rubygems'
+          Gem.pre_install_hooks << lambda do |inst|
+            false
+          end
+        H
+      end
+
+      bundle :install, :expect_err => true,
+        :requires => [lib_path('install_hooks.rb')]
+      expect(out).to include("failed for foo-1.0")
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/post_bundle_message_spec.rb b/misc/lib/bundler-1.3.5/spec/install/post_bundle_message_spec.rb
new file mode 100644
index 0000000..6bd4e85
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/post_bundle_message_spec.rb
@@ -0,0 +1,142 @@
+require 'spec_helper'
+
+describe "post bundle message" do
+  before :each do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+      gem "activesupport", "2.3.5", :group => [:emo, :test]
+      group :test do
+        gem "rspec"
+      end
+      gem "rack-obama", :group => :obama
+    G
+  end
+
+  let(:bundle_show_message)       {"Use `bundle show [gemname]` to see where a bundled gem is installed."}
+  let(:bundle_deployment_message) {"It was installed into ./vendor"}
+  let(:bundle_complete_message)   {"Your bundle is complete!"}
+  let(:bundle_updated_message)    {"Your bundle is updated!"}
+
+  describe "for fresh bundle install" do
+    it "without any options" do
+      bundle :install
+      expect(out).to include(bundle_show_message)
+      expect(out).not_to include("Gems in the group")
+      expect(out).to include(bundle_complete_message)
+    end
+
+    it "with --without one group" do
+      bundle "install --without emo"
+      expect(out).to include(bundle_show_message)
+      expect(out).to include("Gems in the group emo were not installed")
+      expect(out).to include(bundle_complete_message)
+    end
+
+    it "with --without two groups" do
+      bundle "install --without emo test"
+      expect(out).to include(bundle_show_message)
+      expect(out).to include("Gems in the groups emo and test were not installed")
+      expect(out).to include(bundle_complete_message)
+    end
+
+    it "with --without more groups" do
+      bundle "install --without emo obama test"
+      expect(out).to include(bundle_show_message)
+      expect(out).to include("Gems in the groups emo, obama and test were not installed")
+      expect(out).to include(bundle_complete_message)
+    end
+
+    describe "with --path and" do
+      it "without any options" do
+        bundle "install --path vendor"
+        expect(out).to include(bundle_deployment_message)
+        expect(out).to_not include("Gems in the group")
+        expect(out).to include(bundle_complete_message)
+      end
+
+      it "with --without one group" do
+        bundle "install --without emo --path vendor"
+        expect(out).to include(bundle_deployment_message)
+        expect(out).to include("Gems in the group emo were not installed")
+        expect(out).to include(bundle_complete_message)
+      end
+
+      it "with --without two groups" do
+        bundle "install --without emo test --path vendor"
+        expect(out).to include(bundle_deployment_message)
+        expect(out).to include("Gems in the groups emo and test were not installed")
+        expect(out).to include(bundle_complete_message)
+      end
+
+      it "with --without more groups" do
+        bundle "install --without emo obama test --path vendor"
+        expect(out).to include(bundle_deployment_message)
+        expect(out).to include("Gems in the groups emo, obama and test were not installed")
+        expect(out).to include(bundle_complete_message)
+      end
+    end
+  end
+
+  describe "for second bundle install run" do
+    it "without any options" do
+      2.times { bundle :install }
+      expect(out).to include(bundle_show_message)
+      expect(out).to_not include("Gems in the groups")
+      expect(out).to include(bundle_complete_message)
+    end
+
+    it "with --without one group" do
+      bundle "install --without emo"
+      bundle :install
+      expect(out).to include(bundle_show_message)
+      expect(out).to include("Gems in the group emo were not installed")
+      expect(out).to include(bundle_complete_message)
+    end
+
+    it "with --without two groups" do
+      bundle "install --without emo test"
+      bundle :install
+      expect(out).to include(bundle_show_message)
+      expect(out).to include("Gems in the groups emo and test were not installed")
+      expect(out).to include(bundle_complete_message)
+    end
+
+    it "with --without more groups" do
+      bundle "install --without emo obama test"
+      bundle :install
+      expect(out).to include(bundle_show_message)
+      expect(out).to include("Gems in the groups emo, obama and test were not installed")
+      expect(out).to include(bundle_complete_message)
+    end
+  end
+
+  describe "for bundle update" do
+    it "without any options" do
+      bundle :update
+      expect(out).not_to include("Gems in the groups")
+      expect(out).to include(bundle_updated_message)
+    end
+
+    it "with --without one group" do
+      bundle :install, :without => :emo
+      bundle :update
+      expect(out).to include("Gems in the group emo were not installed")
+      expect(out).to include(bundle_updated_message)
+    end
+
+    it "with --without two groups" do
+      bundle "install --without emo test"
+      bundle :update
+      expect(out).to include("Gems in the groups emo and test were not installed")
+      expect(out).to include(bundle_updated_message)
+    end
+
+    it "with --without more groups" do
+      bundle "install --without emo obama test"
+      bundle :update
+      expect(out).to include("Gems in the groups emo, obama and test were not installed")
+      expect(out).to include(bundle_updated_message)
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/security_policy_spec.rb b/misc/lib/bundler-1.3.5/spec/install/security_policy_spec.rb
new file mode 100644
index 0000000..c0cadcf
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/security_policy_spec.rb
@@ -0,0 +1,78 @@
+require "spec_helper"
+require "rubygems/security"
+
+# unfortunately, testing signed gems with a provided CA is extremely difficult
+# as 'gem cert' is currently the only way to add CAs to the system.
+
+describe "policies with unsigned gems" do
+  before do
+    build_security_repo
+    gemfile <<-G
+      source "file://#{security_repo}"
+      gem "rack"
+      gem "signed_gem"
+    G
+  end
+
+  it "works after you try to deploy without a lock" do
+    bundle "install --deployment"
+    bundle :install, :exitstatus => true
+    expect(exitstatus).to eq(0)
+    should_be_installed "rack 1.0", "signed_gem 1.0"
+  end
+
+  it "fails when given invalid security policy" do
+    bundle "install --trust-policy=InvalidPolicyName"
+    expect(out).to include("Rubygems doesn't know about trust policy")
+  end
+
+  it "fails with High Security setting due to presence of unsigned gem" do
+    bundle "install --trust-policy=HighSecurity"
+    expect(out).to include("security policy didn't allow")
+  end
+
+  # This spec will fail on Rubygems 2 rc1 due to a bug in policy.rb. the bug is fixed in rc3.
+  it "fails with Medium Security setting due to presence of unsigned gem", :unless => ENV['RGV'] == "v2.0.0.rc.1" do
+    bundle "install --trust-policy=MediumSecurity"
+    expect(out).to include("security policy didn't allow")
+  end
+
+  it "succeeds with no policy" do
+    bundle "install", :exitstatus => true
+    expect(exitstatus).to eq(0)
+  end
+
+end
+
+describe "policies with signed gems, no CA" do
+  before do
+    build_security_repo
+    gemfile <<-G
+      source "file://#{security_repo}"
+      gem "signed_gem"
+    G
+  end
+
+  it "fails with High Security setting, gem is self-signed" do
+    bundle "install --trust-policy=HighSecurity"
+    expect(out).to include("security policy didn't allow")
+  end
+
+  it "fails with Medium Security setting, gem is self-signed" do
+    bundle "install --trust-policy=MediumSecurity"
+    expect(out).to include("security policy didn't allow")
+  end
+
+  it "succeeds with Low Security setting, low security accepts self signed gem" do
+    bundle "install --trust-policy=LowSecurity", :exitstatus => true
+    expect(exitstatus).to eq(0)
+    should_be_installed "signed_gem 1.0"
+  end
+
+  it "succeeds with no policy" do
+    bundle "install", :exitstatus => true
+    expect(exitstatus).to eq(0)
+    should_be_installed "signed_gem 1.0"
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/install/upgrade_spec.rb b/misc/lib/bundler-1.3.5/spec/install/upgrade_spec.rb
new file mode 100644
index 0000000..603c39b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/install/upgrade_spec.rb
@@ -0,0 +1,26 @@
+require "spec_helper"
+
+describe "bundle install for the first time with v1.0" do
+  before :each do
+    in_app_root
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+  end
+
+  it "removes lockfiles in 0.9 YAML format" do
+    File.open("Gemfile.lock", "w"){|f| YAML.dump({}, f) }
+    bundle :install
+    expect(File.read("Gemfile.lock")).not_to match(/^---/)
+  end
+
+  it "removes env.rb if it exists" do
+    bundled_app.join(".bundle").mkdir
+    bundled_app.join(".bundle/environment.rb").open("w"){|f| f.write("raise 'nooo'") }
+    bundle :install
+    expect(bundled_app.join(".bundle/environment.rb")).not_to exist
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/integration/inject.rb b/misc/lib/bundler-1.3.5/spec/integration/inject.rb
new file mode 100644
index 0000000..f7ffff6
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/integration/inject.rb
@@ -0,0 +1,78 @@
+require 'spec_helper'
+
+describe "bundle inject" do
+  before :each do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+  end
+
+  context "without a lockfile" do
+    it "locks with the injected gems" do
+      expect(bundled_app("Gemfile.lock")).not_to exist
+      bundle "inject 'rack-obama' '> 0'"
+      expect(bundled_app("Gemfile.lock").read).to match(/rack-obama/)
+    end
+  end
+
+  context "with a lockfile" do
+    before do
+      bundle "install"
+    end
+
+    it "adds the injected gems to the gemfile" do
+      expect(bundled_app("Gemfile").read).not_to match(/rack-obama/)
+      bundle "inject 'rack-obama' '> 0'"
+      expect(bundled_app("Gemfile").read).to match(/rack-obama/)
+    end
+
+    it "locks with the injected gems" do
+      expect(bundled_app("Gemfile.lock").read).not_to match(/rack-obama/)
+      bundle "inject 'rack-obama' '> 0'"
+      expect(bundled_app("Gemfile.lock").read).to match(/rack-obama/)
+    end
+  end
+
+  context "with injected gems already in the Gemfile" do
+    it "doesn't add existing gems" do
+      bundle "inject 'rack' '> 0'"
+      expect(out).to match(/cannot specify the same gem twice/i)
+    end
+  end
+
+  context "when frozen" do
+    before do
+      bundle "install"
+      bundle "config --local frozen 1"
+    end
+
+    it "injects anyway" do
+      bundle "inject 'rack-obama' '> 0'"
+      expect(bundled_app("Gemfile").read).to match(/rack-obama/)
+    end
+
+    it "locks with the injected gems" do
+      expect(bundled_app("Gemfile.lock").read).not_to match(/rack-obama/)
+      bundle "inject 'rack-obama' '> 0'"
+      expect(bundled_app("Gemfile.lock").read).to match(/rack-obama/)
+    end
+
+    it "restores frozen afterwards" do
+      bundle "inject 'rack-obama' '> 0'"
+      config = YAML.load(bundled_app(".bundle/config").read)
+      expect(config["BUNDLE_FROZEN"]).to eq("1")
+    end
+
+    it "doesn't allow Gemfile changes" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack-obama"
+      G
+      bundle "inject 'rack' '> 0'"
+      expect(out).to match(/trying to install in deployment mode after changing/)
+
+      expect(bundled_app("Gemfile.lock").read).not_to match(/rack-obama/)
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/lock/git_spec.rb b/misc/lib/bundler-1.3.5/spec/lock/git_spec.rb
new file mode 100644
index 0000000..23b7f31
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/lock/git_spec.rb
@@ -0,0 +1,35 @@
+require "spec_helper"
+
+describe "bundle lock with git gems" do
+  before :each do
+    build_git "foo"
+
+    install_gemfile <<-G
+      gem 'foo', :git => "#{lib_path('foo-1.0')}"
+    G
+  end
+
+  it "doesn't break right after running lock" do
+    should_be_installed "foo 1.0.0"
+  end
+
+  it "locks a git source to the current ref" do
+    update_git "foo"
+    bundle :install
+
+    run <<-RUBY
+      require 'foo'
+      puts "WIN" unless defined?(FOO_PREV_REF)
+    RUBY
+
+    expect(out).to eq("WIN")
+  end
+
+  it "provides correct #full_gem_path" do
+    run <<-RUBY
+      puts Bundler.rubygems.find_name('foo').first.full_gem_path
+    RUBY
+    expect(out).to eq(bundle("show foo"))
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/lock/lockfile_spec.rb b/misc/lib/bundler-1.3.5/spec/lock/lockfile_spec.rb
new file mode 100644
index 0000000..30c4b22
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/lock/lockfile_spec.rb
@@ -0,0 +1,836 @@
+require "spec_helper"
+
+describe "the lockfile format" do
+  include Bundler::GemHelpers
+
+  it "generates a simple lockfile for a single source, gem" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack"
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (1.0.0)
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        rack
+    G
+  end
+
+  it "generates a simple lockfile for a single source, gem with dependencies" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack-obama"
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (1.0.0)
+          rack-obama (1.0)
+            rack
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        rack-obama
+    G
+  end
+
+  it "generates a simple lockfile for a single source, gem with a version requirement" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack-obama", ">= 1.0"
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (1.0.0)
+          rack-obama (1.0)
+            rack
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        rack-obama (>= 1.0)
+    G
+  end
+
+  it "generates lockfiles with multiple requirements" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "net-sftp"
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          net-sftp (1.1.1)
+            net-ssh (>= 1.0.0, < 1.99.0)
+          net-ssh (1.0)
+
+      PLATFORMS
+        ruby
+
+      DEPENDENCIES
+        net-sftp
+    G
+
+    should_be_installed "net-sftp 1.1.1", "net-ssh 1.0.0"
+  end
+
+  it "generates a simple lockfile for a single pinned source, gem with a version requirement" do
+    git = build_git "foo"
+
+    install_gemfile <<-G
+      gem "foo", :git => "#{lib_path("foo-1.0")}"
+    G
+
+    lockfile_should_be <<-G
+      GIT
+        remote: #{lib_path("foo-1.0")}
+        revision: #{git.ref_for('master')}
+        specs:
+          foo (1.0)
+
+      GEM
+        specs:
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        foo!
+    G
+  end
+
+  it "does not assplode when a platform specific dependency is present and the Gemfile has not been resolved on that platform" do
+    build_lib "omg", :path => lib_path('omg')
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      platforms :#{not_local_tag} do
+        gem "omg", :path => "#{lib_path('omg')}"
+      end
+
+      gem "rack"
+    G
+
+    lockfile <<-L
+      GIT
+        remote: git://github.com/nex3/haml.git
+        revision: 8a2271f
+        specs:
+
+      GEM
+        remote: file://#{gem_repo1}/
+        specs:
+          rack (1.0.0)
+
+      PLATFORMS
+        #{not_local}
+
+      DEPENDENCIES
+        omg!
+        rack
+    L
+
+    bundle "install"
+    should_be_installed "rack 1.0.0"
+  end
+
+  it "serializes global git sources" do
+    git = build_git "foo"
+
+    install_gemfile <<-G
+      git "#{lib_path('foo-1.0')}" do
+        gem "foo"
+      end
+    G
+
+    lockfile_should_be <<-G
+      GIT
+        remote: #{lib_path('foo-1.0')}
+        revision: #{git.ref_for('master')}
+        specs:
+          foo (1.0)
+
+      GEM
+        specs:
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        foo!
+    G
+  end
+
+  it "generates a lockfile with a ref for a single pinned source, git gem with a branch requirement" do
+    git = build_git "foo"
+    update_git "foo", :branch => "omg"
+
+    install_gemfile <<-G
+      gem "foo", :git => "#{lib_path("foo-1.0")}", :branch => "omg"
+    G
+
+    lockfile_should_be <<-G
+      GIT
+        remote: #{lib_path("foo-1.0")}
+        revision: #{git.ref_for('omg')}
+        branch: omg
+        specs:
+          foo (1.0)
+
+      GEM
+        specs:
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        foo!
+    G
+  end
+
+  it "generates a lockfile with a ref for a single pinned source, git gem with a tag requirement" do
+    git = build_git "foo"
+    update_git "foo", :tag => "omg"
+
+    install_gemfile <<-G
+      gem "foo", :git => "#{lib_path("foo-1.0")}", :tag => "omg"
+    G
+
+    lockfile_should_be <<-G
+      GIT
+        remote: #{lib_path("foo-1.0")}
+        revision: #{git.ref_for('omg')}
+        tag: omg
+        specs:
+          foo (1.0)
+
+      GEM
+        specs:
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        foo!
+    G
+  end
+
+  it "serializes pinned path sources to the lockfile" do
+    build_lib "foo"
+
+    install_gemfile <<-G
+      gem "foo", :path => "#{lib_path("foo-1.0")}"
+    G
+
+    lockfile_should_be <<-G
+      PATH
+        remote: #{lib_path("foo-1.0")}
+        specs:
+          foo (1.0)
+
+      GEM
+        specs:
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        foo!
+    G
+  end
+
+  it "lists gems alphabetically" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "thin"
+      gem "actionpack"
+      gem "rack-obama"
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          actionpack (2.3.2)
+            activesupport (= 2.3.2)
+          activesupport (2.3.2)
+          rack (1.0.0)
+          rack-obama (1.0)
+            rack
+          thin (1.0)
+            rack
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        actionpack
+        rack-obama
+        thin
+    G
+  end
+
+  it "order dependencies of dependencies in alphabetical order" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rails"
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          actionmailer (2.3.2)
+            activesupport (= 2.3.2)
+          actionpack (2.3.2)
+            activesupport (= 2.3.2)
+          activerecord (2.3.2)
+            activesupport (= 2.3.2)
+          activeresource (2.3.2)
+            activesupport (= 2.3.2)
+          activesupport (2.3.2)
+          rails (2.3.2)
+            actionmailer (= 2.3.2)
+            actionpack (= 2.3.2)
+            activerecord (= 2.3.2)
+            activeresource (= 2.3.2)
+            rake (= 10.0.2)
+          rake (10.0.2)
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        rails
+    G
+  end
+
+  it "orders dependencies according to version" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem 'double_deps'
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          double_deps (1.0)
+            net-ssh
+            net-ssh (>= 1.0.0)
+          net-ssh (1.0)
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        double_deps
+    G
+  end
+
+  it "does not add the :require option to the lockfile" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack-obama", ">= 1.0", :require => "rack/obama"
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (1.0.0)
+          rack-obama (1.0)
+            rack
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        rack-obama (>= 1.0)
+    G
+  end
+
+  it "does not add the :group option to the lockfile" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack-obama", ">= 1.0", :group => :test
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (1.0.0)
+          rack-obama (1.0)
+            rack
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        rack-obama (>= 1.0)
+    G
+  end
+
+  it "stores relative paths when the path is provided in a relative fashion and in Gemfile dir" do
+    build_lib "foo", :path => bundled_app('foo')
+
+    install_gemfile <<-G
+      path "foo"
+      gem "foo"
+    G
+
+    lockfile_should_be <<-G
+      PATH
+        remote: foo
+        specs:
+          foo (1.0)
+
+      GEM
+        specs:
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        foo
+    G
+  end
+
+  it "stores relative paths when the path is provided in a relative fashion and is above Gemfile dir" do
+    build_lib "foo", :path => bundled_app(File.join('..', 'foo'))
+
+    install_gemfile <<-G
+      path "../foo"
+      gem "foo"
+    G
+
+    lockfile_should_be <<-G
+      PATH
+        remote: ../foo
+        specs:
+          foo (1.0)
+
+      GEM
+        specs:
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        foo
+    G
+  end
+
+  it "stores relative paths when the path is provided in an absolute fashion but is relative" do
+    build_lib "foo", :path => bundled_app('foo')
+
+    install_gemfile <<-G
+      path File.expand_path("../foo", __FILE__)
+      gem "foo"
+    G
+
+    lockfile_should_be <<-G
+      PATH
+        remote: foo
+        specs:
+          foo (1.0)
+
+      GEM
+        specs:
+
+      PLATFORMS
+        #{generic(Gem::Platform.local)}
+
+      DEPENDENCIES
+        foo
+    G
+  end
+
+  it "keeps existing platforms in the lockfile" do
+    lockfile <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (1.0.0)
+
+      PLATFORMS
+        java
+
+      DEPENDENCIES
+        rack
+    G
+
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack"
+    G
+
+    platforms = ['java', generic(Gem::Platform.local).to_s].sort
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (1.0.0)
+
+      PLATFORMS
+        #{platforms[0]}
+        #{platforms[1]}
+
+      DEPENDENCIES
+        rack
+    G
+  end
+
+  it "persists the spec's platform to the lockfile" do
+    build_gem "platform_specific", "1.0.0", :to_system => true do |s|
+      s.platform = Gem::Platform.new('universal-java-16')
+    end
+
+    simulate_platform "universal-java-16"
+
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "platform_specific"
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          platform_specific (1.0-java)
+
+      PLATFORMS
+        java
+
+      DEPENDENCIES
+        platform_specific
+    G
+  end
+
+  it "does not add duplicate gems" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+      gem "activesupport"
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          activesupport (2.3.5)
+          rack (1.0.0)
+
+      PLATFORMS
+        ruby
+
+      DEPENDENCIES
+        activesupport
+        rack
+    G
+  end
+
+  it "does not add duplicate dependencies" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+      gem "rack"
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (1.0.0)
+
+      PLATFORMS
+        ruby
+
+      DEPENDENCIES
+        rack
+    G
+  end
+
+  it "does not add duplicate dependencies with versions" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack", "1.0"
+      gem "rack", "1.0"
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (1.0.0)
+
+      PLATFORMS
+        ruby
+
+      DEPENDENCIES
+        rack (= 1.0)
+    G
+  end
+
+  it "does not add duplicate dependencies in different groups" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack", "1.0", :group => :one
+      gem "rack", "1.0", :group => :two
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (1.0.0)
+
+      PLATFORMS
+        ruby
+
+      DEPENDENCIES
+        rack (= 1.0)
+    G
+  end
+
+  it "raises if two different versions are used" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack", "1.0"
+      gem "rack", "1.1"
+    G
+
+    expect(bundled_app("Gemfile.lock")).not_to exist
+    expect(out).to include "rack (= 1.0) and rack (= 1.1)"
+  end
+
+
+  it "raises if two different versions are used" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+      gem "rack", :git => "git://hubz.com"
+    G
+
+    expect(bundled_app("Gemfile.lock")).not_to exist
+    expect(out).to include "rack (>= 0) should come from an unspecified source and git://hubz.com (at master)"
+  end
+
+  it "works correctly with multiple version dependencies" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack", "> 0.9", "< 1.0"
+    G
+
+    lockfile_should_be <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (0.9.1)
+
+      PLATFORMS
+        ruby
+
+      DEPENDENCIES
+        rack (> 0.9, < 1.0)
+    G
+
+  end
+
+  # Some versions of the Bundler 1.1 RC series introduced corrupted
+  # lockfiles. There were two major problems:
+  #
+  # * multiple copies of the same GIT section appeared in the lockfile
+  # * when this happened, those sections got multiple copies of gems
+  #   in those sections.
+  it "fix corrupted lockfiles" do
+    build_git "omg", :path => lib_path('omg')
+    revision = revision_for(lib_path('omg'))
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "omg", :git => "#{lib_path('omg')}", :branch => 'master'
+    G
+
+    bundle "install --path vendor"
+    should_be_installed "omg 1.0"
+
+    # Create a Gemfile.lock that has duplicate GIT sections
+    lockfile <<-L
+      GIT
+        remote: #{lib_path('omg')}
+        revision: #{revision}
+        branch: master
+        specs:
+          omg (1.0)
+
+      GIT
+        remote: #{lib_path('omg')}
+        revision: #{revision}
+        branch: master
+        specs:
+          omg (1.0)
+
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+
+      PLATFORMS
+        #{local}
+
+      DEPENDENCIES
+        omg!
+    L
+
+    FileUtils.rm_rf(bundled_app('vendor'))
+    bundle "install"
+    should_be_installed "omg 1.0"
+
+    # Confirm that duplicate specs do not appear
+    expect(File.read(bundled_app('Gemfile.lock'))).to eq(strip_whitespace(<<-L))
+      GIT
+        remote: #{lib_path('omg')}
+        revision: #{revision}
+        branch: master
+        specs:
+          omg (1.0)
+
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+
+      PLATFORMS
+        #{local}
+
+      DEPENDENCIES
+        omg!
+    L
+  end
+
+  describe "line endings" do
+    def set_lockfile_mtime_to_known_value
+      time = Time.local(2000, 1, 1, 0, 0, 0)
+      File.utime(time, time, bundled_app('Gemfile.lock'))
+    end
+    before(:each) do
+      build_repo2
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "rack"
+      G
+      set_lockfile_mtime_to_known_value
+    end
+
+    it "generates Gemfile.lock with \\n line endings" do
+      expect(File.read(bundled_app("Gemfile.lock"))).not_to match("\r\n")
+      should_be_installed "rack 1.0"
+    end
+
+    context "during updates" do
+
+      it "preserves Gemfile.lock \\n line endings" do
+        update_repo2
+
+        expect { bundle "update" }.to change { File.mtime(bundled_app('Gemfile.lock')) }
+        expect(File.read(bundled_app("Gemfile.lock"))).not_to match("\r\n")
+        should_be_installed "rack 1.2"
+      end
+
+      it "preserves Gemfile.lock \\n\\r line endings" do
+        update_repo2
+        win_lock = File.read(bundled_app("Gemfile.lock")).gsub(/\n/, "\r\n")
+        File.open(bundled_app("Gemfile.lock"), "wb"){|f| f.puts(win_lock) }
+        set_lockfile_mtime_to_known_value
+
+        expect { bundle "update" }.to change { File.mtime(bundled_app('Gemfile.lock')) }
+        expect(File.read(bundled_app("Gemfile.lock"))).to match("\r\n")
+        should_be_installed "rack 1.2"
+      end
+    end
+
+    context "when nothing changes" do
+
+      it "preserves Gemfile.lock \\n line endings" do
+        expect { ruby <<-RUBY
+                   require 'rubygems'
+                   require 'bundler'
+                   Bundler.setup
+                 RUBY
+               }.not_to change { File.mtime(bundled_app('Gemfile.lock')) }
+      end
+
+      it "preserves Gemfile.lock \\n\\r line endings" do
+        win_lock = File.read(bundled_app("Gemfile.lock")).gsub(/\n/, "\r\n")
+        File.open(bundled_app("Gemfile.lock"), "wb"){|f| f.puts(win_lock) }
+        set_lockfile_mtime_to_known_value
+
+        expect { ruby <<-RUBY
+                   require 'rubygems'
+                   require 'bundler'
+                   Bundler.setup
+                 RUBY
+               }.not_to change { File.mtime(bundled_app('Gemfile.lock')) }
+      end
+    end
+  end
+
+  it "refuses to install if Gemfile.lock contains conflict markers" do
+    lockfile <<-L
+      GEM
+        remote: file://#{gem_repo1}/
+        specs:
+      <<<<<<<
+          rack (1.0.0)
+      =======
+          rack (1.0.1)
+      >>>>>>>
+
+      PLATFORMS
+        ruby
+
+      DEPENDENCIES
+        rack
+    L
+
+    error = install_gemfile(<<-G, :expect_err => true)
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+
+    expect(error).to match(/your Gemfile.lock contains merge conflicts/i)
+    expect(error).to match(/git checkout HEAD -- Gemfile.lock/i)
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/binstubs_spec.rb b/misc/lib/bundler-1.3.5/spec/other/binstubs_spec.rb
new file mode 100644
index 0000000..f5e1347
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/binstubs_spec.rb
@@ -0,0 +1,169 @@
+require "spec_helper"
+
+describe "bundle binstubs <gem>" do
+  context "when the gem exists in the lockfile" do
+    it "sets up the binstub" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      bundle "binstubs rack"
+
+      expect(bundled_app("bin/rackup")).to exist
+    end
+
+    it "does not install other binstubs" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "rails"
+      G
+
+      bundle "binstubs rails"
+
+      expect(bundled_app("bin/rackup")).not_to exist
+      expect(bundled_app("bin/rails")).to exist
+    end
+
+    it "does not bundle the bundler binary" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+      G
+
+      bundle "binstubs bundler"
+
+      expect(bundled_app("bin/bundle")).not_to exist
+      expect(out).to eq("Sorry, Bundler can only be run via Rubygems.")
+    end
+
+    it "install binstubs from git gems" do
+      FileUtils.mkdir_p(lib_path("foo/bin"))
+      FileUtils.touch(lib_path("foo/bin/foo"))
+      build_git "foo", "1.0", :path => lib_path("foo") do |s|
+        s.executables = %w(foo)
+      end
+      install_gemfile <<-G
+        gem "foo", :git => "#{lib_path('foo')}"
+      G
+
+      bundle "binstubs foo"
+
+      expect(bundled_app("bin/foo")).to exist
+    end
+
+    it "installs binstubs from path gems" do
+      FileUtils.mkdir_p(lib_path("foo/bin"))
+      FileUtils.touch(lib_path("foo/bin/foo"))
+      build_lib "foo" , "1.0", :path => lib_path("foo") do |s|
+        s.executables = %w(foo)
+      end
+      install_gemfile <<-G
+        gem "foo", :path => "#{lib_path('foo')}"
+      G
+
+      bundle "binstubs foo"
+
+      expect(bundled_app("bin/foo")).to exist
+    end
+  end
+
+  context "--path" do
+    it "sets the binstubs dir" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      bundle "binstubs rack --path exec"
+
+      expect(bundled_app("exec/rackup")).to exist
+    end
+
+    it "setting is saved for bundle install" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "rails"
+      G
+
+      bundle "binstubs rack --path exec"
+      bundle :install
+
+      expect(bundled_app("exec/rails")).to exist
+    end
+  end
+
+  context "when the bin already exists" do
+    it "don't override it and warn" do
+      FileUtils.mkdir_p(bundled_app("bin"))
+      File.open(bundled_app("bin/rackup"), 'wb') do |file|
+        file.print "OMG"
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      bundle "binstubs rack"
+
+      expect(bundled_app("bin/rackup")).to exist
+      expect(File.read(bundled_app("bin/rackup"))).to eq("OMG")
+      expect(out).to include("Skipped rackup")
+      expect(out).to include("overwrite skipped stubs, use --force")
+    end
+
+    context "when using --force" do
+      it "overrides the binstub" do
+        FileUtils.mkdir_p(bundled_app("bin"))
+        File.open(bundled_app("bin/rackup"), 'wb') do |file|
+          file.print "OMG"
+        end
+
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rack"
+        G
+
+        bundle "binstubs rack --force"
+
+        expect(bundled_app("bin/rackup")).to exist
+        expect(File.read(bundled_app("bin/rackup"))).not_to eq("OMG")
+      end
+    end
+  end
+
+  context "when the gem has no bins" do
+    it "suggests child gems if they have bins" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack-obama"
+      G
+
+      bundle "binstubs rack-obama"
+      expect(out).to include('rack-obama has no executables')
+      expect(out).to include('rack has: rackup')
+    end
+
+    it "works if child gems don't have bins" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "actionpack"
+      G
+
+      bundle "binstubs actionpack"
+      expect(out).to include('no executables for the gem actionpack')
+    end
+
+    it "works if the gem has development dependencies" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "with_development_dependency"
+      G
+
+      bundle "binstubs with_development_dependency"
+      expect(out).to include('no executables for the gem with_development_dependency')
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/bundle_ruby_spec.rb b/misc/lib/bundler-1.3.5/spec/other/bundle_ruby_spec.rb
new file mode 100644
index 0000000..164a23c
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/bundle_ruby_spec.rb
@@ -0,0 +1,112 @@
+require "spec_helper"
+
+describe "bundle_ruby" do
+  it "returns the ruby version" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      ruby "1.9.3", :engine => 'ruby', :engine_version => '1.9.3'
+
+      gem "foo"
+    G
+
+    bundle_ruby
+
+    expect(out).to eq("ruby 1.9.3")
+  end
+
+  it "engine defaults to MRI" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      ruby "1.9.3"
+
+      gem "foo"
+    G
+
+    bundle_ruby
+
+    expect(out).to eq("ruby 1.9.3")
+  end
+
+  it "handles jruby" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      ruby "1.8.7", :engine => 'jruby', :engine_version => '1.6.5'
+
+      gem "foo"
+    G
+
+    bundle_ruby
+
+    expect(out).to eq("ruby 1.8.7 (jruby 1.6.5)")
+  end
+
+  it "handles rbx" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      ruby "1.8.7", :engine => 'rbx', :engine_version => '1.2.4'
+
+      gem "foo"
+    G
+
+    bundle_ruby
+
+    expect(out).to eq("ruby 1.8.7 (rbx 1.2.4)")
+  end
+
+  it "raises an error if engine is used but engine version is not" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      ruby "1.8.7", :engine => 'rbx'
+
+      gem "foo"
+    G
+
+    bundle_ruby :exitstatus => true
+    expect(exitstatus).not_to eq(0)
+
+    bundle_ruby
+    expect(out).to eq("Please define :engine_version")
+  end
+
+  it "raises an error if engine_version is used but engine is not" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      ruby "1.8.7", :engine_version => '1.2.4'
+
+      gem "foo"
+    G
+
+    bundle_ruby :exitstatus => true
+    expect(exitstatus).not_to eq(0)
+
+    bundle_ruby
+    expect(out).to eq("Please define :engine")
+  end
+
+  it "raises an error if engine version doesn't match ruby version for mri" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      ruby "1.8.7", :engine => 'ruby', :engine_version => '1.2.4'
+
+      gem "foo"
+    G
+
+    bundle_ruby :exitstatus => true
+    expect(exitstatus).not_to eq(0)
+
+    bundle_ruby
+    expect(out).to eq("ruby_version must match the :engine_version for MRI")
+  end
+
+  it "should print if no ruby version is specified" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "foo"
+    G
+
+    bundle_ruby
+
+    expect(out).to eq("No ruby version specified")
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/check_spec.rb b/misc/lib/bundler-1.3.5/spec/other/check_spec.rb
new file mode 100644
index 0000000..5f36fa2
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/check_spec.rb
@@ -0,0 +1,278 @@
+require "spec_helper"
+
+describe "bundle check" do
+  it "returns success when the Gemfile is satisfied" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rails"
+    G
+
+    bundle :check, :exitstatus => true
+    expect(@exitstatus).to eq(0)
+    expect(out).to eq("The Gemfile's dependencies are satisfied")
+  end
+
+  it "works with the --gemfile flag when not in the directory" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rails"
+    G
+
+    Dir.chdir tmp
+    bundle "check --gemfile bundled_app/Gemfile"
+    expect(out).to eq("The Gemfile's dependencies are satisfied")
+  end
+
+  it "creates a Gemfile.lock by default if one did not exist" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rails"
+    G
+
+    FileUtils.rm("Gemfile.lock")
+
+    bundle "check"
+
+    expect(bundled_app("Gemfile.lock")).to exist
+  end
+
+  it "does not create a Gemfile.lock if --dry-run was passed" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rails"
+    G
+
+    FileUtils.rm("Gemfile.lock")
+
+    bundle "check --dry-run"
+
+    expect(bundled_app("Gemfile.lock")).not_to exist
+  end
+
+  it "prints a generic error if the missing gems are unresolvable" do
+    system_gems ["rails-2.3.2"]
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rails"
+    G
+
+    bundle :check
+    expect(out).to include("Bundler can't satisfy your Gemfile's dependencies.")
+  end
+
+  it "prints a generic error if a Gemfile.lock does not exist and a toplevel dependency does not exist" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rails"
+    G
+
+    bundle :check, :exitstatus => true
+    expect(@exitstatus).to be > 0
+    expect(out).to include("Bundler can't satisfy your Gemfile's dependencies.")
+  end
+
+  it "prints a generic message if you changed your lockfile" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem 'rails'
+    G
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem 'rails_fail'
+    G
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rails"
+      gem "rails_fail"
+    G
+
+    bundle :check
+    expect(out).to include("Bundler can't satisfy your Gemfile's dependencies.")
+  end
+
+  it "remembers --without option from install" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      group :foo do
+        gem "rack"
+      end
+    G
+
+    bundle "install --without foo"
+    bundle "check", :exitstatus => true
+    expect(@exitstatus).to eq(0)
+    expect(out).to include("The Gemfile's dependencies are satisfied")
+  end
+
+  it "ensures that gems are actually installed and not just cached" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack", :group => :foo
+    G
+
+    bundle "install --without foo"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+
+    bundle "check", :exitstatus => true
+    expect(out).to include("* rack (1.0.0)")
+    expect(@exitstatus).to eq(1)
+  end
+
+  it "ignores missing gems restricted to other platforms" do
+    system_gems "rack-1.0.0"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+      platforms :#{not_local_tag} do
+        gem "activesupport"
+      end
+    G
+
+    lockfile <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          activesupport (2.3.5)
+          rack (1.0.0)
+
+      PLATFORMS
+        #{local}
+        #{not_local}
+
+      DEPENDENCIES
+        rack
+        activesupport
+    G
+
+    bundle :check
+    expect(out).to eq("The Gemfile's dependencies are satisfied")
+  end
+
+  it "works with env conditionals" do
+    system_gems "rack-1.0.0"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+      env :NOT_GOING_TO_BE_SET do
+        gem "activesupport"
+      end
+    G
+
+    lockfile <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          activesupport (2.3.5)
+          rack (1.0.0)
+
+      PLATFORMS
+        #{local}
+        #{not_local}
+
+      DEPENDENCIES
+        rack
+        activesupport
+    G
+
+    bundle :check
+    expect(out).to eq("The Gemfile's dependencies are satisfied")
+  end
+
+  it "outputs an error when the default Gemfile is not found" do
+    bundle :check, :exitstatus => true
+    expect(@exitstatus).to eq(10)
+    expect(out).to include("Could not locate Gemfile")
+  end
+
+  it "does not output fatal error message" do
+    bundle :check, :exitstatus => true
+    expect(@exitstatus).to eq(10)
+    expect(out).not_to include("Unfortunately, a fatal error has occurred. ")
+  end
+
+  it "should not crash when called multiple times on a new machine" do
+    gemfile <<-G
+      gem 'rails', '3.0.0.beta3'
+      gem 'paperclip', :git => 'git://github.com/thoughtbot/paperclip.git'
+    G
+
+    simulate_new_machine
+    bundle "check"
+    last_out = out
+    3.times do |i|
+      bundle :check
+      expect(out).to eq(last_out)
+      expect(err).to be_empty
+    end
+  end
+
+  it "fails when there's no lock file and frozen is set" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "foo"
+    G
+
+    bundle "install"
+    bundle "install --deployment"
+    FileUtils.rm(bundled_app("Gemfile.lock"))
+
+    bundle :check, :exitstatus => true
+    expect(exitstatus).not_to eq(0)
+  end
+
+  context "--path" do
+    before do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rails"
+      G
+      bundle "install --path vendor/bundle"
+
+      FileUtils.rm_rf(bundled_app(".bundle"))
+    end
+
+    it "returns success" do
+      bundle "check --path vendor/bundle", :exitstatus => true
+      expect(@exitstatus).to eq(0)
+      expect(out).to eq("The Gemfile's dependencies are satisfied")
+    end
+
+    it "should write to .bundle/config" do
+      bundle "check --path vendor/bundle", :exitstatus => true
+      bundle "check", :exitstatus => true
+      expect(@exitstatus).to eq(0)
+    end
+  end
+
+  describe "when locked" do
+    before :each do
+      system_gems "rack-1.0.0"
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", "1.0"
+      G
+    end
+
+    it "returns success when the Gemfile is satisfied" do
+      bundle :install
+      bundle :check, :exitstatus => true
+      expect(@exitstatus).to eq(0)
+      expect(out).to eq("The Gemfile's dependencies are satisfied")
+    end
+
+    it "shows what is missing with the current Gemfile if it is not satisfied" do
+      simulate_new_machine
+      bundle :check
+      expect(out).to match(/The following gems are missing/)
+      expect(out).to include("* rack (1.0")
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/clean_spec.rb b/misc/lib/bundler-1.3.5/spec/other/clean_spec.rb
new file mode 100644
index 0000000..393902b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/clean_spec.rb
@@ -0,0 +1,592 @@
+require "spec_helper"
+
+describe "bundle clean" do
+  def should_have_gems(*gems)
+    gems.each do |g|
+      expect(vendored_gems("gems/#{g}")).to exist
+      expect(vendored_gems("specifications/#{g}.gemspec")).to exist
+      expect(vendored_gems("cache/#{g}.gem")).to exist
+    end
+  end
+
+  def should_not_have_gems(*gems)
+    gems.each do |g|
+      expect(vendored_gems("gems/#{g}")).not_to exist
+      expect(vendored_gems("specifications/#{g}.gemspec")).not_to exist
+      expect(vendored_gems("cache/#{g}.gem")).not_to exist
+    end
+  end
+
+  it "removes unused gems that are different" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "thin"
+      gem "foo"
+    G
+
+    bundle "install --path vendor/bundle --no-clean"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "thin"
+    G
+    bundle "install"
+
+    bundle :clean
+
+    expect(out).to eq("Removing foo (1.0)")
+
+    should_have_gems 'thin-1.0', 'rack-1.0.0'
+    should_not_have_gems 'foo-1.0'
+
+    expect(vendored_gems("bin/rackup")).to exist
+  end
+
+  it "removes old version of gem if unused" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack", "0.9.1"
+      gem "foo"
+    G
+
+    bundle "install --path vendor/bundle --no-clean"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack", "1.0.0"
+      gem "foo"
+    G
+    bundle "install"
+
+    bundle :clean
+
+    expect(out).to eq("Removing rack (0.9.1)")
+
+    should_have_gems 'foo-1.0', 'rack-1.0.0'
+    should_not_have_gems 'rack-0.9.1'
+
+    expect(vendored_gems("bin/rackup")).to exist
+  end
+
+  it "removes new version of gem if unused" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack", "1.0.0"
+      gem "foo"
+    G
+
+    bundle "install --path vendor/bundle --no-clean"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack", "0.9.1"
+      gem "foo"
+    G
+    bundle "install"
+
+    bundle :clean
+
+    expect(out).to eq("Removing rack (1.0.0)")
+
+    should_have_gems 'foo-1.0', 'rack-0.9.1'
+    should_not_have_gems 'rack-1.0.0'
+
+    expect(vendored_gems("bin/rackup")).to exist
+  end
+
+  it "remove gems in bundle without groups" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "foo"
+
+      group :test_group do
+        gem "rack", "1.0.0"
+      end
+    G
+
+    bundle "install --path vendor/bundle"
+    bundle "install --without test_group"
+    bundle :clean
+
+    expect(out).to eq("Removing rack (1.0.0)")
+
+    should_have_gems 'foo-1.0'
+    should_not_have_gems 'rack-1.0.0'
+
+    expect(vendored_gems("bin/rackup")).to_not exist
+  end
+
+  it "does not remove cached git dir if it's being used" do
+    build_git "foo"
+    revision = revision_for(lib_path("foo-1.0"))
+    git_path = lib_path('foo-1.0')
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack", "1.0.0"
+      git "#{git_path}", :ref => "#{revision}" do
+        gem "foo"
+      end
+    G
+
+    bundle "install --path vendor/bundle"
+
+    bundle :clean
+
+    digest = Digest::SHA1.hexdigest(git_path.to_s)
+    expect(vendored_gems("cache/bundler/git/foo-1.0-#{digest}")).to exist
+  end
+
+  it "removes unused git gems" do
+    build_git "foo", :path => lib_path("foo")
+    git_path = lib_path('foo')
+    revision = revision_for(git_path)
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack", "1.0.0"
+      git "#{git_path}", :ref => "#{revision}" do
+        gem "foo"
+      end
+    G
+
+    bundle "install --path vendor/bundle"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack", "1.0.0"
+    G
+    bundle "install"
+
+    bundle :clean
+
+    expect(out).to eq("Removing foo (#{revision[0..11]})")
+
+    expect(vendored_gems("gems/rack-1.0.0")).to exist
+    expect(vendored_gems("bundler/gems/foo-#{revision[0..11]}")).not_to exist
+    digest = Digest::SHA1.hexdigest(git_path.to_s)
+    expect(vendored_gems("cache/bundler/git/foo-#{digest}")).not_to exist
+
+    expect(vendored_gems("specifications/rack-1.0.0.gemspec")).to exist
+
+    expect(vendored_gems("bin/rackup")).to exist
+  end
+
+  it "removes old git gems" do
+    build_git "foo-bar", :path => lib_path("foo-bar")
+    revision = revision_for(lib_path("foo-bar"))
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack", "1.0.0"
+      git "#{lib_path('foo-bar')}" do
+        gem "foo-bar"
+      end
+    G
+
+    bundle "install --path vendor/bundle"
+
+    update_git "foo", :path => lib_path("foo-bar")
+    revision2 = revision_for(lib_path("foo-bar"))
+
+    bundle "update"
+    bundle :clean
+
+    expect(out).to eq("Removing foo-bar (#{revision[0..11]})")
+
+    expect(vendored_gems("gems/rack-1.0.0")).to exist
+    expect(vendored_gems("bundler/gems/foo-bar-#{revision[0..11]}")).not_to exist
+    expect(vendored_gems("bundler/gems/foo-bar-#{revision2[0..11]}")).to exist
+
+    expect(vendored_gems("specifications/rack-1.0.0.gemspec")).to exist
+
+    expect(vendored_gems("bin/rackup")).to exist
+  end
+
+  it "does not remove nested gems in a git repo" do
+    build_lib "activesupport", "3.0", :path => lib_path("rails/activesupport")
+    build_git "rails", "3.0", :path => lib_path("rails") do |s|
+      s.add_dependency "activesupport", "= 3.0"
+    end
+    revision = revision_for(lib_path("rails"))
+
+    gemfile <<-G
+      gem "activesupport", :git => "#{lib_path('rails')}", :ref => '#{revision}'
+    G
+
+    bundle "install --path vendor/bundle"
+    bundle :clean
+    expect(out).to eq("")
+
+    expect(vendored_gems("bundler/gems/rails-#{revision[0..11]}")).to exist
+  end
+
+  it "does not remove git sources that are in without groups" do
+    build_git "foo", :path => lib_path("foo")
+    git_path = lib_path('foo')
+    revision = revision_for(git_path)
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack", "1.0.0"
+      group :test do
+        git "#{git_path}", :ref => "#{revision}" do
+          gem "foo"
+        end
+      end
+    G
+    bundle "install --path vendor/bundle --without test"
+
+    bundle :clean
+
+    expect(out).to eq("")
+    expect(vendored_gems("bundler/gems/foo-#{revision[0..11]}")).to exist
+    digest = Digest::SHA1.hexdigest(git_path.to_s)
+    expect(vendored_gems("cache/bundler/git/foo-#{digest}")).to_not exist
+  end
+
+  it "does not blow up when using without groups" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack"
+
+      group :development do
+        gem "foo"
+      end
+    G
+
+    bundle "install --path vendor/bundle --without development"
+
+    bundle :clean, :exitstatus => true
+    expect(exitstatus).to eq(0)
+  end
+
+  it "displays an error when used without --path" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack", "1.0.0"
+    G
+
+    bundle :clean, :exitstatus => true
+
+    expect(exitstatus).to eq(1)
+    expect(out).to eq("Can only use bundle clean when --path is set or --force is set")
+  end
+
+  # handling bundle clean upgrade path from the pre's
+  it "removes .gem/.gemspec file even if there's no corresponding gem dir is already moved" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "thin"
+      gem "foo"
+    G
+
+    bundle "install --path vendor/bundle"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "foo"
+    G
+    bundle "install"
+
+    FileUtils.rm(vendored_gems("bin/rackup"))
+    FileUtils.rm_rf(vendored_gems("gems/thin-1.0"))
+    FileUtils.rm_rf(vendored_gems("gems/rack-1.0.0"))
+
+    bundle :clean
+
+    should_not_have_gems 'thin-1.0', 'rack-1.0'
+    should_have_gems 'foo-1.0'
+
+    expect(vendored_gems("bin/rackup")).not_to exist
+  end
+
+  it "does not call clean automatically when using system gems" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "thin"
+      gem "rack"
+    G
+    bundle :install
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack"
+    G
+    bundle :install
+
+    sys_exec "gem list"
+    expect(out).to include("rack (1.0.0)")
+    expect(out).to include("thin (1.0)")
+  end
+
+  it "--clean should override the bundle setting on install" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "thin"
+      gem "rack"
+    G
+    bundle "install --path vendor/bundle --clean"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack"
+    G
+    bundle "install"
+
+    should_have_gems 'rack-1.0.0'
+    should_not_have_gems 'thin-1.0'
+  end
+
+  it "--clean should override the bundle setting on update" do
+    build_repo2
+
+    gemfile <<-G
+      source "file://#{gem_repo2}"
+
+      gem "foo"
+    G
+    bundle "install --path vendor/bundle --clean"
+
+    update_repo2 do
+      build_gem 'foo', '1.0.1'
+    end
+
+    bundle "update"
+
+    should_have_gems 'foo-1.0.1'
+    should_not_have_gems 'foo-1.0'
+  end
+
+  it "does not clean automatically on --path" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "thin"
+      gem "rack"
+    G
+    bundle "install --path vendor/bundle"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack"
+    G
+    bundle "install"
+
+    should_have_gems 'rack-1.0.0', 'thin-1.0'
+  end
+
+  it "does not clean on bundle update with --path" do
+    build_repo2
+
+    gemfile <<-G
+      source "file://#{gem_repo2}"
+
+      gem "foo"
+    G
+    bundle "install --path vendor/bundle"
+
+    update_repo2 do
+      build_gem 'foo', '1.0.1'
+    end
+
+    bundle :update
+    should_have_gems 'foo-1.0', 'foo-1.0.1'
+  end
+
+  it "does not clean on bundle update when using --system" do
+    build_repo2
+
+    gemfile <<-G
+      source "file://#{gem_repo2}"
+
+      gem "foo"
+    G
+    bundle "install"
+
+    update_repo2 do
+      build_gem 'foo', '1.0.1'
+    end
+    bundle :update
+
+    sys_exec "gem list"
+    expect(out).to include("foo (1.0.1, 1.0)")
+  end
+
+  it "cleans system gems when --force is used" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "foo"
+      gem "rack"
+    G
+    bundle :install
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "rack"
+    G
+    bundle :install
+    bundle "clean --force"
+
+    expect(out).to eq("Removing foo (1.0)")
+    sys_exec "gem list"
+    expect(out).not_to include("foo (1.0)")
+    expect(out).to include("rack (1.0.0)")
+  end
+
+  it "cleans git gems with a 7 length git revision" do
+    build_git "foo"
+    revision = revision_for(lib_path("foo-1.0"))
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "foo", :git => "#{lib_path('foo-1.0')}"
+    G
+
+    bundle "install --path vendor/bundle"
+
+    # mimic 7 length git revisions in Gemfile.lock
+    gemfile_lock = File.read(bundled_app('Gemfile.lock')).split("\n")
+    gemfile_lock.each_with_index do |line, index|
+      gemfile_lock[index] = line[0..(11 + 7)] if line.include?("  revision:")
+    end
+    File.open(bundled_app('Gemfile.lock'), 'w') do |file|
+      file.print gemfile_lock.join("\n")
+    end
+
+    bundle "install --path vendor/bundle"
+
+    bundle :clean
+
+    expect(out).not_to include("Removing foo (1.0 #{revision[0..6]})")
+
+    expect(vendored_gems("bundler/gems/foo-1.0-#{revision[0..6]}")).to exist
+  end
+
+  it "when using --force on system gems, it doesn't remove binaries" do
+    build_repo2
+    update_repo2 do
+      build_gem 'bindir' do |s|
+        s.bindir = "exe"
+        s.executables = "foo"
+      end
+    end
+
+    gemfile <<-G
+      source "file://#{gem_repo2}"
+
+      gem "bindir"
+    G
+    bundle :install
+
+    bundle "clean --force"
+
+    sys_status "foo"
+
+    expect(exitstatus).to eq(0)
+    expect(out).to eq("1.0")
+  end
+
+  it "doesn't blow up on path gems without a .gempsec" do
+    relative_path = "vendor/private_gems/bar-1.0"
+    absolute_path = bundled_app(relative_path)
+    FileUtils.mkdir_p("#{absolute_path}/lib/bar")
+    File.open("#{absolute_path}/lib/bar/bar.rb", 'wb') do |file|
+      file.puts "module Bar; end"
+    end
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "foo"
+      gem "bar", "1.0", :path => "#{relative_path}"
+    G
+
+    bundle "install --path vendor/bundle"
+    bundle :clean, :exitstatus => true
+
+    expect(exitstatus).to eq(0)
+  end
+
+  it "doesn't remove gems in dry-run mode" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "thin"
+      gem "foo"
+    G
+
+    bundle "install --path vendor/bundle --no-clean"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "thin"
+    G
+
+    bundle :install
+
+    bundle "clean --dry-run"
+
+    expect(out).not_to eq("Removing foo (1.0)")
+    expect(out).to eq("Would have removed foo (1.0)")
+
+    should_have_gems 'thin-1.0', 'rack-1.0.0', 'foo-1.0'
+
+    expect(vendored_gems("bin/rackup")).to exist
+  end
+
+  it "doesn't store dry run as a config setting" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "thin"
+      gem "foo"
+    G
+
+    bundle "install --path vendor/bundle --no-clean"
+    bundle "config dry_run false"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      gem "thin"
+    G
+
+    bundle :install
+
+    bundle "clean"
+
+    expect(out).to eq("Removing foo (1.0)")
+    expect(out).not_to eq("Would have removed foo (1.0)")
+
+    should_have_gems 'thin-1.0', 'rack-1.0.0'
+    should_not_have_gems 'foo-1.0'
+
+    expect(vendored_gems("bin/rackup")).to exist
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/config_spec.rb b/misc/lib/bundler-1.3.5/spec/other/config_spec.rb
new file mode 100644
index 0000000..100889b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/config_spec.rb
@@ -0,0 +1,181 @@
+require "spec_helper"
+
+describe ".bundle/config" do
+  before :each do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack", "1.0.0"
+    G
+  end
+
+  describe "BUNDLE_APP_CONFIG" do
+    it "can be moved with an environment variable" do
+      ENV['BUNDLE_APP_CONFIG'] = tmp('foo/bar').to_s
+      bundle "install --path vendor/bundle"
+
+      expect(bundled_app('.bundle')).not_to exist
+      expect(tmp('foo/bar/config')).to exist
+      should_be_installed "rack 1.0.0"
+    end
+
+    it "can provide a relative path with the environment variable" do
+      FileUtils.mkdir_p bundled_app('omg')
+      Dir.chdir bundled_app('omg')
+
+      ENV['BUNDLE_APP_CONFIG'] = "../foo"
+      bundle "install --path vendor/bundle"
+
+      expect(bundled_app(".bundle")).not_to exist
+      expect(bundled_app("../foo/config")).to exist
+      should_be_installed "rack 1.0.0"
+    end
+
+    it "removes environment.rb from BUNDLE_APP_CONFIG's path" do
+      FileUtils.mkdir_p(tmp('foo/bar'))
+      ENV['BUNDLE_APP_CONFIG'] = tmp('foo/bar').to_s
+      bundle "install"
+      FileUtils.touch tmp('foo/bar/environment.rb')
+      should_be_installed "rack 1.0.0"
+      expect(tmp('foo/bar/environment.rb')).not_to exist
+    end
+  end
+
+  describe "global" do
+    before(:each) { bundle :install }
+
+    it "is the default" do
+      bundle "config foo global"
+      run "puts Bundler.settings[:foo]"
+      expect(out).to eq("global")
+    end
+
+    it "can also be set explicitly" do
+      bundle "config --global foo global"
+      run "puts Bundler.settings[:foo]"
+      expect(out).to eq("global")
+    end
+
+    it "has lower precedence than local" do
+      bundle "config --local  foo local"
+
+      bundle "config --global foo global"
+      expect(out).to match(/Your application has set foo to "local"/)
+
+      run "puts Bundler.settings[:foo]"
+      expect(out).to eq("local")
+    end
+
+    it "has lower precedence than env" do
+      begin
+        ENV["BUNDLE_FOO"] = "env"
+
+        bundle "config --global foo global"
+        expect(out).to match(/You have a bundler environment variable for foo set to "env"/)
+
+        run "puts Bundler.settings[:foo]"
+        expect(out).to eq("env")
+      ensure
+        ENV.delete("BUNDLE_FOO")
+      end
+    end
+
+    it "can be deleted" do
+      bundle "config --global foo global"
+      bundle "config --delete foo"
+
+      run "puts Bundler.settings[:foo] == nil"
+      expect(out).to eq("true")
+    end
+
+    it "warns when overriding" do
+      bundle "config --global foo previous"
+      bundle "config --global foo global"
+      expect(out).to match(/You are replacing the current global value of foo/)
+
+      run "puts Bundler.settings[:foo]"
+      expect(out).to eq("global")
+    end
+
+    it "expands the path at time of setting" do
+      bundle "config --global local.foo .."
+      run "puts Bundler.settings['local.foo']"
+      expect(out).to eq(File.expand_path(Dir.pwd + "/.."))
+    end
+  end
+
+  describe "local" do
+    before(:each) { bundle :install }
+
+    it "can also be set explicitly" do
+      bundle "config --local foo local"
+      run "puts Bundler.settings[:foo]"
+      expect(out).to eq("local")
+    end
+
+    it "has higher precedence than env" do
+      begin
+        ENV["BUNDLE_FOO"] = "env"
+        bundle "config --local foo local"
+
+        run "puts Bundler.settings[:foo]"
+        expect(out).to eq("local")
+      ensure
+        ENV.delete("BUNDLE_FOO")
+      end
+    end
+
+    it "can be deleted" do
+      bundle "config --local foo local"
+      bundle "config --delete foo"
+
+      run "puts Bundler.settings[:foo] == nil"
+      expect(out).to eq("true")
+    end
+
+    it "warns when overriding" do
+      bundle "config --local foo previous"
+      bundle "config --local foo local"
+      expect(out).to match(/You are replacing the current local value of foo/)
+
+      run "puts Bundler.settings[:foo]"
+      expect(out).to eq("local")
+    end
+
+    it "expands the path at time of setting" do
+      bundle "config --local local.foo .."
+      run "puts Bundler.settings['local.foo']"
+      expect(out).to eq(File.expand_path(Dir.pwd + "/.."))
+    end
+  end
+
+  describe "env" do
+    before(:each) { bundle :install }
+
+    it "can set boolean properties via the environment" do
+      ENV["BUNDLE_FROZEN"] = "true"
+
+      run "if Bundler.settings[:frozen]; puts 'true' else puts 'false' end"
+      expect(out).to eq("true")
+    end
+
+    it "can set negative boolean properties via the environment" do
+      run "if Bundler.settings[:frozen]; puts 'true' else puts 'false' end"
+      expect(out).to eq("false")
+
+      ENV["BUNDLE_FROZEN"] = "false"
+
+      run "if Bundler.settings[:frozen]; puts 'true' else puts 'false' end"
+      expect(out).to eq("false")
+
+      ENV["BUNDLE_FROZEN"] = "0"
+
+      run "if Bundler.settings[:frozen]; puts 'true' else puts 'false' end"
+      expect(out).to eq("false")
+
+      ENV["BUNDLE_FROZEN"] = ""
+
+      run "if Bundler.settings[:frozen]; puts 'true' else puts 'false' end"
+      expect(out).to eq("false")
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/console_spec.rb b/misc/lib/bundler-1.3.5/spec/other/console_spec.rb
new file mode 100644
index 0000000..b72883a
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/console_spec.rb
@@ -0,0 +1,54 @@
+require "spec_helper"
+
+describe "bundle console" do
+  before :each do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+      gem "activesupport", :group => :test
+      gem "rack_middleware", :group => :development
+    G
+  end
+
+  it "starts IRB with the default group loaded" do
+    bundle "console" do |input|
+      input.puts("puts RACK")
+      input.puts("exit")
+    end
+    expect(out).to include("0.9.1")
+  end
+
+  it "doesn't load any other groups" do
+    bundle "console" do |input|
+      input.puts("puts ACTIVESUPPORT")
+      input.puts("exit")
+    end
+    expect(out).to include("NameError")
+  end
+
+  describe "when given a group" do
+    it "loads the given group" do
+      bundle "console test" do |input|
+        input.puts("puts ACTIVESUPPORT")
+        input.puts("exit")
+      end
+      expect(out).to include("2.3.5")
+    end
+
+    it "loads the default group" do
+      bundle "console test" do |input|
+        input.puts("puts RACK")
+        input.puts("exit")
+      end
+      expect(out).to include("0.9.1")
+    end
+
+    it "doesn't load other groups" do
+      bundle "console test" do |input|
+        input.puts("puts RACK_MIDDLEWARE")
+        input.puts("exit")
+      end
+      expect(out).to include("NameError")
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/exec_spec.rb b/misc/lib/bundler-1.3.5/spec/other/exec_spec.rb
new file mode 100644
index 0000000..b550424
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/exec_spec.rb
@@ -0,0 +1,249 @@
+require "spec_helper"
+
+describe "bundle exec" do
+  before :each do
+    system_gems "rack-1.0.0", "rack-0.9.1"
+  end
+
+  it "activates the correct gem" do
+    gemfile <<-G
+      gem "rack", "0.9.1"
+    G
+
+    bundle "exec rackup"
+    expect(out).to eq("0.9.1")
+  end
+
+  it "works when the bins are in ~/.bundle" do
+    install_gemfile <<-G
+      gem "rack"
+    G
+
+    bundle "exec rackup"
+    expect(out).to eq("1.0.0")
+  end
+
+  it "works when running from a random directory" do
+    install_gemfile <<-G
+      gem "rack"
+    G
+
+    bundle "exec 'cd #{tmp('gems')} && rackup'"
+
+    expect(out).to eq("1.0.0")
+  end
+
+  it "works when exec'ing something else" do
+    install_gemfile 'gem "rack"'
+    bundle "exec echo exec"
+    expect(out).to eq("exec")
+  end
+
+  it "accepts --verbose" do
+    install_gemfile 'gem "rack"'
+    bundle "exec --verbose echo foobar"
+    expect(out).to eq("foobar")
+  end
+
+  it "passes --verbose to command if it is given after the command" do
+    install_gemfile 'gem "rack"'
+    bundle "exec echo --verbose"
+    expect(out).to eq("--verbose")
+  end
+
+  it "can run a command named --verbose" do
+    install_gemfile 'gem "rack"'
+    File.open("--verbose", 'w') do |f|
+      f.puts "#!/bin/sh"
+      f.puts "echo foobar"
+    end
+    File.chmod(0744, "--verbose")
+    ENV['PATH'] = "."
+    bundle "exec -- --verbose"
+    expect(out).to eq("foobar")
+  end
+
+  it "handles different versions in different bundles" do
+    build_repo2 do
+      build_gem "rack_two", "1.0.0" do |s|
+        s.executables = "rackup"
+      end
+    end
+
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack", "0.9.1"
+    G
+
+    Dir.chdir bundled_app2 do
+      install_gemfile bundled_app2('Gemfile'), <<-G
+        source "file://#{gem_repo2}"
+        gem "rack_two", "1.0.0"
+      G
+    end
+
+    bundle "exec rackup"
+
+    expect(out).to eq("0.9.1")
+
+    Dir.chdir bundled_app2 do
+      bundle "exec rackup"
+      expect(out).to eq("1.0.0")
+    end
+  end
+
+  it "handles gems installed with --without" do
+    install_gemfile <<-G, :without => :middleware
+      source "file://#{gem_repo1}"
+      gem "rack" # rack 0.9.1 and 1.0 exist
+
+      group :middleware do
+        gem "rack_middleware" # rack_middleware depends on rack 0.9.1
+      end
+    G
+
+    bundle "exec rackup"
+
+    expect(out).to eq("0.9.1")
+    should_not_be_installed "rack_middleware 1.0"
+  end
+
+  it "should not duplicate already exec'ed RUBYOPT or PATH" do
+    install_gemfile <<-G
+      gem "rack"
+    G
+
+    rubyopt = ENV['RUBYOPT']
+    rubyopt = "-I#{bundler_path} -rbundler/setup #{rubyopt}"
+
+    bundle "exec 'echo $RUBYOPT'"
+    expect(out).to have_rubyopts(rubyopt)
+
+    bundle "exec 'echo $RUBYOPT'", :env => {"RUBYOPT" => rubyopt}
+    expect(out).to have_rubyopts(rubyopt)
+  end
+
+  it "errors nicely when the argument doesn't exist" do
+    install_gemfile <<-G
+      gem "rack"
+    G
+
+    bundle "exec foobarbaz", :exitstatus => true
+    expect(exitstatus).to eq(127)
+    expect(out).to include("bundler: command not found: foobarbaz")
+    expect(out).to include("Install missing gem executables with `bundle install`")
+  end
+
+  it "errors nicely when the argument is not executable" do
+    install_gemfile <<-G
+      gem "rack"
+    G
+
+    bundle "exec touch foo"
+    bundle "exec ./foo", :exitstatus => true
+    expect(exitstatus).to eq(126)
+    expect(out).to include("bundler: not executable: ./foo")
+  end
+
+  it "errors nicely when no arguments are passed" do
+    install_gemfile <<-G
+      gem "rack"
+    G
+
+    bundle "exec", :exitstatus => true
+    expect(exitstatus).to eq(128)
+    expect(out).to include("bundler: exec needs a command to run")
+  end
+
+  describe "with gem executables" do
+    describe "run from a random directory" do
+      before(:each) do
+        install_gemfile <<-G
+          gem "rack"
+        G
+      end
+
+      it "works when unlocked" do
+        bundle "exec 'cd #{tmp('gems')} && rackup'"
+        expect(out).to eq("1.0.0")
+      end
+
+      it "works when locked" do
+        should_be_locked
+        bundle "exec 'cd #{tmp('gems')} && rackup'"
+        expect(out).to eq("1.0.0")
+      end
+    end
+
+    describe "from gems bundled via :path" do
+      before(:each) do
+        build_lib "fizz", :path => home("fizz") do |s|
+          s.executables = "fizz"
+        end
+
+        install_gemfile <<-G
+          gem "fizz", :path => "#{File.expand_path(home("fizz"))}"
+        G
+      end
+
+      it "works when unlocked" do
+        bundle "exec fizz"
+        expect(out).to eq("1.0")
+      end
+
+      it "works when locked" do
+        should_be_locked
+
+        bundle "exec fizz"
+        expect(out).to eq("1.0")
+      end
+    end
+
+    describe "from gems bundled via :git" do
+      before(:each) do
+        build_git "fizz_git" do |s|
+          s.executables = "fizz_git"
+        end
+
+        install_gemfile <<-G
+          gem "fizz_git", :git => "#{lib_path('fizz_git-1.0')}"
+        G
+      end
+
+      it "works when unlocked" do
+        bundle "exec fizz_git"
+        expect(out).to eq("1.0")
+      end
+
+      it "works when locked" do
+        should_be_locked
+        bundle "exec fizz_git"
+        expect(out).to eq("1.0")
+      end
+    end
+
+    describe "from gems bundled via :git with no gemspec" do
+      before(:each) do
+        build_git "fizz_no_gemspec", :gemspec => false do |s|
+          s.executables = "fizz_no_gemspec"
+        end
+
+        install_gemfile <<-G
+          gem "fizz_no_gemspec", "1.0", :git => "#{lib_path('fizz_no_gemspec-1.0')}"
+        G
+      end
+
+      it "works when unlocked" do
+        bundle "exec fizz_no_gemspec"
+        expect(out).to eq("1.0")
+      end
+
+      it "works when locked" do
+        should_be_locked
+        bundle "exec fizz_no_gemspec"
+        expect(out).to eq("1.0")
+      end
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/ext_spec.rb b/misc/lib/bundler-1.3.5/spec/other/ext_spec.rb
new file mode 100644
index 0000000..1509bc5
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/ext_spec.rb
@@ -0,0 +1,37 @@
+require 'spec_helper'
+
+describe "Gem::Specification#match_platform" do
+  it "does not match platforms other than the gem platform" do
+    darwin = gem "lol", "1.0", "platform_specific-1.0-x86-darwin-10"
+    expect(darwin.match_platform(pl('java'))).to be_false
+  end
+end
+
+describe "Bundler::GemHelpers#generic" do
+  include Bundler::GemHelpers
+
+  it "converts non-windows platforms into ruby" do
+    expect(generic(pl('x86-darwin-10'))).to eq(pl('ruby'))
+  end
+end
+
+describe "Gem::SourceIndex#refresh!" do
+  rubygems_1_7 = Gem::Version.new(Gem::VERSION) >= Gem::Version.new("1.7.0")
+
+  before do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+  end
+
+  it "does not explode when called", :if => rubygems_1_7 do
+    run "Gem.source_index.refresh!"
+    run "Gem::SourceIndex.new([]).refresh!"
+  end
+
+  it "does not explode when called", :unless => rubygems_1_7 do
+    run "Gem.source_index.refresh!"
+    run "Gem::SourceIndex.from_gems_in([]).refresh!"
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/help_spec.rb b/misc/lib/bundler-1.3.5/spec/other/help_spec.rb
new file mode 100644
index 0000000..73203f2
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/help_spec.rb
@@ -0,0 +1,39 @@
+require "spec_helper"
+
+describe "bundle help" do
+  # Rubygems 1.4+ no longer load gem plugins so this test is no longer needed
+  rubygems_under_14 = Gem::Requirement.new("< 1.4").satisfied_by?(Gem::Version.new(Gem::VERSION))
+  it "complains if older versions of bundler are installed", :if => rubygems_under_14 do
+    system_gems "bundler-0.8.1"
+
+    bundle "help", :expect_err => true
+    expect(err).to include("older than 0.9")
+    expect(err).to include("running `gem cleanup bundler`.")
+  end
+
+  it "uses groff when available" do
+    fake_groff!
+
+    bundle "help gemfile"
+    expect(out).to eq(%|["-Wall", "-mtty-char", "-mandoc", "-Tascii", "#{root}/lib/bundler/man/gemfile.5"]|)
+  end
+
+  it "prefixes bundle commands with bundle- when finding the groff files" do
+    fake_groff!
+
+    bundle "help install"
+    expect(out).to eq(%|["-Wall", "-mtty-char", "-mandoc", "-Tascii", "#{root}/lib/bundler/man/bundle-install"]|)
+  end
+
+  it "simply outputs the txt file when there is no groff on the path" do
+    kill_path!
+
+    bundle "help install", :expect_err => true
+    expect(out).to match(/BUNDLE-INSTALL/)
+  end
+
+  it "still outputs the old help for commands that do not have man pages yet" do
+    bundle "help check"
+    expect(out).to include("Check searches the local machine")
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/init_spec.rb b/misc/lib/bundler-1.3.5/spec/other/init_spec.rb
new file mode 100644
index 0000000..1c68646
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/init_spec.rb
@@ -0,0 +1,40 @@
+require "spec_helper"
+
+describe "bundle init" do
+  it "generates a Gemfile" do
+    bundle :init
+    expect(bundled_app("Gemfile")).to exist
+  end
+
+  it "does not change existing Gemfiles" do
+    gemfile <<-G
+      gem "rails"
+    G
+
+    expect {
+      bundle :init
+    }.not_to change { File.read(bundled_app("Gemfile")) }
+  end
+
+  it "should generate from an existing gemspec" do
+    spec_file = tmp.join('test.gemspec')
+    File.open(spec_file, 'w') do |file|
+      file << <<-S
+        Gem::Specification.new do |s|
+        s.name = 'test'
+        s.add_dependency 'rack', '= 1.0.1'
+        s.add_development_dependency 'rspec', '1.2'
+        end
+      S
+    end
+
+    bundle :init, :gemspec => spec_file
+
+    gemfile = bundled_app("Gemfile").read
+    expect(gemfile).to match(/source :gemcutter/)
+    expect(gemfile.scan(/gem "rack", "= 1.0.1"/).size).to eq(1)
+    expect(gemfile.scan(/gem "rspec", "= 1.2"/).size).to eq(1)
+    expect(gemfile.scan(/group :development/).size).to eq(1)
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/licenses_spec.rb b/misc/lib/bundler-1.3.5/spec/other/licenses_spec.rb
new file mode 100644
index 0000000..c8d5ff7
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/licenses_spec.rb
@@ -0,0 +1,18 @@
+require "spec_helper"
+
+describe "bundle licenses" do
+  before :each do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rails"
+      gem "with_license"
+    G
+  end
+
+  it "prints license information for all gems in the bundle" do
+    bundle "licenses"
+
+    expect(out).to include("actionpack: Unknown")
+    expect(out).to include("with_license: MIT")
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/newgem_spec.rb b/misc/lib/bundler-1.3.5/spec/other/newgem_spec.rb
new file mode 100644
index 0000000..7694e94
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/newgem_spec.rb
@@ -0,0 +1,403 @@
+require "spec_helper"
+
+describe "bundle gem" do
+  before do
+    @git_name = `git config --global user.name`.chomp
+    `git config --global user.name "Bundler User"`
+    @git_email = `git config --global user.email`.chomp
+    `git config --global user.email user at example.com`
+  end
+
+  after do
+    `git config --global user.name "#{@git_name}"`
+    `git config --global user.email #{@git_email}`
+  end
+
+  shared_examples_for "git config is present" do
+    context "git config user.{name,email} present" do
+      it "sets gemspec author to git user.name if available" do
+        expect(generated_gem.gemspec.authors.first).to eq("Bundler User")
+      end
+
+      it "sets gemspec email to git user.email if available" do
+        expect(generated_gem.gemspec.email.first).to eq("user at example.com")
+      end
+    end
+  end
+
+  shared_examples_for "git config is absent" do |hoge|
+    it "sets gemspec author to default message if git user.name is not set or empty" do
+      expect(generated_gem.gemspec.authors.first).to eq("TODO: Write your name")
+    end
+
+    it "sets gemspec email to default message if git user.email is not set or empty" do
+      expect(generated_gem.gemspec.email.first).to eq("TODO: Write your email address")
+    end
+  end
+
+  context "gem naming with underscore" do
+    let(:gem_name) { 'test_gem' }
+
+    before do
+      bundle "gem #{gem_name}"
+      # reset gemspec cache for each test because of commit 3d4163a
+      Bundler.clear_gemspec_cache
+    end
+
+    let(:generated_gem) { Bundler::GemHelper.new(bundled_app(gem_name).to_s) }
+
+    it "generates a gem skeleton" do
+      expect(bundled_app("test_gem/test_gem.gemspec")).to exist
+      expect(bundled_app("test_gem/LICENSE.txt")).to exist
+      expect(bundled_app("test_gem/Gemfile")).to exist
+      expect(bundled_app("test_gem/Rakefile")).to exist
+      expect(bundled_app("test_gem/lib/test_gem.rb")).to exist
+      expect(bundled_app("test_gem/lib/test_gem/version.rb")).to exist
+    end
+
+    it "starts with version 0.0.1" do
+      expect(bundled_app("test_gem/lib/test_gem/version.rb").read).to match(/VERSION = "0.0.1"/)
+    end
+
+    it "does not nest constants" do
+      expect(bundled_app("test_gem/lib/test_gem/version.rb").read).to match(/module TestGem/)
+      expect(bundled_app("test_gem/lib/test_gem.rb").read).to match(/module TestGem/)
+    end
+
+    it_should_behave_like "git config is present"
+
+    context "git config user.{name,email} is not set" do
+      before do
+        `git config --global --unset user.name`
+        `git config --global --unset user.email`
+        reset!
+        in_app_root
+        bundle "gem #{gem_name}"
+      end
+
+      it_should_behave_like "git config is absent"
+    end
+
+    it "sets gemspec license to MIT by default" do
+      expect(generated_gem.gemspec.license).to eq("MIT")
+    end
+
+    it "requires the version file" do
+      expect(bundled_app("test_gem/lib/test_gem.rb").read).to match(/require "test_gem\/version"/)
+    end
+
+    it "runs rake without problems" do
+      system_gems ["rake-10.0.2"]
+
+      rakefile = strip_whitespace <<-RAKEFILE
+        task :default do
+          puts 'SUCCESS'
+        end
+      RAKEFILE
+      File.open(bundled_app("test_gem/Rakefile"), 'w') do |file|
+        file.puts rakefile
+      end
+
+      Dir.chdir(bundled_app(gem_name)) do
+        sys_exec("rake")
+        expect(out).to include("SUCCESS")
+      end
+    end
+
+    context "--bin parameter set" do
+      before do
+        reset!
+        in_app_root
+        bundle "gem #{gem_name} --bin"
+      end
+
+      it "builds bin skeleton" do
+        expect(bundled_app("test_gem/bin/test_gem")).to exist
+      end
+
+      it "requires 'test-gem'" do
+        expect(bundled_app("test_gem/bin/test_gem").read).to match(/require 'test_gem'/)
+      end
+    end
+
+    context "no --test parameter" do
+      before do
+        reset!
+        in_app_root
+        bundle "gem #{gem_name}"
+      end
+
+      it "doesn't create any spec/test file" do
+        expect(bundled_app("test_gem/.rspec")).to_not exist
+        expect(bundled_app("test_gem/spec/test_gem_spec.rb")).to_not exist
+        expect(bundled_app("test_gem/spec/spec_helper.rb")).to_not exist
+        expect(bundled_app("test_gem/test/test_test_gem.rb")).to_not exist
+        expect(bundled_app("test_gem/test/minitest_helper.rb")).to_not exist
+      end
+    end
+
+    context "--test parameter set to rspec" do
+      before do
+        reset!
+        in_app_root
+        bundle "gem #{gem_name} --test=rspec"
+      end
+
+      it "builds spec skeleton" do
+        expect(bundled_app("test_gem/.rspec")).to exist
+        expect(bundled_app("test_gem/spec/test_gem_spec.rb")).to exist
+        expect(bundled_app("test_gem/spec/spec_helper.rb")).to exist
+      end
+
+      it "requires 'test-gem'" do
+        expect(bundled_app("test_gem/spec/spec_helper.rb").read).to match(/require 'test_gem'/)
+      end
+
+      it "creates a default test which fails" do
+        expect(bundled_app("test_gem/spec/test_gem_spec.rb").read).to match(/false.should be_true/)
+      end
+    end
+
+    context "--test parameter set to minitest" do
+      before do
+        reset!
+        in_app_root
+        bundle "gem #{gem_name} --test=minitest"
+      end
+
+      it "builds spec skeleton" do
+        expect(bundled_app("test_gem/test/test_test_gem.rb")).to exist
+        expect(bundled_app("test_gem/test/minitest_helper.rb")).to exist
+      end
+
+      it "requires 'test-gem'" do
+        expect(bundled_app("test_gem/test/minitest_helper.rb").read).to match(/require 'test_gem'/)
+      end
+
+      it "requires 'minitest_helper'" do
+        expect(bundled_app("test_gem/test/test_test_gem.rb").read).to match(/require 'minitest_helper'/)
+      end
+
+      it "creates a default test which fails" do
+        expect(bundled_app("test_gem/test/test_test_gem.rb").read).to match(/assert false/)
+      end
+    end
+
+    context "--test with no arguments" do
+      before do
+        reset!
+        in_app_root
+        bundle "gem #{gem_name} --test"
+      end
+
+      it "defaults to rspec" do
+        expect(bundled_app("test_gem/spec/spec_helper.rb")).to exist
+        expect(bundled_app("test_gem/test/minitest_helper.rb")).to_not exist
+      end
+
+      it "creates a .travis.yml file to test the library against the current Ruby version on Travis CI" do
+        expect(bundled_app("test_gem/.travis.yml").read).to match(%r(- #{RUBY_VERSION}))
+      end
+    end
+
+    context "--edit option" do
+      it "opens the generated gemspec in the user's text editor" do
+        reset!
+        in_app_root
+        output = bundle "gem #{gem_name} --edit=echo"
+        gemspec_path = File.join(Dir.pwd, gem_name, "#{gem_name}.gemspec")
+        expect(output).to include("echo \"#{gemspec_path}\"")
+      end
+    end
+  end
+
+  context "gem naming with dashed" do
+    let(:gem_name) { 'test-gem' }
+
+    before do
+      bundle "gem #{gem_name}"
+      # reset gemspec cache for each test because of commit 3d4163a
+      Bundler.clear_gemspec_cache
+    end
+
+    let(:generated_gem) { Bundler::GemHelper.new(bundled_app(gem_name).to_s) }
+
+    it "generates a gem skeleton" do
+      expect(bundled_app("test-gem/test-gem.gemspec")).to exist
+      expect(bundled_app("test-gem/LICENSE.txt")).to exist
+      expect(bundled_app("test-gem/Gemfile")).to exist
+      expect(bundled_app("test-gem/Rakefile")).to exist
+      expect(bundled_app("test-gem/lib/test/gem.rb")).to exist
+      expect(bundled_app("test-gem/lib/test/gem/version.rb")).to exist
+    end
+
+    it "starts with version 0.0.1" do
+      expect(bundled_app("test-gem/lib/test/gem/version.rb").read).to match(/VERSION = "0.0.1"/)
+    end
+
+    it "nests constants so they work" do
+      expect(bundled_app("test-gem/lib/test/gem/version.rb").read).to match(/module Test\n  module Gem/)
+      expect(bundled_app("test-gem/lib/test/gem.rb").read).to match(/module Test\n  module Gem/)
+    end
+
+    it_should_behave_like "git config is present"
+
+    context "git config user.{name,email} is not set" do
+      before do
+        `git config --global --unset user.name`
+        `git config --global --unset user.email`
+        reset!
+        in_app_root
+        bundle "gem #{gem_name}"
+      end
+
+      it_should_behave_like "git config is absent"
+    end
+
+    it "sets gemspec license to MIT by default" do
+      expect(generated_gem.gemspec.license).to eq("MIT")
+    end
+
+    it "requires the version file" do
+      expect(bundled_app("test-gem/lib/test/gem.rb").read).to match(/require "test\/gem\/version"/)
+    end
+
+    it "runs rake without problems" do
+      system_gems ["rake-10.0.2"]
+
+      rakefile = strip_whitespace <<-RAKEFILE
+        task :default do
+          puts 'SUCCESS'
+        end
+      RAKEFILE
+      File.open(bundled_app("test-gem/Rakefile"), 'w') do |file|
+        file.puts rakefile
+      end
+
+      Dir.chdir(bundled_app(gem_name)) do
+        sys_exec("rake")
+        expect(out).to include("SUCCESS")
+      end
+    end
+
+    context "--bin parameter set" do
+      before do
+        reset!
+        in_app_root
+        bundle "gem #{gem_name} --bin"
+      end
+
+      it "builds bin skeleton" do
+        expect(bundled_app("test-gem/bin/test-gem")).to exist
+      end
+
+      it "requires 'test/gem'" do
+        expect(bundled_app("test-gem/bin/test-gem").read).to match(/require 'test\/gem'/)
+      end
+    end
+
+    context "no --test parameter" do
+      before do
+        reset!
+        in_app_root
+        bundle "gem #{gem_name}"
+      end
+
+      it "doesn't create any spec/test file" do
+        expect(bundled_app("test-gem/.rspec")).to_not exist
+        expect(bundled_app("test-gem/spec/test/gem_spec.rb")).to_not exist
+        expect(bundled_app("test-gem/spec/spec_helper.rb")).to_not exist
+        expect(bundled_app("test-gem/test/test_test/gem.rb")).to_not exist
+        expect(bundled_app("test-gem/test/minitest_helper.rb")).to_not exist
+      end
+    end
+
+    context "--test parameter set to rspec" do
+      before do
+        reset!
+        in_app_root
+        bundle "gem #{gem_name} --test=rspec"
+      end
+
+      it "builds spec skeleton" do
+        expect(bundled_app("test-gem/.rspec")).to exist
+        expect(bundled_app("test-gem/spec/test/gem_spec.rb")).to exist
+        expect(bundled_app("test-gem/spec/spec_helper.rb")).to exist
+      end
+
+      it "requires 'test/gem'" do
+        expect(bundled_app("test-gem/spec/spec_helper.rb").read).to match(/require 'test\/gem'/)
+      end
+
+      it "creates a default test which fails" do
+        expect(bundled_app("test-gem/spec/test/gem_spec.rb").read).to match(/false.should be_true/)
+      end
+
+      it "creates a default rake task to run the specs" do
+        rakefile = strip_whitespace <<-RAKEFILE
+          require "bundler/gem_tasks"
+          require "rspec/core/rake_task"
+
+          RSpec::Core::RakeTask.new(:spec)
+
+          task :default => :spec
+        RAKEFILE
+
+        expect(bundled_app("test-gem/Rakefile").read).to eq(rakefile)
+      end
+    end
+
+    context "--test parameter set to minitest" do
+      before do
+        reset!
+        in_app_root
+        bundle "gem #{gem_name} --test=minitest"
+      end
+
+      it "builds spec skeleton" do
+        expect(bundled_app("test-gem/test/test_test/gem.rb")).to exist
+        expect(bundled_app("test-gem/test/minitest_helper.rb")).to exist
+      end
+
+      it "requires 'test/gem'" do
+        expect(bundled_app("test-gem/test/minitest_helper.rb").read).to match(/require 'test\/gem'/)
+      end
+
+      it "requires 'minitest_helper'" do
+        expect(bundled_app("test-gem/test/test_test/gem.rb").read).to match(/require 'minitest_helper'/)
+      end
+
+      it "creates a default test which fails" do
+        expect(bundled_app("test-gem/test/test_test/gem.rb").read).to match(/assert false/)
+      end
+
+      it "creates a default rake task to run the test suite" do
+        rakefile = strip_whitespace <<-RAKEFILE
+          require "bundler/gem_tasks"
+          require "rake/testtask"
+
+          Rake::TestTask.new(:test) do |t|
+            t.libs << "test"
+          end
+
+          task :default => :test
+        RAKEFILE
+
+        expect(bundled_app("test-gem/Rakefile").read).to eq(rakefile)
+      end
+    end
+
+    context "--test with no arguments" do
+      before do
+        reset!
+        in_app_root
+        bundle "gem #{gem_name} --test"
+      end
+
+      it "defaults to rspec" do
+        expect(bundled_app("test-gem/spec/spec_helper.rb")).to exist
+        expect(bundled_app("test-gem/test/minitest_helper.rb")).to_not exist
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/open_spec.rb b/misc/lib/bundler-1.3.5/spec/other/open_spec.rb
new file mode 100644
index 0000000..b586376
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/open_spec.rb
@@ -0,0 +1,55 @@
+require "spec_helper"
+
+describe "bundle open" do
+  before :each do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rails"
+    G
+  end
+
+  it "opens the gem with BUNDLER_EDITOR as highest priority" do
+    bundle "open rails", :env => {"EDITOR" => "echo editor", "VISUAL" => "echo visual", "BUNDLER_EDITOR" => "echo bundler_editor"}
+    expect(out).to eq("bundler_editor #{default_bundle_path('gems', 'rails-2.3.2')}")
+  end
+
+  it "opens the gem with VISUAL as 2nd highest priority" do
+    bundle "open rails", :env => {"EDITOR" => "echo editor", "VISUAL" => "echo visual", "BUNDLER_EDITOR" => ""}
+    expect(out).to eq("visual #{default_bundle_path('gems', 'rails-2.3.2')}")
+  end
+
+  it "opens the gem with EDITOR as 3rd highest priority" do
+    bundle "open rails", :env => {"EDITOR" => "echo editor", "VISUAL" => "", "BUNDLER_EDITOR" => ""}
+    expect(out).to eq("editor #{default_bundle_path('gems', 'rails-2.3.2')}")
+  end
+
+  it "complains if no EDITOR is set" do
+    bundle "open rails", :env => {"EDITOR" => "", "VISUAL" => "", "BUNDLER_EDITOR" => ""}
+    expect(out).to eq("To open a bundled gem, set $EDITOR or $BUNDLER_EDITOR")
+  end
+
+  it "complains if gem not in bundle" do
+    bundle "open missing", :env => {"EDITOR" => "echo editor", "VISUAL" => "", "BUNDLER_EDITOR" => ""}
+    expect(out).to match(/could not find gem 'missing'/i)
+  end
+
+  it "suggests alternatives for similar-sounding gems" do
+    bundle "open Rails", :env => {"EDITOR" => "echo editor", "VISUAL" => "", "BUNDLER_EDITOR" => ""}
+    expect(out).to match(/did you mean rails\?/i)
+  end
+
+  it "opens the gem with short words" do
+    bundle "open rec" , :env => {"EDITOR" => "echo editor", "VISUAL" => "echo visual", "BUNDLER_EDITOR" => "echo bundler_editor"}
+
+    expect(out).to eq("bundler_editor #{default_bundle_path('gems', 'activerecord-2.3.2')}")
+  end
+
+  it "select the gem from many match gems" do
+    env = {"EDITOR" => "echo editor", "VISUAL" => "echo visual", "BUNDLER_EDITOR" => "echo bundler_editor"}
+    bundle "open active" , :env => env do |input|
+      input.puts '2'
+    end
+
+    expect(out).to match(/bundler_editor #{default_bundle_path('gems', 'activerecord-2.3.2')}\z/)
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/outdated_spec.rb b/misc/lib/bundler-1.3.5/spec/other/outdated_spec.rb
new file mode 100644
index 0000000..54676fc
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/outdated_spec.rb
@@ -0,0 +1,118 @@
+require "spec_helper"
+
+describe "bundle outdated" do
+
+  before :each do
+    build_repo2 do
+      build_git "foo", :path => lib_path("foo")
+      build_git "zebra", :path => lib_path("zebra")
+    end
+
+    install_gemfile <<-G
+      source "file://#{gem_repo2}"
+      gem "zebra", :git => "#{lib_path('zebra')}"
+      gem "foo", :git => "#{lib_path('foo')}"
+      gem "activesupport", "2.3.5"
+    G
+  end
+
+  describe "with no arguments" do
+    it "returns a sorted list of outdated gems" do
+      update_repo2 do
+        build_gem "activesupport", "3.0"
+        update_git "foo", :path => lib_path("foo")
+        update_git "zebra", :path => lib_path("zebra")
+      end
+
+      bundle "outdated"
+
+      expect(out).to include("activesupport (3.0 > 2.3.5)")
+      expect(out).to include("foo (1.0")
+
+      # Gem names are one per-line, between "*" and their parenthesized version.
+      gem_list = out.split("\n").map { |g| g[ /\* (.*) \(/, 1] }.compact
+      expect(gem_list).to eq(gem_list.sort)
+    end
+
+    it "returns non zero exit status if outdated gems present" do
+      update_repo2 do
+        build_gem "activesupport", "3.0"
+        update_git "foo", :path => lib_path("foo")
+      end
+
+      bundle "outdated", :exitstatus => true
+
+      expect(exitstatus).to_not be_zero
+    end
+
+    it "returns success exit status if no outdated gems present" do
+      bundle "outdated", :exitstatus => true
+
+      expect(exitstatus).to be_zero
+    end
+  end
+
+  describe "with --local option" do
+    it "doesn't hit repo2" do
+      FileUtils.rm_rf(gem_repo2)
+
+      bundle "outdated --local"
+      expect(out).not_to match(/Fetching/)
+    end
+  end
+
+  describe "with specified gems" do
+    it "returns list of outdated gems" do
+      update_repo2 do
+        build_gem "activesupport", "3.0"
+        update_git "foo", :path => lib_path("foo")
+      end
+
+      bundle "outdated foo"
+      expect(out).not_to include("activesupport (3.0 > 2.3.5)")
+      expect(out).to include("foo (1.0")
+    end
+  end
+
+  describe "pre-release gems" do
+    context "without the --pre option" do
+      it "ignores pre-release versions" do
+        update_repo2 do
+          build_gem "activesupport", "3.0.0.beta"
+        end
+
+        bundle "outdated"
+        expect(out).not_to include("activesupport (3.0.0.beta > 2.3.5)")
+      end
+    end
+
+    context "with the --pre option" do
+      it "includes pre-release versions" do
+        update_repo2 do
+          build_gem "activesupport", "3.0.0.beta"
+        end
+
+        bundle "outdated --pre"
+        expect(out).to include("activesupport (3.0.0.beta > 2.3.5)")
+      end
+    end
+
+    context "when current gem is a pre-release" do
+      it "includes the gem" do
+        update_repo2 do
+          build_gem "activesupport", "3.0.0.beta.1"
+          build_gem "activesupport", "3.0.0.beta.2"
+        end
+
+        install_gemfile <<-G
+          source "file://#{gem_repo2}"
+          gem "activesupport", "3.0.0.beta.1"
+        G
+
+        bundle "outdated"
+        expect(out).to include("activesupport (3.0.0.beta.2 > 3.0.0.beta.1)")
+      end
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/platform_spec.rb b/misc/lib/bundler-1.3.5/spec/other/platform_spec.rb
new file mode 100644
index 0000000..f0329a5
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/platform_spec.rb
@@ -0,0 +1,1058 @@
+require "spec_helper"
+
+describe "bundle platform" do
+  context "without flags" do
+    it "returns all the output" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+
+        #{ruby_version_correct}
+
+        gem "foo"
+      G
+
+      bundle "platform"
+      expect(out).to eq(<<-G.chomp)
+Your platform is: #{RUBY_PLATFORM}
+
+Your app has gems that work on these platforms:
+* ruby
+
+Your Gemfile specifies a Ruby version requirement:
+* ruby #{RUBY_VERSION}
+
+Your current platform satisfies the Ruby version requirement.
+G
+    end
+
+    it "doesn't print ruby version requirement if it isn't specified" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+
+        gem "foo"
+      G
+
+      bundle "platform"
+      expect(out).to eq(<<-G.chomp)
+Your platform is: #{RUBY_PLATFORM}
+
+Your app has gems that work on these platforms:
+* ruby
+
+Your Gemfile does not specify a Ruby version requirement.
+G
+    end
+
+    it "doesn't match the ruby version requirement" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+
+        #{ruby_version_incorrect}
+
+        gem "foo"
+      G
+
+      bundle "platform"
+      expect(out).to eq(<<-G.chomp)
+Your platform is: #{RUBY_PLATFORM}
+
+Your app has gems that work on these platforms:
+* ruby
+
+Your Gemfile specifies a Ruby version requirement:
+* ruby #{not_local_ruby_version}
+
+Your Ruby version is #{RUBY_VERSION}, but your Gemfile specified #{not_local_ruby_version}
+G
+    end
+  end
+
+  context "--ruby" do
+    it "returns ruby version when explicit" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        ruby "1.9.3", :engine => 'ruby', :engine_version => '1.9.3'
+
+        gem "foo"
+      G
+
+      bundle "platform --ruby"
+
+      expect(out).to eq("ruby 1.9.3")
+    end
+
+    it "engine defaults to MRI" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        ruby "1.9.3"
+
+        gem "foo"
+      G
+
+      bundle "platform --ruby"
+
+      expect(out).to eq("ruby 1.9.3")
+    end
+
+    it "handles jruby" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        ruby "1.8.7", :engine => 'jruby', :engine_version => '1.6.5'
+
+        gem "foo"
+      G
+
+      bundle "platform --ruby"
+
+      expect(out).to eq("ruby 1.8.7 (jruby 1.6.5)")
+    end
+
+    it "handles rbx" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        ruby "1.8.7", :engine => 'rbx', :engine_version => '1.2.4'
+
+        gem "foo"
+      G
+
+      bundle "platform --ruby"
+
+      expect(out).to eq("ruby 1.8.7 (rbx 1.2.4)")
+    end
+
+    it "raises an error if engine is used but engine version is not" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        ruby "1.8.7", :engine => 'rbx'
+
+        gem "foo"
+      G
+
+      bundle "platform", :exitstatus => true
+
+      expect(exitstatus).not_to eq(0)
+    end
+
+    it "raises an error if engine_version is used but engine is not" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        ruby "1.8.7", :engine_version => '1.2.4'
+
+        gem "foo"
+      G
+
+      bundle "platform", :exitstatus => true
+
+      expect(exitstatus).not_to eq(0)
+    end
+
+    it "raises an error if engine version doesn't match ruby version for mri" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        ruby "1.8.7", :engine => 'ruby', :engine_version => '1.2.4'
+
+        gem "foo"
+      G
+
+      bundle "platform", :exitstatus => true
+
+      expect(exitstatus).not_to eq(0)
+    end
+
+    it "should print if no ruby version is specified" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+
+        gem "foo"
+      G
+
+      bundle "platform --ruby"
+      puts err
+
+      expect(out).to eq("No ruby version specified")
+    end
+  end
+
+  let(:ruby_version_correct) { "ruby \"#{RUBY_VERSION}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{local_engine_version}\"" }
+  let(:ruby_version_correct_engineless) { "ruby \"#{RUBY_VERSION}\"" }
+  let(:ruby_version_incorrect) { "ruby \"#{not_local_ruby_version}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{not_local_ruby_version}\"" }
+  let(:engine_incorrect) { "ruby \"#{RUBY_VERSION}\", :engine => \"#{not_local_tag}\", :engine_version => \"#{RUBY_VERSION}\"" }
+  let(:engine_version_incorrect) { "ruby \"#{RUBY_VERSION}\", :engine => \"#{local_ruby_engine}\", :engine_version => \"#{not_local_engine_version}\"" }
+
+  def should_be_ruby_version_incorrect(opts = {:exitstatus => true})
+    expect(exitstatus).to eq(18) if opts[:exitstatus]
+    expect(out).to be_include("Your Ruby version is #{RUBY_VERSION}, but your Gemfile specified #{not_local_ruby_version}")
+  end
+
+  def should_be_engine_incorrect(opts = {:exitstatus => true})
+    expect(exitstatus).to eq(18) if opts[:exitstatus]
+    expect(out).to be_include("Your Ruby engine is #{local_ruby_engine}, but your Gemfile specified #{not_local_tag}")
+  end
+
+  def should_be_engine_version_incorrect(opts = {:exitstatus => true})
+    expect(exitstatus).to eq(18) if opts[:exitstatus]
+    expect(out).to be_include("Your #{local_ruby_engine} version is #{local_engine_version}, but your Gemfile specified #{local_ruby_engine} #{not_local_engine_version}")
+  end
+
+  context "bundle install" do
+    it "installs fine when the ruby version matches" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+
+        #{ruby_version_correct}
+      G
+
+      expect(bundled_app('Gemfile.lock')).to exist
+    end
+
+    it "installs fine with any engine" do
+      simulate_ruby_engine "jruby" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rack"
+
+          #{ruby_version_correct_engineless}
+        G
+
+        expect(bundled_app('Gemfile.lock')).to exist
+      end
+    end
+
+    it "doesn't install when the ruby version doesn't match" do
+      install_gemfile <<-G, :exitstatus => true
+        source "file://#{gem_repo1}"
+        gem "rack"
+
+        #{ruby_version_incorrect}
+      G
+
+      expect(bundled_app('Gemfile.lock')).not_to exist
+      should_be_ruby_version_incorrect
+    end
+
+    it "doesn't install when engine doesn't match" do
+      install_gemfile <<-G, :exitstatus => true
+        source "file://#{gem_repo1}"
+        gem "rack"
+
+        #{engine_incorrect}
+      G
+
+      expect(bundled_app('Gemfile.lock')).not_to exist
+      should_be_engine_incorrect
+    end
+
+    it "doesn't install when engine version doesn't match" do
+      simulate_ruby_engine "jruby" do
+        install_gemfile <<-G, :exitstatus => true
+          source "file://#{gem_repo1}"
+          gem "rack"
+
+          #{engine_version_incorrect}
+        G
+
+        expect(bundled_app('Gemfile.lock')).not_to exist
+        should_be_engine_version_incorrect
+      end
+    end
+  end
+
+  context "bundle check" do
+    it "checks fine when the ruby version matches" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+
+        #{ruby_version_correct}
+      G
+
+      bundle :check, :exitstatus => true
+      expect(exitstatus).to eq(0)
+      expect(out).to eq("The Gemfile's dependencies are satisfied")
+    end
+
+    it "checks fine with any engine" do
+      simulate_ruby_engine "jruby" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rack"
+        G
+
+        gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rack"
+
+          #{ruby_version_correct_engineless}
+        G
+
+        bundle :check, :exitstatus => true
+        expect(exitstatus).to eq(0)
+        expect(out).to eq("The Gemfile's dependencies are satisfied")
+      end
+    end
+
+    it "fails when ruby version doesn't match" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+
+        #{ruby_version_incorrect}
+      G
+
+      bundle :check, :exitstatus => true
+      should_be_ruby_version_incorrect
+    end
+
+    it "fails when engine doesn't match" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+
+        #{engine_incorrect}
+      G
+
+      bundle :check, :exitstatus => true
+      should_be_engine_incorrect
+    end
+
+    it "fails when engine version doesn't match" do
+      simulate_ruby_engine "ruby" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rack"
+        G
+
+        gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rack"
+
+          #{engine_version_incorrect}
+        G
+
+        bundle :check, :exitstatus => true
+        should_be_engine_version_incorrect
+      end
+    end
+  end
+
+  context "bundle update" do
+    before do
+      build_repo2
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "activesupport"
+        gem "rack-obama"
+      G
+    end
+
+    it "updates successfully when the ruby version matches" do
+      gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "activesupport"
+        gem "rack-obama"
+
+        #{ruby_version_correct}
+      G
+      update_repo2 do
+        build_gem "activesupport", "3.0"
+      end
+
+      bundle "update"
+      should_be_installed "rack 1.2", "rack-obama 1.0", "activesupport 3.0"
+    end
+
+    it "updates fine with any engine" do
+      simulate_ruby_engine "jruby" do
+        gemfile <<-G
+          source "file://#{gem_repo2}"
+          gem "activesupport"
+          gem "rack-obama"
+
+          #{ruby_version_correct_engineless}
+        G
+        update_repo2 do
+          build_gem "activesupport", "3.0"
+        end
+
+        bundle "update"
+        should_be_installed "rack 1.2", "rack-obama 1.0", "activesupport 3.0"
+      end
+    end
+
+    it "fails when ruby version doesn't match" do
+      gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "activesupport"
+        gem "rack-obama"
+
+        #{ruby_version_incorrect}
+      G
+      update_repo2 do
+        build_gem "activesupport", "3.0"
+      end
+
+      bundle :update, :exitstatus => true
+      should_be_ruby_version_incorrect
+    end
+
+    it "fails when ruby engine doesn't match" do
+      gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "activesupport"
+        gem "rack-obama"
+
+        #{engine_incorrect}
+      G
+      update_repo2 do
+        build_gem "activesupport", "3.0"
+      end
+
+      bundle :update, :exitstatus => true
+      should_be_engine_incorrect
+    end
+
+    it "fails when ruby engine version doesn't match" do
+      simulate_ruby_engine "jruby" do
+        gemfile <<-G
+          source "file://#{gem_repo2}"
+          gem "activesupport"
+          gem "rack-obama"
+
+          #{engine_version_incorrect}
+        G
+        update_repo2 do
+          build_gem "activesupport", "3.0"
+        end
+
+        bundle :update, :exitstatus => true
+        should_be_engine_version_incorrect
+      end
+    end
+  end
+
+  context "bundle show" do
+    before do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rails"
+      G
+    end
+
+    it "prints path if ruby version is correct" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rails"
+
+        #{ruby_version_correct}
+      G
+
+      bundle "show rails"
+      expect(out).to eq(default_bundle_path('gems', 'rails-2.3.2').to_s)
+    end
+
+    it "prints path if ruby version is correct for any engine" do
+      simulate_ruby_engine "jruby" do
+        gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rails"
+
+          #{ruby_version_correct_engineless}
+        G
+
+        bundle "show rails"
+        expect(out).to eq(default_bundle_path('gems', 'rails-2.3.2').to_s)
+      end
+    end
+
+    it "fails if ruby version doesn't match" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rails"
+
+        #{ruby_version_incorrect}
+      G
+
+      bundle "show rails", :exitstatus => true
+      should_be_ruby_version_incorrect
+    end
+
+    it "fails if engine doesn't match" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rails"
+
+        #{engine_incorrect}
+      G
+
+      bundle "show rails", :exitstatus => true
+      should_be_engine_incorrect
+    end
+
+    it "fails if engine version doesn't match" do
+      simulate_ruby_engine "jruby" do
+        gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rails"
+
+          #{engine_version_incorrect}
+        G
+
+        bundle "show rails", :exitstatus => true
+        should_be_engine_version_incorrect
+      end
+    end
+  end
+
+  context "bundle cache" do
+    before do
+      gemfile <<-G
+        gem 'rack'
+      G
+
+      system_gems "rack-1.0.0"
+    end
+
+    it "copies the .gem file to vendor/cache when ruby version matches" do
+      gemfile <<-G
+        gem 'rack'
+
+        #{ruby_version_correct}
+      G
+
+      bundle :cache
+      expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
+    end
+
+    it "copies the .gem file to vendor/cache when ruby version matches for any engine" do
+      simulate_ruby_engine "jruby" do
+        gemfile <<-G
+          gem 'rack'
+
+          #{ruby_version_correct_engineless}
+        G
+
+        bundle :cache
+        expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
+      end
+    end
+
+    it "fails if the ruby version doesn't match" do
+      gemfile <<-G
+        gem 'rack'
+
+        #{ruby_version_incorrect}
+      G
+
+      bundle :cache, :exitstatus => true
+      should_be_ruby_version_incorrect
+    end
+
+    it "fails if the engine doesn't match" do
+      gemfile <<-G
+        gem 'rack'
+
+        #{engine_incorrect}
+      G
+
+      bundle :cache, :exitstatus => true
+      should_be_engine_incorrect
+    end
+
+    it "fails if the engine version doesn't match" do
+      simulate_ruby_engine "jruby" do
+        gemfile <<-G
+        gem 'rack'
+
+        #{engine_version_incorrect}
+        G
+
+        bundle :cache, :exitstatus => true
+        should_be_engine_version_incorrect
+      end
+    end
+  end
+
+  context "bundle pack" do
+    before do
+      gemfile <<-G
+        gem 'rack'
+      G
+
+      system_gems "rack-1.0.0"
+    end
+
+    it "copies the .gem file to vendor/cache when ruby version matches" do
+      gemfile <<-G
+        gem 'rack'
+
+        #{ruby_version_correct}
+      G
+
+      bundle :pack
+      expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
+    end
+
+    it "copies the .gem file to vendor/cache when ruby version matches any engine" do
+      simulate_ruby_engine "jruby" do
+        gemfile <<-G
+          gem 'rack'
+
+          #{ruby_version_correct_engineless}
+        G
+
+        bundle :pack
+        expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
+      end
+    end
+
+    it "fails if the ruby version doesn't match" do
+      gemfile <<-G
+        gem 'rack'
+
+        #{ruby_version_incorrect}
+      G
+
+      bundle :pack, :exitstatus => true
+      should_be_ruby_version_incorrect
+    end
+
+    it "fails if the engine doesn't match" do
+      gemfile <<-G
+        gem 'rack'
+
+        #{engine_incorrect}
+      G
+
+      bundle :pack, :exitstatus => true
+      should_be_engine_incorrect
+    end
+
+    it "fails if the engine version doesn't match" do
+      simulate_ruby_engine "jruby" do
+        gemfile <<-G
+        gem 'rack'
+
+        #{engine_version_incorrect}
+        G
+
+        bundle :pack, :exitstatus => true
+        should_be_engine_version_incorrect
+      end
+    end
+  end
+
+  context "bundle exec" do
+    before do
+      system_gems "rack-1.0.0", "rack-0.9.1"
+    end
+
+    it "activates the correct gem when ruby version matches" do
+      gemfile <<-G
+        gem "rack", "0.9.1"
+
+        #{ruby_version_correct}
+      G
+
+      bundle "exec rackup"
+      expect(out).to eq("0.9.1")
+    end
+
+    it "activates the correct gem when ruby version matches any engine" do
+      simulate_ruby_engine "jruby" do
+        gemfile <<-G
+          gem "rack", "0.9.1"
+
+          #{ruby_version_correct_engineless}
+        G
+
+        bundle "exec rackup"
+        expect(out).to eq("0.9.1")
+      end
+    end
+
+    it "fails when the ruby version doesn't match" do
+      gemfile <<-G
+        gem "rack", "0.9.1"
+
+        #{ruby_version_incorrect}
+      G
+
+      bundle "exec rackup", :exitstatus => true
+      should_be_ruby_version_incorrect
+    end
+
+    it "fails when the engine doesn't match" do
+      gemfile <<-G
+        gem "rack", "0.9.1"
+
+        #{engine_incorrect}
+      G
+
+      bundle "exec rackup", :exitstatus => true
+      should_be_engine_incorrect
+    end
+
+    it "fails when the engine version doesn't match" do
+      simulate_ruby_engine "jruby" do
+        gemfile <<-G
+          gem "rack", "0.9.1"
+
+          #{engine_version_incorrect}
+        G
+
+        bundle "exec rackup", :exitstatus => true
+        should_be_engine_version_incorrect
+      end
+    end
+  end
+
+  context "bundle console" do
+    before do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "activesupport", :group => :test
+        gem "rack_middleware", :group => :development
+      G
+    end
+
+    it "starts IRB with the default group loaded when ruby version matches" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "activesupport", :group => :test
+        gem "rack_middleware", :group => :development
+
+        #{ruby_version_correct}
+      G
+
+      bundle "console" do |input|
+        input.puts("puts RACK")
+        input.puts("exit")
+      end
+      expect(out).to include("0.9.1")
+    end
+
+    it "starts IRB with the default group loaded when ruby version matches any engine" do
+      simulate_ruby_engine "jruby" do
+        gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rack"
+          gem "activesupport", :group => :test
+          gem "rack_middleware", :group => :development
+
+          #{ruby_version_correct_engineless}
+        G
+
+        bundle "console" do |input|
+          input.puts("puts RACK")
+          input.puts("exit")
+        end
+        expect(out).to include("0.9.1")
+      end
+    end
+
+    it "fails when ruby version doesn't match" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "activesupport", :group => :test
+        gem "rack_middleware", :group => :development
+
+        #{ruby_version_incorrect}
+      G
+
+      bundle "console", :exitstatus => true
+      should_be_ruby_version_incorrect
+    end
+
+    it "fails when engine doesn't match" do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+        gem "activesupport", :group => :test
+        gem "rack_middleware", :group => :development
+
+        #{engine_incorrect}
+      G
+
+      bundle "console", :exitstatus => true
+      should_be_engine_incorrect
+    end
+
+    it "fails when engine version doesn't match" do
+      simulate_ruby_engine "jruby" do
+        gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rack"
+          gem "activesupport", :group => :test
+          gem "rack_middleware", :group => :development
+
+          #{engine_version_incorrect}
+        G
+
+        bundle "console", :exitstatus => true
+        should_be_engine_version_incorrect
+      end
+    end
+  end
+
+  context "Bundler.setup" do
+    before do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "yard"
+        gem "rack", :group => :test
+      G
+    end
+
+    it "makes a Gemfile.lock if setup succeeds" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "yard"
+        gem "rack"
+
+        #{ruby_version_correct}
+      G
+
+      File.read(bundled_app("Gemfile.lock"))
+
+      FileUtils.rm(bundled_app("Gemfile.lock"))
+
+      run "1"
+      expect(bundled_app("Gemfile.lock")).to exist
+    end
+
+    it "makes a Gemfile.lock if setup succeeds for any engine" do
+      simulate_ruby_engine "jruby" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "yard"
+          gem "rack"
+
+          #{ruby_version_correct_engineless}
+        G
+
+        File.read(bundled_app("Gemfile.lock"))
+
+        FileUtils.rm(bundled_app("Gemfile.lock"))
+
+        run "1"
+        expect(bundled_app("Gemfile.lock")).to exist
+      end
+    end
+
+    it "fails when ruby version doesn't match" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "yard"
+        gem "rack"
+
+        #{ruby_version_incorrect}
+      G
+
+      File.read(bundled_app("Gemfile.lock"))
+
+      FileUtils.rm(bundled_app("Gemfile.lock"))
+
+      ruby <<-R
+        require 'rubygems'
+        require 'bundler'
+
+        begin
+          Bundler.setup
+        rescue Bundler::RubyVersionMismatch => e
+          puts e.message
+        end
+      R
+
+      expect(bundled_app("Gemfile.lock")).not_to exist
+      should_be_ruby_version_incorrect(:exitstatus => false)
+    end
+
+    it "fails when engine doesn't match" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "yard"
+        gem "rack"
+
+        #{engine_incorrect}
+      G
+
+      File.read(bundled_app("Gemfile.lock"))
+
+      FileUtils.rm(bundled_app("Gemfile.lock"))
+
+      ruby <<-R
+        require 'rubygems'
+        require 'bundler'
+
+        begin
+          Bundler.setup
+        rescue Bundler::RubyVersionMismatch => e
+          puts e.message
+        end
+      R
+
+      expect(bundled_app("Gemfile.lock")).not_to exist
+      should_be_engine_incorrect(:exitstatus => false)
+    end
+
+    it "fails when engine version doesn't match" do
+      simulate_ruby_engine "jruby" do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "yard"
+          gem "rack"
+
+          #{engine_version_incorrect}
+        G
+
+        File.read(bundled_app("Gemfile.lock"))
+
+        FileUtils.rm(bundled_app("Gemfile.lock"))
+
+        ruby <<-R
+          require 'rubygems'
+          require 'bundler'
+
+          begin
+            Bundler.setup
+          rescue Bundler::RubyVersionMismatch => e
+            puts e.message
+          end
+        R
+
+        expect(bundled_app("Gemfile.lock")).not_to exist
+        should_be_engine_version_incorrect(:exitstatus => false)
+      end
+    end
+  end
+
+  context "bundle outdated" do
+    before do
+      build_repo2 do
+        build_git "foo", :path => lib_path("foo")
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "activesupport", "2.3.5"
+        gem "foo", :git => "#{lib_path('foo')}"
+      G
+    end
+
+    it "returns list of outdated gems when the ruby version matches" do
+      update_repo2 do
+        build_gem "activesupport", "3.0"
+        update_git "foo", :path => lib_path("foo")
+      end
+
+      gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "activesupport", "2.3.5"
+        gem "foo", :git => "#{lib_path('foo')}"
+
+        #{ruby_version_correct}
+      G
+
+      bundle "outdated"
+      expect(out).to include("activesupport (3.0 > 2.3.5)")
+      expect(out).to include("foo (1.0")
+    end
+
+    it "returns list of outdated gems when the ruby version matches for any engine" do
+      simulate_ruby_engine "jruby" do
+        update_repo2 do
+          build_gem "activesupport", "3.0"
+          update_git "foo", :path => lib_path("foo")
+        end
+
+        gemfile <<-G
+          source "file://#{gem_repo2}"
+          gem "activesupport", "2.3.5"
+          gem "foo", :git => "#{lib_path('foo')}"
+
+          #{ruby_version_correct_engineless}
+        G
+
+        bundle "outdated"
+        expect(out).to include("activesupport (3.0 > 2.3.5)")
+        expect(out).to include("foo (1.0")
+      end
+    end
+
+    it "fails when the ruby version doesn't match" do
+      update_repo2 do
+        build_gem "activesupport", "3.0"
+        update_git "foo", :path => lib_path("foo")
+      end
+
+      gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "activesupport", "2.3.5"
+        gem "foo", :git => "#{lib_path('foo')}"
+
+        #{ruby_version_incorrect}
+      G
+
+      bundle "outdated", :exitstatus => true
+      should_be_ruby_version_incorrect
+    end
+
+    it "fails when the engine doesn't match" do
+      update_repo2 do
+        build_gem "activesupport", "3.0"
+        update_git "foo", :path => lib_path("foo")
+      end
+
+      gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "activesupport", "2.3.5"
+        gem "foo", :git => "#{lib_path('foo')}"
+
+        #{engine_incorrect}
+      G
+
+      bundle "outdated", :exitstatus => true
+      should_be_engine_incorrect
+    end
+
+    it "fails when the engine version doesn't match" do
+      simulate_ruby_engine "jruby" do
+        update_repo2 do
+          build_gem "activesupport", "3.0"
+          update_git "foo", :path => lib_path("foo")
+        end
+
+        gemfile <<-G
+          source "file://#{gem_repo2}"
+          gem "activesupport", "2.3.5"
+          gem "foo", :git => "#{lib_path('foo')}"
+
+          #{engine_version_incorrect}
+        G
+
+        bundle "outdated", :exitstatus => true
+        should_be_engine_version_incorrect
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/other/show_spec.rb b/misc/lib/bundler-1.3.5/spec/other/show_spec.rb
new file mode 100644
index 0000000..bdd3a1f
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/other/show_spec.rb
@@ -0,0 +1,102 @@
+require "spec_helper"
+
+describe "bundle show" do
+  before :each do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rails"
+    G
+  end
+
+  it "creates a Gemfile.lock if one did not exist" do
+    FileUtils.rm("Gemfile.lock")
+
+    bundle "show"
+
+    expect(bundled_app("Gemfile.lock")).to exist
+  end
+
+  it "creates a Gemfile.lock when invoked with a gem name" do
+    FileUtils.rm("Gemfile.lock")
+
+    bundle "show rails"
+
+    expect(bundled_app("Gemfile.lock")).to exist
+  end
+
+  it "prints path if gem exists in bundle" do
+    bundle "show rails"
+    expect(out).to eq(default_bundle_path('gems', 'rails-2.3.2').to_s)
+  end
+
+  it "warns if path no longer exists on disk" do
+    FileUtils.rm_rf("#{system_gem_path}/gems/rails-2.3.2")
+
+    bundle "show rails"
+
+    expect(out).to match(/has been deleted/i)
+    expect(out).to include(default_bundle_path('gems', 'rails-2.3.2').to_s)
+  end
+
+  it "prints the path to the running bundler" do
+    bundle "show bundler"
+    expect(out).to eq(File.expand_path('../../../', __FILE__))
+  end
+
+  it "complains if gem not in bundle" do
+    bundle "show missing"
+    expect(out).to match(/could not find gem 'missing'/i)
+  end
+
+  it "prints path of all gems in bundle sorted by name" do
+    bundle "show --paths"
+
+    expect(out).to include(default_bundle_path('gems', 'rake-10.0.2').to_s)
+    expect(out).to include(default_bundle_path('gems', 'rails-2.3.2').to_s)
+
+    # Gem names are the last component of their path.
+    gem_list = out.split.map { |p| p.split('/').last }
+    expect(gem_list).to eq(gem_list.sort)
+  end
+end
+
+describe "bundle show with a git repo" do
+  before :each do
+    @git = build_git "foo", "1.0"
+  end
+
+  it "prints out git info" do
+    install_gemfile <<-G
+      gem "foo", :git => "#{lib_path('foo-1.0')}"
+    G
+    should_be_installed "foo 1.0"
+
+    bundle :show
+    expect(out).to include("foo (1.0 #{@git.ref_for('master', 6)}")
+  end
+
+  it "prints out branch names other than master" do
+    update_git "foo", :branch => "omg" do |s|
+      s.write "lib/foo.rb", "FOO = '1.0.omg'"
+    end
+    @revision = revision_for(lib_path("foo-1.0"))[0...6]
+
+    install_gemfile <<-G
+      gem "foo", :git => "#{lib_path('foo-1.0')}", :branch => "omg"
+    G
+    should_be_installed "foo 1.0.omg"
+
+    bundle :show
+    expect(out).to include("foo (1.0 #{@git.ref_for('omg', 6)}")
+  end
+
+  it "doesn't print the branch when tied to a ref" do
+    sha = revision_for(lib_path("foo-1.0"))
+    install_gemfile <<-G
+      gem "foo", :git => "#{lib_path('foo-1.0')}", :ref => "#{sha}"
+    G
+
+    bundle :show
+    expect(out).to include("foo (1.0 #{sha[0..6]})")
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/quality_spec.rb b/misc/lib/bundler-1.3.5/spec/quality_spec.rb
new file mode 100644
index 0000000..a9d3d6f
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/quality_spec.rb
@@ -0,0 +1,62 @@
+require "spec_helper"
+
+if defined?(Encoding) && Encoding.default_external != "UTF-8"
+  Encoding.default_external = "UTF-8"
+end
+
+describe "The library itself" do
+  def check_for_tab_characters(filename)
+    failing_lines = []
+    File.readlines(filename).each_with_index do |line,number|
+      failing_lines << number + 1 if line =~ /\t/
+    end
+
+    unless failing_lines.empty?
+      "#{filename} has tab characters on lines #{failing_lines.join(', ')}"
+    end
+  end
+
+  def check_for_extra_spaces(filename)
+    failing_lines = []
+    File.readlines(filename).each_with_index do |line,number|
+      next if line =~ /^\s+#.*\s+\n$/
+      failing_lines << number + 1 if line =~ /\s+\n$/
+    end
+
+    unless failing_lines.empty?
+      "#{filename} has spaces on the EOL on lines #{failing_lines.join(', ')}"
+    end
+  end
+
+  RSpec::Matchers.define :be_well_formed do
+    failure_message_for_should do |actual|
+      actual.join("\n")
+    end
+
+    match do |actual|
+      actual.empty?
+    end
+  end
+
+  it "has no malformed whitespace" do
+    error_messages = []
+    Dir.chdir(File.expand_path("../..", __FILE__)) do
+      `git ls-files`.split("\n").each do |filename|
+        next if filename =~ /\.gitmodules|\.marshal|fixtures|vendor|ssl_certs/
+        error_messages << check_for_tab_characters(filename)
+        error_messages << check_for_extra_spaces(filename)
+      end
+    end
+    expect(error_messages.compact).to be_well_formed
+  end
+
+  it "can still be built" do
+    Dir.chdir(root) do
+      `gem build bundler.gemspec`
+      expect($?).to eq(0)
+
+      # clean up the .gem generated
+      system("rm bundler-#{Bundler::VERSION}.gem")
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/realworld/dependency_api_spec.rb b/misc/lib/bundler-1.3.5/spec/realworld/dependency_api_spec.rb
new file mode 100644
index 0000000..ad4756c
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/realworld/dependency_api_spec.rb
@@ -0,0 +1,61 @@
+require "spec_helper"
+
+describe "gemcutter's dependency API", :realworld => true do
+  def wait_for_server(port, seconds = 15)
+    tries = 0
+    TCPSocket.new("127.0.0.1", port)
+  rescue => e
+    raise(e) if tries > (seconds * 2)
+    tries += 1
+    sleep 0.5
+    retry
+  end
+
+  context "when Gemcutter API takes too long to respond" do
+    before do
+      # need to hack, so we can require rack
+      old_gem_home = ENV['GEM_HOME']
+      ENV['GEM_HOME'] = Spec::Path.base_system_gems.to_s
+      require 'rack'
+      ENV['GEM_HOME'] = old_gem_home
+
+      port = 21453
+      port += 1 while TCPSocket.new("127.0.0.1", port) rescue false
+      @server_uri = "http://127.0.0.1:#{port}"
+
+      require File.expand_path('../../support/artifice/endpoint_timeout', __FILE__)
+      require 'thread'
+      @t = Thread.new {
+        server = Rack::Server.start(:app       => EndpointTimeout,
+                                    :Host      => '0.0.0.0',
+                                    :Port      => port,
+                                    :server    => 'webrick',
+                                    :AccessLog => [])
+        server.start
+      }
+      @t.run
+
+      wait_for_server(port)
+    end
+
+    after do
+      @t.kill
+    end
+
+    it "times out and falls back on the modern index" do
+      gemfile <<-G
+        source "#{@server_uri}"
+        gem "rack"
+
+        old_v, $VERBOSE = $VERBOSE, nil
+        Bundler::Fetcher::API_TIMEOUT = 1
+        $VERBOSE = old_v
+      G
+
+      bundle :install
+      expect(out).to include("Fetching source index from #{@server_uri}/")
+      should_be_installed "rack 1.0.0"
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/realworld/edgecases_spec.rb b/misc/lib/bundler-1.3.5/spec/realworld/edgecases_spec.rb
new file mode 100644
index 0000000..57c2252
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/realworld/edgecases_spec.rb
@@ -0,0 +1,177 @@
+require 'spec_helper'
+
+describe "real world edgecases", :realworld => true do
+  # there is no rbx-relative-require gem that will install on 1.9
+  it "ignores extra gems with bad platforms", :ruby => "1.8" do
+    install_gemfile <<-G
+      source :rubygems
+      gem "linecache", "0.46"
+    G
+    expect(err).to eq("")
+  end
+
+  # https://github.com/carlhuda/bundler/issues/1202
+  it "bundle cache works with rubygems 1.3.7 and pre gems", :ruby => "1.8" do
+    install_gemfile <<-G
+      source :rubygems
+      gem "rack",          "1.3.0.beta2"
+      gem "will_paginate", "3.0.pre2"
+    G
+    bundle :cache
+    expect(out).not_to include("Removing outdated .gem files from vendor/cache")
+  end
+
+  # https://github.com/carlhuda/bundler/issues/1486
+  # this is a hash collision that only manifests on 1.8.7
+  it "finds the correct child versions", :ruby => "1.8" do
+    install_gemfile <<-G
+      source :rubygems
+
+      gem 'i18n', '~> 0.4'
+      gem 'activesupport', '~> 3.0'
+      gem 'activerecord', '~> 3.0'
+      gem 'builder', '~> 2.1.2'
+    G
+    expect(out).to include("activemodel (3.0.5)")
+  end
+
+  # https://github.com/carlhuda/bundler/issues/1500
+  it "does not fail install because of gem plugins" do
+    realworld_system_gems("open_gem --version 1.4.2", "rake --version 0.9.2")
+    gemfile <<-G
+      source :rubygems
+
+      gem 'rack', '1.0.1'
+    G
+
+    bundle "install --path vendor/bundle", :expect_err => true
+    expect(err).not_to include("Could not find rake")
+    expect(err).to be_empty
+  end
+
+  it "checks out git repos when the lockfile is corrupted" do
+    gemfile <<-G
+      source :rubygems
+
+      gem 'activerecord',  :github => 'carlhuda/rails-bundler-test', :branch => 'master'
+      gem 'activesupport', :github => 'carlhuda/rails-bundler-test', :branch => 'master'
+      gem 'actionpack',    :github => 'carlhuda/rails-bundler-test', :branch => 'master'
+    G
+
+    lockfile <<-L
+      GIT
+        remote: git://github.com/carlhuda/rails-bundler-test.git
+        revision: 369e28a87419565f1940815219ea9200474589d4
+        branch: master
+        specs:
+          actionpack (3.2.2)
+            activemodel (= 3.2.2)
+            activesupport (= 3.2.2)
+            builder (~> 3.0.0)
+            erubis (~> 2.7.0)
+            journey (~> 1.0.1)
+            rack (~> 1.4.0)
+            rack-cache (~> 1.2)
+            rack-test (~> 0.6.1)
+            sprockets (~> 2.1.2)
+          activemodel (3.2.2)
+            activesupport (= 3.2.2)
+            builder (~> 3.0.0)
+          activerecord (3.2.2)
+            activemodel (= 3.2.2)
+            activesupport (= 3.2.2)
+            arel (~> 3.0.2)
+            tzinfo (~> 0.3.29)
+          activesupport (3.2.2)
+            i18n (~> 0.6)
+            multi_json (~> 1.0)
+
+      GIT
+        remote: git://github.com/carlhuda/rails-bundler-test.git
+        revision: 369e28a87419565f1940815219ea9200474589d4
+        branch: master
+        specs:
+          actionpack (3.2.2)
+            activemodel (= 3.2.2)
+            activesupport (= 3.2.2)
+            builder (~> 3.0.0)
+            erubis (~> 2.7.0)
+            journey (~> 1.0.1)
+            rack (~> 1.4.0)
+            rack-cache (~> 1.2)
+            rack-test (~> 0.6.1)
+            sprockets (~> 2.1.2)
+          activemodel (3.2.2)
+            activesupport (= 3.2.2)
+            builder (~> 3.0.0)
+          activerecord (3.2.2)
+            activemodel (= 3.2.2)
+            activesupport (= 3.2.2)
+            arel (~> 3.0.2)
+            tzinfo (~> 0.3.29)
+          activesupport (3.2.2)
+            i18n (~> 0.6)
+            multi_json (~> 1.0)
+
+      GIT
+        remote: git://github.com/carlhuda/rails-bundler-test.git
+        revision: 369e28a87419565f1940815219ea9200474589d4
+        branch: master
+        specs:
+          actionpack (3.2.2)
+            activemodel (= 3.2.2)
+            activesupport (= 3.2.2)
+            builder (~> 3.0.0)
+            erubis (~> 2.7.0)
+            journey (~> 1.0.1)
+            rack (~> 1.4.0)
+            rack-cache (~> 1.2)
+            rack-test (~> 0.6.1)
+            sprockets (~> 2.1.2)
+          activemodel (3.2.2)
+            activesupport (= 3.2.2)
+            builder (~> 3.0.0)
+          activerecord (3.2.2)
+            activemodel (= 3.2.2)
+            activesupport (= 3.2.2)
+            arel (~> 3.0.2)
+            tzinfo (~> 0.3.29)
+          activesupport (3.2.2)
+            i18n (~> 0.6)
+            multi_json (~> 1.0)
+
+      GEM
+        remote: https://rubygems.org/
+        specs:
+          arel (3.0.2)
+          builder (3.0.0)
+          erubis (2.7.0)
+          hike (1.2.1)
+          i18n (0.6.0)
+          journey (1.0.3)
+          multi_json (1.1.0)
+          rack (1.4.1)
+          rack-cache (1.2)
+            rack (>= 0.4)
+          rack-test (0.6.1)
+            rack (>= 1.0)
+          sprockets (2.1.2)
+            hike (~> 1.2)
+            rack (~> 1.0)
+            tilt (~> 1.1, != 1.3.0)
+          tilt (1.3.3)
+          tzinfo (0.3.32)
+
+      PLATFORMS
+        ruby
+
+      DEPENDENCIES
+        actionpack!
+        activerecord!
+        activesupport!
+    L
+
+    bundle :install, :exitstatus => true
+    expect(exitstatus).to eq(0)
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/resolver/basic_spec.rb b/misc/lib/bundler-1.3.5/spec/resolver/basic_spec.rb
new file mode 100644
index 0000000..6371dc5
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/resolver/basic_spec.rb
@@ -0,0 +1,26 @@
+require "spec_helper"
+
+describe "Resolving" do
+
+  before :each do
+    @index = an_awesome_index
+  end
+
+  it "resolves a single gem" do
+    dep "rack"
+
+    should_resolve_as %w(rack-1.1)
+  end
+
+  it "resolves a gem with dependencies" do
+    dep "actionpack"
+
+    should_resolve_as %w(actionpack-2.3.5 activesupport-2.3.5 rack-1.0)
+  end
+
+  it "resolve a conflicting index" do
+    @index = a_conflict_index
+    dep "my_app"
+    should_resolve_as %w(activemodel-3.2.11 builder-3.0.4 grape-0.2.6 my_app-1.0.0)
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/resolver/platform_spec.rb b/misc/lib/bundler-1.3.5/spec/resolver/platform_spec.rb
new file mode 100644
index 0000000..7608d57
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/resolver/platform_spec.rb
@@ -0,0 +1,82 @@
+require "spec_helper"
+
+describe "Resolving platform craziness" do
+  describe "with cross-platform gems" do
+    before :each do
+      @index = an_awesome_index
+    end
+
+    it "resolves a simple multi platform gem" do
+      dep "nokogiri"
+      platforms "ruby", "java"
+
+      should_resolve_as %w(nokogiri-1.4.2 nokogiri-1.4.2-java weakling-0.0.3)
+    end
+
+    it "doesn't pull gems that don't exist for the current platform" do
+      dep "nokogiri"
+      platforms "ruby"
+
+      should_resolve_as %w(nokogiri-1.4.2)
+    end
+
+    it "doesn't pull gems when the version is available for all requested platforms" do
+      dep "nokogiri"
+      platforms "mswin32"
+
+      should_resolve_as %w(nokogiri-1.4.2.1-x86-mswin32)
+    end
+  end
+
+  describe "with mingw32" do
+
+    before :each do
+      @index = build_index do
+        platforms "mingw32 mswin32" do |platform|
+          gem "thin", "1.2.7", platform
+        end
+      end
+    end
+
+    it "finds mswin gems" do
+      # win32 is hardcoded to get CPU x86 in rubygems
+      platforms "mswin32"
+      dep "thin"
+      should_resolve_as %w(thin-1.2.7-x86-mswin32)
+    end
+
+    it "finds mingw gems" do
+      # mingw is _not_ hardcoded to add CPU x86 in rubygems
+      platforms "x86-mingw32"
+      dep "thin"
+      should_resolve_as %w(thin-1.2.7-x86-mingw32)
+    end
+  end
+
+  describe "with conflicting cases" do
+    before :each do
+      @index = build_index do
+        gem "foo", "1.0.0" do
+          dep "bar", ">= 0"
+        end
+
+        gem 'bar', "1.0.0" do
+          dep "baz", "~> 1.0.0"
+        end
+
+        gem "bar", "1.0.0", "java" do
+          dep "baz", " ~> 1.1.0"
+        end
+
+        gem "baz", %w(1.0.0 1.1.0 1.2.0)
+      end
+    end
+
+    it "reports on the conflict" do
+      platforms "ruby", "java"
+      dep "foo"
+
+      should_conflict_on "baz"
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/runtime/executable_spec.rb b/misc/lib/bundler-1.3.5/spec/runtime/executable_spec.rb
new file mode 100644
index 0000000..ad43c05
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/runtime/executable_spec.rb
@@ -0,0 +1,149 @@
+require "spec_helper"
+
+describe "Running bin/* commands" do
+  before :each do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+  end
+
+  it "runs the bundled command when in the bundle" do
+    bundle "install --binstubs"
+
+    build_gem "rack", "2.0", :to_system => true do |s|
+      s.executables = "rackup"
+    end
+
+    gembin "rackup"
+    expect(out).to eq("1.0.0")
+  end
+
+  it "allows the location of the gem stubs to be specified" do
+    bundle "install --binstubs gbin"
+
+    expect(bundled_app("bin")).not_to exist
+    expect(bundled_app("gbin/rackup")).to exist
+
+    gembin bundled_app("gbin/rackup")
+    expect(out).to eq("1.0.0")
+  end
+
+  it "allows absolute paths as a specification of where to install bin stubs" do
+    bundle "install --binstubs #{tmp}/bin"
+
+    gembin tmp("bin/rackup")
+    expect(out).to eq("1.0.0")
+  end
+
+  it "uses the default ruby install name when shebang is not specified" do
+   bundle "install --binstubs"
+   expect(File.open("bin/rackup").gets).to eq("#!/usr/bin/env #{RbConfig::CONFIG['ruby_install_name']}\n")
+  end
+
+  it "allows the name of the shebang executable to be specified" do
+    bundle "install --binstubs --shebang ruby-foo"
+    expect(File.open("bin/rackup").gets).to eq("#!/usr/bin/env ruby-foo\n")
+  end
+
+  it "runs the bundled command when out of the bundle" do
+    bundle "install --binstubs"
+
+    build_gem "rack", "2.0", :to_system => true do |s|
+      s.executables = "rackup"
+    end
+
+    Dir.chdir(tmp) do
+      gembin "rackup"
+      expect(out).to eq("1.0.0")
+    end
+  end
+
+  it "works with gems in path" do
+    build_lib "rack", :path => lib_path("rack") do |s|
+      s.executables = 'rackup'
+    end
+
+    gemfile <<-G
+      gem "rack", :path => "#{lib_path('rack')}"
+    G
+
+    bundle "install --binstubs"
+
+    build_gem 'rack', '2.0', :to_system => true do |s|
+      s.executables = 'rackup'
+    end
+
+    gembin "rackup"
+    expect(out).to eq('1.0')
+  end
+
+  it "don't bundle da bundla" do
+    build_gem "bundler", Bundler::VERSION, :to_system => true do |s|
+      s.executables = "bundle"
+    end
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "bundler"
+    G
+
+    bundle "install --binstubs"
+
+    expect(bundled_app("bin/bundle")).not_to exist
+  end
+
+  it "does not generate bin stubs if the option was not specified" do
+    bundle "install"
+
+    expect(bundled_app("bin/rackup")).not_to exist
+  end
+
+  it "allows you to stop installing binstubs" do
+    bundle "install --binstubs bin/"
+    bundled_app("bin/rackup").rmtree
+    bundle "install --binstubs \"\""
+
+    expect(bundled_app("bin/rackup")).not_to exist
+    #expect(bundled_app("rackup")).not_to exist
+
+    bundle "config bin"
+    expect(out).to include("You have not configured a value for `bin`")
+  end
+
+  it "remembers that the option was specified" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "activesupport"
+    G
+
+    bundle "install --binstubs"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "activesupport"
+      gem "rack"
+    G
+
+    bundle "install"
+
+    expect(bundled_app("bin/rackup")).to exist
+  end
+
+  it "rewrites bins on --binstubs (to maintain backwards compatibility)" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+
+    bundle "install --binstubs bin/"
+
+    File.open(bundled_app("bin/rackup"), 'wb') do |file|
+      file.print "OMG"
+    end
+
+    bundle "install"
+
+    expect(bundled_app("bin/rackup").read).to_not eq("OMG")
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/runtime/load_spec.rb b/misc/lib/bundler-1.3.5/spec/runtime/load_spec.rb
new file mode 100644
index 0000000..086145d
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/runtime/load_spec.rb
@@ -0,0 +1,107 @@
+require "spec_helper"
+
+describe "Bundler.load" do
+  before :each do
+    system_gems "rack-1.0.0"
+    # clear memoized method results
+    # TODO: Don't reset internal ivars
+    Bundler.instance_eval do
+      @load = nil
+      @runtime = nil
+      @definition = nil
+    end
+  end
+
+  describe "with a gemfile" do
+    before(:each) do
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+    end
+
+    it "provides a list of the env dependencies" do
+      expect(Bundler.load.dependencies).to have_dep("rack", ">= 0")
+    end
+
+    it "provides a list of the resolved gems" do
+      expect(Bundler.load.gems).to have_gem("rack-1.0.0", "bundler-#{Bundler::VERSION}")
+    end
+
+    it "ignores blank BUNDLE_GEMFILEs" do
+      expect {
+        ENV['BUNDLE_GEMFILE'] = ""
+        Bundler.load
+      }.not_to raise_error(Bundler::GemfileNotFound)
+    end
+
+  end
+
+  describe "without a gemfile" do
+    it "raises an exception if the default gemfile is not found" do
+      expect {
+        Bundler.load
+      }.to raise_error(Bundler::GemfileNotFound, /could not locate gemfile/i)
+    end
+
+    it "raises an exception if a specified gemfile is not found" do
+      expect {
+        ENV['BUNDLE_GEMFILE'] = "omg.rb"
+        Bundler.load
+      }.to raise_error(Bundler::GemfileNotFound, /omg\.rb/)
+    end
+
+    it "does not find a Gemfile above the testing directory" do
+      bundler_gemfile = tmp.join("../Gemfile")
+      unless File.exists?(bundler_gemfile)
+        FileUtils.touch(bundler_gemfile)
+        @remove_bundler_gemfile = true
+      end
+      begin
+        expect { Bundler.load }.to raise_error(Bundler::GemfileNotFound)
+      ensure
+        bundler_gemfile.rmtree if @remove_bundler_gemfile
+      end
+    end
+
+  end
+
+  describe "when called twice" do
+    it "doesn't try to load the runtime twice" do
+      system_gems "rack-1.0.0", "activesupport-2.3.5"
+      gemfile <<-G
+        gem "rack"
+        gem "activesupport", :group => :test
+      G
+
+      ruby <<-RUBY
+        require "bundler"
+        Bundler.setup :default
+        Bundler.require :default
+        puts RACK
+        begin
+          require "activesupport"
+        rescue LoadError
+          puts "no activesupport"
+        end
+      RUBY
+
+      expect(out.split("\n")).to eq(["1.0.0", "no activesupport"])
+    end
+  end
+
+  describe "not hurting brittle rubygems" do
+    it "does not inject #source into the generated YAML of the gem specs" do
+      system_gems "activerecord-2.3.2", "activesupport-2.3.2"
+      gemfile <<-G
+        gem "activerecord"
+      G
+
+      Bundler.load.specs.each do |spec|
+        expect(spec.to_yaml).not_to match(/^\s+source:/)
+        expect(spec.to_yaml).not_to match(/^\s+groups:/)
+      end
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/runtime/platform_spec.rb b/misc/lib/bundler-1.3.5/spec/runtime/platform_spec.rb
new file mode 100644
index 0000000..1f9e2ec
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/runtime/platform_spec.rb
@@ -0,0 +1,90 @@
+require "spec_helper"
+
+describe "Bundler.setup with multi platform stuff" do
+  it "raises a friendly error when gems are missing locally" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+
+    lockfile <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          rack (1.0)
+
+      PLATFORMS
+        #{local_tag}
+
+      DEPENDENCIES
+        rack
+    G
+
+    ruby <<-R
+      begin
+        require 'bundler'
+        Bundler.setup
+      rescue Bundler::GemNotFound => e
+        puts "WIN"
+      end
+    R
+
+    expect(out).to eq("WIN")
+  end
+
+  it "will resolve correctly on the current platform when the lockfile was targetted for a different one" do
+    lockfile <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          nokogiri (1.4.2-java)
+            weakling (= 0.0.3)
+          weakling (0.0.3)
+
+      PLATFORMS
+        java
+
+      DEPENDENCIES
+        nokogiri
+    G
+
+    system_gems "nokogiri-1.4.2"
+
+    simulate_platform "x86-darwin-10"
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "nokogiri"
+    G
+
+    should_be_installed "nokogiri 1.4.2"
+  end
+
+  it "will add the resolve for the current platform" do
+    lockfile <<-G
+      GEM
+        remote: file:#{gem_repo1}/
+        specs:
+          nokogiri (1.4.2-java)
+            weakling (= 0.0.3)
+          weakling (0.0.3)
+
+      PLATFORMS
+        java
+
+      DEPENDENCIES
+        nokogiri
+    G
+
+    system_gems "nokogiri-1.4.2", "platform_specific-1.0-x86-darwin-100"
+
+    simulate_platform "x86-darwin-100"
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "nokogiri"
+      gem "platform_specific"
+    G
+
+    should_be_installed "nokogiri 1.4.2", "platform_specific 1.0 x86-darwin-100"
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/runtime/require_spec.rb b/misc/lib/bundler-1.3.5/spec/runtime/require_spec.rb
new file mode 100644
index 0000000..db72ff7
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/runtime/require_spec.rb
@@ -0,0 +1,323 @@
+require "spec_helper"
+
+describe "Bundler.require" do
+  before :each do
+    build_lib "one", "1.0.0" do |s|
+      s.write "lib/baz.rb", "puts 'baz'"
+      s.write "lib/qux.rb", "puts 'qux'"
+    end
+
+    build_lib "two", "1.0.0" do |s|
+      s.write "lib/two.rb", "puts 'two'"
+      s.add_dependency "three", "= 1.0.0"
+    end
+
+    build_lib "three", "1.0.0" do |s|
+      s.write "lib/three.rb", "puts 'three'"
+      s.add_dependency "seven", "= 1.0.0"
+    end
+
+    build_lib "four", "1.0.0" do |s|
+      s.write "lib/four.rb", "puts 'four'"
+    end
+
+    build_lib "five", "1.0.0", :no_default => true do |s|
+      s.write "lib/mofive.rb", "puts 'five'"
+    end
+
+    build_lib "six", "1.0.0" do |s|
+      s.write "lib/six.rb", "puts 'six'"
+    end
+
+    build_lib "seven", "1.0.0" do |s|
+      s.write "lib/seven.rb", "puts 'seven'"
+    end
+
+    gemfile <<-G
+      path "#{lib_path}"
+      gem "one", :group => :bar, :require => %w(baz qux)
+      gem "two"
+      gem "three", :group => :not
+      gem "four", :require => false
+      gem "five"
+      gem "six", :group => "string"
+      gem "seven", :group => :not
+    G
+  end
+
+  it "requires the gems" do
+    # default group
+    run "Bundler.require"
+    expect(out).to eq("two")
+
+    # specific group
+    run "Bundler.require(:bar)"
+    expect(out).to eq("baz\nqux")
+
+    # default and specific group
+    run "Bundler.require(:default, :bar)"
+    expect(out).to eq("baz\nqux\ntwo")
+
+    # specific group given as a string
+    run "Bundler.require('bar')"
+    expect(out).to eq("baz\nqux")
+
+    # specific group declared as a string
+    run "Bundler.require(:string)"
+    expect(out).to eq("six")
+
+    # required in resolver order instead of gemfile order
+    run("Bundler.require(:not)")
+    expect(out.split("\n").sort).to eq(['seven', 'three'])
+  end
+
+  it "allows requiring gems with non standard names explicitly" do
+    run "Bundler.require ; require 'mofive'"
+    expect(out).to eq("two\nfive")
+  end
+
+  it "raises an exception if a require is specified but the file does not exist" do
+    gemfile <<-G
+      path "#{lib_path}"
+      gem "two", :require => 'fail'
+    G
+
+    load_error_run <<-R, 'fail'
+      Bundler.require
+    R
+
+    expect(err).to eq("ZOMG LOAD ERROR")
+  end
+
+  describe "with namespaced gems" do
+    before :each do
+      build_lib "jquery-rails", "1.0.0" do |s|
+        s.write "lib/jquery/rails.rb", "puts 'jquery/rails'"
+      end
+      lib_path('jquery-rails-1.0.0/lib/jquery-rails.rb').rmtree
+    end
+
+    it "requires gem names that are namespaced" do
+      gemfile <<-G
+        path '#{lib_path}'
+        gem 'jquery-rails'
+      G
+
+      run "Bundler.require"
+      expect(out).to eq("jquery/rails")
+    end
+
+    it "silently passes if the require fails" do
+      build_lib "bcrypt-ruby", "1.0.0", :no_default => true do |s|
+        s.write "lib/brcrypt.rb", "BCrypt = '1.0.0'"
+      end
+      gemfile <<-G
+        path "#{lib_path}"
+        gem "bcrypt-ruby"
+      G
+
+      cmd = <<-RUBY
+        require 'bundler'
+        Bundler.require
+      RUBY
+      ruby(cmd, :expect_err => true)
+
+      expect(err).to be_empty
+    end
+
+    it "does not mangle explictly given requires" do
+      gemfile <<-G
+        path "#{lib_path}"
+        gem 'jquery-rails', :require => 'jquery-rails'
+      G
+
+      load_error_run <<-R, 'jquery-rails'
+        Bundler.require
+      R
+      expect(err).to eq("ZOMG LOAD ERROR")
+    end
+
+    it "handles the case where regex fails" do
+      build_lib "load-fuuu", "1.0.0" do |s|
+        s.write "lib/load-fuuu.rb", "raise LoadError.new(\"Could not open library 'libfuuu-1.0': libfuuu-1.0: cannot open shared object file: No such file or directory.\")"
+      end
+
+      gemfile <<-G
+        path "#{lib_path}"
+        gem "load-fuuu"
+      G
+
+      cmd = <<-RUBY
+        begin
+          Bundler.require
+        rescue LoadError => e
+          $stderr.puts "ZOMG LOAD ERROR" if e.message.include?("Could not open library 'libfuuu-1.0'")
+        end
+      RUBY
+      run(cmd, :expect_err => true)
+
+      expect(err).to eq("ZOMG LOAD ERROR")
+    end
+
+    it "doesn't swallow the error when the library has an unrelated error" do
+      build_lib "load-fuuu", "1.0.0" do |s|
+        s.write "lib/load-fuuu.rb", "raise LoadError.new(\"cannot load such file -- load-bar\")"
+      end
+
+      gemfile <<-G
+        path "#{lib_path}"
+        gem "load-fuuu"
+      G
+
+      cmd = <<-RUBY
+        begin
+          Bundler.require
+        rescue LoadError => e
+          $stderr.puts "ZOMG LOAD ERROR: \#{e.message}"
+        end
+      RUBY
+      run(cmd, :expect_err => true)
+
+      expect(err).to eq("ZOMG LOAD ERROR: cannot load such file -- load-bar")
+    end
+  end
+
+  describe "using bundle exec" do
+    it "requires the locked gems" do
+      bundle "exec ruby -e 'Bundler.require'"
+      expect(out).to eq("two")
+
+      bundle "exec ruby -e 'Bundler.require(:bar)'"
+      expect(out).to eq("baz\nqux")
+
+      bundle "exec ruby -e 'Bundler.require(:default, :bar)'"
+      expect(out).to eq("baz\nqux\ntwo")
+    end
+  end
+
+  describe "order" do
+    before(:each) do
+      build_lib "one", "1.0.0" do |s|
+        s.write "lib/one.rb", <<-ONE
+          if defined?(Two)
+            Two.two
+          else
+            puts "two_not_loaded"
+          end
+          puts 'one'
+        ONE
+      end
+
+      build_lib "two", "1.0.0" do |s|
+        s.write "lib/two.rb", <<-TWO
+          module Two
+            def self.two
+              puts 'module_two'
+            end
+          end
+          puts 'two'
+        TWO
+      end
+    end
+
+    it "works when the gems are in the Gemfile in the correct order" do
+      gemfile <<-G
+        path "#{lib_path}"
+        gem "two"
+        gem "one"
+      G
+
+      run "Bundler.require"
+      expect(out).to eq("two\nmodule_two\none")
+    end
+
+    describe "a gem with different requires for different envs" do
+      before(:each) do
+        build_gem "multi_gem", :to_system => true do |s|
+          s.write "lib/one.rb", "puts 'ONE'"
+          s.write "lib/two.rb", "puts 'TWO'"
+        end
+
+        install_gemfile <<-G
+          gem "multi_gem", :require => "one", :group => :one
+          gem "multi_gem", :require => "two", :group => :two
+        G
+      end
+
+      it "requires both with Bundler.require(both)" do
+        run "Bundler.require(:one, :two)"
+        expect(out).to eq("ONE\nTWO")
+      end
+
+      it "requires one with Bundler.require(:one)" do
+        run "Bundler.require(:one)"
+        expect(out).to eq("ONE")
+      end
+
+      it "requires :two with Bundler.require(:two)" do
+        run "Bundler.require(:two)"
+        expect(out).to eq("TWO")
+      end
+    end
+
+    it "fails when the gems are in the Gemfile in the wrong order" do
+      gemfile <<-G
+        path "#{lib_path}"
+        gem "one"
+        gem "two"
+      G
+
+      run "Bundler.require"
+      expect(out).to eq("two_not_loaded\none\ntwo")
+    end
+
+    describe "with busted gems" do
+      it "should be busted" do
+        build_gem "busted_require", :to_system => true do |s|
+          s.write "lib/busted_require.rb", "require 'no_such_file_omg'"
+        end
+
+        install_gemfile <<-G
+          gem "busted_require"
+        G
+
+        load_error_run <<-R, 'no_such_file_omg'
+          Bundler.require
+        R
+        expect(err).to eq('ZOMG LOAD ERROR')
+      end
+    end
+  end
+end
+
+describe "Bundler.require with platform specific dependencies" do
+  it "does not require the gems that are pinned to other platforms" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      platforms :#{not_local_tag} do
+        gem "fail", :require => "omgomg"
+      end
+
+      gem "rack", "1.0.0"
+    G
+
+    run "Bundler.require", :expect_err => true
+    expect(err).to be_empty
+  end
+
+  it "requires gems pinned to multiple platforms, including the current one" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+
+      platforms :#{not_local_tag}, :#{local_tag} do
+        gem "rack", :require => "rack"
+      end
+    G
+
+    run "Bundler.require; puts RACK", :expect_err => true
+
+    expect(out).to eq("1.0.0")
+    expect(err).to be_empty
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/runtime/setup_spec.rb b/misc/lib/bundler-1.3.5/spec/runtime/setup_spec.rb
new file mode 100644
index 0000000..e38bee0
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/runtime/setup_spec.rb
@@ -0,0 +1,855 @@
+require "spec_helper"
+
+describe "Bundler.setup" do
+  describe "with no arguments" do
+    it "makes all groups available" do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :group => :test
+      G
+
+      ruby <<-RUBY
+        require 'rubygems'
+        require 'bundler'
+        Bundler.setup
+
+        require 'rack'
+        puts RACK
+      RUBY
+      expect(err).to eq("")
+      expect(out).to eq("1.0.0")
+    end
+  end
+
+  describe "when called with groups" do
+    before(:each) do
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "yard"
+        gem "rack", :group => :test
+      G
+    end
+
+    it "doesn't make all groups available" do
+      ruby <<-RUBY
+        require 'rubygems'
+        require 'bundler'
+        Bundler.setup(:default)
+
+        begin
+          require 'rack'
+        rescue LoadError
+          puts "WIN"
+        end
+      RUBY
+      expect(err).to eq("")
+      expect(out).to eq("WIN")
+    end
+
+    it "accepts string for group name" do
+      ruby <<-RUBY
+        require 'rubygems'
+        require 'bundler'
+        Bundler.setup(:default, 'test')
+
+        require 'rack'
+        puts RACK
+      RUBY
+      expect(err).to eq("")
+      expect(out).to eq("1.0.0")
+    end
+
+    it "leaves all groups available if they were already" do
+      ruby <<-RUBY
+        require 'rubygems'
+        require 'bundler'
+        Bundler.setup
+        Bundler.setup(:default)
+
+        require 'rack'
+        puts RACK
+      RUBY
+      expect(err).to eq("")
+      expect(out).to eq("1.0.0")
+    end
+
+    it "leaves :default available if setup is called twice" do
+      ruby <<-RUBY
+        require 'rubygems'
+        require 'bundler'
+        Bundler.setup(:default)
+        Bundler.setup(:default, :test)
+
+        begin
+          require 'yard'
+          puts "WIN"
+        rescue LoadError
+          puts "FAIL"
+        end
+      RUBY
+      expect(err).to eq("")
+      expect(out).to match("WIN")
+    end
+  end
+
+  it "raises if the Gemfile was not yet installed" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+
+    ruby <<-R
+      require 'rubygems'
+      require 'bundler'
+
+      begin
+        Bundler.setup
+        puts "FAIL"
+      rescue Bundler::GemNotFound
+        puts "WIN"
+      end
+    R
+
+    expect(out).to eq("WIN")
+  end
+
+  it "doesn't create a Gemfile.lock if the setup fails" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+
+    ruby <<-R, :expect_err => true
+      require 'rubygems'
+      require 'bundler'
+
+      Bundler.setup
+    R
+
+    expect(bundled_app("Gemfile.lock")).not_to exist
+  end
+
+  it "doesn't change the Gemfile.lock if the setup fails" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+
+    lockfile = File.read(bundled_app("Gemfile.lock"))
+
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+      gem "nosuchgem", "10.0"
+    G
+
+    ruby <<-R, :expect_err => true
+      require 'rubygems'
+      require 'bundler'
+
+      Bundler.setup
+    R
+
+    expect(File.read(bundled_app("Gemfile.lock"))).to eq(lockfile)
+  end
+
+  it "makes a Gemfile.lock if setup succeeds" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+
+    File.read(bundled_app("Gemfile.lock"))
+
+    FileUtils.rm(bundled_app("Gemfile.lock"))
+
+    run "1"
+    expect(bundled_app("Gemfile.lock")).to exist
+  end
+
+  it "uses BUNDLE_GEMFILE to locate the gemfile if present" do
+    gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+
+    gemfile bundled_app('4realz'), <<-G
+      source "file://#{gem_repo1}"
+      gem "activesupport", "2.3.5"
+    G
+
+    ENV['BUNDLE_GEMFILE'] = bundled_app('4realz').to_s
+    bundle :install
+
+    should_be_installed "activesupport 2.3.5"
+  end
+
+  it "prioritizes gems in BUNDLE_PATH over gems in GEM_HOME" do
+    ENV['BUNDLE_PATH'] = bundled_app('.bundle').to_s
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack", "1.0.0"
+    G
+
+    build_gem "rack", "1.0", :to_system => true do |s|
+      s.write "lib/rack.rb", "RACK = 'FAIL'"
+    end
+
+    should_be_installed "rack 1.0.0"
+  end
+
+  describe "integrate with rubygems" do
+    describe "by replacing #gem" do
+      before :each do
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "rack", "0.9.1"
+        G
+      end
+
+      it "replaces #gem but raises when the gem is missing" do
+        run <<-R
+          begin
+            gem "activesupport"
+            puts "FAIL"
+          rescue LoadError
+            puts "WIN"
+          end
+        R
+
+        expect(out).to eq("WIN")
+      end
+
+      it "version_requirement is now deprecated in rubygems 1.4.0+ when gem is missing" do
+        run <<-R, :expect_err => true
+          begin
+            gem "activesupport"
+            puts "FAIL"
+          rescue LoadError
+            puts "WIN"
+          end
+        R
+
+        expect(err).to be_empty
+      end
+
+      it "replaces #gem but raises when the version is wrong" do
+        run <<-R
+          begin
+            gem "rack", "1.0.0"
+            puts "FAIL"
+          rescue LoadError
+            puts "WIN"
+          end
+        R
+
+        expect(out).to eq("WIN")
+      end
+
+      it "version_requirement is now deprecated in rubygems 1.4.0+ when the version is wrong" do
+        run <<-R, :expect_err => true
+          begin
+            gem "rack", "1.0.0"
+            puts "FAIL"
+          rescue LoadError
+            puts "WIN"
+          end
+        R
+
+        expect(err).to be_empty
+      end
+    end
+
+    describe "by hiding system gems" do
+      before :each do
+        system_gems "activesupport-2.3.5"
+        install_gemfile <<-G
+          source "file://#{gem_repo1}"
+          gem "yard"
+        G
+      end
+
+      it "removes system gems from Gem.source_index" do
+        run "require 'yard'"
+        expect(out).to eq("bundler-#{Bundler::VERSION}\nyard-1.0")
+      end
+
+      context "when the ruby stdlib is a substring of Gem.path" do
+        it "does not reject the stdlib from $LOAD_PATH" do
+          substring = "/" + $LOAD_PATH.find{|p| p =~ /vendor_ruby/ }.split("/")[2]
+          run "puts 'worked!'", :env => {"GEM_PATH" => substring}
+          expect(out).to eq("worked!")
+        end
+      end
+    end
+  end
+
+  describe "with paths" do
+    it "activates the gems in the path source" do
+      system_gems "rack-1.0.0"
+
+      build_lib "rack", "1.0.0" do |s|
+        s.write "lib/rack.rb", "puts 'WIN'"
+      end
+
+      gemfile <<-G
+        path "#{lib_path('rack-1.0.0')}"
+        source "file://#{gem_repo1}"
+        gem "rack"
+      G
+
+      run "require 'rack'"
+      expect(out).to eq("WIN")
+    end
+  end
+
+  describe "with git" do
+    before do
+      build_git "rack", "1.0.0"
+
+      gemfile <<-G
+        gem "rack", :git => "#{lib_path('rack-1.0.0')}"
+      G
+    end
+
+    it "provides a useful exception when the git repo is not checked out yet" do
+      run "1", :expect_err => true
+      expect(err).to include("#{lib_path('rack-1.0.0')} (at master) is not checked out. Please run `bundle install`")
+    end
+
+    it "does not hit the git binary if the lockfile is available and up to date" do
+      bundle "install"
+
+      break_git!
+
+      ruby <<-R
+        require 'rubygems'
+        require 'bundler'
+
+        begin
+          Bundler.setup
+          puts "WIN"
+        rescue Exception => e
+          puts "FAIL"
+        end
+      R
+
+      expect(out).to eq("WIN")
+    end
+
+    it "provides a good exception if the lockfile is unavailable" do
+      bundle "install"
+
+      FileUtils.rm(bundled_app("Gemfile.lock"))
+
+      break_git!
+
+      ruby <<-R
+        require "rubygems"
+        require "bundler"
+
+        begin
+          Bundler.setup
+          puts "FAIL"
+        rescue Bundler::GitError => e
+          puts e.message
+        end
+      R
+
+      run "puts 'FAIL'", :expect_err => true
+
+      expect(err).not_to include "This is not the git you are looking for"
+    end
+
+    it "works even when the cache directory has been deleted" do
+      bundle "install --path vendor/bundle"
+      FileUtils.rm_rf vendored_gems('cache')
+      should_be_installed "rack 1.0.0"
+    end
+
+    it "does not randomly change the path when specifying --path and the bundle directory becomes read only" do
+      begin
+        bundle "install --path vendor/bundle"
+
+        Dir["**/*"].each do |f|
+          File.directory?(f) ?
+            File.chmod(0555, f) :
+            File.chmod(0444, f)
+        end
+        should_be_installed "rack 1.0.0"
+      ensure
+        Dir["**/*"].each do |f|
+          File.directory?(f) ?
+            File.chmod(0755, f) :
+            File.chmod(0644, f)
+        end
+      end
+    end
+  end
+
+  describe "when specifying local override" do
+    it "explodes if given path does not exist on runtime" do
+      build_git "rack", "0.8"
+
+      FileUtils.cp_r("#{lib_path('rack-0.8')}/.", lib_path('local-rack'))
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :branch => "master"
+      G
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      bundle :install
+      expect(out).to match(/at #{lib_path('local-rack')}/)
+
+      FileUtils.rm_rf(lib_path('local-rack'))
+      run "require 'rack'", :expect_err => true
+      expect(err).to match(/Cannot use local override for rack-0.8 because #{Regexp.escape(lib_path('local-rack').to_s)} does not exist/)
+    end
+
+    it "explodes if branch is not given on runtime" do
+      build_git "rack", "0.8"
+
+      FileUtils.cp_r("#{lib_path('rack-0.8')}/.", lib_path('local-rack'))
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :branch => "master"
+      G
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      bundle :install
+      expect(out).to match(/at #{lib_path('local-rack')}/)
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}"
+      G
+
+      run "require 'rack'", :expect_err => true
+      expect(err).to match(/because :branch is not specified in Gemfile/)
+    end
+
+    it "explodes on different branches on runtime" do
+      build_git "rack", "0.8"
+
+      FileUtils.cp_r("#{lib_path('rack-0.8')}/.", lib_path('local-rack'))
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :branch => "master"
+      G
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      bundle :install
+      expect(out).to match(/at #{lib_path('local-rack')}/)
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :branch => "changed"
+      G
+
+      run "require 'rack'", :expect_err => true
+      expect(err).to match(/is using branch master but Gemfile specifies changed/)
+    end
+
+    it "explodes on refs with different branches on runtime" do
+      build_git "rack", "0.8"
+
+      FileUtils.cp_r("#{lib_path('rack-0.8')}/.", lib_path('local-rack'))
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :ref => "master", :branch => "master"
+      G
+
+      gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :ref => "master", :branch => "nonexistant"
+      G
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      run "require 'rack'", :expect_err => true
+      expect(err).to match(/is using branch master but Gemfile specifies nonexistant/)
+    end
+  end
+
+  describe "when excluding groups" do
+    it "doesn't change the resolve if --without is used" do
+      install_gemfile <<-G, :without => :rails
+        source "file://#{gem_repo1}"
+        gem "activesupport"
+
+        group :rails do
+          gem "rails", "2.3.2"
+        end
+      G
+
+      install_gems "activesupport-2.3.5"
+
+      should_be_installed "activesupport 2.3.2", :groups => :default
+    end
+
+    it "remembers --without and does not bail on bare Bundler.setup" do
+      install_gemfile <<-G, :without => :rails
+        source "file://#{gem_repo1}"
+        gem "activesupport"
+
+        group :rails do
+          gem "rails", "2.3.2"
+        end
+      G
+
+      install_gems "activesupport-2.3.5"
+
+      should_be_installed "activesupport 2.3.2"
+    end
+
+    it "remembers --without and does not include groups passed to Bundler.setup" do
+      install_gemfile <<-G, :without => :rails
+        source "file://#{gem_repo1}"
+        gem "activesupport"
+
+        group :rack do
+          gem "rack"
+        end
+
+        group :rails do
+          gem "rails", "2.3.2"
+        end
+      G
+
+      should_not_be_installed "activesupport 2.3.2", :groups => :rack
+      should_be_installed "rack 1.0.0", :groups => :rack
+    end
+  end
+
+  # Unfortunately, gem_prelude does not record the information about
+  # activated gems, so this test cannot work on 1.9 :(
+  if RUBY_VERSION < "1.9"
+    describe "preactivated gems" do
+      it "raises an exception if a pre activated gem conflicts with the bundle" do
+        system_gems "thin-1.0", "rack-1.0.0"
+        build_gem "thin", "1.1", :to_system => true do |s|
+          s.add_dependency "rack"
+        end
+
+        gemfile <<-G
+          gem "thin", "1.0"
+        G
+
+        ruby <<-R
+          require 'rubygems'
+          gem "thin"
+          require 'bundler'
+          begin
+            Bundler.setup
+            puts "FAIL"
+          rescue Gem::LoadError => e
+            puts e.message
+          end
+        R
+
+        expect(out).to eq("You have already activated thin 1.1, but your Gemfile requires thin 1.0. Using bundle exec may solve this.")
+      end
+
+      it "version_requirement is now deprecated in rubygems 1.4.0+" do
+        system_gems "thin-1.0", "rack-1.0.0"
+        build_gem "thin", "1.1", :to_system => true do |s|
+          s.add_dependency "rack"
+        end
+
+        gemfile <<-G
+          gem "thin", "1.0"
+        G
+
+        ruby <<-R, :expect_err => true
+          require 'rubygems'
+          gem "thin"
+          require 'bundler'
+          begin
+            Bundler.setup
+            puts "FAIL"
+          rescue Gem::LoadError => e
+            puts e.message
+          end
+        R
+
+        expect(err).to be_empty
+      end
+    end
+  end
+
+  # Rubygems returns loaded_from as a string
+  it "has loaded_from as a string on all specs" do
+    build_git "foo"
+    build_git "no-gemspec", :gemspec => false
+
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+      gem "foo", :git => "#{lib_path('foo-1.0')}"
+      gem "no-gemspec", "1.0", :git => "#{lib_path('no-gemspec-1.0')}"
+    G
+
+    run <<-R
+      Gem.loaded_specs.each do |n, s|
+        puts "FAIL" unless String === s.loaded_from
+      end
+    R
+
+    expect(out).to be_empty
+  end
+
+  it "ignores empty gem paths" do
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "rack"
+    G
+
+    ENV["GEM_HOME"] = ""
+    bundle %{exec ruby -e "require 'set'"}
+
+    expect(err).to be_empty
+  end
+
+  it "should prepend gemspec require paths to $LOAD_PATH in order" do
+    update_repo2 do
+      build_gem("requirepaths") do |s|
+        s.write("lib/rq.rb", "puts 'yay'")
+        s.write("src/rq.rb", "puts 'nooo'")
+        s.require_paths = ["lib", "src"]
+      end
+    end
+
+    install_gemfile <<-G
+      source "file://#{gem_repo2}"
+      gem "requirepaths", :require => nil
+    G
+
+    run "require 'rq'"
+    expect(out).to eq("yay")
+  end
+
+  it "ignores Gem.refresh" do
+    system_gems "rack-1.0.0"
+
+    install_gemfile <<-G
+      source "file://#{gem_repo1}"
+      gem "activesupport"
+    G
+
+    run <<-R
+      Gem.refresh
+      puts Bundler.rubygems.find_name("rack").inspect
+    R
+
+    expect(out).to eq("[]")
+  end
+
+  describe "when a vendored gem specification uses the :path option" do
+    it "should resolve paths relative to the Gemfile" do
+      path = bundled_app(File.join('vendor', 'foo'))
+      build_lib "foo", :path => path
+
+      # If the .gemspec exists, then Bundler handles the path differently.
+      # See Source::Path.load_spec_files for details.
+      FileUtils.rm(File.join(path, 'foo.gemspec'))
+
+      install_gemfile <<-G
+        gem 'foo', '1.2.3', :path => 'vendor/foo'
+      G
+
+      Dir.chdir(bundled_app.parent) do
+        run <<-R, :env => {"BUNDLE_GEMFILE" => bundled_app('Gemfile')}
+          require 'foo'
+        R
+      end
+      expect(err).to eq("")
+    end
+
+    it "should make sure the Bundler.root is really included in the path relative to the Gemfile" do
+      relative_path = File.join('vendor', Dir.pwd[1..-1], 'foo')
+      absolute_path = bundled_app(relative_path)
+      FileUtils.mkdir_p(absolute_path)
+      build_lib "foo", :path => absolute_path
+
+      # If the .gemspec exists, then Bundler handles the path differently.
+      # See Source::Path.load_spec_files for details.
+      FileUtils.rm(File.join(absolute_path, 'foo.gemspec'))
+
+      gemfile <<-G
+        gem 'foo', '1.2.3', :path => '#{relative_path}'
+      G
+
+      bundle :install
+
+      Dir.chdir(bundled_app.parent) do
+        run <<-R, :env => {"BUNDLE_GEMFILE" => bundled_app('Gemfile')}
+          require 'foo'
+        R
+      end
+
+      expect(err).to eq("")
+    end
+  end
+
+  describe "with git gems that don't have gemspecs" do
+    before :each do
+      build_git "no-gemspec", :gemspec => false
+
+      install_gemfile <<-G
+        gem "no-gemspec", "1.0", :git => "#{lib_path('no-gemspec-1.0')}"
+      G
+    end
+
+    it "loads the library via a virtual spec" do
+      run <<-R
+        require 'no-gemspec'
+        puts NOGEMSPEC
+      R
+
+      expect(out).to eq("1.0")
+    end
+  end
+
+  describe "with bundled and system gems" do
+    before :each do
+      system_gems "rack-1.0.0"
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+
+        gem "activesupport", "2.3.5"
+      G
+    end
+
+    it "does not pull in system gems" do
+      run <<-R
+        require 'rubygems'
+
+        begin;
+          require 'rack'
+        rescue LoadError
+          puts 'WIN'
+        end
+      R
+
+      expect(out).to eq("WIN")
+    end
+
+    it "provides a gem method" do
+      run <<-R
+        gem 'activesupport'
+        require 'activesupport'
+        puts ACTIVESUPPORT
+      R
+
+      expect(out).to eq("2.3.5")
+    end
+
+    it "raises an exception if gem is used to invoke a system gem not in the bundle" do
+      run <<-R
+        begin
+          gem 'rack'
+        rescue LoadError => e
+          puts e.message
+        end
+      R
+
+      expect(out).to eq("rack is not part of the bundle. Add it to Gemfile.")
+    end
+
+    it "sets GEM_HOME appropriately" do
+      run "puts ENV['GEM_HOME']"
+      expect(out).to eq(default_bundle_path.to_s)
+    end
+  end
+
+  describe "with system gems in the bundle" do
+    before :each do
+      system_gems "rack-1.0.0"
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", "1.0.0"
+        gem "activesupport", "2.3.5"
+      G
+    end
+
+    it "sets GEM_PATH appropriately" do
+      run "puts Gem.path"
+      paths = out.split("\n")
+      expect(paths).to include(system_gem_path.to_s)
+      expect(paths).to include(default_bundle_path.to_s)
+    end
+  end
+
+  describe "with a gemspec that requires other files" do
+    before :each do
+      build_git "bar", :gemspec => false do |s|
+        s.write "lib/bar/version.rb", %{BAR_VERSION = '1.0'}
+        s.write "bar.gemspec", <<-G
+          lib = File.expand_path('../lib/', __FILE__)
+          $:.unshift lib unless $:.include?(lib)
+          require 'bar/version'
+
+          Gem::Specification.new do |s|
+            s.name        = 'bar'
+            s.version     = BAR_VERSION
+            s.summary     = 'Bar'
+            s.files       = Dir["lib/**/*.rb"]
+          end
+        G
+      end
+
+      gemfile <<-G
+        gem "bar", :git => "#{lib_path('bar-1.0')}"
+      G
+    end
+
+    it "evals each gemspec in the context of its parent directory" do
+      bundle :install
+      run "require 'bar'; puts BAR"
+      expect(out).to eq("1.0")
+    end
+
+    it "error intelligently if the gemspec has a LoadError" do
+      update_git "bar", :gemspec => false do |s|
+        s.write "bar.gemspec", "require 'foobarbaz'"
+      end
+      bundle :install
+      expect(out).to include("was a LoadError while loading bar.gemspec")
+      expect(out).to include("foobarbaz")
+      expect(out).to include("bar.gemspec:1")
+      expect(out).to include("try to require a relative path") if RUBY_VERSION >= "1.9"
+    end
+
+    it "evals each gemspec with a binding from the top level" do
+      bundle "install"
+
+      ruby <<-RUBY
+        require 'bundler'
+        def Bundler.require(path)
+          raise "LOSE"
+        end
+        Bundler.load
+      RUBY
+
+      expect(err).to eq("")
+      expect(out).to eq("")
+    end
+  end
+
+  describe "when Bundler is bundled" do
+    it "doesn't blow up" do
+      install_gemfile <<-G
+        gem "bundler", :path => "#{File.expand_path("..", lib)}"
+      G
+
+      bundle %|exec ruby -e "require 'bundler'; Bundler.setup"|
+      expect(err).to be_empty
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/runtime/with_clean_env_spec.rb b/misc/lib/bundler-1.3.5/spec/runtime/with_clean_env_spec.rb
new file mode 100644
index 0000000..7a77db0
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/runtime/with_clean_env_spec.rb
@@ -0,0 +1,92 @@
+require "spec_helper"
+
+describe "Bundler.with_env helpers" do
+
+  shared_examples_for "Bundler.with_*_env" do
+    it "should reset and restore the environment" do
+      gem_path = ENV['GEM_PATH']
+
+      Bundler.with_clean_env do
+        expect(`echo $GEM_PATH`.strip).not_to eq(gem_path)
+      end
+
+      expect(ENV['GEM_PATH']).to eq(gem_path)
+    end
+  end
+
+  around do |example|
+    env = Bundler::ORIGINAL_ENV.dup
+    Bundler::ORIGINAL_ENV['BUNDLE_PATH'] = "./Gemfile"
+    example.run
+    Bundler::ORIGINAL_ENV.replace env
+  end
+
+  describe "Bundler.with_clean_env" do
+
+    it_should_behave_like "Bundler.with_*_env"
+
+    it "should keep the original GEM_PATH even in sub processes" do
+      gemfile ""
+      bundle "install --path vendor/bundle"
+
+      code = "Bundler.with_clean_env do;" +
+             "  print ENV['GEM_PATH'] != '';" +
+             "end"
+
+      result = bundle "exec ruby -e #{code.inspect}"
+      expect(result).to eq("true")
+    end
+
+    it "should not pass any bundler environment variables" do
+      Bundler.with_clean_env do
+        expect(`echo $BUNDLE_PATH`.strip).not_to eq('./Gemfile')
+      end
+    end
+
+    it "should not pass RUBYOPT changes" do
+      lib_path = File.expand_path('../../../lib', __FILE__)
+      Bundler::ORIGINAL_ENV['RUBYOPT'] = " -I#{lib_path} -rbundler/setup"
+
+      Bundler.with_clean_env do
+        expect(`echo $RUBYOPT`.strip).not_to include '-rbundler/setup'
+        expect(`echo $RUBYOPT`.strip).not_to include "-I#{lib_path}"
+      end
+
+      expect(Bundler::ORIGINAL_ENV['RUBYOPT']).to eq(" -I#{lib_path} -rbundler/setup")
+    end
+
+    it "should not change ORIGINAL_ENV" do
+      expect(Bundler::ORIGINAL_ENV['BUNDLE_PATH']).to eq('./Gemfile')
+    end
+
+  end
+
+  describe "Bundler.with_original_env" do
+
+    it_should_behave_like "Bundler.with_*_env"
+
+    it "should pass bundler environment variables set before Bundler was run" do
+      Bundler.with_original_env do
+        expect(`echo $BUNDLE_PATH`.strip).to eq('./Gemfile')
+      end
+    end
+  end
+
+  describe "Bundler.clean_system" do
+    it "runs system inside with_clean_env" do
+      Bundler.clean_system(%{echo 'if [ "$BUNDLE_PATH" = "" ]; then exit 42; else exit 1; fi' | /bin/sh})
+      expect($?.exitstatus).to eq(42)
+    end
+  end
+
+  describe "Bundler.clean_exec" do
+    it "runs exec inside with_clean_env" do
+      pid = Kernel.fork do
+        Bundler.clean_exec(%{echo 'if [ "$BUNDLE_PATH" = "" ]; then exit 42; else exit 1; fi' | /bin/sh})
+      end
+      Process.wait(pid)
+      expect($?.exitstatus).to eq(42)
+    end
+  end
+
+end
diff --git a/misc/lib/bundler-1.3.5/spec/spec_helper.rb b/misc/lib/bundler-1.3.5/spec/spec_helper.rb
new file mode 100644
index 0000000..b1a572f
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/spec_helper.rb
@@ -0,0 +1,107 @@
+$:.unshift File.expand_path('..', __FILE__)
+$:.unshift File.expand_path('../../lib', __FILE__)
+require 'bundler/psyched_yaml'
+require 'fileutils'
+require 'rubygems'
+require 'bundler'
+require 'rspec'
+require 'uri'
+require 'digest/sha1'
+
+# Require the correct version of popen for the current platform
+if RbConfig::CONFIG['host_os'] =~ /mingw|mswin/
+  begin
+    require 'win32/open3'
+  rescue LoadError
+    abort "Run `gem install win32-open3` to be able to run specs"
+  end
+else
+  require 'open3'
+end
+
+Dir["#{File.expand_path('../support', __FILE__)}/*.rb"].each do |file|
+  require file unless file =~ /fakeweb\/.*\.rb/
+end
+
+$debug    = false
+$show_err = true
+
+Spec::Rubygems.setup
+FileUtils.rm_rf(Spec::Path.gem_repo1)
+ENV['RUBYOPT'] = "#{ENV['RUBYOPT']} -r#{Spec::Path.root}/spec/support/rubygems_hax/platform.rb"
+ENV['BUNDLE_SPEC_RUN'] = "true"
+
+# Don't wrap output in tests
+ENV['THOR_COLUMNS'] = '10000'
+
+RSpec.configure do |config|
+  config.include Spec::Builders
+  config.include Spec::Helpers
+  config.include Spec::Indexes
+  config.include Spec::Matchers
+  config.include Spec::Path
+  config.include Spec::Rubygems
+  config.include Spec::Platforms
+  config.include Spec::Sudo
+
+  if Spec::Sudo.test_sudo?
+    config.filter_run :sudo => true
+  else
+    config.filter_run_excluding :sudo => true
+  end
+
+  if ENV['BUNDLER_REALWORLD_TESTS']
+    config.filter_run :realworld => true
+  else
+    config.filter_run_excluding :realworld => true
+  end
+
+  if RUBY_VERSION >= "1.9"
+    config.filter_run_excluding :ruby => "1.8"
+  else
+    config.filter_run_excluding :ruby => "1.9"
+  end
+
+  config.filter_run :focused => true unless ENV['CI']
+  config.run_all_when_everything_filtered = true
+  config.alias_example_to :fit, :focused => true
+
+  original_wd       = Dir.pwd
+  original_path     = ENV['PATH']
+  original_gem_home = ENV['GEM_HOME']
+
+  def pending_jruby_shebang_fix
+    pending "JRuby executables do not have a proper shebang" if RUBY_PLATFORM == "java"
+  end
+
+  config.expect_with :rspec do |c|
+    c.syntax = :expect
+  end
+
+  config.before :all do
+    build_repo1
+  end
+
+  config.before :each do
+    reset!
+    system_gems []
+    in_app_root
+  end
+
+  config.after :each do
+    puts @out if example.exception
+
+    Dir.chdir(original_wd)
+    # Reset ENV
+    ENV['PATH']           = original_path
+    ENV['GEM_HOME']       = original_gem_home
+    ENV['GEM_PATH']       = original_gem_home
+    ENV['BUNDLE_PATH']    = nil
+    ENV['BUNDLE_GEMFILE'] = nil
+    ENV['BUNDLER_TEST']   = nil
+    ENV['BUNDLE_FROZEN']  = nil
+    ENV['BUNDLER_SPEC_PLATFORM'] = nil
+    ENV['BUNDLER_SPEC_VERSION']  = nil
+    ENV['BUNDLE_APP_CONFIG']     = nil
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/support/artifice/endopint_marshal_fail_basic_authentication.rb b/misc/lib/bundler-1.3.5/spec/support/artifice/endopint_marshal_fail_basic_authentication.rb
new file mode 100644
index 0000000..205b258
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/artifice/endopint_marshal_fail_basic_authentication.rb
@@ -0,0 +1,13 @@
+require File.expand_path("../endpoint_marshal_fail", __FILE__)
+
+Artifice.deactivate
+
+class EndpointMarshalFailBasicAuthentication < EndpointMarshalFail
+  before do
+    unless env["HTTP_AUTHORIZATION"]
+      halt 401, "Authentication info not supplied"
+    end
+  end
+end
+
+Artifice.activate_with(EndpointMarshalFailBasicAuthentication)
diff --git a/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint.rb b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint.rb
new file mode 100644
index 0000000..68b41b7
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint.rb
@@ -0,0 +1,71 @@
+require File.expand_path("../../path.rb", __FILE__)
+require File.expand_path("../../../../lib/bundler/deprecate", __FILE__)
+include Spec::Path
+
+# Set up pretend http gem server with FakeWeb
+$LOAD_PATH.unshift "#{Dir[base_system_gems.join("gems/artifice*/lib")].first}"
+$LOAD_PATH.unshift "#{Dir[base_system_gems.join("gems/rack-*/lib")].first}"
+$LOAD_PATH.unshift "#{Dir[base_system_gems.join("gems/rack-*/lib")].last}"
+$LOAD_PATH.unshift "#{Dir[base_system_gems.join("gems/tilt*/lib")].first}"
+$LOAD_PATH.unshift "#{Dir[base_system_gems.join("gems/sinatra*/lib")].first}"
+require 'artifice'
+require 'sinatra/base'
+
+class Endpoint < Sinatra::Base
+
+  helpers do
+    def dependencies_for(gem_names, marshal = gem_repo1("specs.4.8"))
+      return [] if gem_names.nil? || gem_names.empty?
+
+      require 'rubygems'
+      require 'bundler'
+      Bundler::Deprecate.skip_during do
+        Marshal.load(File.open(marshal).read).map do |name, version, platform|
+          spec = load_spec(name, version, platform)
+          if gem_names.include?(spec.name)
+            {
+              :name         => spec.name,
+              :number       => spec.version.version,
+              :platform     => spec.platform.to_s,
+              :dependencies => spec.dependencies.select {|dep| dep.type == :runtime }.map do |dep|
+                [dep.name, dep.requirement.requirements.map {|a| a.join(" ") }.join(", ")]
+              end
+            }
+          end
+        end.compact
+      end
+    end
+
+    def load_spec(name, version, platform)
+      full_name = "#{name}-#{version}"
+      full_name += "-#{platform}" if platform != "ruby"
+      Marshal.load(Gem.inflate(File.open(gem_repo1("quick/Marshal.4.8/#{full_name}.gemspec.rz")).read))
+    end
+  end
+
+  get "/quick/Marshal.4.8/:id" do
+    redirect "/fetch/actual/gem/#{params[:id]}"
+  end
+
+  get "/fetch/actual/gem/:id" do
+    File.read("#{gem_repo1}/quick/Marshal.4.8/#{params[:id]}")
+  end
+
+  get "/gems/:id" do
+    File.read("#{gem_repo1}/gems/#{params[:id]}")
+  end
+
+  get "/api/v1/dependencies" do
+    Marshal.dump(dependencies_for(params[:gems]))
+  end
+
+  get "/specs.4.8.gz" do
+    File.read("#{gem_repo1}/specs.4.8.gz")
+  end
+
+  get "/prerelease_specs.4.8.gz" do
+    File.read("#{gem_repo1}/prerelease_specs.4.8.gz")
+  end
+end
+
+Artifice.activate_with(Endpoint)
diff --git a/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_500.rb b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_500.rb
new file mode 100644
index 0000000..84997db
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_500.rb
@@ -0,0 +1,37 @@
+require File.expand_path("../../path.rb", __FILE__)
+include Spec::Path
+
+$LOAD_PATH.unshift "#{Dir[base_system_gems.join("gems/artifice*/lib")].first}"
+$LOAD_PATH.unshift "#{Dir[base_system_gems.join("gems/rack-*/lib")].first}"
+$LOAD_PATH.unshift "#{Dir[base_system_gems.join("gems/rack-*/lib")].last}"
+$LOAD_PATH.unshift "#{Dir[base_system_gems.join("gems/tilt*/lib")].first}"
+$LOAD_PATH.unshift "#{Dir[base_system_gems.join("gems/sinatra*/lib")].first}"
+
+require 'artifice'
+require 'sinatra/base'
+
+Artifice.deactivate
+
+class Endpoint500 < Sinatra::Base
+  get "/quick/Marshal.4.8/:id" do
+    halt 500
+  end
+
+  get "/fetch/actual/gem/:id" do
+    halt 500
+  end
+
+  get "/gems/:id" do
+    halt 500
+  end
+
+  get "/api/v1/dependencies" do
+    halt 500
+  end
+
+  get "/specs.4.8.gz" do
+    halt 500
+  end
+end
+
+Artifice.activate_with(Endpoint500)
diff --git a/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_api_missing.rb b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_api_missing.rb
new file mode 100644
index 0000000..bc89db3
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_api_missing.rb
@@ -0,0 +1,16 @@
+require File.expand_path("../endpoint", __FILE__)
+
+Artifice.deactivate
+
+class EndpointApiMissing < Endpoint
+  get "/fetch/actual/gem/:id" do
+    $stderr.puts params[:id]
+    if params[:id] == 'rack-1.0.gemspec.rz'
+      halt 404
+    else
+      File.read("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}")
+    end
+  end
+end
+
+Artifice.activate_with(EndpointApiMissing)
diff --git a/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_basic_authentication.rb b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_basic_authentication.rb
new file mode 100644
index 0000000..0cfba89
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_basic_authentication.rb
@@ -0,0 +1,13 @@
+require File.expand_path("../endpoint", __FILE__)
+
+Artifice.deactivate
+
+class EndpointBasicAuthentication < Endpoint
+  before do
+    unless env["HTTP_AUTHORIZATION"]
+      halt 401, "Authentication info not supplied"
+    end
+  end
+end
+
+Artifice.activate_with(EndpointBasicAuthentication)
diff --git a/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_creds_diff_host.rb b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_creds_diff_host.rb
new file mode 100644
index 0000000..21cce22
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_creds_diff_host.rb
@@ -0,0 +1,38 @@
+require File.expand_path("../endpoint", __FILE__)
+
+Artifice.deactivate
+
+class EndpointCredsDiffHost < Endpoint
+  helpers do
+    def auth
+      @auth ||= Rack::Auth::Basic::Request.new(request.env)
+    end
+
+    def authorized?
+      auth.provided? && auth.basic? && auth.credentials && auth.credentials == ['user', 'pass']
+    end
+
+    def protected!
+      unless authorized?
+        response['WWW-Authenticate'] = %(Basic realm="Testing HTTP Auth")
+        throw(:halt, [401, "Not authorized\n"])
+      end
+    end
+  end
+
+  before do
+    protected! unless request.path_info.include?("/no/creds/")
+  end
+
+  get "/gems/:id" do
+    redirect "http://diffhost.com/no/creds/#{params[:id]}"
+  end
+
+  get "/no/creds/:id" do
+    if request.host.include?("diffhost") && !auth.provided?
+      File.read("#{gem_repo1}/gems/#{params[:id]}")
+    end
+  end
+end
+
+Artifice.activate_with(EndpointCredsDiffHost)
diff --git a/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_extra.rb b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_extra.rb
new file mode 100644
index 0000000..c50428f
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_extra.rb
@@ -0,0 +1,31 @@
+require File.expand_path("../endpoint", __FILE__)
+
+Artifice.deactivate
+
+class EndpointExtra < Endpoint
+  get "/extra/api/v1/dependencies" do
+    halt 404
+  end
+
+  get "/extra/specs.4.8.gz" do
+    File.read("#{gem_repo2}/specs.4.8.gz")
+  end
+
+  get "/extra/prerelease_specs.4.8.gz" do
+    File.read("#{gem_repo2}/prerelease_specs.4.8.gz")
+  end
+
+  get "/extra/quick/Marshal.4.8/:id" do
+    redirect "/extra/fetch/actual/gem/#{params[:id]}"
+  end
+
+  get "/extra/fetch/actual/gem/:id" do
+    File.read("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}")
+  end
+
+  get "/extra/gems/:id" do
+    File.read("#{gem_repo2}/gems/#{params[:id]}")
+  end
+end
+
+Artifice.activate_with(EndpointExtra)
diff --git a/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_extra_missing.rb b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_extra_missing.rb
new file mode 100644
index 0000000..29322ad
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_extra_missing.rb
@@ -0,0 +1,15 @@
+require File.expand_path("../endpoint_extra", __FILE__)
+
+Artifice.deactivate
+
+class EndpointExtraMissing < EndpointExtra
+  get "/extra/fetch/actual/gem/:id" do
+    if params[:id] == 'missing-1.0.gemspec.rz'
+      halt 404
+    else
+      File.read("#{gem_repo2}/quick/Marshal.4.8/#{params[:id]}")
+    end
+  end
+end
+
+Artifice.activate_with(EndpointExtraMissing)
diff --git a/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_fallback.rb b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_fallback.rb
new file mode 100644
index 0000000..db02a88
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_fallback.rb
@@ -0,0 +1,17 @@
+require File.expand_path("../endpoint", __FILE__)
+
+Artifice.deactivate
+
+class EndpointFallback < Endpoint
+  DEPENDENCY_LIMIT = 60
+
+  get "/api/v1/dependencies" do
+    if params[:gems] && params[:gems].size <= DEPENDENCY_LIMIT
+      Marshal.dump(dependencies_for(params[:gems]))
+    else
+      halt 413, "Too many gems to resolve, please request less than #{DEPENDENCY_LIMIT} gems"
+    end
+  end
+end
+
+Artifice.activate_with(EndpointFallback)
diff --git a/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_marshal_fail.rb b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_marshal_fail.rb
new file mode 100644
index 0000000..a0dc182
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_marshal_fail.rb
@@ -0,0 +1,11 @@
+require File.expand_path("../endpoint_fallback", __FILE__)
+
+Artifice.deactivate
+
+class EndpointMarshalFail < EndpointFallback
+  get "/api/v1/dependencies" do
+    "f0283y01hasf"
+  end
+end
+
+Artifice.activate_with(EndpointMarshalFail)
diff --git a/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_redirect.rb b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_redirect.rb
new file mode 100644
index 0000000..2b48fa5
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_redirect.rb
@@ -0,0 +1,15 @@
+require File.expand_path("../endpoint", __FILE__)
+
+Artifice.deactivate
+
+class EndpointRedirect < Endpoint
+  get "/fetch/actual/gem/:id" do
+    redirect "/fetch/actual/gem/#{params[:id]}"
+  end
+
+  get "/api/v1/dependencies" do
+    status 404
+  end
+end
+
+Artifice.activate_with(EndpointRedirect)
diff --git a/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_timeout.rb b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_timeout.rb
new file mode 100644
index 0000000..da68220
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/artifice/endpoint_timeout.rb
@@ -0,0 +1,13 @@
+require File.expand_path("../endpoint_fallback", __FILE__)
+
+Artifice.deactivate
+
+class EndpointTimeout < EndpointFallback
+  SLEEP_TIMEOUT = 15
+
+  get "/api/v1/dependencies" do
+    sleep(SLEEP_TIMEOUT)
+  end
+end
+
+Artifice.activate_with(EndpointTimeout)
diff --git a/misc/lib/bundler-1.3.5/spec/support/builders.rb b/misc/lib/bundler-1.3.5/spec/support/builders.rb
new file mode 100644
index 0000000..856f047
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/builders.rb
@@ -0,0 +1,674 @@
+module Spec
+  module Builders
+    def self.constantize(name)
+      name.gsub('-', '').upcase
+    end
+
+    def v(version)
+      Gem::Version.new(version)
+    end
+
+    def pl(platform)
+      Gem::Platform.new(platform)
+    end
+
+    def build_repo1
+      build_repo gem_repo1 do
+        build_gem "rack", %w(0.9.1 1.0.0) do |s|
+          s.executables = "rackup"
+          s.post_install_message = "Rack's post install message"
+        end
+
+        build_gem "thin" do |s|
+          s.add_dependency "rack"
+          s.post_install_message = "Thin's post install message"
+        end
+
+        build_gem "rack-obama" do |s|
+          s.add_dependency "rack"
+          s.post_install_message = "Rack-obama's post install message"
+        end
+
+        build_gem "rack_middleware", "1.0" do |s|
+          s.add_dependency "rack", "0.9.1"
+        end
+
+        build_gem "rails",          "2.3.2" do |s|
+          s.executables = "rails"
+          s.add_dependency "rake",           "10.0.2"
+          s.add_dependency "actionpack",     "2.3.2"
+          s.add_dependency "activerecord",   "2.3.2"
+          s.add_dependency "actionmailer",   "2.3.2"
+          s.add_dependency "activeresource", "2.3.2"
+        end
+        build_gem "actionpack",     "2.3.2" do |s|
+          s.add_dependency "activesupport", "2.3.2"
+        end
+        build_gem "activerecord",   ["2.3.1", "2.3.2"] do |s|
+          s.add_dependency "activesupport", "2.3.2"
+        end
+        build_gem "actionmailer",   "2.3.2" do |s|
+          s.add_dependency "activesupport", "2.3.2"
+        end
+        build_gem "activeresource", "2.3.2" do |s|
+          s.add_dependency "activesupport", "2.3.2"
+        end
+        build_gem "activesupport",  %w(1.2.3 2.3.2 2.3.5)
+
+        build_gem "activemerchant" do |s|
+          s.add_dependency "activesupport", ">= 2.0.0"
+        end
+
+        build_gem "rails_fail" do |s|
+          s.add_dependency "activesupport", "= 1.2.3"
+        end
+
+        build_gem "missing_dep" do |s|
+          s.add_dependency "not_here"
+        end
+
+        build_gem "rspec", "1.2.7", :no_default => true do |s|
+          s.write "lib/spec.rb", "SPEC = '1.2.7'"
+        end
+
+        build_gem "rack-test", :no_default => true do |s|
+          s.write "lib/rack/test.rb", "RACK_TEST = '1.0'"
+        end
+
+        build_gem "platform_specific" do |s|
+          s.platform = Gem::Platform.local
+          s.write "lib/platform_specific.rb", "PLATFORM_SPECIFIC = '1.0.0 #{Gem::Platform.local}'"
+        end
+
+        build_gem "platform_specific" do |s|
+          s.platform = "java"
+          s.write "lib/platform_specific.rb", "PLATFORM_SPECIFIC = '1.0.0 JAVA'"
+        end
+
+        build_gem "platform_specific" do |s|
+          s.platform = "ruby"
+          s.write "lib/platform_specific.rb", "PLATFORM_SPECIFIC = '1.0.0 RUBY'"
+        end
+
+        build_gem "platform_specific" do |s|
+          s.platform = "x86-mswin32"
+          s.write "lib/platform_specific.rb", "PLATFORM_SPECIFIC = '1.0.0 MSWIN'"
+        end
+
+        build_gem "platform_specific" do |s|
+          s.platform = "x86-darwin-100"
+          s.write "lib/platform_specific.rb", "PLATFORM_SPECIFIC = '1.0.0 x86-darwin-100'"
+        end
+
+        build_gem "only_java" do |s|
+          s.platform = "java"
+        end
+
+        build_gem "nokogiri", "1.4.2"
+        build_gem "nokogiri", "1.4.2" do |s|
+          s.platform = "java"
+          s.write "lib/nokogiri.rb", "NOKOGIRI = '1.4.2 JAVA'"
+          s.add_dependency "weakling", ">= 0.0.3"
+        end
+
+        build_gem "weakling", "0.0.3"
+
+        build_gem "multiple_versioned_deps" do |s|
+          s.add_dependency "weakling", ">= 0.0.1", "< 0.1"
+        end
+
+        build_gem "not_released", "1.0.pre"
+
+        build_gem "has_prerelease", "1.0"
+        build_gem "has_prerelease", "1.1.pre"
+
+        build_gem "with_development_dependency" do |s|
+          s.add_development_dependency "activesupport", "= 2.3.5"
+        end
+
+        build_gem "with_license" do |s|
+          s.license = "MIT"
+        end
+
+        build_gem "with_implicit_rake_dep" do |s|
+          s.extensions << "Rakefile"
+          s.write "Rakefile", <<-RUBY
+            task :default do
+              path = File.expand_path("../lib", __FILE__)
+              FileUtils.mkdir_p(path)
+              File.open("\#{path}/implicit_rake_dep.rb", "w") do |f|
+                f.puts "IMPLICIT_RAKE_DEP = 'YES'"
+              end
+            end
+          RUBY
+        end
+
+        build_gem "another_implicit_rake_dep" do |s|
+          s.extensions << "Rakefile"
+          s.write "Rakefile", <<-RUBY
+            task :default do
+              path = File.expand_path("../lib", __FILE__)
+              FileUtils.mkdir_p(path)
+              File.open("\#{path}/another_implicit_rake_dep.rb", "w") do |f|
+                f.puts "ANOTHER_IMPLICIT_RAKE_DEP = 'YES'"
+              end
+            end
+          RUBY
+        end
+
+        build_gem "very_simple_binary" do |s|
+          s.add_c_extension
+        end
+
+        build_gem "bundler", "0.9" do |s|
+          s.executables = "bundle"
+          s.write "bin/bundle", "puts 'FAIL'"
+        end
+
+        # The bundler 0.8 gem has a rubygems plugin that always loads :(
+        build_gem "bundler", "0.8.1" do |s|
+          s.write "lib/bundler/omg.rb", ""
+          s.write "lib/rubygems_plugin.rb", "require 'bundler/omg' ; puts 'FAIL'"
+        end
+
+        build_gem "bundler_dep" do |s|
+          s.add_dependency "bundler"
+        end
+
+        # The yard gem iterates over Gem.source_index looking for plugins
+        build_gem "yard" do |s|
+          s.write "lib/yard.rb", <<-Y
+            if Gem::Version.new(Gem::VERSION) >= Gem::Version.new("1.8.10")
+              specs = Gem::Specification
+            else
+              specs = Gem.source_index.find_name('')
+            end
+            specs.each do |gem|
+              puts gem.full_name
+            end
+          Y
+        end
+
+        # The rcov gem is platform mswin32, but has no arch
+        build_gem "rcov" do |s|
+          s.platform = Gem::Platform.new([nil, "mswin32", nil])
+          s.write "lib/rcov.rb", "RCOV = '1.0.0'"
+        end
+
+        build_gem "net-ssh"
+        build_gem "net-sftp", "1.1.1" do |s|
+          s.add_dependency "net-ssh", ">= 1.0.0", "< 1.99.0"
+        end
+
+        # Test comlicated gem dependencies for install
+        build_gem "net_a" do |s|
+          s.add_dependency "net_b"
+          s.add_dependency "net_build_extensions"
+        end
+
+        build_gem "net_b"
+
+        build_gem "net_build_extensions" do |s|
+          s.add_dependency "rake"
+          s.extensions << "Rakefile"
+          s.write "Rakefile", <<-RUBY
+            task :default do
+              path = File.expand_path("../lib", __FILE__)
+              FileUtils.mkdir_p(path)
+              File.open("\#{path}/net_build_extensions.rb", "w") do |f|
+                f.puts "NET_BUILD_EXTENSIONS = 'YES'"
+              end
+            end
+          RUBY
+        end
+
+        build_gem "net_c" do |s|
+          s.add_dependency "net_a"
+          s.add_dependency "net_d"
+        end
+
+        build_gem "net_d"
+
+        build_gem "net_e" do |s|
+          s.add_dependency "net_d"
+        end
+
+        # Capistrano did this (at least until version 2.5.10)
+        build_gem "double_deps" do |s|
+          s.add_dependency "net-ssh", ">= 1.0.0"
+          s.add_dependency "net-ssh"
+        end
+
+        build_gem "foo"
+      end
+    end
+
+    def build_repo2(&blk)
+      FileUtils.rm_rf gem_repo2
+      FileUtils.cp_r gem_repo1, gem_repo2
+      update_repo2(&blk) if block_given?
+    end
+
+    def build_repo3
+      build_repo gem_repo3 do
+        build_gem "rack"
+      end
+      FileUtils.rm_rf Dir[gem_repo3("prerelease*")]
+    end
+
+    def update_repo2
+      update_repo gem_repo2 do
+        build_gem "rack", "1.2" do |s|
+          s.executables = "rackup"
+        end
+        yield if block_given?
+      end
+    end
+
+    def build_security_repo
+      build_repo security_repo do
+        build_gem "rack"
+
+        build_gem "signed_gem" do |s|
+          cert = 'signing-cert.pem'
+          pkey = 'signing-pkey.pem'
+          s.write cert, TEST_CERT
+          s.write pkey, TEST_PKEY
+          s.signing_key = pkey
+          s.cert_chain = [cert]
+        end
+      end
+
+    end
+
+    def build_repo(path, &blk)
+      return if File.directory?(path)
+      rake_path = Dir["#{Path.base_system_gems}/**/rake*.gem"].first
+      if rake_path
+        FileUtils.mkdir_p("#{path}/gems")
+        FileUtils.cp rake_path, "#{path}/gems/"
+      else
+        abort "You need to `rm -rf #{tmp}`"
+      end
+      update_repo(path, &blk)
+    end
+
+    def update_repo(path)
+      @_build_path = "#{path}/gems"
+      yield
+      @_build_path = nil
+      with_gem_path_as Path.base_system_gems do
+        Dir.chdir(path) { gem_command :generate_index }
+      end
+    end
+
+    def build_index(&block)
+      index = Bundler::Index.new
+      IndexBuilder.run(index, &block) if block_given?
+      index
+    end
+
+    def build_spec(name, version, platform = nil, &block)
+      Array(version).map do |v|
+        Gem::Specification.new do |s|
+          s.name     = name
+          s.version  = Gem::Version.new(v)
+          s.platform = platform
+          DepBuilder.run(s, &block) if block_given?
+        end
+      end
+    end
+
+    def build_dep(name, requirements = Gem::Requirement.default, type = :runtime)
+      Bundler::Dependency.new(name, :version => requirements)
+    end
+
+    def build_lib(name, *args, &blk)
+      build_with(LibBuilder, name, args, &blk)
+    end
+
+    def build_gem(name, *args, &blk)
+      build_with(GemBuilder, name, args, &blk)
+    end
+
+    def build_git(name, *args, &block)
+      opts = args.last.is_a?(Hash) ? args.last : {}
+      builder = opts[:bare] ? GitBareBuilder : GitBuilder
+      spec = build_with(builder, name, args, &block)
+      GitReader.new(opts[:path] || lib_path(spec.full_name))
+    end
+
+    def update_git(name, *args, &block)
+      spec = build_with(GitUpdater, name, args, &block)
+      GitReader.new lib_path(spec.full_name)
+    end
+
+  private
+
+    def build_with(builder, name, args, &blk)
+      @_build_path ||= nil
+      options  = args.last.is_a?(Hash) ? args.pop : {}
+      versions = args.last || "1.0"
+      spec     = nil
+
+      options[:path] ||= @_build_path
+
+      Array(versions).each do |version|
+        spec = builder.new(self, name, version)
+        if !spec.authors or spec.authors.empty?
+          spec.authors = ["no one"]
+        end
+        yield spec if block_given?
+        spec._build(options)
+      end
+
+      spec
+    end
+
+    class IndexBuilder
+      include Builders
+
+      def self.run(index, &block)
+        new(index).run(&block)
+      end
+
+      def initialize(index)
+        @index = index
+      end
+
+      def run(&block)
+        instance_eval(&block)
+      end
+
+      def gem(*args, &block)
+        build_spec(*args, &block).each do |s|
+          @index << s
+        end
+      end
+
+      def platforms(platforms)
+        platforms.split(/\s+/).each do |platform|
+          platform.gsub!(/^(mswin32)$/, 'x86-\1')
+          yield Gem::Platform.new(platform)
+        end
+      end
+
+      def versions(versions)
+        versions.split(/\s+/).each { |version| yield v(version) }
+      end
+    end
+
+    class DepBuilder
+      include Builders
+
+      def self.run(spec, &block)
+        new(spec).run(&block)
+      end
+
+      def initialize(spec)
+        @spec = spec
+      end
+
+      def run(&block)
+        instance_eval(&block)
+      end
+
+      def runtime(name, requirements)
+        @spec.add_runtime_dependency(name, requirements)
+      end
+
+      alias dep runtime
+    end
+
+    class LibBuilder
+      def initialize(context, name, version)
+        @context = context
+        @name    = name
+        @spec = Gem::Specification.new do |s|
+          s.name    = name
+          s.version = version
+          s.summary = "This is just a fake gem for testing"
+        end
+        @files = {}
+      end
+
+      def method_missing(*args, &blk)
+        @spec.send(*args, &blk)
+      end
+
+      def write(file, source = "")
+        @files[file] = source
+      end
+
+      def executables=(val)
+        Array(val).each do |file|
+          write "#{@spec.bindir}/#{file}", "require '#{@name}' ; puts #{@name.upcase}"
+        end
+        @spec.executables = Array(val)
+      end
+
+      def add_c_extension
+        require_paths << 'ext'
+        extensions << "ext/extconf.rb"
+        write "ext/extconf.rb", <<-RUBY
+          require "mkmf"
+
+          # exit 1 unless with_config("simple")
+
+          extension_name = "very_simple_binary_c"
+          dir_config extension_name
+          create_makefile extension_name
+        RUBY
+        write "ext/very_simple_binary.c", <<-C
+          #include "ruby.h"
+
+          void Init_very_simple_binary_c() {
+            rb_define_module("VerySimpleBinaryInC");
+          }
+        C
+      end
+
+      def _build(options)
+        path = options[:path] || _default_path
+
+        if options[:rubygems_version]
+          @spec.rubygems_version = options[:rubygems_version]
+          def @spec.mark_version; end
+          def @spec.validate; end
+        end
+
+        case options[:gemspec]
+        when false
+          # do nothing
+        when :yaml
+          @files["#{name}.gemspec"] = @spec.to_yaml
+        else
+          @files["#{name}.gemspec"] = @spec.to_ruby
+        end
+
+        unless options[:no_default]
+          @files = _default_files.merge(@files)
+        end
+
+        @spec.authors = ["no one"]
+
+        @files.each do |file, source|
+          file = Pathname.new(path).join(file)
+          FileUtils.mkdir_p(file.dirname)
+          File.open(file, 'w') { |f| f.puts source }
+        end
+        @spec.files = @files.keys
+        path
+      end
+
+      def _default_files
+        @_default_files ||= { "lib/#{name}.rb" => "#{Builders.constantize(name)} = '#{version}'" }
+      end
+
+      def _default_path
+        @context.tmp('libs', @spec.full_name)
+      end
+    end
+
+    class GitBuilder < LibBuilder
+      def _build(options)
+        path = options[:path] || _default_path
+        super(options.merge(:path => path))
+        Dir.chdir(path) do
+          `git init`
+          `git add *`
+          `git config user.email "lol at wut.com"`
+          `git config user.name "lolwut"`
+          `git commit -m 'OMG INITIAL COMMIT'`
+        end
+      end
+    end
+
+    class GitBareBuilder < LibBuilder
+      def _build(options)
+        path = options[:path] || _default_path
+        super(options.merge(:path => path))
+        Dir.chdir(path) do
+          `git init --bare`
+        end
+      end
+    end
+
+    class GitUpdater < LibBuilder
+      def silently(str)
+        `#{str} 2>#{Bundler::NULL}`
+      end
+
+      def _build(options)
+        libpath = options[:path] || _default_path
+
+        Dir.chdir(libpath) do
+          silently "git checkout master"
+
+          if branch = options[:branch]
+            raise "You can't specify `master` as the branch" if branch == "master"
+
+            if `git branch | grep #{branch}`.empty?
+              silently("git branch #{branch}")
+            end
+
+            silently("git checkout #{branch}")
+          elsif tag = options[:tag]
+            `git tag #{tag}`
+          elsif options[:remote]
+            silently("git remote add origin file://#{options[:remote]}")
+          elsif options[:push]
+            silently("git push origin #{options[:push]}")
+          end
+
+          current_ref = `git rev-parse HEAD`.strip
+          _default_files.keys.each do |path|
+            _default_files[path] << "\n#{Builders.constantize(name)}_PREV_REF = '#{current_ref}'"
+          end
+          super(options.merge(:path => libpath, :gemspec => false))
+          `git add *`
+          `git commit -m "BUMP"`
+        end
+      end
+    end
+
+    class GitReader
+      attr_reader :path
+
+      def initialize(path)
+        @path = path
+      end
+
+      def ref_for(ref, len = nil)
+        ref = git "rev-parse #{ref}"
+        ref = ref[0..len] if len
+        ref
+      end
+
+    private
+
+      def git(cmd)
+        Dir.chdir(@path) { `git #{cmd}`.strip }
+      end
+
+    end
+
+    class GemBuilder < LibBuilder
+
+      def _build(opts)
+        lib_path = super(opts.merge(:path => @context.tmp(".tmp/#{@spec.full_name}"), :no_default => opts[:no_default]))
+        Dir.chdir(lib_path) do
+          destination = opts[:path] || _default_path
+          FileUtils.mkdir_p(destination)
+
+          if !@spec.authors or @spec.authors.empty?
+            @spec.authors = ["that guy"]
+          end
+
+          Bundler.rubygems.build(@spec)
+          if opts[:to_system]
+            `gem install --ignore-dependencies #{@spec.full_name}.gem`
+          else
+            FileUtils.mv("#{@spec.full_name}.gem", opts[:path] || _default_path)
+          end
+        end
+      end
+
+      def _default_path
+        @context.gem_repo1('gems')
+      end
+    end
+
+    TEST_CERT=<<CERT
+-----BEGIN CERTIFICATE-----
+MIIDLDCCAhSgAwIBAgIBADANBgkqhkiG9w0BAQUFADA8MRAwDgYDVQQDDAdleGFt
+cGxlMRMwEQYKCZImiZPyLGQBGRYDZm9vMRMwEQYKCZImiZPyLGQBGRYDY29tMB4X
+DTEzMDIwNDIxMTYzNVoXDTE0MDIwNDIxMTYzNVowPDEQMA4GA1UEAwwHZXhhbXBs
+ZTETMBEGCgmSJomT8ixkARkWA2ZvbzETMBEGCgmSJomT8ixkARkWA2NvbTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANVgibTKM0ux14SXQU9M2Ec2mTHG
+hoPJl/3Qq+p4wEalT87/Ascc2BaT6hXWWfAJ4oxReZnPfVop+fXZZDgtVC0JijPC
+v+5JHs5KLEG1N+wzaVI7238yv4N62t48XD585bPp1meiVh9wE2kdax1bIJBwcRhd
+gzR5kFfr2+O7u/g1nO/LN6aAWlKBXqntUmG0wEoWAibWDqpv4AIJhSGrzAqw648F
+5TWiOEvKyrwohAt7IWbmiS8Cr3qT+GSq6tR9Hi6IC8vFW0gBvd1pSX25oUjdNApX
+lzf6zkqBTzek9R7FN6TiymbJfCqaMz55rNAGZDDX0DOqJIvRTR6I2MQSfJsCAwEA
+AaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQULUiq0A8j8lc03KGvxV4a0tuBqfUw
+CwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQBMqoR/F94kK2ou9Yff+DMp
+b/hXEnl8lXzW0euUiTQcVRX6HO2AqGTqdZemUmm1uetGiozsuA1nbPInZQTL/zQq
+oNbg60JxlKWStxF3zsZdKVDNXsXWg4WlzvF6qd4AjDCO//e/BHHe44r+vASqglYO
+zTrTWYgjtDmPOLDvZTHhZ3kBV0Q0pGCBi7f0VYpqjEHSeyRfqJH1LT8yYC3vuYzZ
+PPIub1CZNnaS4jvtSKZsEzaijftwI7ddt/S9Yt7BahUrfHCMrA/Nt3XSDu0BcgaF
+cxrVBbDO8ELUvTY1yFcMYE1gzTIPCYE9TWXgm7A9HcD/7XLXkUL6nuvG3wwpBPTa
+-----END CERTIFICATE-----
+CERT
+
+    TEST_PKEY=<<PKEY
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEA1WCJtMozS7HXhJdBT0zYRzaZMcaGg8mX/dCr6njARqVPzv8C
+xxzYFpPqFdZZ8AnijFF5mc99Win59dlkOC1ULQmKM8K/7kkezkosQbU37DNpUjvb
+fzK/g3ra3jxcPnzls+nWZ6JWH3ATaR1rHVsgkHBxGF2DNHmQV+vb47u7+DWc78s3
+poBaUoFeqe1SYbTAShYCJtYOqm/gAgmFIavMCrDrjwXlNaI4S8rKvCiEC3shZuaJ
+LwKvepP4ZKrq1H0eLogLy8VbSAG93WlJfbmhSN00CleXN/rOSoFPN6T1HsU3pOLK
+Zsl8KpozPnms0AZkMNfQM6oki9FNHojYxBJ8mwIDAQABAoIBAD8AD+iXQun4il+V
+oSzezYTJNBYkPZcvsHa6Y+gI2wyAxr2hQZq0g4C3D4h/D3L2GDPB4pttTd+PQUQ7
+eYG0sIPTq0B5Id4jLLtP3x1PekF9NH2ZOselnjId1f2D6OByVAf45NsYbUE/ABwr
+GXNDcqvy5xGAmrqlod6zvurQhUFVWNYw1Ry6MCxD79S54Rky9cv6qzviPAh570y+
+aWS+lXJeqVVhmwWnbOUBWu/8dsniJbknassxwOYCShNLGnPMW+gklPaUucOkDF8K
+R0xYbOpAowQaIOdm7sQtt/CZOD34pgAWlLMev/J5y7+y6jvdqBMoLKIMAj/YqphW
+FqOY4fECgYEA9t5MqdexzOpz5LTQbqUDDiMtVR5mn/7wPbgNCRuAADTuM8QJkREe
+JCEG/S9CEmefoa6gr+CyWhq9qbFhLC7rEgBCInW/hL5m8qGVAVcpIUCbpYh7nirN
+fHQP6zL2RESmJDo3Y0vLZosR+XR1UDSb3tdTQSXt/MX6p+gjcswnzN0CgYEA3UUY
+ew22HjB1dnS7ps/gdsNwlalYYwSkfuBqNkluvMRE56HGbKeDYjEV4egkWZVYUNDJ
+P+jVKUTOSfgzXOsR7rKeiaQ3UEZfVpV3iQWtqzS2+BlhWBoQsBLD5CjdP8ykOQGr
+NQVNegXAFGhsiRNwm4Mpl5+t+Ap9aqSy1WwAu9cCgYBwY0vrlrLvY11XpamudZkq
+eoFM2wZFmL6umnf0yXxAm9hF4N2qGWzrbc3MvhMKZfqalPG6oEUSGFJ4SrS+dK24
+CD4Tih+iwzwDAeTgM1oaNVumxLfijgH2wq/sl8rd0ZMBsy88GWmESZPpSUePOCQu
+E0Fny2jJRyiSAHEC9ka4UQKBgDFBmWKDOeBcjzlwYPmQWvp1JVHbodZhCTFJSbuN
++z3AP0qFA8PaQnAQVzuzzqu2iDNtVu+IKDOIopdqzhxII/TMBGjFip6vG7gNi8+P
+2Qo8sOJn2/idzMs1UjAvPJlgN8qM6YzjAk1AjHK+kDKvhijIOPEM1dBanXKo+Tpz
+UXJ/AoGABULY7oaW7vW7XLiHVTHeoqi9m9yNTVQRnsMFJm5GhisjavZbCzCGz1Tl
+hiIdZiAgSpltgy7+R7l7JhmFf04xVnEJc/4lyJc4ZwYXkMGqD1tE9FXowbBFKktB
+cPFVDEsR7SPkiAmGm99WiigexSwxW9hl+TjgolcXG7HTDsES2Sg=
+-----END RSA PRIVATE KEY-----
+PKEY
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/support/fakeweb/rack-1.0.0.marshal b/misc/lib/bundler-1.3.5/spec/support/fakeweb/rack-1.0.0.marshal
new file mode 100644
index 0000000..383ce40
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/fakeweb/rack-1.0.0.marshal
@@ -0,0 +1,2 @@
+[{	:dependencies[
["	thin"	>= 0["ruby-openid"
~> 2.0.0["
mongrel"	>= 0["memcache-client"	>= 0["	fcgi"	>= 0["
camping"	>= 0["test-spec"	>= 0:
platform"	ruby:	name"	rack:
number"
+1.0.0
\ No newline at end of file
diff --git a/misc/lib/bundler-1.3.5/spec/support/fakeweb/windows.rb b/misc/lib/bundler-1.3.5/spec/support/fakeweb/windows.rb
new file mode 100644
index 0000000..0a5dfcb
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/fakeweb/windows.rb
@@ -0,0 +1,23 @@
+require File.expand_path("../../path.rb", __FILE__)
+include Spec::Path
+
+files = [ 'specs.4.8.gz',
+          'prerelease_specs.4.8.gz',
+          'quick/Marshal.4.8/rcov-1.0-mswin32.gemspec.rz',
+          'gems/rcov-1.0-mswin32.gem' ]
+
+# Set up pretend http gem server with FakeWeb
+$LOAD_PATH.unshift "#{Dir[base_system_gems.join("gems/fakeweb*/lib")].first}"
+require 'fakeweb'
+
+FakeWeb.allow_net_connect = false
+
+files.each do |file|
+  FakeWeb.register_uri(:get, "http://localgemserver.test/#{file}",
+    :body => File.read("#{gem_repo1}/#{file}"))
+end
+FakeWeb.register_uri(:get, "http://localgemserver.test/gems/rcov-1.0-x86-mswin32.gem",
+  :status => ["404", "Not Found"])
+
+FakeWeb.register_uri(:get, "http://localgemserver.test/api/v1/dependencies",
+  :status => ["404", "Not Found"])
diff --git a/misc/lib/bundler-1.3.5/spec/support/helpers.rb b/misc/lib/bundler-1.3.5/spec/support/helpers.rb
new file mode 100644
index 0000000..0fd74bd
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/helpers.rb
@@ -0,0 +1,336 @@
+module Spec
+  module Helpers
+    def reset!
+      @in_p, @out_p, @err_p = nil, nil, nil
+      Dir["#{tmp}/{gems/*,*}"].each do |dir|
+        next if %(base remote1 gems rubygems).include?(File.basename(dir))
+        unless ENV['BUNDLER_SUDO_TESTS']
+          FileUtils.rm_rf(dir)
+        else
+          `sudo rm -rf #{dir}`
+        end
+      end
+      FileUtils.mkdir_p(tmp)
+      FileUtils.mkdir_p(home)
+    end
+
+    attr_reader :out, :err, :exitstatus
+
+    def in_app_root(&blk)
+      Dir.chdir(bundled_app, &blk)
+    end
+
+    def in_app_root2(&blk)
+      Dir.chdir(bundled_app2, &blk)
+    end
+
+    def in_app_root_custom(root, &blk)
+      Dir.chdir(root, &blk)
+    end
+
+    def run(cmd, *args)
+      opts = args.last.is_a?(Hash) ? args.pop : {}
+      expect_err = opts.delete(:expect_err)
+      env = opts.delete(:env)
+      groups = args.map {|a| a.inspect }.join(", ")
+      setup = "require 'rubygems' ; require 'bundler' ; Bundler.setup(#{groups})\n"
+      @out = ruby(setup + cmd, :expect_err => expect_err, :env => env)
+    end
+
+    def load_error_run(ruby, name, *args)
+      cmd = <<-RUBY
+        begin
+          #{ruby}
+        rescue LoadError => e
+          $stderr.puts "ZOMG LOAD ERROR" if e.message.include?("-- #{name}")
+        end
+      RUBY
+      opts = args.last.is_a?(Hash) ? args.pop : {}
+      opts.merge!(:expect_err => true)
+      args += [opts]
+      run(cmd, *args)
+    end
+
+    def lib
+      File.expand_path('../../../lib', __FILE__)
+    end
+
+    def bundle(cmd, options = {})
+      expect_err  = options.delete(:expect_err)
+      exitstatus = options.delete(:exitstatus)
+      options["no-color"] = true unless options.key?("no-color") || %w(exec conf).include?(cmd.to_s[0..3])
+
+      bundle_bin = File.expand_path('../../../bin/bundle', __FILE__)
+
+      requires = options.delete(:requires) || []
+      requires << File.expand_path('../fakeweb/'+options.delete(:fakeweb)+'.rb', __FILE__) if options.key?(:fakeweb)
+      requires << File.expand_path('../artifice/'+options.delete(:artifice)+'.rb', __FILE__) if options.key?(:artifice)
+      requires_str = requires.map{|r| "-r#{r}"}.join(" ")
+
+      env = (options.delete(:env) || {}).map{|k,v| "#{k}='#{v}' "}.join
+      args = options.map do |k,v|
+        v == true ? " --#{k}" : " --#{k} #{v}" if v
+      end.join
+
+      cmd = "#{env}#{Gem.ruby} -I#{lib} #{requires_str} #{bundle_bin} #{cmd}#{args}"
+
+      if exitstatus
+        sys_status(cmd)
+      else
+        sys_exec(cmd, expect_err){|i| yield i if block_given? }
+      end
+    end
+
+    def bundle_ruby(options = {})
+      expect_err  = options.delete(:expect_err)
+      exitstatus = options.delete(:exitstatus)
+      options["no-color"] = true unless options.key?("no-color")
+
+      bundle_bin = File.expand_path('../../../bin/bundle_ruby', __FILE__)
+
+      requires = options.delete(:requires) || []
+      requires << File.expand_path('../fakeweb/'+options.delete(:fakeweb)+'.rb', __FILE__) if options.key?(:fakeweb)
+      requires << File.expand_path('../artifice/'+options.delete(:artifice)+'.rb', __FILE__) if options.key?(:artifice)
+      requires_str = requires.map{|r| "-r#{r}"}.join(" ")
+
+      env = (options.delete(:env) || {}).map{|k,v| "#{k}='#{v}' "}.join
+      args = options.map do |k,v|
+        v == true ? " --#{k}" : " --#{k} #{v}" if v
+      end.join
+
+      cmd = "#{env}#{Gem.ruby} -I#{lib} #{requires_str} #{bundle_bin}"
+
+      if exitstatus
+        sys_status(cmd)
+      else
+        sys_exec(cmd, expect_err){|i| yield i if block_given? }
+      end
+    end
+
+    def ruby(ruby, options = {})
+      expect_err = options.delete(:expect_err)
+      env = (options.delete(:env) || {}).map{|k,v| "#{k}='#{v}' "}.join
+      ruby.gsub!(/["`\$]/) {|m| "\\#{m}" }
+      lib_option = options[:no_lib] ? "" : " -I#{lib}"
+      sys_exec(%{#{env}#{Gem.ruby}#{lib_option} -e "#{ruby}"}, expect_err)
+    end
+
+    def load_error_ruby(ruby, name, opts = {})
+      cmd = <<-R
+        begin
+          #{ruby}
+        rescue LoadError => e
+          $stderr.puts "ZOMG LOAD ERROR"# if e.message.include?("-- #{name}")
+        end
+      R
+      ruby(cmd, opts.merge(:expect_err => true))
+    end
+
+    def gembin(cmd)
+      lib = File.expand_path("../../../lib", __FILE__)
+      old, ENV['RUBYOPT'] = ENV['RUBYOPT'], "#{ENV['RUBYOPT']} -I#{lib}"
+      cmd = bundled_app("bin/#{cmd}") unless cmd.to_s.include?("/")
+      sys_exec(cmd.to_s)
+    ensure
+      ENV['RUBYOPT'] = old
+    end
+
+    def sys_exec(cmd, expect_err = false)
+      Open3.popen3(cmd.to_s) do |stdin, stdout, stderr|
+        @in_p, @out_p, @err_p = stdin, stdout, stderr
+
+        yield @in_p if block_given?
+        @in_p.close
+
+        @out = @out_p.read_available_bytes.strip
+        @err = @err_p.read_available_bytes.strip
+      end
+
+      puts @err unless expect_err || @err.empty? || !$show_err
+      @out
+    end
+
+    def sys_status(cmd)
+      @err = nil
+      @out = %x{#{cmd}}.strip
+      @exitstatus = $?.exitstatus
+    end
+
+    def config(config = nil)
+      path = bundled_app('.bundle/config')
+      return YAML.load_file(path) unless config
+      FileUtils.mkdir_p(File.dirname(path))
+      File.open(path, 'w') do |f|
+        f.puts config.to_yaml
+      end
+      config
+    end
+
+    def gemfile(*args)
+      path = bundled_app("Gemfile")
+      path = args.shift if Pathname === args.first
+      str  = args.shift || ""
+      path.dirname.mkpath
+      File.open(path.to_s, 'w') do |f|
+        f.puts strip_whitespace(str)
+      end
+    end
+
+    def lockfile(*args)
+      path = bundled_app("Gemfile.lock")
+      path = args.shift if Pathname === args.first
+      str  = args.shift || ""
+      File.open(path.to_s, 'w') do |f|
+        f.puts strip_whitespace(str)
+      end
+    end
+
+    def strip_whitespace(str)
+      # Trim the leading spaces
+      spaces = str[/\A\s+/, 0] || ""
+      str.gsub(/^#{spaces}/, '')
+    end
+
+    def install_gemfile(*args)
+      gemfile(*args)
+      opts = args.last.is_a?(Hash) ? args.last : {}
+      bundle :install, opts
+    end
+
+    def install_gems(*gems)
+      gems.each do |g|
+        path = "#{gem_repo1}/gems/#{g}.gem"
+
+        raise "OMG `#{path}` does not exist!" unless File.exist?(path)
+
+        gem_command :install, "--no-rdoc --no-ri --ignore-dependencies #{path}"
+      end
+    end
+
+    alias install_gem install_gems
+
+    def with_gem_path_as(path)
+      gem_home, gem_path = ENV['GEM_HOME'], ENV['GEM_PATH']
+      ENV['GEM_HOME'], ENV['GEM_PATH'] = path.to_s, path.to_s
+      yield
+    ensure
+      ENV['GEM_HOME'], ENV['GEM_PATH'] = gem_home, gem_path
+    end
+
+    def break_git!
+      FileUtils.mkdir_p(tmp("broken_path"))
+      File.open(tmp("broken_path/git"), "w", 0755) do |f|
+        f.puts "#!/usr/bin/env ruby\nSTDERR.puts 'This is not the git you are looking for'\nexit 1"
+      end
+
+      ENV["PATH"] = "#{tmp("broken_path")}:#{ENV["PATH"]}"
+    end
+
+    def fake_groff!
+      FileUtils.mkdir_p(tmp("fake_groff"))
+      File.open(tmp("fake_groff/groff"), "w", 0755) do |f|
+        f.puts "#!/usr/bin/env ruby\nputs ARGV.inspect\n"
+      end
+
+      ENV["PATH"] = "#{tmp("fake_groff")}:#{ENV["PATH"]}"
+    end
+
+    def kill_path!
+      ENV["PATH"] = ""
+    end
+
+    def system_gems(*gems)
+      gems = gems.flatten
+
+      FileUtils.rm_rf(system_gem_path)
+      FileUtils.mkdir_p(system_gem_path)
+
+      Gem.clear_paths
+
+      gem_home, gem_path, path = ENV['GEM_HOME'], ENV['GEM_PATH'], ENV['PATH']
+      ENV['GEM_HOME'], ENV['GEM_PATH'] = system_gem_path.to_s, system_gem_path.to_s
+
+      install_gems(*gems)
+      if block_given?
+        begin
+          yield
+        ensure
+          ENV['GEM_HOME'], ENV['GEM_PATH'] = gem_home, gem_path
+          ENV['PATH'] = path
+        end
+      end
+    end
+
+    def realworld_system_gems(*gems)
+      gems = gems.flatten
+
+      FileUtils.rm_rf(system_gem_path)
+      FileUtils.mkdir_p(system_gem_path)
+
+      Gem.clear_paths
+
+      gem_home, gem_path, path = ENV['GEM_HOME'], ENV['GEM_PATH'], ENV['PATH']
+      ENV['GEM_HOME'], ENV['GEM_PATH'] = system_gem_path.to_s, system_gem_path.to_s
+
+      gems.each do |gem|
+        gem_command :install, "--no-rdoc --no-ri #{gem}"
+      end
+      if block_given?
+        begin
+          yield
+        ensure
+          ENV['GEM_HOME'], ENV['GEM_PATH'] = gem_home, gem_path
+          ENV['PATH'] = path
+        end
+      end
+    end
+
+    def cache_gems(*gems)
+      gems = gems.flatten
+
+      FileUtils.rm_rf("#{bundled_app}/vendor/cache")
+      FileUtils.mkdir_p("#{bundled_app}/vendor/cache")
+
+      gems.each do |g|
+        path = "#{gem_repo1}/gems/#{g}.gem"
+        raise "OMG `#{path}` does not exist!" unless File.exist?(path)
+        FileUtils.cp(path, "#{bundled_app}/vendor/cache")
+      end
+    end
+
+    def simulate_new_machine
+      system_gems []
+      FileUtils.rm_rf default_bundle_path
+      FileUtils.rm_rf bundled_app('.bundle')
+    end
+
+    def simulate_platform(platform)
+      old, ENV['BUNDLER_SPEC_PLATFORM'] = ENV['BUNDLER_SPEC_PLATFORM'], platform.to_s
+      yield if block_given?
+    ensure
+      ENV['BUNDLER_SPEC_PLATFORM'] = old if block_given?
+    end
+
+    def simulate_ruby_engine(engine, version = "1.6.0")
+      return if engine == local_ruby_engine
+
+      old, ENV['BUNDLER_SPEC_RUBY_ENGINE'] = ENV['BUNDLER_SPEC_RUBY_ENGINE'], engine
+      old_version, ENV['BUNDLER_SPEC_RUBY_ENGINE_VERSION'] = ENV['BUNDLER_SPEC_RUBY_ENGINE_VERSION'], version
+      yield if block_given?
+    ensure
+      ENV['BUNDLER_SPEC_RUBY_ENGINE'] = old if block_given?
+      ENV['BUNDLER_SPEC_RUBY_ENGINE_VERSION'] = old_version if block_given?
+    end
+
+    def simulate_bundler_version(version)
+      old, ENV['BUNDLER_SPEC_VERSION'] = ENV['BUNDLER_SPEC_VERSION'], version.to_s
+      yield if block_given?
+    ensure
+      ENV['BUNDLER_SPEC_VERSION'] = old if block_given?
+    end
+
+    def revision_for(path)
+      Dir.chdir(path) { `git rev-parse HEAD`.strip }
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/support/indexes.rb b/misc/lib/bundler-1.3.5/spec/support/indexes.rb
new file mode 100644
index 0000000..2ca67a6
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/indexes.rb
@@ -0,0 +1,134 @@
+module Spec
+  module Indexes
+    def dep(name, reqs = nil)
+      @deps ||= []
+      @deps << Bundler::Dependency.new(name, :version => reqs)
+    end
+
+    def platform(*args)
+      @platforms ||= []
+      @platforms.concat args.map { |p| Gem::Platform.new(p) }
+    end
+
+    alias platforms platform
+
+    def resolve
+      @platforms ||= ['ruby']
+      deps = []
+      @deps.each do |d|
+        @platforms.each do |p|
+          deps << Bundler::DepProxy.new(d, p)
+        end
+      end
+      Bundler::Resolver.resolve(deps, @index)
+    end
+
+    def should_resolve_as(specs)
+      got = resolve
+      got = got.map { |s| s.full_name }.sort
+      expect(got).to eq(specs.sort)
+    end
+
+    def should_conflict_on(names)
+      begin
+        got = resolve
+        flunk "The resolve succeeded with: #{got.map { |s| s.full_name }.sort.inspect}"
+      rescue Bundler::VersionConflict => e
+        expect(Array(names).sort).to eq(e.conflicts.sort)
+      end
+    end
+
+    def gem(*args, &blk)
+      build_spec(*args, &blk).first
+    end
+
+    def an_awesome_index
+      build_index do
+        gem "rack", %w(0.8 0.9 0.9.1 0.9.2 1.0 1.1)
+        gem "rack-mount", %w(0.4 0.5 0.5.1 0.5.2 0.6)
+
+        # --- Rails
+        versions "1.2.3 2.2.3 2.3.5 3.0.0.beta 3.0.0.beta1" do |version|
+          gem "activesupport", version
+          gem "actionpack", version do
+            dep "activesupport", version
+            if version >= v('3.0.0.beta')
+              dep "rack", '~> 1.1'
+              dep "rack-mount", ">= 0.5"
+            elsif version > v('2.3')   then dep "rack", '~> 1.0.0'
+            elsif version > v('2.0.0') then dep "rack", '~> 0.9.0'
+            end
+          end
+          gem "activerecord", version do
+            dep "activesupport", version
+            dep "arel", ">= 0.2" if version >= v('3.0.0.beta')
+          end
+          gem "actionmailer", version do
+            dep "activesupport", version
+            dep "actionmailer",  version
+          end
+          if version < v('3.0.0.beta')
+            gem "railties", version do
+              dep "activerecord",  version
+              dep "actionpack",    version
+              dep "actionmailer",  version
+              dep "activesupport", version
+            end
+          else
+            gem "railties", version
+            gem "rails", version do
+              dep "activerecord",  version
+              dep "actionpack",    version
+              dep "actionmailer",  version
+              dep "activesupport", version
+              dep "railties",      version
+            end
+          end
+        end
+
+        versions '1.0 1.2 1.2.1 1.2.2 1.3 1.3.0.1 1.3.5 1.4.0 1.4.2 1.4.2.1' do |version|
+          platforms "ruby java mswin32 mingw32" do |platform|
+            next if version == v('1.4.2.1') && platform != pl('x86-mswin32')
+            next if version == v('1.4.2') && platform == pl('x86-mswin32')
+            gem "nokogiri", version, platform do
+              dep "weakling", ">= 0.0.3" if platform =~ pl('java')
+            end
+          end
+        end
+
+        versions '0.0.1 0.0.2 0.0.3' do |version|
+          gem "weakling", version
+        end
+
+        # --- Rails related
+        versions '1.2.3 2.2.3 2.3.5' do |version|
+          gem "activemerchant", version do
+            dep "activesupport", ">= #{version}"
+          end
+        end
+      end
+    end
+
+    # Builder 3.1.4 will activate first, but if all
+    # goes well, it should resolve to 3.0.4
+    def a_conflict_index
+      build_index do
+        gem "builder", %w(3.0.4 3.1.4)
+        gem("grape", '0.2.6') do
+          dep "builder", ">= 0"
+        end
+
+        versions '3.2.8 3.2.9 3.2.10 3.2.11' do |version|
+          gem("activemodel", version) do
+            dep "builder", "~> 3.0.0"
+          end
+        end
+
+        gem("my_app", '1.0.0') do
+          dep "activemodel", ">= 0"
+          dep "grape", ">= 0"
+        end
+      end
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/support/matchers.rb b/misc/lib/bundler-1.3.5/spec/support/matchers.rb
new file mode 100644
index 0000000..e42c67b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/matchers.rb
@@ -0,0 +1,77 @@
+module Spec
+  module Matchers
+    RSpec::Matchers.define :have_dep do |*args|
+      dep = Bundler::Dependency.new(*args)
+
+      match do |actual|
+        actual.length == 1 && actual.all? { |d| d == dep }
+      end
+    end
+
+    RSpec::Matchers.define :have_gem do |*args|
+      match do |actual|
+        actual.length == args.length && actual.all? { |a| args.include?(a.full_name) }
+      end
+    end
+
+    RSpec::Matchers.define :have_rubyopts do |*args|
+      args = args.flatten
+      args = args.first.split(/\s+/) if args.size == 1
+
+      #failure_message_for_should "Expected RUBYOPT to have options #{args.join(" ")}. It was #{ENV["RUBYOPT"]}"
+
+      match do |actual|
+        actual = actual.split(/\s+/) if actual.is_a?(String)
+        args.all? {|arg| actual.include?(arg) } && actual.uniq.size == actual.size
+      end
+    end
+
+    def should_be_installed(*names)
+      opts = names.last.is_a?(Hash) ? names.pop : {}
+      groups = Array(opts[:groups])
+      groups << opts
+      names.each do |name|
+        name, version, platform = name.split(/\s+/)
+        version_const = name == 'bundler' ? 'Bundler::VERSION' : Spec::Builders.constantize(name)
+        run "require '#{name}.rb'; puts #{version_const}", *groups
+        actual_version, actual_platform = out.split(/\s+/)
+        expect(Gem::Version.new(actual_version)).to eq(Gem::Version.new(version))
+        expect(actual_platform).to eq(platform)
+      end
+    end
+
+    alias should_be_available should_be_installed
+
+    def should_not_be_installed(*names)
+      opts = names.last.is_a?(Hash) ? names.pop : {}
+      groups = Array(opts[:groups]) || []
+      names.each do |name|
+        name, version = name.split(/\s+/)
+        run <<-R, *(groups + [opts])
+          begin
+            require '#{name}'
+            puts #{Spec::Builders.constantize(name)}
+          rescue LoadError, NameError
+            puts "WIN"
+          end
+        R
+        if version.nil? || out == "WIN"
+          expect(out).to eq("WIN")
+        else
+          expect(Gem::Version.new(out)).not_to eq(Gem::Version.new(version))
+        end
+      end
+    end
+
+    def should_be_locked
+      expect(bundled_app("Gemfile.lock")).to exist
+    end
+
+    def lockfile_should_be(expected)
+      should_be_locked
+      spaces = expected[/\A\s+/, 0] || ""
+      expected.gsub!(/^#{spaces}/, '')
+      expect(bundled_app("Gemfile.lock").read).to eq(expected)
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/support/path.rb b/misc/lib/bundler-1.3.5/spec/support/path.rb
new file mode 100644
index 0000000..b1d3c60
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/path.rb
@@ -0,0 +1,77 @@
+require 'pathname'
+
+module Spec
+  module Path
+    def root
+      @root ||= Pathname.new(File.expand_path("../../..", __FILE__))
+    end
+
+    def tmp(*path)
+      root.join("tmp", *path)
+    end
+
+    def home(*path)
+      tmp.join("home", *path)
+    end
+
+    def default_bundle_path(*path)
+      system_gem_path(*path)
+    end
+
+    def bundled_app(*path)
+      root = tmp.join("bundled_app")
+      FileUtils.mkdir_p(root)
+      root.join(*path)
+    end
+
+    alias bundled_app1 bundled_app
+
+    def bundled_app2(*path)
+      root = tmp.join("bundled_app2")
+      FileUtils.mkdir_p(root)
+      root.join(*path)
+    end
+
+    def vendored_gems(path = nil)
+      bundled_app(*["vendor/bundle", Gem.ruby_engine, Gem::ConfigMap[:ruby_version], path].compact)
+    end
+
+    def cached_gem(path)
+      bundled_app("vendor/cache/#{path}.gem")
+    end
+
+    def base_system_gems
+      tmp.join("gems/base")
+    end
+
+    def gem_repo1(*args)
+      tmp("gems/remote1", *args)
+    end
+
+    def gem_repo2(*args)
+      tmp("gems/remote2", *args)
+    end
+
+    def gem_repo3(*args)
+      tmp("gems/remote3", *args)
+    end
+
+    def security_repo(*args)
+      tmp("gems/security_repo", *args)
+    end
+
+    def system_gem_path(*path)
+      tmp("gems/system", *path)
+    end
+
+    def lib_path(*args)
+      tmp("libs", *args)
+    end
+
+    def bundler_path
+      Pathname.new(File.expand_path('../../../lib', __FILE__))
+    end
+
+    extend self
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/support/platforms.rb b/misc/lib/bundler-1.3.5/spec/support/platforms.rb
new file mode 100644
index 0000000..a311458
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/platforms.rb
@@ -0,0 +1,86 @@
+module Spec
+  module Platforms
+    include Bundler::GemHelpers
+
+    def rb
+      Gem::Platform::RUBY
+    end
+
+    def mac
+      Gem::Platform.new('x86-darwin-10')
+    end
+
+    def java
+      Gem::Platform.new([nil, "java", nil])
+    end
+
+    def linux
+      Gem::Platform.new(['x86', 'linux', nil])
+    end
+
+    def mswin
+      Gem::Platform.new(['x86', 'mswin32', nil])
+    end
+
+    def mingw
+      Gem::Platform.new(['x86', 'mingw32', nil])
+    end
+
+    def all_platforms
+      [rb, java, linux, mswin, mingw]
+    end
+
+    def local
+      generic(Gem::Platform.local)
+    end
+
+    def not_local
+      all_platforms.find { |p| p != generic(Gem::Platform.local) }
+    end
+
+    def local_tag
+      if RUBY_PLATFORM == "java"
+        :jruby
+      else
+        :ruby
+      end
+    end
+
+    def not_local_tag
+      [:ruby, :jruby].find { |tag| tag != local_tag }
+    end
+
+    def local_ruby_engine
+      ENV["BUNDLER_SPEC_RUBY_ENGINE"] || (defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby")
+    end
+
+    def local_engine_version
+      return ENV["BUNDLER_SPEC_RUBY_ENGINE_VERSION"] if ENV["BUNDLER_SPEC_RUBY_ENGINE_VERSION"]
+
+      case local_ruby_engine
+      when "ruby"
+        RUBY_VERSION
+      when "rbx"
+        Rubinius::VERSION
+      when "jruby"
+        JRUBY_VERSION
+      else
+        raise BundlerError, "That RUBY_ENGINE is not recognized"
+        nil
+      end
+    end
+
+    def not_local_engine_version
+      case not_local_tag
+      when :ruby
+        not_local_ruby_version
+      when :jruby
+        "1.6.1"
+      end
+    end
+
+    def not_local_ruby_version
+      "1.12"
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/support/ruby_ext.rb b/misc/lib/bundler-1.3.5/spec/support/ruby_ext.rb
new file mode 100644
index 0000000..f1590a7
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/ruby_ext.rb
@@ -0,0 +1,20 @@
+class IO
+  def read_available_bytes(chunk_size = 16384, select_timeout = 0.02)
+    buffer = []
+
+    return "" if closed? || eof?
+    # IO.select cannot be used here due to the fact that it
+    # just does not work on windows
+    while true
+      begin
+        IO.select([self], nil, nil, select_timeout)
+        break if eof? # stop raising :-(
+        buffer << self.readpartial(chunk_size)
+      rescue(EOFError)
+        break
+      end
+    end
+
+    return buffer.join
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/support/rubygems_ext.rb b/misc/lib/bundler-1.3.5/spec/support/rubygems_ext.rb
new file mode 100644
index 0000000..19d0688
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/rubygems_ext.rb
@@ -0,0 +1,39 @@
+require 'rubygems/user_interaction'
+
+module Spec
+  module Rubygems
+    def self.setup
+      Gem.clear_paths
+
+      ENV['BUNDLE_PATH'] = nil
+      ENV['GEM_HOME'] = ENV['GEM_PATH'] = Path.base_system_gems.to_s
+      ENV['PATH'] = ["#{Path.root}/bin", "#{Path.system_gem_path}/bin", ENV['PATH']].join(File::PATH_SEPARATOR)
+
+      unless File.exist?("#{Path.base_system_gems}")
+        FileUtils.mkdir_p(Path.base_system_gems)
+        puts "fetching fakeweb, artifice, sinatra, rake, rack, and builder for the tests to use..."
+        `gem install fakeweb artifice --no-rdoc --no-ri`
+        `gem install sinatra --version 1.2.7 --no-rdoc --no-ri`
+        # Rake version has to be consistent for tests to pass
+        `gem install rake --version 10.0.2 --no-rdoc --no-ri`
+        # 3.0.0 breaks 1.9.2 specs
+        `gem install builder --version 2.1.2 --no-rdoc --no-ri`
+        `gem install rack --no-rdoc --no-ri`
+        `gem install pry --no-rdoc --no-ri`
+      end
+
+      ENV['HOME'] = Path.home.to_s
+
+      Gem::DefaultUserInteraction.ui = Gem::SilentUI.new
+    end
+
+    def gem_command(command, args = "", options = {})
+      if command == :exec && !options[:no_quote]
+        args = args.gsub(/(?=")/, "\\")
+        args = %["#{args}"]
+      end
+      lib  = File.join(File.dirname(__FILE__), '..', '..', 'lib')
+      %x{#{Gem.ruby} -I#{lib} -rubygems -S gem --backtrace #{command} #{args}}.strip
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/support/rubygems_hax/platform.rb b/misc/lib/bundler-1.3.5/spec/support/rubygems_hax/platform.rb
new file mode 100644
index 0000000..a473768
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/rubygems_hax/platform.rb
@@ -0,0 +1,22 @@
+require 'rubygems'
+
+class Gem::Platform
+  @local = new(ENV['BUNDLER_SPEC_PLATFORM']) if ENV['BUNDLER_SPEC_PLATFORM']
+end
+
+if ENV['BUNDLER_SPEC_VERSION']
+  module Bundler
+    VERSION = ENV['BUNDLER_SPEC_VERSION'].dup
+  end
+end
+
+class Object
+  if ENV['BUNDLER_SPEC_RUBY_ENGINE']
+    remove_const :RUBY_ENGINE if defined?(RUBY_ENGINE)
+    RUBY_ENGINE = ENV['BUNDLER_SPEC_RUBY_ENGINE']
+
+    if RUBY_ENGINE == "jruby"
+      JRUBY_VERSION = ENV["BUNDLER_SPEC_RUBY_ENGINE_VERSION"]
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/support/sudo.rb b/misc/lib/bundler-1.3.5/spec/support/sudo.rb
new file mode 100644
index 0000000..6c9a0c2
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/support/sudo.rb
@@ -0,0 +1,20 @@
+module Spec
+  module Sudo
+    def self.present?
+      @which_sudo ||= Bundler.which("sudo")
+    end
+
+    def self.test_sudo?
+      present? && ENV['BUNDLER_SUDO_TESTS']
+    end
+
+    def sudo(cmd)
+      raise "sudo not present" unless Sudo.present?
+      sys_exec("sudo #{cmd}")
+    end
+
+    def chown_system_gems_to_root
+      sudo "chown -R root #{system_gem_path}"
+    end
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/update/gems_spec.rb b/misc/lib/bundler-1.3.5/spec/update/gems_spec.rb
new file mode 100644
index 0000000..3616fcd
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/update/gems_spec.rb
@@ -0,0 +1,153 @@
+require "spec_helper"
+
+describe "bundle update" do
+  before :each do
+    build_repo2
+
+    install_gemfile <<-G
+      source "file://#{gem_repo2}"
+      gem "activesupport"
+      gem "rack-obama"
+    G
+  end
+
+  describe "with no arguments" do
+    it "updates the entire bundle" do
+      update_repo2 do
+        build_gem "activesupport", "3.0"
+      end
+
+      bundle "update"
+      should_be_installed "rack 1.2", "rack-obama 1.0", "activesupport 3.0"
+    end
+
+    it "doesn't delete the Gemfile.lock file if something goes wrong" do
+      gemfile <<-G
+        source "file://#{gem_repo2}"
+        gem "activesupport"
+        gem "rack-obama"
+        exit!
+      G
+      bundle "update"
+      expect(bundled_app("Gemfile.lock")).to exist
+    end
+  end
+
+  describe "--quiet argument" do
+    it 'shows UI messages without --quiet argument' do
+      bundle "update"
+      expect(out).to include("Fetching source")
+    end
+
+    it 'does not show UI messages with --quiet argument' do
+      bundle "update --quiet"
+      expect(out).not_to include("Fetching source")
+    end
+  end
+
+  describe "with a top level dependency" do
+    it "unlocks all child dependencies that are unrelated to other locked dependencies" do
+      update_repo2 do
+        build_gem "activesupport", "3.0"
+      end
+
+      bundle "update rack-obama"
+      should_be_installed "rack 1.2", "rack-obama 1.0", "activesupport 2.3.5"
+    end
+  end
+
+  describe "with a unknown dependency" do
+    it "should inform the user" do
+      bundle "update halting-problem-solver", :expect_err=>true
+      expect(out).to include "Could not find gem 'halting-problem-solver'"
+    end
+    it "should suggest alternatives" do
+      bundle "update active-support", :expect_err=>true
+      expect(out).to include "Did you mean activesupport?"
+    end
+  end
+
+  describe "with a child dependency" do
+    it "should update the child dependency" do
+      update_repo2
+      bundle "update rack"
+      should_be_installed "rack 1.2"
+    end
+  end
+
+  describe "with --local option" do
+    it "doesn't hit repo2" do
+      FileUtils.rm_rf(gem_repo2)
+
+      bundle "update --local"
+      expect(out).not_to match(/Fetching source index/)
+    end
+  end
+end
+
+describe "bundle update in more complicated situations" do
+  before :each do
+    build_repo2
+  end
+
+  it "will eagerly unlock dependencies of a specified gem" do
+    install_gemfile <<-G
+      source "file://#{gem_repo2}"
+
+      gem "thin"
+      gem "rack-obama"
+    G
+
+    update_repo2 do
+      build_gem "thin" , '2.0' do |s|
+        s.add_dependency "rack"
+      end
+    end
+
+    bundle "update thin"
+    should_be_installed "thin 2.0", "rack 1.2", "rack-obama 1.0"
+  end
+end
+
+describe "bundle update without a Gemfile.lock" do
+  it "should not explode" do
+    build_repo2
+
+    gemfile <<-G
+      source "file://#{gem_repo2}"
+
+      gem "rack", "1.0"
+    G
+
+    bundle "update"
+
+    should_be_installed "rack 1.0.0"
+  end
+end
+
+describe "bundle update when a gem depends on a newer version of bundler" do
+  before(:each) do
+    build_repo2 do
+      build_gem "rails", "3.0.1" do |s|
+        s.add_dependency "bundler", Bundler::VERSION.succ
+      end
+    end
+
+    gemfile <<-G
+      source "file://#{gem_repo2}"
+      gem "rails", "3.0.1"
+    G
+  end
+
+  it "should not explode" do
+    bundle "update"
+    expect(err).to be_empty
+  end
+
+  it "should explain that bundler conflicted" do
+    bundle "update"
+    expect(out).not_to match(/in snapshot/i)
+    expect(out).to match(/current Bundler version/i)
+    expect(out).to match(/perhaps you need to update bundler/i)
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/update/git_spec.rb b/misc/lib/bundler-1.3.5/spec/update/git_spec.rb
new file mode 100644
index 0000000..53d6e5b
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/update/git_spec.rb
@@ -0,0 +1,213 @@
+require "spec_helper"
+
+describe "bundle update" do
+  describe "git sources" do
+    it "floats on a branch when :branch is used" do
+      build_git  "foo", "1.0"
+      update_git "foo", :branch => "omg"
+
+      install_gemfile <<-G
+        git "#{lib_path('foo-1.0')}", :branch => "omg" do
+          gem 'foo'
+        end
+      G
+
+      update_git "foo", :branch => "omg" do |s|
+        s.write "lib/foo.rb", "FOO = '1.1'"
+      end
+
+      bundle "update"
+
+      should_be_installed "foo 1.1"
+    end
+
+    it "updates correctly when you have like craziness" do
+      build_lib "activesupport", "3.0", :path => lib_path("rails/activesupport")
+      build_git "rails", "3.0", :path => lib_path("rails") do |s|
+        s.add_dependency "activesupport", "= 3.0"
+      end
+
+      install_gemfile <<-G
+        gem "rails", :git => "#{lib_path('rails')}"
+      G
+
+      bundle "update rails"
+      expect(out).to include("Using activesupport (3.0) from #{lib_path('rails')} (at master)")
+      should_be_installed "rails 3.0", "activesupport 3.0"
+    end
+
+    it "floats on a branch when :branch is used and the source is specified in the update" do
+      build_git  "foo", "1.0", :path => lib_path("foo")
+      update_git "foo", :branch => "omg", :path => lib_path("foo")
+
+      install_gemfile <<-G
+        git "#{lib_path('foo')}", :branch => "omg" do
+          gem 'foo'
+        end
+      G
+
+      update_git "foo", :branch => "omg", :path => lib_path("foo") do |s|
+        s.write "lib/foo.rb", "FOO = '1.1'"
+      end
+
+      bundle "update --source foo"
+
+      should_be_installed "foo 1.1"
+    end
+
+    it "floats on master when updating all gems that are pinned to the source even if you have child dependencies" do
+      build_git "foo", :path => lib_path('foo')
+      build_gem "bar", :to_system => true do |s|
+        s.add_dependency "foo"
+      end
+
+      install_gemfile <<-G
+        gem "foo", :git => "#{lib_path('foo')}"
+        gem "bar"
+      G
+
+      update_git "foo", :path => lib_path('foo') do |s|
+        s.write "lib/foo.rb", "FOO = '1.1'"
+      end
+
+      bundle "update foo"
+
+      should_be_installed "foo 1.1"
+    end
+
+    it "notices when you change the repo url in the Gemfile" do
+      build_git "foo", :path => lib_path("foo_one")
+      build_git "foo", :path => lib_path("foo_two")
+
+      install_gemfile <<-G
+        gem "foo", "1.0", :git => "#{lib_path('foo_one')}"
+      G
+
+      FileUtils.rm_rf lib_path("foo_one")
+
+      install_gemfile <<-G
+        gem "foo", "1.0", :git => "#{lib_path('foo_two')}"
+      G
+
+      expect(err).to be_empty
+      expect(out).to include("Fetching #{lib_path}/foo_two")
+      expect(out).to include("Your bundle is complete!")
+    end
+
+
+    it "fetches tags from the remote" do
+      build_git "foo"
+      @remote = build_git("bar", :bare => true)
+      update_git "foo", :remote => @remote.path
+      update_git "foo", :push => "master"
+
+      install_gemfile <<-G
+        gem 'foo', :git => "#{@remote.path}"
+      G
+
+      # Create a new tag on the remote that needs fetching
+      update_git "foo", :tag => "fubar"
+      update_git "foo", :push => "fubar"
+
+      gemfile <<-G
+        gem 'foo', :git => "#{@remote.path}", :tag => "fubar"
+      G
+
+      bundle "update", :exitstatus => true
+      expect(exitstatus).to eq(0)
+    end
+
+    describe "with submodules" do
+      before :each do
+        build_gem "submodule", :to_system => true do |s|
+          s.write "lib/submodule.rb", "puts 'GEM'"
+        end
+
+        build_git "submodule", "1.0" do |s|
+          s.write "lib/submodule.rb", "puts 'GIT'"
+        end
+
+        build_git "has_submodule", "1.0" do |s|
+          s.add_dependency "submodule"
+        end
+
+        Dir.chdir(lib_path('has_submodule-1.0')) do
+          `git submodule add #{lib_path('submodule-1.0')} submodule-1.0`
+          `git commit -m "submodulator"`
+        end
+      end
+
+      it "it unlocks the source when submodules is added to a git source" do
+        install_gemfile <<-G
+          git "#{lib_path('has_submodule-1.0')}" do
+            gem "has_submodule"
+          end
+        G
+
+        run "require 'submodule'"
+        expect(out).to eq('GEM')
+
+        install_gemfile <<-G
+          git "#{lib_path('has_submodule-1.0')}", :submodules => true do
+            gem "has_submodule"
+          end
+        G
+
+        run "require 'submodule'"
+        expect(out).to eq('GIT')
+      end
+
+      it "it unlocks the source when submodules is removed from git source" do
+        pending "This would require actually removing the submodule from the clone"
+        install_gemfile <<-G
+          git "#{lib_path('has_submodule-1.0')}", :submodules => true do
+            gem "has_submodule"
+          end
+        G
+
+        run "require 'submodule'"
+        expect(out).to eq('GIT')
+
+        install_gemfile <<-G
+          git "#{lib_path('has_submodule-1.0')}" do
+            gem "has_submodule"
+          end
+        G
+
+        run "require 'submodule'"
+        expect(out).to eq('GEM')
+      end
+    end
+
+    it "errors with a message when the .git repo is gone" do
+      build_git "foo", "1.0"
+
+      install_gemfile <<-G
+        gem "foo", :git => "#{lib_path('foo-1.0')}"
+      G
+
+      lib_path("foo-1.0").join(".git").rmtree
+
+      bundle :update, :expect_err => true
+      expect(out).to include(lib_path("foo-1.0").to_s)
+    end
+
+    it "should not explode on invalid revision on update of gem by name" do
+      build_git "rack", "0.8"
+
+      build_git "rack", "0.8", :path => lib_path('local-rack') do |s|
+        s.write "lib/rack.rb", "puts :LOCAL"
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo1}"
+        gem "rack", :git => "#{lib_path('rack-0.8')}", :branch => "master"
+      G
+
+      bundle %|config local.rack #{lib_path('local-rack')}|
+      bundle "update rack"
+      expect(out).to include("Your bundle is updated!")
+    end
+
+  end
+end
diff --git a/misc/lib/bundler-1.3.5/spec/update/source_spec.rb b/misc/lib/bundler-1.3.5/spec/update/source_spec.rb
new file mode 100644
index 0000000..6134c77
--- /dev/null
+++ b/misc/lib/bundler-1.3.5/spec/update/source_spec.rb
@@ -0,0 +1,51 @@
+require "spec_helper"
+
+describe "bundle update" do
+  describe "git sources" do
+    before :each do
+      build_repo2
+      @git = build_git "foo", :path => lib_path("foo") do |s|
+        s.executables = "foobar"
+      end
+
+      install_gemfile <<-G
+        source "file://#{gem_repo2}"
+        git "#{lib_path('foo')}" do
+          gem 'foo'
+        end
+        gem 'rack'
+      G
+    end
+
+    it "updates the source" do
+      update_git "foo", :path => @git.path
+
+      bundle "update --source foo"
+
+      in_app_root do
+        run <<-RUBY
+          require 'foo'
+          puts "WIN" if defined?(FOO_PREV_REF)
+        RUBY
+
+        expect(out).to eq("WIN")
+      end
+    end
+
+    it "unlocks gems that were originally pulled in by the source" do
+      update_git "foo", "2.0", :path => @git.path
+
+      bundle "update --source foo"
+      should_be_installed "foo 2.0"
+    end
+
+    it "leaves all other gems frozen" do
+      update_repo2
+      update_git "foo", :path => @git.path
+
+      bundle "update --source foo"
+      should_be_installed "rack 1.0"
+    end
+  end
+
+end
diff --git a/misc/migrate.rb b/misc/migrate.rb
index 169fcc2..55cfe0d 100644
--- a/misc/migrate.rb
+++ b/misc/migrate.rb
@@ -8,7 +8,6 @@
 # You can redistribute it and/or modify it under GPL2.
 #
 BEGIN { $stdout.binmode }
-$KCODE = 'n'
 
 require "fileutils"
 require "pstore"
diff --git a/misc/paas/cloudfoundry/Gemfile b/misc/paas/cloudfoundry/Gemfile
index d0448c1..33f217b 100644
--- a/misc/paas/cloudfoundry/Gemfile
+++ b/misc/paas/cloudfoundry/Gemfile
@@ -1,4 +1,4 @@
-source :rubygems
+source 'http://rubygems.org'
 
 gem 'rake'
 
@@ -8,8 +8,11 @@ gem 'sprockets'
 gem 'omniauth'
 gem 'omniauth-twitter'
 gem 'omniauth-github'
+gem 'twitter-text', :require => false
 
 gem 'dalli'
+gem 'redis'
+gem 'redis-namespace'
 
 gem 'coffee-script'
 gem 'therubyracer'
diff --git a/misc/paas/cloudfoundry/Gemfile.lock b/misc/paas/cloudfoundry/Gemfile.lock
index c41e687..f31fb4c 100644
--- a/misc/paas/cloudfoundry/Gemfile.lock
+++ b/misc/paas/cloudfoundry/Gemfile.lock
@@ -7,6 +7,7 @@ GEM
       execjs
     coffee-script-source (1.3.3)
     daemons (1.1.9)
+    dalli (2.6.3)
     eventmachine (1.0.0)
     execjs (1.4.0)
       multi_json (~> 1.0)
@@ -50,6 +51,9 @@ GEM
     rack (1.4.1)
     rake (0.9.2.2)
     redcarpet (2.1.1)
+    redis (3.0.4)
+    redis-namespace (1.3.0)
+      redis (~> 3.0.0)
     sequel (3.40.0)
     sprockets (2.6.0)
       hike (~> 1.2)
@@ -63,6 +67,11 @@ GEM
       eventmachine (>= 0.12.6)
       rack (>= 1.0.0)
     tilt (1.3.3)
+    twitter-text (1.6.1)
+      unf (~> 0.0.5)
+    unf (0.0.5)
+      unf_ext
+    unf_ext (0.0.6)
     yajl-ruby (1.1.0)
 
 PLATFORMS
@@ -71,6 +80,7 @@ PLATFORMS
 DEPENDENCIES
   cf-runtime
   coffee-script
+  dalli
   omniauth
   omniauth-github
   omniauth-twitter
@@ -79,7 +89,10 @@ DEPENDENCIES
   rack
   rake
   redcarpet
+  redis
+  redis-namespace
   sequel
   sprockets
   therubyracer
   thin
+  twitter-text
diff --git a/misc/paas/cloudfoundry/tdiary.conf b/misc/paas/cloudfoundry/tdiary.conf
index 88ee341..6a0ea78 100644
--- a/misc/paas/cloudfoundry/tdiary.conf
+++ b/misc/paas/cloudfoundry/tdiary.conf
@@ -1,13 +1,13 @@
 require 'tempfile'
 @data_path = Dir.tmpdir
 
-psql_service = CFRuntime::CloudApp.service_names_of_type('postgresql')
-psql_options = CFRuntime::PGClient.options_for_svc(names[0])
+psql_services = CFRuntime::CloudApp.service_names_of_type('postgresql')
+psql_options = CFRuntime::PGClient.options_for_svc(psql_services[0])
 @database_url = "postgres://#{psql_options[:user]}:#{psql_options[:password]}@#{psql_options[:host]}:#{psql_options[:port]}/#{psql_options[:dbname]}"
 
 @style = 'GFM'
 
-require 'tdiary/io/cache/memcached'
+require 'tdiary/io/cache/file'
 require 'tdiary/io/rdb'
 @io_class = TDiary::RdbIO
 
diff --git a/misc/plugin/category.rb b/misc/plugin/category.rb
index d086080..3ee8857 100644
--- a/misc/plugin/category.rb
+++ b/misc/plugin/category.rb
@@ -56,9 +56,9 @@ def category_anchor(category)
 			""
 		end
 	if @category_icon[category] and !@cgi.mobile_agent?
-		%Q|<a href="#{h @index}?#{period_string}category=#{u category}"><img class="category" src="#{h @category_icon_url}#{h @category_icon[category]}" alt="#{h category}"></a>|
+		%Q|<a href="#{h @index}?#{period_string}category=#{u category}" title="#{h category}"><img class="category" src="#{h @category_icon_url}#{h @category_icon[category]}" alt="#{h category}"></a>|
 	else
-		%Q|[<a href="#{h @index}?#{period_string}category=#{u category}">#{h category}</a>]|
+		%Q|[<a href="#{h @index}?#{period_string}category=#{u category}" title="#{h category}">#{h category}</a>]|
 	end
 end
 
@@ -223,6 +223,7 @@ class CGI
 	end
 	def referer; nil; end
 	def user_agent; nil; end
+	def mobile_agent?; nil; end
 	def request_method; 'GET'; end
 end
 
diff --git a/misc/plugin/comment_emoji_autocomplete.rb b/misc/plugin/comment_emoji_autocomplete.rb
new file mode 100644
index 0000000..56fc0b6
--- /dev/null
+++ b/misc/plugin/comment_emoji_autocomplete.rb
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+#
+# comment_emoji_autocomplete.rb : Support the automatic input of the emoji
+#                                 using jQuery UI autocomplete.
+#
+# Copyright (C) 2013, tamoot <tamoot+tdiary at gmail.com>
+# You can redistribute it and/or modify it under GPL2.
+#
+
+if !@cgi.mobile_agent? && /\A(?:day)\z/ =~ @mode
+	add_header_proc do
+		%Q|<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css"/>|
+	end
+   
+	enable_js('http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js')
+	enable_js('caretposition.js')
+	enable_js('comment_emoji_autocomplete.js')
+
+end
+
+# Local Variables:
+# mode: ruby
+# indent-tabs-mode: t
+# tab-width: 3
+# ruby-indent-level: 3
+# End:
+# vim: ts=3
diff --git a/misc/plugin/image.rb b/misc/plugin/image.rb
index ef8d941..6df4fac 100644
--- a/misc/plugin/image.rb
+++ b/misc/plugin/image.rb
@@ -86,13 +86,11 @@ def image( id, alt = 'image', thumbnail = nil, size = nil, place = 'photo' )
 			size = %Q| width="#{size.to_i}"|
 		end
 	elsif @image_maxwidth and not @conf.secure then
-		File::open( "#{@image_dir}/#{image}".untaint, 'rb' ) do |f|
-			t, w, h = image_info( f )
-			if w > @image_maxwidth then
-				size = %Q[ width="#{h @image_maxwidth}"]
-			else
-				size = ""
-			end
+		t, w, h = image_info( "#{@image_dir}/#{image}".untaint )
+		if w > @image_maxwidth then
+			size = %Q[ width="#{h @image_maxwidth}"]
+		else
+			size = ""
 		end
 	end
 	if thumbnail then
@@ -138,9 +136,9 @@ end
 #
 
 def image_info( f )
-	require 'image_size'
-	info = ImageSize::new( f.read )
-	[info.get_type.downcase.sub( /jpeg/, 'jpg' ), info.get_size].flatten
+	require 'fastimage'
+	info = FastImage.new( f )
+	[info.type.to_s.sub( /jpeg/, 'jpg' ), info.size].flatten
 end
 
 def image_ext
@@ -182,10 +180,9 @@ if /^formplugin$/ =~ @mode then
 		images = image_list( date )
 	   if @cgi.params['plugin_image_addimage'][0]
 			@cgi.params['plugin_image_file'].each do |file|
-				filename = file.original_filename
 				extension, = image_info( file )
 				file.rewind
-				
+
 				if extension =~ /\A(#{image_ext})\z/i
 					begin
 						size = file.size
@@ -237,7 +234,7 @@ add_form_proc do |date|
 			if @conf.secure then
 				img_type, img_w, img_h = 'jpg', nil, nil
 			else
-				img_type, img_w, img_h = open(File.join(@image_dir,img).untaint, 'rb') {|f| image_info(f)}
+				img_type, img_w, img_h = image_info(File.join(@image_dir,img).untaint)
 			end
 			r << %Q[<td><img id="image-index-#{id}" class="image-img form" src="#{h @image_url}/#{h img}" alt="#{id}" width="#{h( (img_w && img_w > 160) ? 160 : (img_w ? img_w : 160) )}"></td>]
 			if @conf.secure then
diff --git a/misc/plugin/makerss.rb b/misc/plugin/makerss.rb
index f03b752..29520a3 100644
--- a/misc/plugin/makerss.rb
+++ b/misc/plugin/makerss.rb
@@ -105,7 +105,7 @@ class MakeRssFull
 	def file
 		f = @conf['makerss.file'] || 'index.rdf'
 		f = 'index.rdf' if f.empty?
-		f =~ %r|^/| ? f : "#{TDiary.document_root}/#{f}"
+		f =~ %r|^/| ? f : "#{document_root}/#{f}"
 	end
 
 	def writable?
@@ -137,6 +137,14 @@ class MakeRssFull
 		u = "#{base_url}#{File.basename(file)}" if u.empty?
 		u
 	end
+
+	def document_root
+		if @cgi.is_a?(RackCGI)
+			File.join(TDiary.server_root, 'public')
+		else
+			TDiary.server_root
+		end
+	end
 end
 
 @makerss_rsses << MakeRssFull::new(@conf, @cgi)
@@ -154,7 +162,7 @@ class MakeRssNoComments < MakeRssFull
 	def file
 		f = @conf['makerss.no_comments.file'] || 'no_comments.rdf'
 		f = 'no_comments.rdf' if f.empty?
-		f =~ %r|^/| ? f : "#{TDiary.document_root}/#{f}"
+		f =~ %r|^/| ? f : "#{document_root}/#{f}"
 	end
 
 	def write( encoder )
diff --git a/misc/plugin/xmlrpc/xmlrpc.rb b/misc/plugin/xmlrpc/xmlrpc.rb
index 4f54549..3b34e67 100644
--- a/misc/plugin/xmlrpc/xmlrpc.rb
+++ b/misc/plugin/xmlrpc/xmlrpc.rb
@@ -7,7 +7,6 @@
 # require Ruby1.8 or xml-rpc(http://raa.ruby-lang.org/project/xml-rpc/)
 
 BEGIN { $stdout.binmode }
-$KCODE = 'n'
 
 if FileTest::symlink?( __FILE__ ) then
   org_path = File::dirname( File::readlink( __FILE__ ) )
diff --git a/misc/style/gfm/gfm_style.rb b/misc/style/gfm/gfm_style.rb
index 0957a6d..6bd698c 100644
--- a/misc/style/gfm/gfm_style.rb
+++ b/misc/style/gfm/gfm_style.rb
@@ -13,23 +13,16 @@
 # You can distribute this under GPL.
 #
 
-$KCODE = 'u' if RUBY_VERSION < '1.9'
-
-begin
-	require 'rubygems'
-rescue LoadError
-ensure
-	require 'redcarpet'
-	require 'twitter-text'
-end
+require 'redcarpet'
+require 'pygments'
+require 'twitter-text'
 
 class HTMLwithPygments < Redcarpet::Render::HTML
 	def block_code(code, language)
-		require 'pygments'
 		Pygments.highlight(code, :lexer => language)
 	rescue Exception
 		<<-HTML
-<div class="highlight"><pre>#{code}</pre></div>
+<div class="highlight"><pre>#{CGI.escapeHTML(code)}</pre></div>
 		HTML
 	end
 end
@@ -103,7 +96,13 @@ module TDiary
 
 			# ignore duplicate autolink
 			if r =~ /<a href="<a href="/
-				r.gsub!(/<a href="<a href=".*?" rel="nofollow">(.*?)<\/a>">(.*?)<\/a>/){ "<a href=\"#{$1}\" rel=\"nofollow\">#{$2}</a>" }
+				r.gsub!(/<a href="<a href=".*?" rel="nofollow">(.*?)<\/a>"(.*?)>(.*?)<\/a>/) do
+          "<a href=\"#{$1}\" rel=\"nofollow\"#{$2}>#{$3}</a>"
+        end
+			end
+      # ignore auto imagelink
+			if r =~ /<img src="<a href="/
+				r.gsub!(/<img src="<a href=".*?" rel="nofollow">(.*?)<\/a>"(?: alt="(.*?)")?>/){ "<img src=\"#{$1}\" alt=\"#{$2}\">" }
 			end
 
 			# emoji
diff --git a/misc/style/rd/rd_style.rb b/misc/style/rd/rd_style.rb
index 8b9bdf0..66d4229 100644
--- a/misc/style/rd/rd_style.rb
+++ b/misc/style/rd/rd_style.rb
@@ -99,8 +99,8 @@ module RD
 		end
 
 		def apply_to_Footnote(element, content)
-			heredoc_id = "%0.32b" % rand( 0x100000000 )
-			%Q|<%=fn <<'#{heredoc_id}' \n #{content.join}\n#{heredoc_id}\n%>|
+			escaped_content = content.join.gsub( /%>/, "%%>" )
+			%Q|<%=fn apply_plugin( #{escaped_content.dump} ) %>|
 		end
 
 		def apply_to_RefToElement(element, content)
diff --git a/plugin/00default.rb b/plugin/00default.rb
index 3ac22c3..2cd0c98 100644
--- a/plugin/00default.rb
+++ b/plugin/00default.rb
@@ -353,7 +353,7 @@ def description_tag
 end
 
 def jquery_tag
-	%Q[<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js" type="text/javascript"></script>]
+	%Q[<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js" type="text/javascript"></script>]
 end
 
 enable_js( '00default.js' )
@@ -368,7 +368,7 @@ def script_tag_query_string
 end
 
 def js_url
-	defined?(Rack) ? 'assets' : 'js'
+	@cgi.is_a?(RackCGI) ? 'assets' : 'js'
 end
 
 def script_tag
@@ -390,7 +390,7 @@ def script_tag
 end
 
 def theme_url
-	defined?(Rack) ? 'assets' : 'theme'
+	@cgi.is_a?(RackCGI) ? 'assets' : 'theme'
 end
 
 def css_tag
@@ -851,13 +851,13 @@ def saveconf_theme
 		@conf.css = @cgi.params['css'][0]
 	end
 
-	@conf_theme_list = []
-	Dir::glob( "#{::TDiary::PATH}/theme/*" ).sort.each do |dir|
+	theme_paths = [::TDiary::PATH, TDiary.server_root].map {|d| "#{d}/theme/*" }
+	@conf_theme_list = Dir::glob( theme_paths ).sort.map {|dir|
 		theme = dir.sub( %r[.*/theme/], '')
 		next unless FileTest::file?( "#{dir}/#{theme}.css".untaint )
 		name = theme.split( /_/ ).collect{|s| s.capitalize}.join( ' ' )
-		@conf_theme_list << [theme,name]
-	end
+		[theme,name]
+	}.compact.uniq
 end
 
 # comments
diff --git a/plugin/50sp.rb b/plugin/50sp.rb
index fd7accd..7a049b3 100644
--- a/plugin/50sp.rb
+++ b/plugin/50sp.rb
@@ -6,6 +6,10 @@ SP_PREFIX = 'sp'
 @sp_path = @sp_path.collect do |path|
 	/\/$/ =~ path ? path.chop : path
 end
+ at sp_path << "#{TDiary::PATH}/misc/plugin" if @sp_path.include?('misc/plugin')
+
+# FIXME: dirty hack, it should create TDiary::Server::Config.plugin_path
+TDiary::Contrib::Plugin.setup( @sp_path ) if defined?(TDiary::Contrib)
 
 # get plugin option
 def sp_option( key )
diff --git a/spec/acceptance/save_conf_default_spec.rb b/spec/acceptance/save_conf_default_spec.rb
index 8854f6c..fa26015 100644
--- a/spec/acceptance/save_conf_default_spec.rb
+++ b/spec/acceptance/save_conf_default_spec.rb
@@ -125,22 +125,20 @@ FOOTER
 		page.should have_field('hour_offset', :with => '-24.0')
 	end
 
-	if RUBY_VERSION > '1.9'
-		scenario 'Rack 環境でテーマ選択が保存される', :exclude_selenium do
-			visit '/update.rb?conf=theme'
-			select 'Tdiary1', :from => 'theme'
-
-			page.all('div.saveconf').first.click_button "OK"
-
-			click_link '最新'
-			page.body.should be_include('href="assets/base.css"')
-			page.body.should be_include('href="assets/tdiary1/tdiary1.css"')
-
-			visit '/update.rb?conf=theme'
-			within('select option[selected]'){
-				page.should have_content 'Tdiary1'
-			}
-		end
+	scenario 'Rack 環境でテーマ選択が保存される', :exclude_selenium do
+		visit '/update.rb?conf=theme'
+		select 'Tdiary1', :from => 'theme'
+
+		page.all('div.saveconf').first.click_button "OK"
+
+		click_link '最新'
+		page.body.should be_include('href="assets/base.css"')
+		page.body.should be_include('href="assets/tdiary1/tdiary1.css"')
+
+		visit '/update.rb?conf=theme'
+		within('select option[selected]'){
+			page.should have_content 'Tdiary1'
+		}
 	end
 
 	scenario 'Webrick 環境でテーマ選択が保存される', :exclude_rack do
diff --git a/spec/acceptance/save_conf_plugin_spec.rb b/spec/acceptance/save_conf_plugin_spec.rb
index fff9aa3..d24ab3d 100644
--- a/spec/acceptance/save_conf_plugin_spec.rb
+++ b/spec/acceptance/save_conf_plugin_spec.rb
@@ -46,20 +46,18 @@ feature 'プラグイン選択設定の利用' do
 		page.should_not have_content 'rspec.rb'
 	end
 
-	if RUBY_VERSION > '1.9'
-		scenario '外部の Javascript を追加するプラグインを有効にする' do
-			visit '/update.rb?conf=sp'
+	scenario '外部の Javascript を追加するプラグインを有効にする' do
+		visit '/update.rb?conf=sp'
 
-			check "sp.category_autocomplete.rb"
-			page.all('div.saveconf').first.click_button 'OK'
+		check "sp.category_autocomplete.rb"
+		page.all('div.saveconf').first.click_button 'OK'
 
-			visit '/update.rb'
+		visit '/update.rb'
 
-			page.body.should be_include('caretposition.js')
-			page.body.should be_include('category_autocomplete.js')
-			page.body.should be_include('http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js')
-			page.body.should_not be_include('http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js?')
-		end
+		page.body.should be_include('caretposition.js')
+		page.body.should be_include('category_autocomplete.js')
+		page.body.should be_include('http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js')
+		page.body.should_not be_include('http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js?')
 	end
 end
 # Local Variables:
diff --git a/spec/acceptance/view_comment_spec.rb b/spec/acceptance/view_comment_spec.rb
index 47f48d3..7effe85 100644
--- a/spec/acceptance/view_comment_spec.rb
+++ b/spec/acceptance/view_comment_spec.rb
@@ -21,44 +21,40 @@ feature 'ツッコミの表示' do
 		page.should have_no_content "こんにちは!こんにちは!"
 	end
 
-	# workaround for Nokogiri::XML::Node::Encoding
-	# String#force_encoding を独自に定義しているため、Nokogiri 内部でエラーとなってしまう
-	unless RUBY_VERSION < '1.9'
-		scenario "日付表示だと絵文字を表示できる", :exclude_selenium do
-			append_default_diary
+	scenario "日付表示だと絵文字を表示できる", :exclude_selenium do
+		append_default_diary
 
-			visit "/"
-			click_link 'ツッコミを入れる'
-			fill_in "name", :with => "寿司"
-			fill_in "body", :with => <<-BODY
+		visit "/"
+		click_link 'ツッコミを入れる'
+		fill_in "name", :with => "寿司"
+		fill_in "body", :with => <<-BODY
 :sushi: は美味しい
 BODY
-			click_button '投稿'
+		click_button '投稿'
 
-			visit "/"
-			today = Date.today.strftime("%Y年%m月%d日")
-			page.find('h2', :text => today).click_link today
-			within('div.day div.comment div.commentbody') {
-				page.body.should be_include "<img src='http://www.emoji-cheat-sheet.com/graphics/emojis/sushi.png' width='20' height='20' title='sushi' alt='sushi' class='emoji' /> は美味しい"
-			}
-		end
+		visit "/"
+		today = Date.today.strftime("%Y年%m月%d日")
+		page.find('h2', :text => today).click_link today
+		within('div.day div.comment div.commentbody') {
+			page.body.should be_include "<img src='http://www.emoji-cheat-sheet.com/graphics/emojis/sushi.png' width='20' height='20' title='sushi' alt='sushi' class='emoji' /> は美味しい"
+		}
+	end
 
-		scenario "一覧表示でも絵文字を表示できる", :exclude_selenium do
-			append_default_diary
+	scenario "一覧表示でも絵文字を表示できる", :exclude_selenium do
+		append_default_diary
 
-			visit "/"
-			click_link 'ツッコミを入れる'
-			fill_in "name", :with => "寿司"
-			fill_in "body", :with => <<-BODY
+		visit "/"
+		click_link 'ツッコミを入れる'
+		fill_in "name", :with => "寿司"
+		fill_in "body", :with => <<-BODY
 :sushi: は美味しい
 BODY
-			click_button '投稿'
+		click_button '投稿'
 
-			visit "/"
-			within('div.day div.comment div.commentshort') {
-				page.body.should be_include "<img src='http://www.emoji-cheat-sheet.com/graphics/emojis/sushi.png' width='20' height='20' title='sushi' alt='sushi' class='emoji' /> は美味しい"
-			}
-		end
+		visit "/"
+		within('div.day div.comment div.commentshort') {
+			page.body.should be_include "<img src='http://www.emoji-cheat-sheet.com/graphics/emojis/sushi.png' width='20' height='20' title='sushi' alt='sushi' class='emoji' /> は美味しい"
+		}
 	end
 end
 
diff --git a/spec/acceptance_helper.rb b/spec/acceptance_helper.rb
index 59dc2ab..14ae71b 100644
--- a/spec/acceptance_helper.rb
+++ b/spec/acceptance_helper.rb
@@ -2,20 +2,24 @@ require 'spec_helper'
 
 Dir["#{File.dirname(__FILE__)}/acceptance/support/**/*.rb"].each {|f| require f}
 
+require 'tdiary/application'
 Capybara.app = Rack::Builder.new do
 	map '/' do
-		run TDiary::Application.new(:index)
+		run TDiary::Dispatcher.index
 	end
 
 	map '/index.rb' do
-		run TDiary::Application.new(:index)
+		run TDiary::Dispatcher.index
 	end
 
 	map '/update.rb' do
-		run TDiary::Application.new(:update)
+		run TDiary::Dispatcher.update
 	end
 end
 
+# FIXME: TDiary::Application has auth middleware in update.rb, so it cannot be tested.
+# Capybara.app = TDiary::Application.new
+
 Capybara.save_and_open_page_path = File.dirname(__FILE__) + '/../tmp/capybara'
 
 RSpec.configure do |config|
diff --git a/spec/core/compatible_spec.rb b/spec/core/compatible_spec.rb
index 80a4f65..cfe4e4e 100644
--- a/spec/core/compatible_spec.rb
+++ b/spec/core/compatible_spec.rb
@@ -1,48 +1,46 @@
 # -*- coding: utf-8 -*-
 require 'spec_helper'
 
-if defined?(Encoding)
-	require 'tdiary/compatible'
-	require 'fileutils'
+require 'tdiary/compatible'
+require 'fileutils'
 
-	describe PStore, "auto convert library" do
-		before do
-			# rake specで動かすと、comppatible.rb が既に読み込まれてしまっているため、
-			# このPStoreがASCII-8BITではなくUTF-8になってしまう。
-			# そのため、下記と同様の ascii8bit-pstore.db をテストフィクスチャとしている。
-			# PStore.new(@dbfile).transaction do |db|
-			# 	db["key1".to_8bit] = "val1".to_8bit
-			# 	db["key2".to_8bit] = 2
-			# 	db["key3".to_8bit] = [1, :sym, "string".to_8bit]
-			# end
-			dbfilename = '../fixtures/ascii8bit-pstore.db'
-			dbfile_orig = File.join(File.dirname(__FILE__), dbfilename)
-			@dbfile = File.join(File.dirname(__FILE__), "#{dbfilename}.work")
-			FileUtils.cp dbfile_orig, @dbfile
-		end
+describe PStore, "auto convert library" do
+	before do
+		# rake specで動かすと、comppatible.rb が既に読み込まれてしまっているため、
+		# このPStoreがASCII-8BITではなくUTF-8になってしまう。
+		# そのため、下記と同様の ascii8bit-pstore.db をテストフィクスチャとしている。
+		# PStore.new(@dbfile).transaction do |db|
+		# 	db["key1".to_8bit] = "val1".to_8bit
+		# 	db["key2".to_8bit] = 2
+		# 	db["key3".to_8bit] = [1, :sym, "string".to_8bit]
+		# end
+		dbfilename = '../fixtures/ascii8bit-pstore.db'
+		dbfile_orig = File.join(File.dirname(__FILE__), dbfilename)
+		@dbfile = File.join(File.dirname(__FILE__), "#{dbfilename}.work")
+		FileUtils.cp dbfile_orig, @dbfile
+	end
 
-		after do
-			FileUtils.rm @dbfile
-		end
+	after do
+		FileUtils.rm @dbfile
+	end
 
-		it "should convert an encoding to UTF-8 automatically" do
-			PStore.new(@dbfile).transaction do |db|
-				db["key1"].encoding.should == Encoding::UTF_8
-				db["key2"].should  == 2
-				db["key3"][2].encoding.should  == Encoding::UTF_8
-			end
+	it "should convert an encoding to UTF-8 automatically" do
+		PStore.new(@dbfile).transaction do |db|
+			db["key1"].encoding.should == Encoding::UTF_8
+			db["key2"].should  == 2
+			db["key3"][2].encoding.should  == Encoding::UTF_8
 		end
+	end
 
-		it "1回目のtransactionではMashal.loadが3回呼ばれる" do
-			Marshal.should_receive(:load).exactly(3).and_return({})
-			PStore.new(@dbfile).transaction {}
-		end
+	it "1回目のtransactionではMashal.loadが3回呼ばれる" do
+		Marshal.should_receive(:load).exactly(3).and_return({})
+		PStore.new(@dbfile).transaction {}
+	end
 
-		it "2回目のtransactionではMashal.loadが1回だけ呼ばれる" do
-			Marshal.should_receive(:load).exactly(4).and_return({})
-			PStore.new(@dbfile).transaction {}
-			PStore.new(@dbfile).transaction {}
-		end
+	it "2回目のtransactionではMashal.loadが1回だけ呼ばれる" do
+		Marshal.should_receive(:load).exactly(4).and_return({})
+		PStore.new(@dbfile).transaction {}
+		PStore.new(@dbfile).transaction {}
 	end
 end
 
diff --git a/spec/core/rack/assets/precompile_spec.rb b/spec/core/rack/assets/precompile_spec.rb
index 55684d2..42b3265 100644
--- a/spec/core/rack/assets/precompile_spec.rb
+++ b/spec/core/rack/assets/precompile_spec.rb
@@ -2,67 +2,66 @@
 require 'spec_helper'
 require 'rack/test'
 require 'fileutils'
+require 'sprockets'
 require 'tdiary/rack/assets/precompile'
 
-if defined?(Encoding)
-	describe TDiary::Rack::Assets::Precompile do
-		include Rack::Test::Methods
+describe TDiary::Rack::Assets::Precompile do
+	include Rack::Test::Methods
 
-		let(:app) do
-			TDiary::Rack::Assets::Precompile.new(lambda{|env| [200, {}, ['Awesome']]}, @environment)
-		end
-		let(:assets_path) {"#{TDiary::PATH}/tmp/assets"}
+	let(:app) do
+		TDiary::Rack::Assets::Precompile.new(lambda{|env| [200, {}, ['Awesome']]}, @environment)
+	end
+	let(:assets_path) {"#{TDiary::PATH}/tmp/assets"}
+
+	before do
+		FileUtils.mkdir_p assets_path
+		@environment = Sprockets::Environment.new
+		@environment.append_path assets_path
+	end
 
+	after do
+		FileUtils.rm_rf assets_path
+	end
+
+	context "JavaScript が無い場合" do
 		before do
-			FileUtils.mkdir_p assets_path
-			@environment = Sprockets::Environment.new
-			@environment.append_path assets_path
+			FileUtils.touch "#{assets_path}/foo.coffee"
+			get '/'
 		end
 
-		after do
-			FileUtils.rm_rf assets_path
+		it "JavaScript にコンパイルされる" do
+			FileTest.exist?("#{assets_path}/foo.js").should be_true
 		end
+	end
 
-		context "JavaScript が無い場合" do
+	context "JavaScript がある場合" do
+		context "CoffeeScript の方が新しい場合" do
 			before do
+				FileUtils.touch "#{assets_path}/foo.js"
+				sleep 1
 				FileUtils.touch "#{assets_path}/foo.coffee"
+				@jstime = File.mtime("#{assets_path}/foo.js").to_i
+
 				get '/'
 			end
 
-			it "JavaScript にコンパイルされる" do
-				FileTest.exist?("#{assets_path}/foo.js").should be_true
+			it "JavaScript が更新される" do
+				@jstime.should < File.mtime("#{assets_path}/foo.js").to_i
 			end
 		end
 
-		context "JavaScript がある場合" do
-			context "CoffeeScript の方が新しい場合" do
-				before do
-					FileUtils.touch "#{assets_path}/foo.js"
-					sleep 1
-					FileUtils.touch "#{assets_path}/foo.coffee"
-					@jstime = File.mtime("#{assets_path}/foo.js").to_i
-
-					get '/'
-				end
+		context "JavaScript の方が新しい場合" do
+			before do
+				FileUtils.touch "#{assets_path}/foo.coffee"
+				sleep 1
+				FileUtils.touch "#{assets_path}/foo.js"
+				@jstime = File.mtime("#{assets_path}/foo.js").to_i
 
-				it "JavaScript が更新される" do
-					@jstime.should < File.mtime("#{assets_path}/foo.js").to_i
-				end
+				get '/'
 			end
 
-			context "JavaScript の方が新しい場合" do
-				before do
-					FileUtils.touch "#{assets_path}/foo.coffee"
-					sleep 1
-					FileUtils.touch "#{assets_path}/foo.js"
-					@jstime = File.mtime("#{assets_path}/foo.js").to_i
-
-					get '/'
-				end
-
-				it "JavaScript は更新されない" do
-					@jstime.should == File.mtime("#{assets_path}/foo.js").to_i
-				end
+			it "JavaScript は更新されない" do
+				@jstime.should == File.mtime("#{assets_path}/foo.js").to_i
 			end
 		end
 	end
diff --git a/spec/core/rack/static_spec.rb b/spec/core/rack/static_spec.rb
new file mode 100644
index 0000000..d7f4874
--- /dev/null
+++ b/spec/core/rack/static_spec.rb
@@ -0,0 +1,27 @@
+require 'spec_helper'
+require 'rack/test'
+require 'tdiary/rack/static'
+
+describe TDiary::Rack::Static do
+	include Rack::Test::Methods
+
+	describe "reserve static files" do
+		let(:app) { TDiary::Rack::Static.new(
+			lambda{|env| [500, {}, ['Internal Server Error']]}, 'doc')}
+
+		it 'should return the file in static directory' do
+			get '/README.md'
+			last_response.should be_ok
+		end
+
+		it 'should run the app if file is not exist' do
+			get '/index.rb'
+			last_response.status.should be 500
+		end
+
+		it 'should run the app when post method' do
+			post '/index.rb'
+			last_response.status.should be 500
+		end
+	end
+end
diff --git a/spec/core/style/gfm_style_spec.rb b/spec/core/style/gfm_style_spec.rb
index c7bca41..c621bc0 100644
--- a/spec/core/style/gfm_style_spec.rb
+++ b/spec/core/style/gfm_style_spec.rb
@@ -130,6 +130,54 @@ http://www.google.com
 		it { @diary.to_html.should eq @html }
 	end
 
+  describe 'auto imagelink' do
+		before do
+			source = <<-EOF
+# subTitle
+
+![](http://www.google.com/logo.jpg)
+
+![google](http://www.google.com/logo.jpg)
+         EOF
+			@diary.append(source)
+			@html = <<-EOF
+<div class="section">
+<%=section_enter_proc( Time.at( 1041346800 ) )%>
+<h3><%= subtitle_proc( Time.at( 1041346800 ), "subTitle" ) %></h3>
+<p><img src="http://www.google.com/logo.jpg" alt=""></p>
+
+<p><img src="http://www.google.com/logo.jpg" alt="google"></p>
+<%=section_leave_proc( Time.at( 1041346800 ) )%>
+</div>
+         EOF
+		end
+
+		it { @diary.to_html.should eq @html }
+
+  end
+
+  describe 'auto imagelink' do
+		before do
+			source = <<-EOF
+# subTitle
+
+<a href="http://www.exaple.com" target="_blank">Anchor</a>
+         EOF
+			@diary.append(source)
+			@html = <<-EOF
+<div class="section">
+<%=section_enter_proc( Time.at( 1041346800 ) )%>
+<h3><%= subtitle_proc( Time.at( 1041346800 ), "subTitle" ) %></h3>
+<p><a href="http://www.exaple.com" rel="nofollow" target="_blank">Anchor</a></p>
+<%=section_leave_proc( Time.at( 1041346800 ) )%>
+</div>
+         EOF
+		end
+
+		it { @diary.to_html.should eq @html }
+
+  end
+
 	describe 'url syntax with code blocks' do
 		before do
 			source = <<-'EOF'
diff --git a/spec/core/style/rd_style_spec.rb b/spec/core/style/rd_style_spec.rb
index 9a580db..492c302 100644
--- a/spec/core/style/rd_style_spec.rb
+++ b/spec/core/style/rd_style_spec.rb
@@ -172,6 +172,28 @@ aaa</p>
 		end
 	end
 
+	describe 'fn' do
+		context 'my' do
+			before do
+				source = <<-'EOF'
+((-((<20130714>))-))
+				EOF
+				@diary.append(source)
+			end
+
+			before do
+				@html = <<-'EOF'
+<div class="section">
+<%=section_enter_proc( Time::at( 1041346800 ))%>
+<p><%=fn apply_plugin( "<%=my \"20130714\",\"20130714\"%%>" ) %></p>
+<%=section_leave_proc( Time::at( 1041346800 ))%>
+</div>
+				EOF
+			end
+			it { @diary.to_html.should eq @html }
+		end
+	end
+
 	describe 'test_rd_on_error' do
 		context 'link' do
 			before do
diff --git a/spec/fixtures/tdiary.conf.gem b/spec/fixtures/tdiary.conf.gem
new file mode 100644
index 0000000..2ae4263
--- /dev/null
+++ b/spec/fixtures/tdiary.conf.gem
@@ -0,0 +1,212 @@
+ at data_path = File.expand_path("tmp/data", File.dirname(__FILE__))
+
+ at style = 'Wiki'
+ at index = './'
+ at update = 'update.rb'
+ at options['apply_plugin'] = true
+ at options['sp.path'] = [
+	'misc/plugin'
+]
+
+ at accesskey_enabled = false
+ at options['bot'] = [
+	'^BlogLines/',
+	'^blogmap',
+	'MI[CK]AN/',
+	'^NG/',
+	'^samidare',
+	'^TAMATEBAKO/'
+]
+
+ at options['sp.selected'] =
+"amazon.rb
+append-css.rb
+calendar2.rb
+category.rb
+comment_mail-smtp.rb
+disp_referrer.rb
+dropdown_calendar.rb
+footnote.rb
+highlight.rb
+image.rb
+jdate.rb
+kw.rb
+makerss.rb
+my-ex.rb
+recent_comment3.rb
+recent_list.rb
+"
+
+ at options['dropdown_calendar.label'] = ''
+ at options['makerss.file'] = 'public/index.rdf'
+ at options['makerss.no_comments.file'] = 'public/no_comments.rdf'
+
+ at options['spamfilter.bad_comment_patts'] = "(href=|casino|gambling|betting|fastsearch\\.eu\\.com|ganzao|poker|holdem|hold.em|roulette|drug|tramadol|viagra|fioricet|oxycontin|biaxin|aldara|business cards|home depot|slot.?machine|insurance|getblog2|video-game|Good site|internet-all\\.com|deai|tdfms|comu2|omaha)\r\n"
+ at options['spamfilter.bad_ip_addrs'] = ""
+ at options['spamfilter.bad_mail_patts'] = "(mu at alloha\\.info|mumu2004 at mail\\.com|zhongleibo|dfd at 12\\.com|anonimous|aol\\.|yahoo\\.|google\\.|hotmail\\.|msn\\.|leroy\\.|ablare\\.|gmx\\.|lorazepam|\\.co$)"
+ at options['spamfilter.bad_uri_patts'] = ""
+ at options['spamfilter.bad_uri_patts_for_mails'] = false
+ at options['spamfilter.debug_file'] = ""
+ at options['spamfilter.debug_mode'] = false
+ at options['spamfilter.filter_mode'] = true
+ at options['spamfilter.max_uris'] = "2"
+ at options['spamfilter.resolv_check'] = false
+ at options['spamfilter.resolv_check_mode'] = false
+ at options['spamlookup.domain.list'] = "bsb.spamlookup.net\r\nsc.surbl.org\r\nrbl.bulkfeeds.jp"
+ at options['spamlookup.safe_domain.list'] = "search.yahoo.co.jp\r\nwww.google.com\r\nwww.google.co.jp\r\nsearch.msn.co.jp"
+
+
+ at html_title = %Q[【日記のタイトル】(→<a href="#{@update}?conf=default">サイトの情報</a>で変更しましょう)]
+
+ at header = <<HEADER
+<%= navi %>
+<h1><%= @conf.html_title %></h1>
+<div class="main">
+HEADER
+
+ at footer = <<FOOTER
+</div>
+<div class="sidebar">
+<div style="text-align: center">
+	<%=calendar2%>
+	<%=calendar%>
+</div>
+
+<h3>最近の日記</h3>
+<%= recent_list %>
+
+<h3>最近のツッコミ</h3>
+<%= recent_comment3 %>
+</div>
+FOOTER
+
+ at date_format = '%Y年%m月%d日'
+
+ at section_anchor = '<span class="sanchor">_</span>'
+ at comment_anchor = '<span class="canchor">_</span>'
+
+ at latest_limit = 10
+
+ at theme = 'default'
+
+ at show_comment = true
+ at comment_limit = 3
+
+ at show_referer = true
+ at referer_day_only = true
+
+ at hour_offset = 0
+
+ at show_nyear = true
+
+ at no_referer = [
+	# Capybara の Referer を変更できないので、リンク元確認のテストのために除外する
+	# '^' + Regexp.quote( base_url ),  # 自分の日記
+	'^http://localhost[:/]',
+	'^http://192\.168\.',
+	'^http://172\.1[6789]',
+	'^http://172\.2[0-9]',
+	'^http://172\.3[01]',
+	'^http://10\.',
+	'^http:/+$',
+	'^http://[^/]+$',
+	'search\\?q=cache:',
+	'^http://cache\.yahoofs\.jp/',
+	'^http://[^\.]+\.alexa\.com/',
+	'^http://www\.hotbot\.com/',
+	'^http://gw\.mobile\.goo\.ne\.jp/',
+	'^http://haro\.jp/rss/',
+	'^https?://(www.)?bloglines.com[/:]',
+	'^http://del\.icio\.us/',
+	'^http://d\.hatena\.ne\.jp/.*/\?of=\d+$',
+	'^http://feedbringer\.net/',
+	'^http://reader\.www\.infoseek\.co\.jp/',
+	'^http://feedpath\.jp/feedreader/',
+	'^http://webryreader\.biglobe\.ne\.jp/',
+	'^http://www\.easythumbs\.com',
+	'^http://www\.shinobi\.jp/',
+	'^http://freerss\.net/',
+	'^http://g\.msn\.com/',
+	'^http://myweb-bookmarks\.com/',
+	'^http://reader\.livedoor\.com/',
+	'^http://wrs\.search\.yahoo\.co\.jp/',
+	'^http://www\.google\.com/reader/',
+	'^http://my\.yahoo\.co\.jp/',
+	'^http://data\.click\.rss\.drecom\.jp/',
+	'^http://i-know\.jp/',
+	'^http://r\.hatena\.ne\.jp/',
+	'^http://reader\.freerss\.net/',
+	'^http://reader\.goo\.ne\.jp/',
+	'^https://enter\.nifty\.com/my/',
+	'/feedshow(cat|cat|all|guide)?\.php',
+]
+
+ at no_referer2 = [
+	'(sex|pussy|porn|xxx|rape|nudity|x-pictures|x-stories|pics--movies|teen|shemale|scat|pissing|pantyhose|mature|incest|hentai|bdsm|taboo|bestiality|violence|tits|cocks|peeing|anal|lesbian|shaved|www89.com|casino|poker|gambl|diet|discount|holdem|texas|viagra|betting|insurance|pharmac|phentermin|mortgage|loan|credit-card|hotel|credit|debt|get-sport|available-sport|sport-2u|-doctor|feelor\.com|adoptingcenter|domainthriftstore|payday|rrso|novacspacetravel|pills|radcraft\.com|partyshopcentral| [...]
+]
+
+ at only_volatile = [
+]
+
+ at only_volatile2 = [
+	'^http://(www|images|translate)\.google\.[^/]+/',
+	'^http://([a-z]+\.)?(search|google|websearch|srd)\.yahoo\.[^/]+/',
+	'^http://(\w+\.)?search\.msn\.[^/]+/',
+	'^http://g\.msn\.com/',
+	'^http://([^\.]+\.)?goo\.ne\.jp/',
+	'^http://(www\.)?infoseek\.[^/]+/[OI]?Titles',
+	'^http://search\.fresheye\.com/',
+	'^http://[^\.]+\.excite\.[^/]+/search',
+	'^http://ask\.jp/',
+	'^http://www\.tocc\.co\.jp/search/',
+	'^http://[^\.]*\.lycos\.[a-z\.]+/',
+	'\.search\.biglobe\.ne\.jp/',
+	'^https?://(search|enter)\.nifty\.com/',
+	'^http://search\.jp\.aol\.com/',
+	'^http://www\.looksmart\.com/',
+	'^http://[^.]*\.naver\.co\.jp/',
+	'^http://allabout\.co\.jp/.*?/extsearch',
+	'^http://www\.isao\.net/search/',
+	'^http://(search-intl|search)\.netscape\.com/',
+	'^http://www\.wisenut\.com/',
+	'^http://www\.search\.com/',
+	'^http://(www|labs)\.ceek\.jp/',
+	'^http://seek\.3721\.com/',
+	'^http://search\.jword\.jp/',
+	'^http://www\.alltheweb\.com/',
+	'searchscout\.com/',
+	'^http://(sf|search)\.livedoor\.com/',
+	'^http://www\.myblog\.jp/',
+	'^http://mixi\.jp/',
+	'^http://aolsearch\.jp\.aol\.com/',
+	'^http://cgi\.search\.biglobe\.ne\.jp/cgi-bin/search2-b',
+	'^http://excite\.co\.jp/search',
+	'^http://so-net\.search\.goo\.ne\.jp/',
+	'^http://www.altavista.com',
+	'^http://1470\.net/mm/',
+	'^http://www\.rojo\.com/',
+	'^http://[br]\.hatena\.ne\.jp/',
+	'^http://r\.zeromemory\.info/',
+	'^http://newsing\.jp/',
+	'^http://clip\.nifty\.com/',
+	'^http://www\.flog\.jp/',
+	'^http://www\.technorati\.jp/',
+	'^http://netnavigate\.net/',
+	'^http://www\.netvibes\.com/',
+]
+
+ at referer_table = [
+	['^(.{50}).*$', '\1...'],
+]
+
+ at referer_table2 = [
+	['^http://www\.tdiary\.net/.*', 'tDiary.Net'],
+	['^http://sho\.tdiary\.net/(\d{4})(\d\d)(\d\d)\.html', 'ただのにっき(\1-\2-\3)'],
+	['^http://sho\.tdiary\.net/(\d{4})(\d\d)\.html', 'ただのにっき(\1-\2)'],
+	['^http://([^\.]*)\.tdiary\.net/(\d{4})(\d\d)(\d\d)\.html', 'tDiary.Net[\1](\2-\3-\4)'],
+	['^http://([^\.]*)\.tdiary\.net/(\d{4})(\d\d)\.html', 'tDiary.Net[\1](\2-\3)'],
+	['^http://([^\.]*)\.tdiary\.net/.*', 'tDiary.Net[\1]'],
+]
+
+ at secure = false
+load_cgi_conf
diff --git a/spec/javascripts/helpers/jasmine-jquery.js b/spec/javascripts/helpers/jasmine-jquery.js
new file mode 100644
index 0000000..1a27296
--- /dev/null
+++ b/spec/javascripts/helpers/jasmine-jquery.js
@@ -0,0 +1,659 @@
+/*!
+ Jasmine-jQuery: a set of jQuery helpers for Jasmine tests.
+
+ Version 1.5.3
+
+ https://github.com/velesin/jasmine-jquery
+
+ Copyright (c) 2010-2013 Wojciech Zawistowski, Travis Jeffery
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+var readFixtures = function() {
+  return jasmine.getFixtures().proxyCallTo_('read', arguments)
+}
+
+var preloadFixtures = function() {
+  jasmine.getFixtures().proxyCallTo_('preload', arguments)
+}
+
+var loadFixtures = function() {
+  jasmine.getFixtures().proxyCallTo_('load', arguments)
+}
+
+var appendLoadFixtures = function() {
+  jasmine.getFixtures().proxyCallTo_('appendLoad', arguments)
+}
+
+var setFixtures = function(html) {
+  jasmine.getFixtures().proxyCallTo_('set', arguments)
+}
+
+var appendSetFixtures = function() {
+  jasmine.getFixtures().proxyCallTo_('appendSet', arguments)
+}
+
+var sandbox = function(attributes) {
+  return jasmine.getFixtures().sandbox(attributes)
+}
+
+var spyOnEvent = function(selector, eventName) {
+  return jasmine.JQuery.events.spyOn(selector, eventName)
+}
+
+var preloadStyleFixtures = function() {
+  jasmine.getStyleFixtures().proxyCallTo_('preload', arguments)
+}
+
+var loadStyleFixtures = function() {
+  jasmine.getStyleFixtures().proxyCallTo_('load', arguments)
+}
+
+var appendLoadStyleFixtures = function() {
+  jasmine.getStyleFixtures().proxyCallTo_('appendLoad', arguments)
+}
+
+var setStyleFixtures = function(html) {
+  jasmine.getStyleFixtures().proxyCallTo_('set', arguments)
+}
+
+var appendSetStyleFixtures = function(html) {
+  jasmine.getStyleFixtures().proxyCallTo_('appendSet', arguments)
+}
+
+var loadJSONFixtures = function() {
+  return jasmine.getJSONFixtures().proxyCallTo_('load', arguments)
+}
+
+var getJSONFixture = function(url) {
+  return jasmine.getJSONFixtures().proxyCallTo_('read', arguments)[url]
+}
+
+jasmine.spiedEventsKey = function (selector, eventName) {
+  return [$(selector).selector, eventName].toString()
+}
+
+jasmine.getFixtures = function() {
+  return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures()
+}
+
+jasmine.getStyleFixtures = function() {
+  return jasmine.currentStyleFixtures_ = jasmine.currentStyleFixtures_ || new jasmine.StyleFixtures()
+}
+
+jasmine.Fixtures = function() {
+  this.containerId = 'jasmine-fixtures'
+  this.fixturesCache_ = {}
+  this.fixturesPath = 'spec/javascripts/fixtures'
+}
+
+jasmine.Fixtures.prototype.set = function(html) {
+  this.cleanUp()
+  this.createContainer_(html)
+}
+
+jasmine.Fixtures.prototype.appendSet= function(html) {
+  this.addToContainer_(html)
+}
+
+jasmine.Fixtures.prototype.preload = function() {
+  this.read.apply(this, arguments)
+}
+
+jasmine.Fixtures.prototype.load = function() {
+  this.cleanUp()
+  this.createContainer_(this.read.apply(this, arguments))
+}
+
+jasmine.Fixtures.prototype.appendLoad = function() {
+  this.addToContainer_(this.read.apply(this, arguments))
+}
+
+jasmine.Fixtures.prototype.read = function() {
+  var htmlChunks = []
+
+  var fixtureUrls = arguments
+  for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
+    htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex]))
+  }
+
+  return htmlChunks.join('')
+}
+
+jasmine.Fixtures.prototype.clearCache = function() {
+  this.fixturesCache_ = {}
+}
+
+jasmine.Fixtures.prototype.cleanUp = function() {
+  $('#' + this.containerId).remove()
+}
+
+jasmine.Fixtures.prototype.sandbox = function(attributes) {
+  var attributesToSet = attributes || {}
+  return $('<div id="sandbox" />').attr(attributesToSet)
+}
+
+jasmine.Fixtures.prototype.createContainer_ = function(html) {
+  var container
+  if(html instanceof $) {
+    container = $('<div id="' + this.containerId + '" />')
+    container.html(html)
+  } else {
+    container = '<div id="' + this.containerId + '">' + html + '</div>'
+  }
+  $(document.body).append(container)
+}
+
+jasmine.Fixtures.prototype.addToContainer_ = function(html){
+  var container = $(document.body).find('#'+this.containerId).append(html)
+  if(!container.length){
+    this.createContainer_(html)
+  }
+}
+
+jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) {
+  if (typeof this.fixturesCache_[url] === 'undefined') {
+    this.loadFixtureIntoCache_(url)
+  }
+  return this.fixturesCache_[url]
+}
+
+jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
+  var url = this.makeFixtureUrl_(relativeUrl)
+  var request = $.ajax({
+    type: "GET",
+    url: url + "?" + new Date().getTime(),
+    async: false
+  })
+  this.fixturesCache_[relativeUrl] = request.responseText
+}
+
+jasmine.Fixtures.prototype.makeFixtureUrl_ = function(relativeUrl){
+  return this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl
+}
+
+jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
+  return this[methodName].apply(this, passedArguments)
+}
+
+
+jasmine.StyleFixtures = function() {
+  this.fixturesCache_ = {}
+  this.fixturesNodes_ = []
+  this.fixturesPath = 'spec/javascripts/fixtures'
+}
+
+jasmine.StyleFixtures.prototype.set = function(css) {
+  this.cleanUp()
+  this.createStyle_(css)
+}
+
+jasmine.StyleFixtures.prototype.appendSet = function(css) {
+  this.createStyle_(css)
+}
+
+jasmine.StyleFixtures.prototype.preload = function() {
+  this.read_.apply(this, arguments)
+}
+
+jasmine.StyleFixtures.prototype.load = function() {
+  this.cleanUp()
+  this.createStyle_(this.read_.apply(this, arguments))
+}
+
+jasmine.StyleFixtures.prototype.appendLoad = function() {
+  this.createStyle_(this.read_.apply(this, arguments))
+}
+
+jasmine.StyleFixtures.prototype.cleanUp = function() {
+  while(this.fixturesNodes_.length) {
+    this.fixturesNodes_.pop().remove()
+  }
+}
+
+jasmine.StyleFixtures.prototype.createStyle_ = function(html) {
+  var styleText = $('<div></div>').html(html).text(),
+    style = $('<style>' + styleText + '</style>')
+
+  this.fixturesNodes_.push(style)
+
+  $('head').append(style)
+}
+
+jasmine.StyleFixtures.prototype.clearCache = jasmine.Fixtures.prototype.clearCache
+
+jasmine.StyleFixtures.prototype.read_ = jasmine.Fixtures.prototype.read
+
+jasmine.StyleFixtures.prototype.getFixtureHtml_ = jasmine.Fixtures.prototype.getFixtureHtml_
+
+jasmine.StyleFixtures.prototype.loadFixtureIntoCache_ = jasmine.Fixtures.prototype.loadFixtureIntoCache_
+
+jasmine.StyleFixtures.prototype.makeFixtureUrl_ = jasmine.Fixtures.prototype.makeFixtureUrl_
+
+jasmine.StyleFixtures.prototype.proxyCallTo_ = jasmine.Fixtures.prototype.proxyCallTo_
+
+jasmine.getJSONFixtures = function() {
+  return jasmine.currentJSONFixtures_ = jasmine.currentJSONFixtures_ || new jasmine.JSONFixtures()
+}
+
+jasmine.JSONFixtures = function() {
+  this.fixturesCache_ = {}
+  this.fixturesPath = 'spec/javascripts/fixtures/json'
+}
+
+jasmine.JSONFixtures.prototype.load = function() {
+  this.read.apply(this, arguments)
+  return this.fixturesCache_
+}
+
+jasmine.JSONFixtures.prototype.read = function() {
+  var fixtureUrls = arguments
+  for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
+    this.getFixtureData_(fixtureUrls[urlIndex])
+  }
+  return this.fixturesCache_
+}
+
+jasmine.JSONFixtures.prototype.clearCache = function() {
+  this.fixturesCache_ = {}
+}
+
+jasmine.JSONFixtures.prototype.getFixtureData_ = function(url) {
+  this.loadFixtureIntoCache_(url)
+  return this.fixturesCache_[url]
+}
+
+jasmine.JSONFixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
+  var self = this
+  var url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl
+  $.ajax({
+    async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
+    cache: false,
+    dataType: 'json',
+    url: url,
+    success: function(data) {
+      self.fixturesCache_[relativeUrl] = data
+    },
+    error: function(jqXHR, status, errorThrown) {
+        throw Error('JSONFixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')')
+    }
+  })
+}
+
+jasmine.JSONFixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
+  return this[methodName].apply(this, passedArguments)
+}
+
+jasmine.JQuery = function() {}
+
+jasmine.JQuery.browserTagCaseIndependentHtml = function(html) {
+  return $('<div/>').append(html).html()
+}
+
+jasmine.JQuery.elementToString = function(element) {
+  var domEl = $(element).get(0)
+  if (domEl == undefined || domEl.cloneNode)
+    return $('<div />').append($(element).clone()).html()
+  else
+    return element.toString()
+}
+
+jasmine.JQuery.matchersClass = {}
+
+!function(namespace) {
+  var data = {
+    spiedEvents: {},
+    handlers:    []
+  }
+
+  namespace.events = {
+    spyOn: function(selector, eventName) {
+      var handler = function(e) {
+        data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] = jasmine.util.argsToArray(arguments)
+      }
+      $(selector).on(eventName, handler)
+      data.handlers.push(handler)
+      return {
+        selector: selector,
+        eventName: eventName,
+        handler: handler,
+        reset: function(){
+          delete data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]
+        }
+      }
+    },
+
+    args: function(selector, eventName) {
+      var actualArgs = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)];
+
+      if (!actualArgs) {
+        throw "There is no spy for " + eventName + " on " + selector.toString() + ". Make sure to create a spy using spyOnEvent.";
+      }
+
+      return actualArgs;
+    },
+
+    wasTriggered: function(selector, eventName) {
+      return !!(data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)])
+    },
+
+    wasTriggeredWith: function(selector, eventName, expectedArgs, env) {
+      var actualArgs = jasmine.JQuery.events.args(selector, eventName).slice(1);
+      if (Object.prototype.toString.call(expectedArgs) !== '[object Array]') {
+        actualArgs = actualArgs[0];
+      }
+      return env.equals_(expectedArgs, actualArgs);
+    },
+
+    wasPrevented: function(selector, eventName) {
+      var args = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)],
+          e = args ? args[0] : undefined;
+      return e && e.isDefaultPrevented()
+    },
+
+    wasStopped: function(selector, eventName) {
+      var args = data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)],
+          e = args ? args[0] : undefined;
+      return e && e.isPropagationStopped()
+    },
+
+    cleanUp: function() {
+      data.spiedEvents = {}
+      data.handlers    = []
+    }
+  }
+}(jasmine.JQuery)
+
+!function(){
+  var jQueryMatchers = {
+    toHaveClass: function(className) {
+      return this.actual.hasClass(className)
+    },
+
+    toHaveCss: function(css){
+      for (var prop in css){
+        if (this.actual.css(prop) !== css[prop]) return false
+      }
+      return true
+    },
+
+    toBeVisible: function() {
+      return this.actual.is(':visible')
+    },
+
+    toBeHidden: function() {
+      return this.actual.is(':hidden')
+    },
+
+    toBeSelected: function() {
+      return this.actual.is(':selected')
+    },
+
+    toBeChecked: function() {
+      return this.actual.is(':checked')
+    },
+
+    toBeEmpty: function() {
+      return this.actual.is(':empty')
+    },
+
+    toExist: function() {
+      return $(document).find(this.actual).length
+    },
+
+    toHaveLength: function(length) {
+      return this.actual.length === length
+    },
+
+    toHaveAttr: function(attributeName, expectedAttributeValue) {
+      return hasProperty(this.actual.attr(attributeName), expectedAttributeValue)
+    },
+
+    toHaveProp: function(propertyName, expectedPropertyValue) {
+      return hasProperty(this.actual.prop(propertyName), expectedPropertyValue)
+    },
+
+    toHaveId: function(id) {
+      return this.actual.attr('id') == id
+    },
+
+    toHaveHtml: function(html) {
+      return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html)
+    },
+
+    toContainHtml: function(html){
+      var actualHtml = this.actual.html()
+      var expectedHtml = jasmine.JQuery.browserTagCaseIndependentHtml(html)
+      return (actualHtml.indexOf(expectedHtml) >= 0)
+    },
+
+    toHaveText: function(text) {
+      var trimmedText = $.trim(this.actual.text())
+      if (text && $.isFunction(text.test)) {
+        return text.test(trimmedText)
+      } else {
+        return trimmedText == text
+      }
+    },
+
+    toContainText: function(text) {
+      var trimmedText = $.trim(this.actual.text())
+      if (text && $.isFunction(text.test)) {
+        return text.test(trimmedText)
+      } else {
+        return trimmedText.indexOf(text) != -1;
+      }
+    },
+
+    toHaveValue: function(value) {
+      return this.actual.val() === value
+    },
+
+    toHaveData: function(key, expectedValue) {
+      return hasProperty(this.actual.data(key), expectedValue)
+    },
+
+    toBe: function(selector) {
+      return this.actual.is(selector)
+    },
+
+    toContain: function(selector) {
+      return this.actual.find(selector).length
+    },
+
+    toBeDisabled: function(selector){
+      return this.actual.is(':disabled')
+    },
+
+    toBeFocused: function(selector) {
+      return this.actual[0] === this.actual[0].ownerDocument.activeElement
+    },
+
+    toHandle: function(event) {
+
+      var events = $._data(this.actual.get(0), "events")
+
+      if(!events || !event || typeof event !== "string") {
+        return false
+      }
+
+      var namespaces = event.split(".")
+      var eventType = namespaces.shift()
+      var sortedNamespaces = namespaces.slice(0).sort()
+      var namespaceRegExp = new RegExp("(^|\\.)" + sortedNamespaces.join("\\.(?:.*\\.)?") + "(\\.|$)")
+
+      if(events[eventType] && namespaces.length) {
+        for(var i = 0; i < events[eventType].length; i++) {
+          var namespace = events[eventType][i].namespace
+          if(namespaceRegExp.test(namespace)) {
+            return true
+          }
+        }
+      } else {
+        return events[eventType] && events[eventType].length > 0
+      }
+    },
+
+    // tests the existence of a specific event binding + handler
+    toHandleWith: function(eventName, eventHandler) {
+      var stack = $._data(this.actual.get(0), "events")[eventName]
+      for (var i = 0; i < stack.length; i++) {
+        if (stack[i].handler == eventHandler) return true
+      }
+      return false
+    }
+  }
+
+  var hasProperty = function(actualValue, expectedValue) {
+    if (expectedValue === undefined) return actualValue !== undefined
+    return actualValue == expectedValue
+  }
+
+  var bindMatcher = function(methodName) {
+    var builtInMatcher = jasmine.Matchers.prototype[methodName]
+
+    jasmine.JQuery.matchersClass[methodName] = function() {
+      if (this.actual
+        && (this.actual instanceof $
+          || jasmine.isDomNode(this.actual))) {
+            this.actual = $(this.actual)
+            var result = jQueryMatchers[methodName].apply(this, arguments)
+            var element
+            if (this.actual.get && (element = this.actual.get()[0]) && !$.isWindow(element) && element.tagName !== "HTML")
+              this.actual = jasmine.JQuery.elementToString(this.actual)
+            return result
+          }
+
+          if (builtInMatcher) {
+            return builtInMatcher.apply(this, arguments)
+          }
+
+          return false
+    }
+  }
+
+  for(var methodName in jQueryMatchers) {
+    bindMatcher(methodName)
+  }
+}()
+
+beforeEach(function() {
+  this.addMatchers(jasmine.JQuery.matchersClass)
+  this.addMatchers({
+    toHaveBeenTriggeredOn: function(selector) {
+      this.message = function() {
+        return [
+          "Expected event " + this.actual + " to have been triggered on " + selector,
+          "Expected event " + this.actual + " not to have been triggered on " + selector
+        ]
+      }
+      return jasmine.JQuery.events.wasTriggered(selector, this.actual)
+    }
+  })
+  this.addMatchers({
+    toHaveBeenTriggered: function(){
+      var eventName = this.actual.eventName,
+          selector = this.actual.selector
+      this.message = function() {
+        return [
+          "Expected event " + eventName + " to have been triggered on " + selector,
+          "Expected event " + eventName + " not to have been triggered on " + selector
+        ]
+      }
+      return jasmine.JQuery.events.wasTriggered(selector, eventName)
+     }
+  })
+  this.addMatchers({
+    toHaveBeenTriggeredOnAndWith: function() {
+      var selector = arguments[0],
+          expectedArgs = arguments[1],
+          wasTriggered = jasmine.JQuery.events.wasTriggered(selector, this.actual);
+      this.message = function() {
+        if (wasTriggered) {
+          var actualArgs = jasmine.JQuery.events.args(selector, this.actual, expectedArgs)[1];
+          return [
+            "Expected event " + this.actual + " to have been triggered with " + jasmine.pp(expectedArgs) + "  but it was triggered with " + jasmine.pp(actualArgs),
+            "Expected event " + this.actual + " not to have been triggered with " + jasmine.pp(expectedArgs) + " but it was triggered with " + jasmine.pp(actualArgs)
+          ]
+        } else {
+          return [
+            "Expected event " + this.actual + " to have been triggered on " + selector,
+            "Expected event " + this.actual + " not to have been triggered on " + selector
+          ]
+        }
+      }
+      return wasTriggered && jasmine.JQuery.events.wasTriggeredWith(selector, this.actual, expectedArgs, this.env);
+    }
+  })
+  this.addMatchers({
+    toHaveBeenPreventedOn: function(selector) {
+      this.message = function() {
+        return [
+          "Expected event " + this.actual + " to have been prevented on " + selector,
+          "Expected event " + this.actual + " not to have been prevented on " + selector
+        ]
+      }
+      return jasmine.JQuery.events.wasPrevented(selector, this.actual)
+    }
+  })
+  this.addMatchers({
+    toHaveBeenPrevented: function() {
+      var eventName = this.actual.eventName,
+          selector = this.actual.selector
+      this.message = function() {
+        return [
+          "Expected event " + eventName + " to have been prevented on " + selector,
+          "Expected event " + eventName + " not to have been prevented on " + selector
+        ]
+      }
+      return jasmine.JQuery.events.wasPrevented(selector, eventName)
+    }
+  })
+  this.addMatchers({
+    toHaveBeenStoppedOn: function(selector) {
+      this.message = function() {
+        return [
+          "Expected event " + this.actual + " to have been stopped on " + selector,
+          "Expected event " + this.actual + " not to have been stopped on " + selector
+        ]
+      }
+      return jasmine.JQuery.events.wasStopped(selector, this.actual)
+    }
+  })
+  this.addMatchers({
+    toHaveBeenStopped: function() {
+      var eventName = this.actual.eventName,
+          selector = this.actual.selector
+      this.message = function() {
+        return [
+          "Expected event " + eventName + " to have been stopped on " + selector,
+          "Expected event " + eventName + " not to have been stopped on " + selector
+        ]
+      }
+      return jasmine.JQuery.events.wasStopped(selector, eventName)
+    }
+  })
+})
+
+afterEach(function() {
+  jasmine.getFixtures().cleanUp()
+  jasmine.getStyleFixtures().cleanUp()
+  jasmine.JQuery.events.cleanUp()
+})
diff --git a/spec/javascripts/jquery.js b/spec/javascripts/jquery.js
new file mode 100644
index 0000000..a86bf79
--- /dev/null
+++ b/spec/javascripts/jquery.js
@@ -0,0 +1,9472 @@
+/*!
+ * jQuery JavaScript Library v1.8.3
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
+ */
+(function( window, undefined ) {
+var
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// Use the correct document accordingly with window argument (sandbox)
+	document = window.document,
+	location = window.location,
+	navigator = window.navigator,
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// Save a reference to some core methods
+	core_push = Array.prototype.push,
+	core_slice = Array.prototype.slice,
+	core_indexOf = Array.prototype.indexOf,
+	core_toString = Object.prototype.toString,
+	core_hasOwn = Object.prototype.hasOwnProperty,
+	core_trim = String.prototype.trim,
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Used for matching numbers
+	core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
+
+	// Used for detecting and trimming whitespace
+	core_rnotwhite = /\S/,
+	core_rspace = /\s+/,
+
+	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([\da-z])/gi,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// The ready event handler and self cleanup method
+	DOMContentLoaded = function() {
+		if ( document.addEventListener ) {
+			document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+			jQuery.ready();
+		} else if ( document.readyState === "complete" ) {
+			// we're here because readyState === "complete" in oldIE
+			// which is good enough for us to call the dom ready!
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	},
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context && context.nodeType ? context.ownerDocument || context : document );
+
+					// scripts is true for back-compat
+					selector = jQuery.parseHTML( match[1], doc, true );
+					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+						this.attr.call( selector, context, true );
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.8.3",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return core_slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Add the callback
+		jQuery.ready.promise().done( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +i;
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( core_slice.apply( this, arguments ),
+			"slice", core_slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: core_push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( !document.body ) {
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+
+		// Trigger any bound ready events
+		if ( jQuery.fn.trigger ) {
+			jQuery( document ).trigger("ready").off("ready");
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ core_toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!core_hasOwn.call(obj, "constructor") &&
+				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || core_hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	// data: string of html
+	// context (optional): If specified, the fragment will be created in this context, defaults to document
+	// scripts (optional): If true, will include scripts passed in the html string
+	parseHTML: function( data, context, scripts ) {
+		var parsed;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		if ( typeof context === "boolean" ) {
+			scripts = context;
+			context = 0;
+		}
+		context = context || document;
+
+		// Single tag
+		if ( (parsed = rsingleTag.exec( data )) ) {
+			return [ context.createElement( parsed[1] ) ];
+		}
+
+		parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
+		return jQuery.merge( [],
+			(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
+	},
+
+	parseJSON: function( data ) {
+		if ( !data || typeof data !== "string") {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return ( new Function( "return " + data ) )();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && core_rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+	},
+
+	// args is for internal usage only
+	each: function( obj, callback, args ) {
+		var name,
+			i = 0,
+			length = obj.length,
+			isObj = length === undefined || jQuery.isFunction( obj );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in obj ) {
+					if ( callback.apply( obj[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( obj[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in obj ) {
+					if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+		function( text ) {
+			return text == null ?
+				"" :
+				core_trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				( text + "" ).replace( rtrim, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var type,
+			ret = results || [];
+
+		if ( arr != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			type = jQuery.type( arr );
+
+			if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
+				core_push.call( ret, arr );
+			} else {
+				jQuery.merge( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		var len;
+
+		if ( arr ) {
+			if ( core_indexOf ) {
+				return core_indexOf.call( arr, elem, i );
+			}
+
+			len = arr.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in arr && arr[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var l = second.length,
+			i = first.length,
+			j = 0;
+
+		if ( typeof l === "number" ) {
+			for ( ; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var retVal,
+			ret = [],
+			i = 0,
+			length = elems.length;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key,
+			ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var tmp, args, proxy;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = core_slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Multifunctional method to get and set values of a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+		var exec,
+			bulk = key == null,
+			i = 0,
+			length = elems.length;
+
+		// Sets many values
+		if ( key && typeof key === "object" ) {
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+			}
+			chainable = 1;
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = pass === undefined && jQuery.isFunction( value );
+
+			if ( bulk ) {
+				// Bulk operations only iterate when executing function values
+				if ( exec ) {
+					exec = fn;
+					fn = function( elem, key, value ) {
+						return exec.call( jQuery( elem ), value );
+					};
+
+				// Otherwise they run against the entire set
+				} else {
+					fn.call( elems, value );
+					fn = null;
+				}
+			}
+
+			if ( fn ) {
+				for (; i < length; i++ ) {
+					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+				}
+			}
+
+			chainable = 1;
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	}
+});
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called after the browser event has already occurred.
+		// we once tried to use readyState "interactive" here, but it caused issues like the one
+		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			setTimeout( jQuery.ready, 1 );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else {
+			// Ensure firing before onload, maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var top = false;
+
+			try {
+				top = window.frameElement == null && document.documentElement;
+			} catch(e) {}
+
+			if ( top && top.doScroll ) {
+				(function doScrollCheck() {
+					if ( !jQuery.isReady ) {
+
+						try {
+							// Use the trick by Diego Perini
+							// http://javascript.nwbox.com/IEContentLoaded/
+							top.doScroll("left");
+						} catch(e) {
+							return setTimeout( doScrollCheck, 50 );
+						}
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				})();
+			}
+		}
+	}
+	return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+	var object = optionsCache[ options ] = {};
+	jQuery.each( options.split( core_rspace ), function( _, flag ) {
+		object[ flag ] = true;
+	});
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		( optionsCache[ options ] || createOptions( options ) ) :
+		jQuery.extend( {}, options );
+
+	var // Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// Flag to know if list is currently firing
+		firing,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = !options.once && [],
+		// Fire callbacks
+		fire = function( data ) {
+			memory = options.memory && data;
+			fired = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			firing = true;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+					memory = false; // To prevent further calls using add
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( stack ) {
+					if ( stack.length ) {
+						fire( stack.shift() );
+					}
+				} else if ( memory ) {
+					list = [];
+				} else {
+					self.disable();
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					// First, we save the current length
+					var start = list.length;
+					(function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							var type = jQuery.type( arg );
+							if ( type === "function" ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && type !== "string" ) {
+								// Inspect recursively
+								add( arg );
+							}
+						});
+					})( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away
+					} else if ( memory ) {
+						firingStart = start;
+						fire( memory );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					jQuery.each( arguments, function( _, arg ) {
+						var index;
+						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+							list.splice( index, 1 );
+							// Handle firing indexes
+							if ( firing ) {
+								if ( index <= firingLength ) {
+									firingLength--;
+								}
+								if ( index <= firingIndex ) {
+									firingIndex--;
+								}
+							}
+						}
+					});
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				return jQuery.inArray( fn, list ) > -1;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				args = args || [];
+				args = [ context, args.slice ? args.slice() : args ];
+				if ( list && ( !fired || stack ) ) {
+					if ( firing ) {
+						stack.push( args );
+					} else {
+						fire( args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var tuples = [
+				// action, add listener, listener list, final state
+				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+				[ "notify", "progress", jQuery.Callbacks("memory") ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				then: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+							var action = tuple[ 0 ],
+								fn = fns[ i ];
+							// deferred[ done | fail | progress ] for forwarding actions to newDefer
+							deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
+								function() {
+									var returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise()
+											.done( newDefer.resolve )
+											.fail( newDefer.reject )
+											.progress( newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								} :
+								newDefer[ action ]
+							);
+						});
+						fns = null;
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Keep pipe for back-compat
+		promise.pipe = promise.then;
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 3 ];
+
+			// promise[ done | fail | progress ] = list.add
+			promise[ tuple[1] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(function() {
+					// state = [ resolved | rejected ]
+					state = stateString;
+
+				// [ reject_list | resolve_list ].disable; progress_list.lock
+				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+			}
+
+			// deferred[ resolve | reject | notify ] = list.fire
+			deferred[ tuple[0] ] = list.fire;
+			deferred[ tuple[0] + "With" ] = list.fireWith;
+		});
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( subordinate /* , ..., subordinateN */ ) {
+		var i = 0,
+			resolveValues = core_slice.call( arguments ),
+			length = resolveValues.length,
+
+			// the count of uncompleted subordinates
+			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+			// Update function for both resolve and progress values
+			updateFunc = function( i, contexts, values ) {
+				return function( value ) {
+					contexts[ i ] = this;
+					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+					if( values === progressValues ) {
+						deferred.notifyWith( contexts, values );
+					} else if ( !( --remaining ) ) {
+						deferred.resolveWith( contexts, values );
+					}
+				};
+			},
+
+			progressValues, progressContexts, resolveContexts;
+
+		// add listeners to Deferred subordinates; treat others as resolved
+		if ( length > 1 ) {
+			progressValues = new Array( length );
+			progressContexts = new Array( length );
+			resolveContexts = new Array( length );
+			for ( ; i < length; i++ ) {
+				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+					resolveValues[ i ].promise()
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject )
+						.progress( updateFunc( i, progressContexts, progressValues ) );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+});
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		fragment,
+		eventName,
+		i,
+		isSupported,
+		clickFn,
+		div = document.createElement("div");
+
+	// Setup
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	// Support tests won't run in some limited or non-browser environments
+	all = div.getElementsByTagName("*");
+	a = div.getElementsByTagName("a")[ 0 ];
+	if ( !all || !a || !all.length ) {
+		return {};
+	}
+
+	// First batch of tests
+	select = document.createElement("select");
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName("input")[ 0 ];
+
+	a.style.cssText = "top:1px;float:left;opacity:.5";
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.5/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Tests for enctype support on a form (#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+		boxModel: ( document.compatMode === "CSS1Compat" ),
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true,
+		boxSizingReliable: true,
+		pixelPosition: false
+	};
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", clickFn = function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent("onclick");
+		div.detachEvent( "onclick", clickFn );
+	}
+
+	// Check if a radio maintains its value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute( "type", "radio" );
+	support.radioValue = input.value === "t";
+
+	input.setAttribute( "checked", "checked" );
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for ( i in {
+			submit: true,
+			change: true,
+			focusin: true
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, div, tds, marginDiv,
+			divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		container = document.createElement("div");
+		container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName("td");
+		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE <= 8 fail this test)
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Check box-sizing and margin behavior
+		div.innerHTML = "";
+		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+		support.boxSizing = ( div.offsetWidth === 4 );
+		support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+		// NOTE: To any future maintainer, we've window.getComputedStyle
+		// because jsdom on node.js will break without it.
+		if ( window.getComputedStyle ) {
+			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+			// Check if div with explicit width and no margin-right incorrectly
+			// gets computed margin-right based on width of container. For more
+			// info see bug #3333
+			// Fails in WebKit before Feb 2011 nightlies
+			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+			marginDiv = document.createElement("div");
+			marginDiv.style.cssText = div.style.cssText = divReset;
+			marginDiv.style.marginRight = marginDiv.style.width = "0";
+			div.style.width = "1px";
+			div.appendChild( marginDiv );
+			support.reliableMarginRight =
+				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+		}
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.innerHTML = "";
+			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "block";
+			div.style.overflow = "visible";
+			div.innerHTML = "<div></div>";
+			div.firstChild.style.width = "5px";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+			container.style.zoom = 1;
+		}
+
+		// Null elements to avoid leaks in IE
+		body.removeChild( container );
+		container = div = tds = marginDiv = null;
+	});
+
+	// Null elements to avoid leaks in IE
+	fragment.removeChild( div );
+	all = a = select = opt = input = fragment = div = null;
+
+	return support;
+})();
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	deletedIds: [],
+
+	// Remove at next major release (1.9/2.0)
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// Avoids exposing jQuery metadata on plain JS objects when the object
+			// is serialized using JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, i, l,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split(" ");
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject( cache[ id ] ) ) {
+				return;
+			}
+		}
+
+		// Destroy the cache
+		if ( isNode ) {
+			jQuery.cleanData( [ elem ], true );
+
+		// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+		} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+			delete cache[ id ];
+
+		// When all else fails, null
+		} else {
+			cache[ id ] = null;
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+		// nodes accept data unless otherwise specified; rejection can be conditional
+		return !noData || noData !== true && elem.getAttribute("classid") === noData;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, part, attr, name, l,
+			elem = this[0],
+			i = 0,
+			data = null;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attr = elem.attributes;
+					for ( l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( !name.indexOf( "data-" ) ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split( ".", 2 );
+		parts[1] = parts[1] ? "." + parts[1] : "";
+		part = parts[1] + "!";
+
+		return jQuery.access( this, function( value ) {
+
+			if ( value === undefined ) {
+				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+				// Try to fetch any internally stored data first
+				if ( data === undefined && elem ) {
+					data = jQuery.data( elem, key );
+					data = dataAttr( elem, key, data );
+				}
+
+				return data === undefined && parts[1] ?
+					this.data( parts[0] ) :
+					data;
+			}
+
+			parts[1] = value;
+			this.each(function() {
+				var self = jQuery( this );
+
+				self.triggerHandler( "setData" + part, parts );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + part, parts );
+			});
+		}, null, value, arguments.length > 1, null, false );
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				// Only convert to a number if it doesn't change the string
+				+data + "" === data ? +data :
+				rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	var name;
+	for ( name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray(data) ) {
+					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// not intended for public consumption - generates a queueHooks object, or returns the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+			empty: jQuery.Callbacks("once memory").add(function() {
+				jQuery.removeData( elem, type + "queue", true );
+				jQuery.removeData( elem, key, true );
+			})
+		});
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[0], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each(function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[0] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while( i-- ) {
+			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+});
+var nodeHook, boolHook, fixSpecified,
+	rclass = /[\t\r\n]/g,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea|)$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( core_rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var removes, className, elem, c, cl, i, l;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+		if ( (value && typeof value === "string") || value === undefined ) {
+			removes = ( value || "" ).split( core_rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+				if ( elem.nodeType === 1 && elem.className ) {
+
+					className = (" " + elem.className + " ").replace( rclass, " " );
+
+					// loop over each item in the removal list
+					for ( c = 0, cl = removes.length; c < cl; c++ ) {
+						// Remove until there is nothing to remove,
+						while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
+							className = className.replace( " " + removes[ c ] + " " , " " );
+						}
+					}
+					elem.className = value ? jQuery.trim( className ) : "";
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( core_rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space separated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var val,
+				self = jQuery(this);
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one" || index < 0,
+					values = one ? null : [],
+					max = one ? index + 1 : options.length,
+					i = index < 0 ?
+						max :
+						one ? index : 0;
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// oldIE doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+							// Don't return options that are disabled or in a disabled optgroup
+							( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
+	attrFn: {},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, value + "" );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var propName, attrNames, name, isBool,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+
+			attrNames = value.split( core_rspace );
+
+			for ( ; i < attrNames.length; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+					isBool = rboolean.test( name );
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					// Do not do this for boolean attributes (see #10870)
+					if ( !isBool ) {
+						jQuery.attr( elem, name, "" );
+					}
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( isBool && propName in elem ) {
+						elem[ propName ] = false;
+					}
+				}
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true,
+		coords: true
+	};
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
+				ret.value :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return ( ret.value = value + "" );
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = value + "" );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+var rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
+	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var t, tns, type, origType, namespaces, origCount,
+			j, events, special, eventType, handleObj,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector? special.delegateType : special.bindType ) || type;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			delete elemData.handle;
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, "events", true );
+		}
+	},
+
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
+			type = event.type || event,
+			namespaces = [];
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "!" ) >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf( "." ) >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			for ( old = elem; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old === (elem.ownerDocument || document) ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
+			handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = core_slice.call( arguments ),
+			run_all = !event.exclusive && !event.namespace,
+			special = jQuery.event.special[ event.type ] || {},
+			handlerQueue = [];
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !(event.button && event.type === "click") ) {
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+				// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.disabled !== true || event.type !== "click" ) {
+					selMatch = {};
+					matches = [];
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+						sel = handleObj.selector;
+
+						if ( selMatch[ sel ] === undefined ) {
+							selMatch[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) >= 0 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( selMatch[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, matches: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
+		event.metaKey = !!event.metaKey;
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{ type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		var name = "on" + type;
+
+		if ( elem.detachEvent ) {
+
+			// #8545, #7054, preventing memory leaks for custom events in IE6-8
+			// detachEvent needed property on element, by name of that event, to properly expose it to GC
+			if ( typeof elem[ name ] === "undefined" ) {
+				elem[ name ] = null;
+			}
+
+			elem.detachEvent( name, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !jQuery._data( form, "_submit_attached" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					jQuery._data( form, "_submit_attached", true );
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+						}
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event, true );
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					jQuery._data( elem, "_change_attached", true );
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return !rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var origFn, type;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) { // && selector != null
+				// ( types-Object, data )
+				data = data || selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://sizzlejs.com/
+ */
+(function( window, undefined ) {
+
+var cachedruns,
+	assertGetIdNotName,
+	Expr,
+	getText,
+	isXML,
+	contains,
+	compile,
+	sortOrder,
+	hasDuplicate,
+	outermostContext,
+
+	baseHasDuplicate = true,
+	strundefined = "undefined",
+
+	expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
+
+	Token = String,
+	document = window.document,
+	docElem = document.documentElement,
+	dirruns = 0,
+	done = 0,
+	pop = [].pop,
+	push = [].push,
+	slice = [].slice,
+	// Use a stripped-down indexOf if a native one is unavailable
+	indexOf = [].indexOf || function( elem ) {
+		var i = 0,
+			len = this.length;
+		for ( ; i < len; i++ ) {
+			if ( this[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	// Augment a function for special use by Sizzle
+	markFunction = function( fn, value ) {
+		fn[ expando ] = value == null || value;
+		return fn;
+	},
+
+	createCache = function() {
+		var cache = {},
+			keys = [];
+
+		return markFunction(function( key, value ) {
+			// Only keep the most recent entries
+			if ( keys.push( key ) > Expr.cacheLength ) {
+				delete cache[ keys.shift() ];
+			}
+
+			// Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)
+			return (cache[ key + " " ] = value);
+		}, cache );
+	},
+
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+
+	// Regex
+
+	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+	// http://www.w3.org/TR/css3-syntax/#characters
+	characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
+
+	// Loosely modeled on CSS identifier characters
+	// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
+	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = characterEncoding.replace( "w", "w#" ),
+
+	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+	operators = "([*^$|!~]?=)",
+	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+		"*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+	// Prefer arguments not in parens/brackets,
+	//   then attribute selectors and non-pseudos (denoted by :),
+	//   then anything else
+	// These preferences are here to reduce the number of selectors
+	//   needing tokenize in the PSEUDO preFilter
+	pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
+
+	// For matchExpr.POS and matchExpr.needsContext
+	pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+		"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
+	rpseudo = new RegExp( pseudos ),
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
+
+	rnot = /^:not/,
+	rsibling = /[\x20\t\r\n\f]*[+~]/,
+	rendsWithNot = /:not\($/,
+
+	rheader = /h\d/i,
+	rinputs = /input|select|textarea|button/i,
+
+	rbackslash = /\\(?!\\)/g,
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
+		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+		"NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
+		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"POS": new RegExp( pos, "i" ),
+		"CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		// For use in libraries implementing .is()
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
+	},
+
+	// Support
+
+	// Used for testing something on an element
+	assert = function( fn ) {
+		var div = document.createElement("div");
+
+		try {
+			return fn( div );
+		} catch (e) {
+			return false;
+		} finally {
+			// release memory in IE
+			div = null;
+		}
+	},
+
+	// Check if getElementsByTagName("*") returns only elements
+	assertTagNameNoComments = assert(function( div ) {
+		div.appendChild( document.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	}),
+
+	// Check if getAttribute returns normalized href attributes
+	assertHrefNotNormalized = assert(function( div ) {
+		div.innerHTML = "<a href='#'></a>";
+		return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
+			div.firstChild.getAttribute("href") === "#";
+	}),
+
+	// Check if attributes should be retrieved by attribute nodes
+	assertAttributes = assert(function( div ) {
+		div.innerHTML = "<select></select>";
+		var type = typeof div.lastChild.getAttribute("multiple");
+		// IE8 returns a string for some attributes even when not present
+		return type !== "boolean" && type !== "string";
+	}),
+
+	// Check if getElementsByClassName can be trusted
+	assertUsableClassName = assert(function( div ) {
+		// Opera can't find a second classname (in 9.6)
+		div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
+		if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
+			return false;
+		}
+
+		// Safari 3.2 caches class attributes and doesn't catch changes
+		div.lastChild.className = "e";
+		return div.getElementsByClassName("e").length === 2;
+	}),
+
+	// Check if getElementById returns elements by name
+	// Check if getElementsByName privileges form controls or returns elements by ID
+	assertUsableName = assert(function( div ) {
+		// Inject content
+		div.id = expando + 0;
+		div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
+		docElem.insertBefore( div, docElem.firstChild );
+
+		// Test
+		var pass = document.getElementsByName &&
+			// buggy browsers will return fewer than the correct 2
+			document.getElementsByName( expando ).length === 2 +
+			// buggy browsers will return more than the correct 0
+			document.getElementsByName( expando + 0 ).length;
+		assertGetIdNotName = !document.getElementById( expando );
+
+		// Cleanup
+		docElem.removeChild( div );
+
+		return pass;
+	});
+
+// If slice is not available, provide a backup
+try {
+	slice.call( docElem.childNodes, 0 )[0].nodeType;
+} catch ( e ) {
+	slice = function( i ) {
+		var elem,
+			results = [];
+		for ( ; (elem = this[i]); i++ ) {
+			results.push( elem );
+		}
+		return results;
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+	var match, elem, xml, m,
+		nodeType = context.nodeType;
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	if ( nodeType !== 1 && nodeType !== 9 ) {
+		return [];
+	}
+
+	xml = isXML( context );
+
+	if ( !xml && !seed ) {
+		if ( (match = rquickExpr.exec( selector )) ) {
+			// Speed-up: Sizzle("#ID")
+			if ( (m = match[1]) ) {
+				if ( nodeType === 9 ) {
+					elem = context.getElementById( m );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE, Opera, and Webkit return items
+						// by name instead of ID
+						if ( elem.id === m ) {
+							results.push( elem );
+							return results;
+						}
+					} else {
+						return results;
+					}
+				} else {
+					// Context is not a document
+					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+						contains( context, elem ) && elem.id === m ) {
+						results.push( elem );
+						return results;
+					}
+				}
+
+			// Speed-up: Sizzle("TAG")
+			} else if ( match[2] ) {
+				push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
+				return results;
+
+			// Speed-up: Sizzle(".CLASS")
+			} else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
+				push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
+				return results;
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );
+}
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	return Sizzle( expr, null, null, [ elem ] ).length > 0;
+};
+
+// Returns a function to use in pseudos for input types
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+// Returns a function to use in pseudos for buttons
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+// Returns a function to use in pseudos for positionals
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+			// Use textContent for elements
+			// innerText usage removed for consistency of new lines (see #11153)
+			if ( typeof elem.textContent === "string" ) {
+				return elem.textContent;
+			} else {
+				// Traverse its children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+		// Do not include comment or processing instruction nodes
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( ; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	}
+	return ret;
+};
+
+isXML = Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+// Element contains another
+contains = Sizzle.contains = docElem.contains ?
+	function( a, b ) {
+		var adown = a.nodeType === 9 ? a.documentElement : a,
+			bup = b && b.parentNode;
+		return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
+	} :
+	docElem.compareDocumentPosition ?
+	function( a, b ) {
+		return b && !!( a.compareDocumentPosition( b ) & 16 );
+	} :
+	function( a, b ) {
+		while ( (b = b.parentNode) ) {
+			if ( b === a ) {
+				return true;
+			}
+		}
+		return false;
+	};
+
+Sizzle.attr = function( elem, name ) {
+	var val,
+		xml = isXML( elem );
+
+	if ( !xml ) {
+		name = name.toLowerCase();
+	}
+	if ( (val = Expr.attrHandle[ name ]) ) {
+		return val( elem );
+	}
+	if ( xml || assertAttributes ) {
+		return elem.getAttribute( name );
+	}
+	val = elem.getAttributeNode( name );
+	return val ?
+		typeof elem[ name ] === "boolean" ?
+			elem[ name ] ? name : null :
+			val.specified ? val.value : null :
+		null;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	// IE6/7 return a modified href
+	attrHandle: assertHrefNotNormalized ?
+		{} :
+		{
+			"href": function( elem ) {
+				return elem.getAttribute( "href", 2 );
+			},
+			"type": function( elem ) {
+				return elem.getAttribute("type");
+			}
+		},
+
+	find: {
+		"ID": assertGetIdNotName ?
+			function( id, context, xml ) {
+				if ( typeof context.getElementById !== strundefined && !xml ) {
+					var m = context.getElementById( id );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					return m && m.parentNode ? [m] : [];
+				}
+			} :
+			function( id, context, xml ) {
+				if ( typeof context.getElementById !== strundefined && !xml ) {
+					var m = context.getElementById( id );
+
+					return m ?
+						m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
+							[m] :
+							undefined :
+						[];
+				}
+			},
+
+		"TAG": assertTagNameNoComments ?
+			function( tag, context ) {
+				if ( typeof context.getElementsByTagName !== strundefined ) {
+					return context.getElementsByTagName( tag );
+				}
+			} :
+			function( tag, context ) {
+				var results = context.getElementsByTagName( tag );
+
+				// Filter out possible comments
+				if ( tag === "*" ) {
+					var elem,
+						tmp = [],
+						i = 0;
+
+					for ( ; (elem = results[i]); i++ ) {
+						if ( elem.nodeType === 1 ) {
+							tmp.push( elem );
+						}
+					}
+
+					return tmp;
+				}
+				return results;
+			},
+
+		"NAME": assertUsableName && function( tag, context ) {
+			if ( typeof context.getElementsByName !== strundefined ) {
+				return context.getElementsByName( name );
+			}
+		},
+
+		"CLASS": assertUsableClassName && function( className, context, xml ) {
+			if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
+				return context.getElementsByClassName( className );
+			}
+		}
+	},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( rbackslash, "" );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				3 xn-component of xn+y argument ([+-]?\d*n|)
+				4 sign of xn-component
+				5 x of xn-component
+				6 sign of y-component
+				7 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1] === "nth" ) {
+				// nth-child requires argument
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
+				match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var unquoted, excess;
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			if ( match[3] ) {
+				match[2] = match[3];
+			} else if ( (unquoted = match[4]) ) {
+				// Only check arguments that contain a pseudo
+				if ( rpseudo.test(unquoted) &&
+					// Get excess from tokenize (recursively)
+					(excess = tokenize( unquoted, true )) &&
+					// advance to the next closing parenthesis
+					(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+					// excess is a negative index
+					unquoted = unquoted.slice( 0, excess );
+					match[0] = match[0].slice( 0, excess );
+				}
+				match[2] = unquoted;
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+		"ID": assertGetIdNotName ?
+			function( id ) {
+				id = id.replace( rbackslash, "" );
+				return function( elem ) {
+					return elem.getAttribute("id") === id;
+				};
+			} :
+			function( id ) {
+				id = id.replace( rbackslash, "" );
+				return function( elem ) {
+					var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+					return node && node.value === id;
+				};
+			},
+
+		"TAG": function( nodeName ) {
+			if ( nodeName === "*" ) {
+				return function() { return true; };
+			}
+			nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
+
+			return function( elem ) {
+				return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+			};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ expando ][ className + " " ];
+
+			return pattern ||
+				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+				classCache( className, function( elem ) {
+					return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
+				});
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem, context ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.substr( result.length - check.length ) === check :
+					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, argument, first, last ) {
+
+			if ( type === "nth" ) {
+				return function( elem ) {
+					var node, diff,
+						parent = elem.parentNode;
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					if ( parent ) {
+						diff = 0;
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								diff++;
+								if ( elem === node ) {
+									break;
+								}
+							}
+						}
+					}
+
+					// Incorporate the offset (or cast to NaN), then check against cycle size
+					diff -= last;
+					return diff === first || ( diff % first === 0 && diff / first >= 0 );
+				};
+			}
+
+			return function( elem ) {
+				var node = elem;
+
+				switch ( type ) {
+					case "only":
+					case "first":
+						while ( (node = node.previousSibling) ) {
+							if ( node.nodeType === 1 ) {
+								return false;
+							}
+						}
+
+						if ( type === "first" ) {
+							return true;
+						}
+
+						node = elem;
+
+						/* falls through */
+					case "last":
+						while ( (node = node.nextSibling) ) {
+							if ( node.nodeType === 1 ) {
+								return false;
+							}
+						}
+
+						return true;
+				}
+			};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf.call( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			return function( elem ) {
+				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		"enabled": function( elem ) {
+			return elem.disabled === false;
+		},
+
+		"disabled": function( elem ) {
+			return elem.disabled === true;
+		},
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"selected": function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos["empty"]( elem );
+		},
+
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+			//   not comment, processing instructions, or others
+			// Thanks to Diego Perini for the nodeName shortcut
+			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+			var nodeType;
+			elem = elem.firstChild;
+			while ( elem ) {
+				if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
+					return false;
+				}
+				elem = elem.nextSibling;
+			}
+			return true;
+		},
+
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"text": function( elem ) {
+			var type, attr;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" &&
+				(type = elem.type) === "text" &&
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
+		},
+
+		// Input types
+		"radio": createInputPseudo("radio"),
+		"checkbox": createInputPseudo("checkbox"),
+		"file": createInputPseudo("file"),
+		"password": createInputPseudo("password"),
+		"image": createInputPseudo("image"),
+
+		"submit": createButtonPseudo("submit"),
+		"reset": createButtonPseudo("reset"),
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"focus": function( elem ) {
+			var doc = elem.ownerDocument;
+			return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+		},
+
+		"active": function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		},
+
+		// Positional types
+		"first": createPositionalPseudo(function() {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length ) {
+			for ( var i = 0; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length ) {
+			for ( var i = 1; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+function siblingCheck( a, b, ret ) {
+	if ( a === b ) {
+		return ret;
+	}
+
+	var cur = a.nextSibling;
+
+	while ( cur ) {
+		if ( cur === b ) {
+			return -1;
+		}
+
+		cur = cur.nextSibling;
+	}
+
+	return 1;
+}
+
+sortOrder = docElem.compareDocumentPosition ?
+	function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
+			a.compareDocumentPosition :
+			a.compareDocumentPosition(b) & 4
+		) ? -1 : 1;
+	} :
+	function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+// Always assume the presence of duplicates if sort doesn't
+// pass them to our comparison function (as in Google Chrome).
+[0, 0].sort( sortOrder );
+baseHasDuplicate = !hasDuplicate;
+
+// Document sorting and removing duplicates
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		i = 1,
+		j = 0;
+
+	hasDuplicate = baseHasDuplicate;
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		for ( ; (elem = results[i]); i++ ) {
+			if ( elem === results[ i - 1 ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	return results;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+function tokenize( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ expando ][ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[0].length ) || soFar;
+			}
+			groups.push( tokens = [] );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			tokens.push( matched = new Token( match.shift() ) );
+			soFar = soFar.slice( matched.length );
+
+			// Cast descendant combinators to space
+			matched.type = match[0].replace( rtrim, " " );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				(match = preFilters[ type ]( match ))) ) {
+
+				tokens.push( matched = new Token( match.shift() ) );
+				soFar = soFar.slice( matched.length );
+				matched.type = type;
+				matched.matches = match;
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		checkNonElements = base && combinator.dir === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( checkNonElements || elem.nodeType === 1  ) {
+					return matcher( elem, context, xml );
+				}
+			}
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+			if ( !xml ) {
+				var cache,
+					dirkey = dirruns + " " + doneName + " ",
+					cachedkey = dirkey + cachedruns;
+				while ( (elem = elem[ dir ]) ) {
+					if ( checkNonElements || elem.nodeType === 1 ) {
+						if ( (cache = elem[ expando ]) === cachedkey ) {
+							return elem.sizset;
+						} else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
+							if ( elem.sizset ) {
+								return elem;
+							}
+						} else {
+							elem[ expando ] = cachedkey;
+							if ( matcher( elem, context, xml ) ) {
+								elem.sizset = true;
+								return elem;
+							}
+							elem.sizset = false;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( checkNonElements || elem.nodeType === 1 ) {
+						if ( matcher( elem, context, xml ) ) {
+							return elem;
+						}
+					}
+				}
+			}
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( (elem = temp[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( (elem = matcherOut[i]) ) {
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( (matcherIn[i] = elem) );
+						}
+					}
+					postFinder( null, (matcherOut = []), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( (elem = matcherOut[i]) &&
+						(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+						seed[temp] = !(results[temp] = elem);
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf.call( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
+		} else {
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && tokens.join("")
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, expandContext ) {
+			var elem, j, matcher,
+				setMatched = [],
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				outermost = expandContext != null,
+				contextBackup = outermostContext,
+				// We must always have either seed elements or context
+				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+				// Nested matchers should use non-integer dirruns
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
+
+			if ( outermost ) {
+				outermostContext = context !== document && context;
+				cachedruns = superMatcher.el;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			for ( ; (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
+						if ( matcher( elem, context, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+						cachedruns = ++superMatcher.el;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// Apply set filters to unmatched elements
+			matchedCount += i;
+			if ( bySet && i !== matchedCount ) {
+				for ( j = 0; (matcher = setMatchers[j]); j++ ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	superMatcher.el = 0;
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ expando ][ selector + " " ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !group ) {
+			group = tokenize( selector );
+		}
+		i = group.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( group[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+	}
+	return cached;
+};
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function select( selector, context, results, seed, xml ) {
+	var i, tokens, token, type, find,
+		match = tokenize( selector ),
+		j = match.length;
+
+	if ( !seed ) {
+		// Try to minimize operations if there is only one group
+		if ( match.length === 1 ) {
+
+			// Take a shortcut and set the context if the root selector is an ID
+			tokens = match[0] = match[0].slice( 0 );
+			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+					context.nodeType === 9 && !xml &&
+					Expr.relative[ tokens[1].type ] ) {
+
+				context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];
+				if ( !context ) {
+					return results;
+				}
+
+				selector = selector.slice( tokens.shift().length );
+			}
+
+			// Fetch a seed set for right-to-left matching
+			for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
+				token = tokens[i];
+
+				// Abort if we hit a combinator
+				if ( Expr.relative[ (type = token.type) ] ) {
+					break;
+				}
+				if ( (find = Expr.find[ type ]) ) {
+					// Search, expanding context for leading sibling combinators
+					if ( (seed = find(
+						token.matches[0].replace( rbackslash, "" ),
+						rsibling.test( tokens[0].type ) && context.parentNode || context,
+						xml
+					)) ) {
+
+						// If seed is empty or no tokens remain, we can return early
+						tokens.splice( i, 1 );
+						selector = seed.length && tokens.join("");
+						if ( !selector ) {
+							push.apply( results, slice.call( seed, 0 ) );
+							return results;
+						}
+
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function
+	// Provide `match` to avoid retokenization if we modified the selector above
+	compile( selector, match )(
+		seed,
+		context,
+		xml,
+		results,
+		rsibling.test( selector )
+	);
+	return results;
+}
+
+if ( document.querySelectorAll ) {
+	(function() {
+		var disconnectedMatch,
+			oldSelect = select,
+			rescape = /'|\\/g,
+			rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
+
+			// qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA
+			// A support test would require too much code (would include document ready)
+			rbuggyQSA = [ ":focus" ],
+
+			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+			// A support test would require too much code (would include document ready)
+			// just skip matchesSelector for :active
+			rbuggyMatches = [ ":active" ],
+			matches = docElem.matchesSelector ||
+				docElem.mozMatchesSelector ||
+				docElem.webkitMatchesSelector ||
+				docElem.oMatchesSelector ||
+				docElem.msMatchesSelector;
+
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( div ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explictly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// http://bugs.jquery.com/ticket/12359
+			div.innerHTML = "<select><option selected=''></option></select>";
+
+			// IE8 - Some boolean attributes are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here (do not put tests after this one)
+			if ( !div.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+		});
+
+		assert(function( div ) {
+
+			// Opera 10-12/IE9 - ^= $= *= and empty values
+			// Should not select anything
+			div.innerHTML = "<p test=''></p>";
+			if ( div.querySelectorAll("[test^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here (do not put tests after this one)
+			div.innerHTML = "<input type='hidden'/>";
+			if ( !div.querySelectorAll(":enabled").length ) {
+				rbuggyQSA.push(":enabled", ":disabled");
+			}
+		});
+
+		// rbuggyQSA always contains :focus, so no need for a length check
+		rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );
+
+		select = function( selector, context, results, seed, xml ) {
+			// Only use querySelectorAll when not filtering,
+			// when this is not xml,
+			// and when no QSA bugs apply
+			if ( !seed && !xml && !rbuggyQSA.test( selector ) ) {
+				var groups, i,
+					old = true,
+					nid = expando,
+					newContext = context,
+					newSelector = context.nodeType === 9 && selector;
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					groups = tokenize( selector );
+
+					if ( (old = context.getAttribute("id")) ) {
+						nid = old.replace( rescape, "\\$&" );
+					} else {
+						context.setAttribute( "id", nid );
+					}
+					nid = "[id='" + nid + "'] ";
+
+					i = groups.length;
+					while ( i-- ) {
+						groups[i] = nid + groups[i].join("");
+					}
+					newContext = rsibling.test( selector ) && context.parentNode || context;
+					newSelector = groups.join(",");
+				}
+
+				if ( newSelector ) {
+					try {
+						push.apply( results, slice.call( newContext.querySelectorAll(
+							newSelector
+						), 0 ) );
+						return results;
+					} catch(qsaError) {
+					} finally {
+						if ( !old ) {
+							context.removeAttribute("id");
+						}
+					}
+				}
+			}
+
+			return oldSelect( selector, context, results, seed, xml );
+		};
+
+		if ( matches ) {
+			assert(function( div ) {
+				// Check to see if it's possible to do matchesSelector
+				// on a disconnected node (IE 9)
+				disconnectedMatch = matches.call( div, "div" );
+
+				// This should fail with an exception
+				// Gecko does not error, returns false instead
+				try {
+					matches.call( div, "[test!='']:sizzle" );
+					rbuggyMatches.push( "!=", pseudos );
+				} catch ( e ) {}
+			});
+
+			// rbuggyMatches always contains :active and :focus, so no need for a length check
+			rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
+
+			Sizzle.matchesSelector = function( elem, expr ) {
+				// Make sure that attribute selectors are quoted
+				expr = expr.replace( rattributeQuotes, "='$1']" );
+
+				// rbuggyMatches always contains :active, so no need for an existence check
+				if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {
+					try {
+						var ret = matches.call( elem, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9
+								elem.document && elem.document.nodeType !== 11 ) {
+							return ret;
+						}
+					} catch(e) {}
+				}
+
+				return Sizzle( expr, null, null, [ elem ] ).length > 0;
+			};
+		}
+	})();
+}
+
+// Deprecated
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Back-compat
+function setFilters() {}
+Expr.filters = setFilters.prototype = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prev(?:Until|All))/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	rneedsContext = jQuery.expr.match.needsContext,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var i, l, length, n, r, ret,
+			self = this;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		ret = this.pushStack( "", "find", selector );
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var i,
+			targets = jQuery( target, this ),
+			len = targets.length;
+
+		return this.filter(function() {
+			for ( i = 0; i < len; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// If this is a positional/relative selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				rneedsContext.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			ret = [],
+			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+				}
+				cur = cur.parentNode;
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter(selector)
+		);
+	}
+});
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+function sibling( cur, dir ) {
+	do {
+		cur = cur[ dir ];
+	} while ( cur && cur.nodeType !== 1 );
+
+	return cur;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( this.length > 1 && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style|link)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	rcheckableType = /^(?:checkbox|radio)$/,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	},
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+// unless wrapped in a div with non-breaking characters in front of it.
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "X<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( !isDisconnected( this[0] ) ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		}
+
+		if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
+		}
+	},
+
+	after: function() {
+		if ( !isDisconnected( this[0] ) ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		}
+
+		if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		var elem,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		return jQuery.access( this, function( value ) {
+			var elem = this[0] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					undefined;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch(e) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function( value ) {
+		if ( !isDisconnected( this[0] ) ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		}
+
+		return this.length ?
+			this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+			this;
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+
+		// Flatten any nested arrays
+		args = [].concat.apply( [], args );
+
+		var results, first, fragment, iNoClone,
+			i = 0,
+			value = args[0],
+			scripts = [],
+			l = this.length;
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call( this, i, table ? self.html() : undefined );
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			results = jQuery.buildFragment( args, this, scripts );
+			fragment = results.fragment;
+			first = fragment.firstChild;
+
+			if ( fragment.childNodes.length === 1 ) {
+				fragment = first;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				// Use the original fragment for the last item instead of the first because it can end up
+				// being emptied incorrectly in certain situations (#8070).
+				// Fragments from the fragment cache must always be cloned and never used in place.
+				for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
+					callback.call(
+						table && jQuery.nodeName( this[i], "table" ) ?
+							findOrAppend( this[i], "tbody" ) :
+							this[i],
+						i === iNoClone ?
+							fragment :
+							jQuery.clone( fragment, true, true )
+					);
+				}
+			}
+
+			// Fix #11809: Avoid leaking memory
+			fragment = first = null;
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, function( i, elem ) {
+					if ( elem.src ) {
+						if ( jQuery.ajax ) {
+							jQuery.ajax({
+								url: elem.src,
+								type: "GET",
+								dataType: "script",
+								async: false,
+								global: false,
+								"throws": true
+							});
+						} else {
+							jQuery.error("no ajax");
+						}
+					} else {
+						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
+					}
+
+					if ( elem.parentNode ) {
+						elem.parentNode.removeChild( elem );
+					}
+				});
+			}
+		}
+
+		return this;
+	}
+});
+
+function findOrAppend( elem, tag ) {
+	return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	if ( nodeName === "object" ) {
+		// IE6-10 improperly clones children of object elements using classid.
+		// IE10 throws NoModificationAllowedError if parent is null, #12132.
+		if ( dest.parentNode ) {
+			dest.outerHTML = src.outerHTML;
+		}
+
+		// This path appears unavoidable for IE9. When cloning an object
+		// element in IE9, the outerHTML strategy above is not sufficient.
+		// If the src has innerHTML and the destination does not,
+		// copy the src.innerHTML into the dest.innerHTML. #10324
+		if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+
+		dest.defaultChecked = dest.checked = src.checked;
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+
+	// IE blanks contents when cloning scripts
+	} else if ( nodeName === "script" && dest.text !== src.text ) {
+		dest.text = src.text;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, context, scripts ) {
+	var fragment, cacheable, cachehit,
+		first = args[ 0 ];
+
+	// Set context from what may come in as undefined or a jQuery collection or a node
+	// Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
+	// also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
+	context = context || document;
+	context = !context.nodeType && context[0] || context;
+	context = context.ownerDocument || context;
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		// Mark cacheable and look for a hit
+		cacheable = true;
+		fragment = jQuery.fragments[ first ];
+		cachehit = fragment !== undefined;
+	}
+
+	if ( !fragment ) {
+		fragment = context.createDocumentFragment();
+		jQuery.clean( args, context, fragment, scripts );
+
+		// Update the cache, but only store false
+		// unless this is a second parsing of the same content
+		if ( cacheable ) {
+			jQuery.fragments[ first ] = cachehit && fragment;
+		}
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			i = 0,
+			ret = [],
+			insert = jQuery( selector ),
+			l = insert.length,
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+		} else {
+			for ( ; i < l; i++ ) {
+				elems = ( i > 0 ? this.clone(true) : this ).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			clone;
+
+		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+			clone = elem.cloneNode( true );
+
+		// IE<=8 does not properly clone detached, unknown element nodes
+		} else {
+			fragmentDiv.innerHTML = elem.outerHTML;
+			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+		}
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
+			safe = context === document && safeFragment,
+			ret = [];
+
+		// Ensure that context is a document
+		if ( !context || typeof context.createDocumentFragment === "undefined" ) {
+			context = document;
+		}
+
+		// Use the already-created safe fragment if context permits
+		for ( i = 0; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Ensure a safe container in which to render the html
+					safe = safe || createSafeFragment( context );
+					div = context.createElement("div");
+					safe.appendChild( div );
+
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Go to html and back, then peel off extra wrappers
+					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+					wrap = wrapMap[ tag ] || wrapMap._default;
+					depth = wrap[0];
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						hasBody = rtbody.test(elem);
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+
+					// Take out of fragment container (we need a fresh div each time)
+					div.parentNode.removeChild( div );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				jQuery.merge( ret, elem );
+			}
+		}
+
+		// Fix #11356: Clear elements from safeFragment
+		if ( div ) {
+			elem = div = safe = null;
+		}
+
+		// Reset defaultChecked for any radios and checkboxes
+		// about to be appended to the DOM in IE 6/7 (#8060)
+		if ( !jQuery.support.appendChecked ) {
+			for ( i = 0; (elem = ret[i]) != null; i++ ) {
+				if ( jQuery.nodeName( elem, "input" ) ) {
+					fixDefaultChecked( elem );
+				} else if ( typeof elem.getElementsByTagName !== "undefined" ) {
+					jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+				}
+			}
+		}
+
+		// Append elements to a provided document fragment
+		if ( fragment ) {
+			// Special handling of each script element
+			handleScript = function( elem ) {
+				// Check if we consider it executable
+				if ( !elem.type || rscriptType.test( elem.type ) ) {
+					// Detach the script and store it in the scripts array (if provided) or the fragment
+					// Return truthy to indicate that it has been handled
+					return scripts ?
+						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+						fragment.appendChild( elem );
+				}
+			};
+
+			for ( i = 0; (elem = ret[i]) != null; i++ ) {
+				// Check if we're done after handling an executable script
+				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+					// Append to fragment and handle embedded scripts
+					fragment.appendChild( elem );
+					if ( typeof elem.getElementsByTagName !== "undefined" ) {
+						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+						// Splice the scripts into ret after their former ancestor and advance our index beyond them
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+						i += jsTags.length;
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems, /* internal */ acceptData ) {
+		var data, id, elem, type,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			deleteExpando = jQuery.support.deleteExpando,
+			special = jQuery.event.special;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( acceptData || jQuery.acceptData( elem ) ) {
+
+				id = elem[ internalKey ];
+				data = id && cache[ id ];
+
+				if ( data ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Remove cache only if it was not already removed by jQuery.event.remove
+					if ( cache[ id ] ) {
+
+						delete cache[ id ];
+
+						// IE does not allow us to delete expando properties from nodes,
+						// nor does it have a removeAttribute function on Document nodes;
+						// we must handle all of these cases
+						if ( deleteExpando ) {
+							delete elem[ internalKey ];
+
+						} else if ( elem.removeAttribute ) {
+							elem.removeAttribute( internalKey );
+
+						} else {
+							elem[ internalKey ] = null;
+						}
+
+						jQuery.deletedIds.push( id );
+					}
+				}
+			}
+		}
+	}
+});
+// Limit scope pollution from any deprecated API
+(function() {
+
+var matched, browser;
+
+// Use of jQuery.browser is frowned upon.
+// More details: http://api.jquery.com/jQuery.browser
+// jQuery.uaMatch maintained for back-compat
+jQuery.uaMatch = function( ua ) {
+	ua = ua.toLowerCase();
+
+	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+		/(msie) ([\w.]+)/.exec( ua ) ||
+		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+		[];
+
+	return {
+		browser: match[ 1 ] || "",
+		version: match[ 2 ] || "0"
+	};
+};
+
+matched = jQuery.uaMatch( navigator.userAgent );
+browser = {};
+
+if ( matched.browser ) {
+	browser[ matched.browser ] = true;
+	browser.version = matched.version;
+}
+
+// Chrome is Webkit, but Webkit is also Safari.
+if ( browser.chrome ) {
+	browser.webkit = true;
+} else if ( browser.webkit ) {
+	browser.safari = true;
+}
+
+jQuery.browser = browser;
+
+jQuery.sub = function() {
+	function jQuerySub( selector, context ) {
+		return new jQuerySub.fn.init( selector, context );
+	}
+	jQuery.extend( true, jQuerySub, this );
+	jQuerySub.superclass = this;
+	jQuerySub.fn = jQuerySub.prototype = this();
+	jQuerySub.fn.constructor = jQuerySub;
+	jQuerySub.sub = this.sub;
+	jQuerySub.fn.init = function init( selector, context ) {
+		if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+			context = jQuerySub( context );
+		}
+
+		return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+	};
+	jQuerySub.fn.init.prototype = jQuerySub.fn;
+	var rootjQuerySub = jQuerySub(document);
+	return jQuerySub;
+};
+
+})();
+var curCSS, iframe, iframeDoc,
+	ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	rposition = /^(top|right|bottom|left)$/,
+	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rmargin = /^margin/,
+	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+	rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
+	elemdisplay = { BODY: "block" },
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: 0,
+		fontWeight: 400
+	},
+
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+
+	eventsToggle = jQuery.fn.toggle;
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in style ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt(0).toUpperCase() + name.slice(1),
+		origName = name,
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in style ) {
+			return name;
+		}
+	}
+
+	return origName;
+}
+
+function isHidden( elem, el ) {
+	elem = el || elem;
+	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+	var elem, display,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		values[ index ] = jQuery._data( elem, "olddisplay" );
+		if ( show ) {
+			// Reset the inline display of this element to learn if it is
+			// being hidden by cascaded rules or not
+			if ( !values[ index ] && elem.style.display === "none" ) {
+				elem.style.display = "";
+			}
+
+			// Set elements which have been overridden with display: none
+			// in a stylesheet to whatever the default browser style is
+			// for such an element
+			if ( elem.style.display === "" && isHidden( elem ) ) {
+				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+			}
+		} else {
+			display = curCSS( elem, "display" );
+
+			if ( !values[ index ] && display !== "none" ) {
+				jQuery._data( elem, "olddisplay", display );
+			}
+		}
+	}
+
+	// Set the display of most of the elements in a second loop
+	// to avoid the constant reflow
+	for ( index = 0; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+			elem.style.display = show ? values[ index ] || "" : "none";
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend({
+	css: function( name, value ) {
+		return jQuery.access( this, function( elem, name, value ) {
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	},
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state, fn2 ) {
+		var bool = typeof state === "boolean";
+
+		if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
+			return eventsToggle.apply( this, arguments );
+		}
+
+		return this.each(function() {
+			if ( bool ? state : isHidden( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, numeric, extra ) {
+		var val, num, hooks,
+			origName = jQuery.camelCase( name );
+
+		// Make sure that we're working with the right name
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name );
+		}
+
+		//convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Return, converting to number if forced or a qualifier was provided and val looks numeric
+		if ( numeric || extra !== undefined ) {
+			num = parseFloat( val );
+			return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
+		}
+		return val;
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var ret, name,
+			old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		ret = callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+
+		return ret;
+	}
+});
+
+// NOTE: To any future maintainer, we've window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+	curCSS = function( elem, name ) {
+		var ret, width, minWidth, maxWidth,
+			computed = window.getComputedStyle( elem, null ),
+			style = elem.style;
+
+		if ( computed ) {
+
+			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
+			ret = computed.getPropertyValue( name ) || computed[ name ];
+
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+
+			// A tribute to the "awesome hack by Dean Edwards"
+			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+				width = style.width;
+				minWidth = style.minWidth;
+				maxWidth = style.maxWidth;
+
+				style.minWidth = style.maxWidth = style.width = ret;
+				ret = computed.width;
+
+				style.width = width;
+				style.minWidth = minWidth;
+				style.maxWidth = maxWidth;
+			}
+		}
+
+		return ret;
+	};
+} else if ( document.documentElement.currentStyle ) {
+	curCSS = function( elem, name ) {
+		var left, rsLeft,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && style[ name ] ) {
+			ret = style[ name ];
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		// but not position css attributes, as those are proportional to the parent element instead
+		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+	var matches = rnumsplit.exec( value );
+	return matches ?
+			Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+			value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
+	var i = extra === ( isBorderBox ? "border" : "content" ) ?
+		// If we already have the right measurement, avoid augmentation
+		4 :
+		// Otherwise initialize for horizontal or vertical properties
+		name === "width" ? 1 : 0,
+
+		val = 0;
+
+	for ( ; i < 4; i += 2 ) {
+		// both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			// we use jQuery.css instead of curCSS here
+			// because of the reliableMarginRight CSS hook!
+			val += jQuery.css( elem, extra + cssExpand[ i ], true );
+		}
+
+		// From this point on we use curCSS for maximum performance (relevant in animations)
+		if ( isBorderBox ) {
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+			}
+
+			// at this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+		} else {
+			// at this point, extra isn't content, so add padding
+			val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+
+			// at this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property, which is equivalent to the border-box value
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		valueIsBorderBox = true,
+		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
+
+	// some non-html elements return undefined for offsetWidth, so check for null/undefined
+	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+	if ( val <= 0 || val == null ) {
+		// Fall back to computed then uncomputed css if necessary
+		val = curCSS( elem, name );
+		if ( val < 0 || val == null ) {
+			val = elem.style[ name ];
+		}
+
+		// Computed unit is not pixels. Stop here and return.
+		if ( rnumnonpx.test(val) ) {
+			return val;
+		}
+
+		// we need the check for style in case a browser which returns unreliable values
+		// for getComputedStyle silently falls back to the reliable elem.style
+		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+		// Normalize "", auto, and prepare for extra
+		val = parseFloat( val ) || 0;
+	}
+
+	// use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox
+		)
+	) + "px";
+}
+
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+	if ( elemdisplay[ nodeName ] ) {
+		return elemdisplay[ nodeName ];
+	}
+
+	var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
+		display = elem.css("display");
+	elem.remove();
+
+	// If the simple way fails,
+	// get element's real default display by attaching it to a temp iframe
+	if ( display === "none" || display === "" ) {
+		// Use the already-created iframe if possible
+		iframe = document.body.appendChild(
+			iframe || jQuery.extend( document.createElement("iframe"), {
+				frameBorder: 0,
+				width: 0,
+				height: 0
+			})
+		);
+
+		// Create a cacheable copy of the iframe document on first call.
+		// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+		// document to it; WebKit & Firefox won't allow reusing the iframe document.
+		if ( !iframeDoc || !iframe.createElement ) {
+			iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+			iframeDoc.write("<!doctype html><html><body>");
+			iframeDoc.close();
+		}
+
+		elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
+
+		display = curCSS( elem, "display" );
+		document.body.removeChild( iframe );
+	}
+
+	// Store the correct default display
+	elemdisplay[ nodeName ] = display;
+
+	return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				// certain elements can have dimension info if we invisibly show them
+				// however, it must have a current display style that would benefit from this
+				if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
+					return jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					});
+				} else {
+					return getWidthOrHeight( elem, name, extra );
+				}
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			return setPositiveNumber( elem, value, extra ?
+				augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
+				) : 0
+			);
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+				style.removeAttribute ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				return jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						return curCSS( elem, "marginRight" );
+					}
+				});
+			}
+		};
+	}
+
+	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+	// getComputedStyle returns percent when specified for top/left/bottom/right
+	// rather than make the css module depend on the offset module, we just check for it here
+	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+		jQuery.each( [ "top", "left" ], function( i, prop ) {
+			jQuery.cssHooks[ prop ] = {
+				get: function( elem, computed ) {
+					if ( computed ) {
+						var ret = curCSS( elem, prop );
+						// if curCSS returns percentage, fallback to offset
+						return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
+					}
+				}
+			};
+		});
+	}
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i,
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split(" ") : [ value ],
+				expanded = {};
+
+			for ( i = 0; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+});
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	rselectTextarea = /^(?:select|textarea)/i;
+
+jQuery.fn.extend({
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, value ) {
+			// If value is a function, invoke it and return its value
+			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+		};
+
+	// Set traditional to true for jQuery <= 1.3.2 behavior.
+	if ( traditional === undefined ) {
+		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		});
+
+	} else {
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+var
+	// Document location
+	ajaxLocParts,
+	ajaxLocation,
+
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType, list, placeBefore,
+			dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+			i = 0,
+			length = dataTypes.length;
+
+		if ( jQuery.isFunction( func ) ) {
+			// For each dataType in the dataTypeExpression
+			for ( ; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var selection,
+		list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters );
+
+	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+	if ( typeof url !== "string" && _load ) {
+		return _load.apply( this, arguments );
+	}
+
+	// Don't do a request if no elements are being requested
+	if ( !this.length ) {
+		return this;
+	}
+
+	var selector, type, response,
+		self = this,
+		off = url.indexOf(" ");
+
+	if ( off >= 0 ) {
+		selector = url.slice( off, url.length );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( jQuery.isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// Request the remote document
+	jQuery.ajax({
+		url: url,
+
+		// if "type" variable is undefined, then "GET" method will be used
+		type: type,
+		dataType: "html",
+		data: params,
+		complete: function( jqXHR, status ) {
+			if ( callback ) {
+				self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+			}
+		}
+	}).done(function( responseText ) {
+
+		// Save response for use in complete callback
+		response = arguments;
+
+		// See if a selector was specified
+		self.html( selector ?
+
+			// Create a dummy div to hold the results
+			jQuery("<div>")
+
+				// inject the contents of the document in, removing the scripts
+				// to avoid any 'Permission Denied' errors in IE
+				.append( responseText.replace( rscript, "" ) )
+
+				// Locate the specified elements
+				.find( selector ) :
+
+			// If not, just inject the full result
+			responseText );
+
+	});
+
+	return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.on( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // ifModified key
+			ifModifiedKey,
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// The jqXHR state
+			state = 0,
+			// Default abort message
+			strAbort = "canceled",
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					modified = jqXHR.getResponseHeader("Last-Modified");
+					if ( modified ) {
+						jQuery.lastModified[ ifModifiedKey ] = modified;
+					}
+					modified = jqXHR.getResponseHeader("Etag");
+					if ( modified ) {
+						jQuery.etag[ ifModifiedKey ] = modified;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					isSuccess = ajaxConvert( s, response );
+					statusText = isSuccess.state;
+					success = isSuccess.data;
+					error = isSuccess.error;
+					isSuccess = !error;
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.add;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for ( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.always( tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
+
+		// A cross-domain request is in order when we have a protocol:host:port mismatch
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( state === 2 ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already and return
+				return jqXHR.abort();
+
+		}
+
+		// aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var ct, type, finalDataType, firstDataType,
+		contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	var conv, conv2, current, tmp,
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice(),
+		prev = dataTypes[ 0 ],
+		converters = {},
+		i = 0;
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	// Convert to each sequential dataType, tolerating list modification
+	for ( ; (current = dataTypes[++i]); ) {
+
+		// There's only work to do if current dataType is non-auto
+		if ( current !== "*" ) {
+
+			// Convert response if prev dataType is non-auto and differs from current
+			if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split(" ");
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.splice( i--, 0, current );
+								}
+
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s["throws"] ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+						}
+					}
+				}
+			}
+
+			// Update prev for next iteration
+			prev = current;
+		}
+	}
+
+	return { state: "success", data: response };
+}
+var oldCallbacks = [],
+	rquestion = /\?/,
+	rjsonp = /(=)\?(?=&|$)|\?\?/,
+	nonce = jQuery.now();
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		data = s.data,
+		url = s.url,
+		hasCallback = s.jsonp !== false,
+		replaceInUrl = hasCallback && rjsonp.test( url ),
+		replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
+			!( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
+			rjsonp.test( data );
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+		overwritten = window[ callbackName ];
+
+		// Insert callback into url or form data
+		if ( replaceInUrl ) {
+			s.url = url.replace( rjsonp, "$1" + callbackName );
+		} else if ( replaceInData ) {
+			s.data = data.replace( rjsonp, "$1" + callbackName );
+		} else if ( hasCallback ) {
+			s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always(function() {
+			// Restore preexisting value
+			window[ callbackName ] = overwritten;
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+				// make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		});
+
+		// Delegate to script
+		return "script";
+	}
+});
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+var xhrCallbacks,
+	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var handle, i,
+						xhr = s.xhr();
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occurred
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									try {
+										responses.text = xhr.responseText;
+									} catch( e ) {
+									}
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					if ( !s.async ) {
+						// if we're in sync mode we fire the callback
+						callback();
+					} else if ( xhr.readyState === 4 ) {
+						// (IE6 & IE7) if it's in cache and has been
+						// retrieved directly we need to fire the callback
+						setTimeout( callback, 0 );
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+var fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+	rrun = /queueHooks$/,
+	animationPrefilters = [ defaultPrefilter ],
+	tweeners = {
+		"*": [function( prop, value ) {
+			var end, unit,
+				tween = this.createTween( prop, value ),
+				parts = rfxnum.exec( value ),
+				target = tween.cur(),
+				start = +target || 0,
+				scale = 1,
+				maxIterations = 20;
+
+			if ( parts ) {
+				end = +parts[2];
+				unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+				// We need to compute starting value
+				if ( unit !== "px" && start ) {
+					// Iteratively approximate from a nonzero starting point
+					// Prefer the current property, because this process will be trivial if it uses the same units
+					// Fallback to end or a simple constant
+					start = jQuery.css( tween.elem, prop, true ) || end || 1;
+
+					do {
+						// If previous iteration zeroed out, double until we get *something*
+						// Use a string for doubling factor so we don't accidentally see scale as unchanged below
+						scale = scale || ".5";
+
+						// Adjust and apply
+						start = start / scale;
+						jQuery.style( tween.elem, prop, start + unit );
+
+					// Update scale, tolerating zero or NaN from tween.cur()
+					// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+					} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+				}
+
+				tween.unit = unit;
+				tween.start = start;
+				// If a +=/-= token was provided, we're doing a relative animation
+				tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+			}
+			return tween;
+		}]
+	};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout(function() {
+		fxNow = undefined;
+	}, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function createTweens( animation, props ) {
+	jQuery.each( props, function( prop, value ) {
+		var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+			index = 0,
+			length = collection.length;
+		for ( ; index < length; index++ ) {
+			if ( collection[ index ].call( animation, prop, value ) ) {
+
+				// we're done with this property
+				return;
+			}
+		}
+	});
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		index = 0,
+		tweenerIndex = 0,
+		length = animationPrefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+			// don't match elem in the :animated selector
+			delete tick.elem;
+		}),
+		tick = function() {
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+				temp = remaining / animation.duration || 0,
+				percent = 1 - temp,
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length ; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+			if ( percent < 1 && length ) {
+				return remaining;
+			} else {
+				deferred.resolveWith( elem, [ animation ] );
+				return false;
+			}
+		},
+		animation = deferred.promise({
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, { specialEasing: {} }, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end, easing ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+					// if we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+
+				for ( ; index < length ; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// resolve when we played the last frame
+				// otherwise, reject
+				if ( gotoEnd ) {
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		}),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length ; index++ ) {
+		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			return result;
+		}
+	}
+
+	createTweens( animation, props );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			anim: animation,
+			queue: animation.opts.queue,
+			elem: elem
+		})
+	);
+
+	// attach callbacks from options
+	return animation.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( jQuery.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// not quite $.extend, this wont overwrite keys already present.
+			// also - reusing 'index' from above because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.split(" ");
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			tweeners[ prop ] = tweeners[ prop ] || [];
+			tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			animationPrefilters.unshift( callback );
+		} else {
+			animationPrefilters.push( callback );
+		}
+	}
+});
+
+function defaultPrefilter( elem, props, opts ) {
+	var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
+		anim = this,
+		style = elem.style,
+		orig = {},
+		handled = [],
+		hidden = elem.nodeType && isHidden( elem );
+
+	// handle queue: false promises
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always(function() {
+			// doing this makes sure that the complete handler will be called
+			// before this completes
+			anim.always(function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			});
+		});
+	}
+
+	// height/width overflow pass
+	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+		// Make sure that nothing sneaks out
+		// Record all 3 overflow attributes because IE does not
+		// change the overflow attribute when overflowX and
+		// overflowY are set to the same value
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Set display property to inline-block for height/width
+		// animations on inline elements that are having width/height animated
+		if ( jQuery.css( elem, "display" ) === "inline" &&
+				jQuery.css( elem, "float" ) === "none" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !jQuery.support.shrinkWrapBlocks ) {
+			anim.done(function() {
+				style.overflow = opts.overflow[ 0 ];
+				style.overflowX = opts.overflow[ 1 ];
+				style.overflowY = opts.overflow[ 2 ];
+			});
+		}
+	}
+
+
+	// show/hide pass
+	for ( index in props ) {
+		value = props[ index ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ index ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+				continue;
+			}
+			handled.push( index );
+		}
+	}
+
+	length = handled.length;
+	if ( length ) {
+		dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+		if ( "hidden" in dataShow ) {
+			hidden = dataShow.hidden;
+		}
+
+		// store state if its toggle - enables .stop().toggle() to "reverse"
+		if ( toggle ) {
+			dataShow.hidden = !hidden;
+		}
+		if ( hidden ) {
+			jQuery( elem ).show();
+		} else {
+			anim.done(function() {
+				jQuery( elem ).hide();
+			});
+		}
+		anim.done(function() {
+			var prop;
+			jQuery.removeData( elem, "fxshow", true );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		});
+		for ( index = 0 ; index < length ; index++ ) {
+			prop = handled[ index ];
+			tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+			orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+
+			if ( !( prop in dataShow ) ) {
+				dataShow[ prop ] = tween.start;
+				if ( hidden ) {
+					tween.end = tween.start;
+					tween.start = prop === "width" || prop === "height" ? 1 : 0;
+				}
+			}
+		}
+	}
+}
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || "swing";
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			if ( tween.elem[ tween.prop ] != null &&
+				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// passing any value as a 4th parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails
+			// so, simple values such as "10px" are parsed to Float.
+			// complex values such as "rotate(1rad)" are returned as is.
+			result = jQuery.css( tween.elem, tween.prop, false, "" );
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+			// use step hook for back compat - use cssHook if its there - use .style if its
+			// available and use plain properties where available
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Remove in 2.0 - this supports IE8's panic based approach
+// to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ||
+			// special check for .toggle( handler, handler, ... )
+			( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+});
+
+jQuery.fn.extend({
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// show any hidden elements after setting opacity to 0
+		return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+			// animate to the value specified
+			.end().animate({ opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations resolve immediately
+				if ( empty ) {
+					anim.stop( true );
+				}
+			};
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		attrs = { height: type },
+		i = 0;
+
+	// if we include width, step value is 1 to do all cssExpand values,
+	// if we don't include width, step value is 2 to skip over Left and Right
+	includeWidth = includeWidth? 1 : 0;
+	for( ; i < 4 ; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show"),
+	slideUp: genFx("hide"),
+	slideToggle: genFx("toggle"),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			jQuery.isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+	};
+
+	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+	// normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p*Math.PI ) / 2;
+	}
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+	var timer,
+		timers = jQuery.timers,
+		i = 0;
+
+	fxNow = jQuery.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+		// Checks the timer has not already been removed
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
+		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.stop = function() {
+	clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+	// Default speed
+	_default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+var rroot = /^(?:body|html)$/i;
+
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
+		box = { top: 0, left: 0 },
+		elem = this[ 0 ],
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return;
+	}
+
+	if ( (body = doc.body) === elem ) {
+		return jQuery.offset.bodyOffset( elem );
+	}
+
+	docElem = doc.documentElement;
+
+	// Make sure it's not a disconnected DOM node
+	if ( !jQuery.contains( docElem, elem ) ) {
+		return box;
+	}
+
+	// If we don't have gBCR, just use 0,0 rather than error
+	// BlackBerry 5, iOS 3 (original iPhone)
+	if ( typeof elem.getBoundingClientRect !== "undefined" ) {
+		box = elem.getBoundingClientRect();
+	}
+	win = getWindow( doc );
+	clientTop  = docElem.clientTop  || body.clientTop  || 0;
+	clientLeft = docElem.clientLeft || body.clientLeft || 0;
+	scrollTop  = win.pageYOffset || docElem.scrollTop;
+	scrollLeft = win.pageXOffset || docElem.scrollLeft;
+	return {
+		top: box.top  + scrollTop  - clientTop,
+		left: box.left + scrollLeft - clientLeft
+	};
+};
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[0] ) {
+			return;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent || document.body;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					win.document.documentElement[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					 top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+		// margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return jQuery.access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+					// isn't a whole lot we can do. See pull request at this URL for discussion:
+					// https://github.com/jquery/jquery/pull/764
+					return elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, value, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable, null );
+		};
+	});
+});
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+})( window );
diff --git a/spec/javascripts/support/jasmine.yml b/spec/javascripts/support/jasmine.yml
index dff87d6..44b5fa6 100644
--- a/spec/javascripts/support/jasmine.yml
+++ b/spec/javascripts/support/jasmine.yml
@@ -1,76 +1,16 @@
-# src_files
-#
-# Return an array of filepaths relative to src_dir to include before jasmine specs.
-# Default: []
-#
-# EXAMPLE:
-#
-# src_files:
-#   - lib/source1.js
-#   - lib/source2.js
-#   - dist/**/*.js
-#
 src_files:
-    - vendor/jquery-1.8/jquery.js # load first
-    - vendor/jasmine-jquery-1.4.2/jasmine-jquery.js
-    - js/00default.js
-#    - js/**/*.js
+  - "spec/javascripts/jquery.js"
+  - "js/**/*.js"
 
-# stylesheets
-#
-# Return an array of stylesheet filepaths relative to src_dir to include before jasmine specs.
-# Default: []
-#
-# EXAMPLE:
-#
-# stylesheets:
-#   - css/style.css
-#   - stylesheets/*.css
-#
 stylesheets:
+  - "theme/**/*.css"
 
-# helpers
-#
-# Return an array of filepaths relative to spec_dir to include before jasmine specs.
-# Default: ["helpers/**/*.js"]
-#
-# EXAMPLE:
-#
-# helpers:
-#   - helpers/**/*.js
-#
 helpers:
+  - "helpers/**/*.js"
 
-# spec_files
-#
-#  Return an array of filepaths relative to spec_dir to include.
-# Default: ["**/*[sS]pec.js"]
-#
-# EXAMPLE:
-#
-# spec_files:
-#   - **/*[sS]pec.js
-#
 spec_files:
+  - "**/*_[sS]pec.js"
 
-# src_dir
-#
-# Source directory path. Your src_files must be returned relative to this path. Will use root if left blank.
-# Default: project root
-#
-# EXAMPLE:
-#
-# src_dir: public
-#
 src_dir:
 
-# spec_dir
-#
-# Spec directory path. Your spec_files must be returned relative to this path.
-# Default: spec/javascripts
-#
-# EXAMPLE:
-#
-# spec_dir: spec/javascripts
-#
-spec_dir:
+spec_dir: spec/javascripts
diff --git a/spec/plugin/plugin_helper.rb b/spec/plugin/plugin_helper.rb
index 6822ba9..34be298 100644
--- a/spec/plugin/plugin_helper.rb
+++ b/spec/plugin/plugin_helper.rb
@@ -185,7 +185,7 @@ end
 
 def plugin_path( plugin_sym, base=nil )
 	paths = []
-	paths << ( base ? base : "misc/plugin" )
+	paths << ( base ? base : File.join(TDiary.library_root, "misc/plugin") )
 	paths << "#{plugin_sym.to_s}.rb"
 	File.expand_path( File.join( paths ))
 end
diff --git a/spec/rcov.opts b/spec/rcov.opts
deleted file mode 100644
index 93e7674..0000000
--- a/spec/rcov.opts
+++ /dev/null
@@ -1,3 +0,0 @@
---output "coverage/spec"
---exclude "spec/.*, spec/acceptance/.*, spec/plugin/.*, gems/.*, bundle/.*"
---aggregate coverage.aggregate
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 0c3b253..68f3dd0 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -5,21 +5,7 @@ ENV['RACK_ENV'] = "test"
 
 require 'tdiary/environment'
 
-if ENV['COVERAGE'] == 'simplecov'
-	require 'simplecov'
-	require 'simplecov-rcov'
-	class SimpleCov::Formatter::MergedFormatter
-		def format(result)
-			SimpleCov::Formatter::HTMLFormatter.new.format(result)
-			SimpleCov::Formatter::RcovFormatter.new.format(result)
-		end
-	end
-	SimpleCov.formatter = SimpleCov::Formatter::MergedFormatter
-	SimpleCov.start do
-		add_filter '/spec/'
-		add_filter '/vendor/'
-	end
-elsif RUBY_VERSION > '1.9'
+if ENV['COVERAGE'] = 'simplecov'
 	require 'simplecov'
 	require 'coveralls'
 
diff --git a/tdiary.gemspec b/tdiary.gemspec
new file mode 100644
index 0000000..7f6ad07
--- /dev/null
+++ b/tdiary.gemspec
@@ -0,0 +1,25 @@
+# coding: utf-8
+lib = File.expand_path('../', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+require 'tdiary/version'
+
+Gem::Specification.new do |spec|
+  spec.name          = "tdiary"
+  spec.version       = TDiary::VERSION
+  spec.authors       = ["TADA Tadashi", "SHIBATA Hiroshi", "MATSUOKA Kohei"]
+  spec.email         = ["support at tdiary.org"]
+  spec.summary       = %q{a TSUKKOMI-able Web-log}
+  spec.description   = %q{tDiary is so called Weblog.}
+  spec.homepage      = "http://www.tdiary.org/"
+  spec.license       = "GPL-2"
+
+  spec.files         = `git ls-files`.split($/)
+  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
+  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
+  spec.require_paths = ["."]
+
+  spec.required_ruby_version = '>= 1.9.2'
+
+  spec.add_dependency 'thor', '~> 0.18'
+  spec.add_dependency "bundler", "~> 1.3"
+end
diff --git a/tdiary.rb b/tdiary.rb
index 0521e5c..62ab4ac 100644
--- a/tdiary.rb
+++ b/tdiary.rb
@@ -7,14 +7,14 @@ Copyright (C) 2001-2013, TADA Tadashi <t at tdtds.jp>
 You can redistribute it and/or modify it under GPL2.
 =end
 
-TDIARY_VERSION = '3.2.2'
+Encoding::default_external = 'UTF-8'
+
+require 'tdiary/version'
+TDIARY_VERSION = TDiary::VERSION
 
 $:.unshift File.join(File::dirname(__FILE__), '/misc/lib').untaint
-Dir["#{File::dirname(__FILE__) + '/vendor/*/lib'}"].each {|dir| $:.unshift dir.untaint }
-begin
-	Encoding::default_external = 'UTF-8'
-rescue NameError
-	$KCODE = 'n'
+['/misc/lib/*/lib', '/vendor/*/lib'].each do |path|
+	Dir["#{File::dirname(__FILE__) + path}"].each {|dir| $:.unshift dir.untaint }
 end
 
 require 'cgi'
@@ -23,6 +23,7 @@ require 'fileutils'
 require 'pstore'
 require 'json'
 require 'erb'
+require 'tdiary/environment'
 require 'tdiary/compatible'
 require 'tdiary/core_ext'
 
@@ -117,11 +118,17 @@ module TDiary
 		end
 
 		def root
+			library_root
+		end
+
+		# directory where tDiary libraries is located
+		def library_root
 			File.expand_path('..', __FILE__)
 		end
 
-		def document_root
-			defined?( Rack ) ? "#{root}/public" : '.'
+		# directory where the server was started
+		def server_root
+			Dir.pwd
 		end
 	end
 end
diff --git a/tdiary/admin.rb b/tdiary/admin.rb
index 9064119..ff18aa6 100644
--- a/tdiary/admin.rb
+++ b/tdiary/admin.rb
@@ -73,7 +73,7 @@ module TDiary
 
 			@title = @cgi.params['title'][0]
 			@body = @cgi.params['body'][0]
-			if @cgi.mobile_agent? && String.method_defined?(:encode)
+			if @cgi.mobile_agent?
 				@title.force_encoding(@conf.mobile_encoding)
 				@body.force_encoding(@conf.mobile_encoding)
 			end
@@ -113,7 +113,7 @@ module TDiary
 		def initialize( cgi, rhtml, conf )
 			@title = cgi.params['title'][0]
 			@body = cgi.params['body'][0]
-			if cgi.mobile_agent? && String.method_defined?(:encode)
+			if cgi.mobile_agent?
 				@title.force_encoding(conf.mobile_encoding)
 				@body.force_encoding(conf.mobile_encoding)
 			end
diff --git a/tdiary/application.rb b/tdiary/application.rb
index 26872f4..63ee684 100644
--- a/tdiary/application.rb
+++ b/tdiary/application.rb
@@ -1,4 +1,7 @@
 # -*- coding: utf-8 -*-
+require 'rack/builder'
+require 'tdiary/application/configuration'
+require 'tdiary/rack'
 
 # FIXME too dirty hack :-<
 class CGI
@@ -12,40 +15,67 @@ end
 
 module TDiary
 	class Application
-		def initialize( target )
-			@target = target
+		class << self
+			def configure(&block)
+				instance_eval &block
+			end
+
+			def config
+				@config ||= Configuration.new
+			end
+		end
+
+		def initialize( base_dir = '/' )
+			@app = ::Rack::Builder.app {
+				map base_dir do
+					Application.config.builder_procs.each do |builder_proc|
+						instance_eval &builder_proc
+					end
+				end
+			}
 		end
 
 		def call( env )
-			req = adopt_rack_request_to_plain_old_tdiary_style( env )
-			dispatch_request( req )
+			@app.call( env )
 		end
+	end
 
-	private
+	Application.configure do
+		config.assets_paths.concat %w(js theme).map {|path|
+			[TDiary.root, TDiary.server_root].map {|base_dir|
+				File.join(base_dir, path)
+			}
+		}.flatten.uniq
 
-		def adopt_rack_request_to_plain_old_tdiary_style( env )
-			req = TDiary::Request.new( env )
-			req.params # fill params to tdiary_request
-			$RACK_ENV = req.env
-			env["rack.input"].rewind
-			fake_stdin_as_params
-			req
-		end
+		config.builder do
+			map Application.config.path[:index] do
+				use TDiary::Rack::HtmlAnchor
+				use TDiary::Rack::Static, "public"
+				use TDiary::Rack::ValidRequestPath
+				run TDiary::Dispatcher.index
+			end
 
-		def dispatch_request( request )
-			dispatcher = TDiary::Dispatcher.__send__( @target )
-			dispatcher.dispatch_cgi( request )
-		end
+			map Application.config.path[:update] do
+				instance_eval &Application.config.authenticate_proc
+				run TDiary::Dispatcher.update
+			end
 
-		def fake_stdin_as_params
-			stdin_spy = StringIO.new( "" )
-			# FIXME dirty hack
-			if $RACK_ENV && $RACK_ENV['rack.input']
-				stdin_spy.print( $RACK_ENV['rack.input'].read )
-				stdin_spy.rewind
+			map Application.config.path[:assets] do
+				environment = Sprockets::Environment.new
+				Application.config.assets_paths.each do |path|
+					environment.append_path path
+				end
+
+				if Application.config.assets_precompile
+					require 'tdiary/rack/assets/precompile'
+					use TDiary::Rack::Assets::Precompile, environment
+				end
+
+				run environment
 			end
-			$stdin = stdin_spy
 		end
+
+		config.authenticate TDiary::Rack::Auth::Basic, '.htpasswd'
 	end
 end
 
diff --git a/tdiary/application/configuration.rb b/tdiary/application/configuration.rb
new file mode 100644
index 0000000..50db7ba
--- /dev/null
+++ b/tdiary/application/configuration.rb
@@ -0,0 +1,36 @@
+module TDiary
+	class Application
+		class Configuration
+			attr_accessor :assets_paths, :assets_precompile, :plugin_paths, :path, :builder_procs, :authenticate_proc
+
+			def initialize
+				@assets_paths = []
+				# if you need to auto compilation for CoffeeScript
+				@assets_precompile = false;
+				@plugin_paths = []
+				@path = {
+					index: '/',
+					update: '/update.rb',
+					assets: '/assets'
+				}
+				@builder_procs = []
+				@authenticate_proc = proc { }
+			end
+
+			def builder(&block)
+				@builder_procs << block
+			end
+
+			def authenticate(middleware, *params, &block)
+				@authenticate_proc = proc { use middleware, *params, &block }
+			end
+		end
+	end
+end
+
+# Local Variables:
+# mode: ruby
+# indent-tabs-mode: t
+# tab-width: 3
+# ruby-indent-level: 3
+# End:
diff --git a/tdiary/application/extensions/omniauth.rb b/tdiary/application/extensions/omniauth.rb
new file mode 100644
index 0000000..c540ad4
--- /dev/null
+++ b/tdiary/application/extensions/omniauth.rb
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+require 'tdiary/application'
+require 'tdiary/rack/auth/omniauth'
+
+TDiary::Application.configure do
+	config.builder do
+		use ::Rack::Session::Pool, :expire_after => 2592000
+		use OmniAuth::Builder do
+			configure {|conf| conf.path_prefix = "/auth" }
+			provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET']
+			provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET']
+		end
+
+		map('/auth') do
+			run TDiary::Rack::Auth::OmniAuth::CallbackHandler.new
+		end
+	end
+
+	config.authenticate TDiary::Rack::Auth::OmniAuth, :twitter do |auth|
+		# TODO: an user can setting
+		auth.info.nickname == 'your_twitter_screen_name'
+	end
+end
diff --git a/tdiary/base.rb b/tdiary/base.rb
index 42b3a5e..cf6a372 100644
--- a/tdiary/base.rb
+++ b/tdiary/base.rb
@@ -125,11 +125,9 @@ module TDiary
 
 			begin
 				r = ERB.new(rhtml.untaint).result(binding)
-			rescue => e
+			rescue ::Encoding::CompatibilityError => e
 				# migration error on ruby 1.9 only 1st time, reload.
-				if defined?(::Encoding) && e.class == ::Encoding::CompatibilityError
-					raise ForceRedirect.new(base_url)
-				end
+				raise ForceRedirect.new(base_url)
 			end
 			ERB.new(r).src
 		end
diff --git a/tdiary/cli.rb b/tdiary/cli.rb
new file mode 100644
index 0000000..de4aa94
--- /dev/null
+++ b/tdiary/cli.rb
@@ -0,0 +1,184 @@
+# coding: utf-8
+require 'thor'
+require 'tdiary/version'
+require 'bundler'
+
+module TDiary
+	class CLI < Thor
+		include Thor::Actions
+
+		def self.source_root
+			File.expand_path('../..', __FILE__)
+		end
+
+		desc "new DIR_NAME", "Create a new tDiary directory"
+		method_option "skip-bundle", :type => :boolean, :banner =>
+			"don't run bundle and .htpasswd generation"
+		def new(name)
+			target = File.join(Dir.pwd, name)
+			deploy(target)
+			copy_file('tdiary.conf.beginner', File.join(target, 'tdiary.conf'))
+
+			unless options[:'skip-bundle']
+				Bundler.with_clean_env do
+					inside(target) do
+						run('bundle install --without test development')
+						run('bundle exec tdiary htpasswd')
+					end
+				end
+			else
+				say "run `bundle install && bundle exec tdiary htpasswd` manually", :red
+			end
+			say 'install finished', :green
+			say "run `tdiary server` in #{name} directory to start server", :green
+		end
+
+		desc "update", "update tDiary"
+		method_option "skip-bundle", :type => :boolean, :banner =>
+			"don't run bundle"
+		def update
+			target = Dir.pwd
+			unless in_tdiary_dir?(target)
+				say "please run update command in your tdiary directory", :red
+				return 1
+			end
+
+			deploy(target)
+
+			unless options[:'skip-bundle']
+				Bundler.with_clean_env do
+					inside(target) do
+						run('bundle install --without test development')
+					end
+				end
+			end
+			say 'update finished', :green
+		end
+
+		desc "assets_copy", "copy assets files"
+		def assets_copy
+			require 'tdiary/environment'
+			assets_path = File.join(TDiary.server_root, 'public/assets')
+			TDiary::Application.config.assets_paths.each do |path|
+				Dir.glob(File.join(path, '*')).each do |entity|
+					if File.directory?(entity)
+						directory entity, File.join(assets_path, File.basename(entity))
+					else
+						copy_file entity, File.join(assets_path, File.basename(entity))
+					end
+				end
+			end
+		end
+
+		desc "test", "Create test server and run tDiary test"
+		def test
+			target = File.join(Dir.pwd, 'tmp/test')
+			deploy(target)
+			append_to_file(File.join(target, 'Gemfile'), "path '#{CLI::source_root}'")
+			directory('spec', File.join(target, 'spec'))
+			directory('test', File.join(target, 'test'))
+
+			Bundler.with_clean_env do
+				inside(target) do
+					run('bundle install')
+					run('bundle exec rake spec')
+				end
+			end
+		end
+
+		desc "server", "Start tDiary server"
+		method_option "rack", :type => :string, :banner =>
+			"start server with rack interface (default)"
+		method_option "cgi", :type => :string, :banner =>
+			"start server with cgi interface"
+		method_option "bind", :aliases => "b", :type => :string, :default => "0.0.0.0", :banner =>
+			"bind to the IP"
+		method_option "port", :aliases => "p", :type => :numeric, :default => 19292, :banner =>
+			"use PORT"
+		def server
+			require 'tdiary/environment'
+
+			if options[:cgi]
+				opts = {
+					:daemon => ENV['DAEMON'],
+					:bind   => options[:bind],
+					:port   => options[:port],
+					:logger => $stderr,
+					:access_log => $stderr,
+				}
+				TDiary::Server.run( opts )
+			elsif
+				# --rack option
+				# Rack::Server reads ARGV as :config, so delete it
+				ARGV.shift
+				opts = {
+					:environment => ENV['RACK_ENV'] || "development",
+					:daemonize   => false,
+					:Host        => options[:bind],
+					:Port        => options[:port],
+					:pid         => File.expand_path("tdiary.pid"),
+					:AccessLog   => $stderr,
+					:config      => File.expand_path("config.ru")
+				}
+				::Rack::Server.start( opts )
+			end
+		end
+
+		desc "htpasswd", "Create a .htpasswd file"
+		def htpasswd
+			require 'webrick/httpauth/htpasswd'
+			say "Input your username/password"
+			print 'Username: '
+			ARGV.replace([])
+			username = gets().chop
+			print 'New password: '
+			system "stty -echo"
+			password = $stdin.gets.chop
+			puts
+			print 'Re-type new password: '
+			password2 = $stdin.gets.chop
+			puts
+			system "stty echo"
+			if password != password2
+				raise StandardError, 'password verification error'
+			end
+			htpasswd = WEBrick::HTTPAuth::Htpasswd.new('.htpasswd')
+			htpasswd.set_passwd(nil, username, password)
+			htpasswd.flush
+		end
+
+		desc "version", "Prints the tDiary's version information"
+		def version
+			say "tdiary #{TDiary::VERSION}"
+		end
+		map %w(-v --version) => :version
+
+		no_commands do
+			def deploy(target)
+				empty_directory(target)
+				empty_directory(File.join(target, 'public'))
+				empty_directory(File.join(target, 'misc/plugin'))
+				empty_directory(File.join(target, 'tdiary/filter'))
+				empty_directory(File.join(target, 'tdiary/style'))
+				empty_directory(File.join(target, 'js'))
+				empty_directory(File.join(target, 'theme'))
+				%w(
+				README.md
+				Gemfile
+				Gemfile.lock
+				config.ru
+				tdiary.conf.beginner
+				tdiary.conf.sample
+				tdiary.conf.sample-en
+				).each do |file|
+					copy_file(file, File.join(target, file))
+				end
+				directory('doc', File.join(target, 'doc'))
+			end
+
+			def in_tdiary_dir?(target)
+				File.exist?(File.join(target, 'tdiary.conf'))
+			end
+		end
+	end
+end
diff --git a/tdiary/compatible.rb b/tdiary/compatible.rb
index 5374de8..d3e8542 100644
--- a/tdiary/compatible.rb
+++ b/tdiary/compatible.rb
@@ -17,87 +17,55 @@ end
 
 # for Ruby 1.9.X
 
+# preload transcodes outside $SAFE=4 environment, that is a workaround
+# for the possible SecurityError. see the following uri for the detail.
+# http://redmine.ruby-lang.org/issues/5279
+%w(utf-16be euc-jp iso-2022-jp Shift_JIS).each do |enc|
+	"\uFEFF".encode(enc) rescue nil
+end
+
 # Auto convert ASCII_8BIT pstore data (created by Ruby-1.8) to UTF-8.
-if ::String.method_defined?(:force_encoding)
-	require 'pstore'
-	class PStoreRuby18Exception < Exception; end
+require 'pstore'
+class PStoreRuby18Exception < Exception; end
 
-	class PStore
-		alias compatible_transaction_original transaction unless defined?(compatible_transaction_original)
-		def transaction(*args, &block)
-			begin
-				compatible_transaction_original(*args, &block)
-			rescue PStoreRuby18Exception => e
-				# first loaded the pstore file (it's created by Ruby-1.8)
-				# force convert ASCII_8BIT pstore data to UTF_8
-				file = open_and_lock_file(@filename, false)
-				table = Marshal::load(file, proc {|obj|
-					if obj.respond_to?('force_encoding') && obj.encoding == Encoding::ASCII_8BIT
-						obj.force_encoding('UTF-8')
-					end
-					obj
-				})
-				table[:__ruby_version] = RUBY_VERSION
-				if on_windows?
-					save_data_with_fast_strategy(Marshal::dump(table), file)
-				else
-					save_data_with_atomic_file_rename_strategy(Marshal::dump(table), file)
+class PStore
+	alias compatible_transaction_original transaction unless defined?(compatible_transaction_original)
+	def transaction(*args, &block)
+		begin
+			compatible_transaction_original(*args, &block)
+		rescue PStoreRuby18Exception => e
+			# first loaded the pstore file (it's created by Ruby-1.8)
+			# force convert ASCII_8BIT pstore data to UTF_8
+			file = open_and_lock_file(@filename, false)
+			table = Marshal::load(file, proc {|obj|
+				if obj.respond_to?('force_encoding') && obj.encoding == Encoding::ASCII_8BIT
+					obj.force_encoding('UTF-8')
 				end
-				retry
-			end
-		end
-
-		private
-		def load(content)
-			table = Marshal::load(content)
-			raise PStoreRuby18Exception.new if !table[:__ruby_version] || table[:__ruby_version] < '1.9'
-			# hide __ruby_version to caller
-			table.delete(:__ruby_version)
-			table
-		end
-
-		def dump(table)
+				obj
+			})
 			table[:__ruby_version] = RUBY_VERSION
-			Marshal::dump(table)
-		end
-	end
-end
-
-# for Ruby 1.8.X
-unless ::String.method_defined?(:force_encoding)
-	class String
-		def force_encoding(encoding)
-			self
+			if on_windows?
+				save_data_with_fast_strategy(Marshal::dump(table), file)
+			else
+				save_data_with_atomic_file_rename_strategy(Marshal::dump(table), file)
+			end
+			retry
 		end
 	end
-end
-
-# for Ruby 1.8.6
-unless ::String.method_defined?(:lines)
-	class String
-		alias_method :lines, :to_a
-	end
-end
 
-unless ::String.method_defined?(:bytesize)
-	class String
-		alias bytesize size
-	end
-end
+	private
 
-unless ::String.method_defined?(:ord)
-	class String
-		def ord
-			self[0]
-		end
+	def load(content)
+		table = Marshal::load(content)
+		raise PStoreRuby18Exception.new if !table[:__ruby_version] || table[:__ruby_version] < '1.9'
+		# hide __ruby_version to caller
+		table.delete(:__ruby_version)
+		table
 	end
-end
 
-unless ::Integer.method_defined?(:ord)
-	class Integer
-		def ord
-			self
-		end
+	def dump(table)
+		table[:__ruby_version] = RUBY_VERSION
+		Marshal::dump(table)
 	end
 end
 
diff --git a/tdiary/config.rb b/tdiary/config.rb
index 5ba9229..2335301 100644
--- a/tdiary/config.rb
+++ b/tdiary/config.rb
@@ -65,50 +65,18 @@ module TDiary
 			@options2.delete( key )
 		end
 
-		if String.method_defined?(:encode)
-			# preload transcodes outside $SAFE=4 environment, that is a workaround
-			# for the possible SecurityError. see the following uri for the detail.
-			# http://redmine.ruby-lang.org/issues/5279
-			%w(utf-16be euc-jp iso-2022-jp Shift_JIS).each do |enc|
-				"\uFEFF".encode(enc) rescue nil
+		def to_native( str, charset = nil )
+			str = str.dup
+			if str.encoding == Encoding::ASCII_8BIT
+				str.force_encoding(charset || 'utf-8')
 			end
-
-			def to_native( str, charset = nil )
-				str = str.dup
-				if str.encoding == Encoding::ASCII_8BIT
-					str.force_encoding(charset || 'utf-8')
-				end
-				unless str.valid_encoding?
-					str.encode!('utf-16be', {:invalid => :replace, :undef => :replace})
-				end
-				unless str.encoding == Encoding::UTF_8
-					str.encode!('utf-8', {:invalid => :replace, :undef => :replace})
-				end
-				str
+			unless str.valid_encoding?
+				str.encode!('utf-16be', {:invalid => :replace, :undef => :replace})
 			end
-		else
-			require 'kconv'
-			require 'iconv'
-			require 'nkf'
-
-			def to_native( str, charset = nil )
-				return str if Kconv.isutf8(str)
-				begin
-					Iconv.conv('utf-8', charset || 'utf-8', str)
-				rescue
-					from = case charset
-						when /^utf-8$/i
-							'W'
-						when /^shift_jis/i
-							'S'
-						when /^EUC-JP/i
-							'E'
-						else
-							''
-					end
-					NKF::nkf("-m0 -#{from}w", str)
-				end
+			unless str.encoding == Encoding::UTF_8
+				str.encode!('utf-8', {:invalid => :replace, :undef => :replace})
 			end
+			str
 		end
 
 	private
diff --git a/tdiary/core_ext.rb b/tdiary/core_ext.rb
index 278e926..ff30136 100644
--- a/tdiary/core_ext.rb
+++ b/tdiary/core_ext.rb
@@ -94,6 +94,8 @@ class CGI
 	end
 end
 
+class RackCGI < CGI; end
+
 =begin
 == Safe module
 =end
@@ -102,8 +104,13 @@ module Safe
 		result = nil
 		if $SAFE < level then
 			Proc.new {
-				$SAFE = level
-				result = yield
+				begin
+					$SAFE = level
+				rescue ArgumentError => e
+					# $SAFE=4 was removed from Ruby 2.1.0.
+				ensure
+					result = yield
+				end
 			}.call
 		else
 			result = yield
diff --git a/tdiary/deploy.rb b/tdiary/deploy.rb
deleted file mode 100644
index 4cf1b50..0000000
--- a/tdiary/deploy.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# coding: utf-8
-
-require 'capistrano_colors'
-
-require 'rvm/capistrano'
-set :rvm_type, :system
-
-require 'pit'
-config = Pit.get('tdiary', :require => {
-    :username => 'your username',
-    :server => 'your server address'
-  })
-
-set :application, 'tdiary'
-
-set :scm, :git
-set :repository, 'git://github.com/tdiary/tdiary-core.git'
-set :branch, 'master'
-set :deploy_via, :remote_cache
-
-server config[:server], :app
-
-set :user, config[:username]
-set :deploy_to, defer { "/home/#{user}/app/#{application}" }
-
-namespace :deploy do
-  task :start do ; end
-  task :stop do ; end
-  task :restart, :roles => :app, :except => { :no_release => true } do
-    run "touch #{File.join(current_path, 'tmp', 'restart.txt')}"
-  end
-
-  desc 'update shared library'
-  task :update_library, :roles => :app do
-    run "cp -r #{shared_path}/lib/* #{latest_release}/misc/lib"
-    run "cp -r #{shared_path}/js/* #{latest_release}/js"
-  end
-
-  after 'deploy:finalize_update', 'deploy:update_library'
-  after 'deploy:update', 'deploy:cleanup'
-end
-
-namespace :httpd do
-  [:stop, :start, :restart, :reload].each do |action|
-    desc "#{action.to_s.capitalize} Apache"
-    task action, :roles => :app do
-      invoke_command "/etc/init.d/apache2 #{action.to_s}", :via => run_method
-    end
-  end
-end
diff --git a/tdiary/dispatcher.rb b/tdiary/dispatcher.rb
index c613053..478fdc5 100644
--- a/tdiary/dispatcher.rb
+++ b/tdiary/dispatcher.rb
@@ -16,8 +16,13 @@ module TDiary
 			@target = TARGET[target]
 		end
 
+		def call( env )
+			req = adopt_rack_request_to_plain_old_tdiary_style( env )
+			dispatch_cgi(req, RackCGI.new)
+		end
+
 		# FIXME rename method name to more suitable one.
-		def dispatch_cgi( request, cgi = CGI.new )
+		def dispatch_cgi(request, cgi)
 			result = @target.run( request, cgi )
 			result.headers.reject!{|k,v| k.to_s.downcase == "status" }
 			result.to_a
@@ -25,11 +30,12 @@ module TDiary
 
 		class << self
 			# stolen from Rack::Handler::CGI.send_headers
-			def send_headers( status, headers )
+			def send_headers(status, headers)
 				begin
-					$stdout.print CGI.new.header( {'Status'=>status}.merge(headers) )
+					headers['type'] = headers.delete('Content-Type')
+					$stdout.print CGI.new.header({'Status'=>status}.merge(headers))
 				rescue EOFError
-					charset = headers.delete( 'charset' )
+					charset = headers.delete('charset')
 					headers['Content-Type'] ||= headers.delete( 'type' )
 					headers['Content-Type'] += "; charset=#{charset}" if charset
 					$stdout.print headers.map{|k,v| "#{k}: #{v}\r\n"}.join << "\r\n"
@@ -37,14 +43,6 @@ module TDiary
 				$stdout.flush
 			end
 
-			# stolen from Rack::Handler::CGI.send_body
-			def send_body( body )
-				body.lines.each { |part|
-					$stdout.print part
-					$stdout.flush
-				}
-			end
-
 			# FIXME temporary method during (scratch) refactoring
 			def extract_status_for_legacy_tdiary( head )
 				status_str = head.delete('status')
@@ -64,8 +62,30 @@ module TDiary
 			def update
 				new( :update )
 			end
+
 			private :new
 		end
+
+	private
+
+		def adopt_rack_request_to_plain_old_tdiary_style( env )
+			req = TDiary::Request.new( env )
+			req.params # fill params to tdiary_request
+			$RACK_ENV = req.env
+			env["rack.input"].rewind
+			fake_stdin_as_params
+			req
+		end
+
+		# FIXME dirty hack
+		def fake_stdin_as_params
+			stdin_spy = StringIO.new
+			if $RACK_ENV && $RACK_ENV['rack.input']
+				stdin_spy.print($RACK_ENV['rack.input'].read)
+				stdin_spy.rewind
+			end
+			$stdin = stdin_spy
+		end
 	end
 end
 
diff --git a/tdiary/environment.rb b/tdiary/environment.rb
index d1243c0..d45851d 100644
--- a/tdiary/environment.rb
+++ b/tdiary/environment.rb
@@ -1,5 +1,4 @@
 # -*- coding: utf-8 -*-
-require 'rubygems'
 
 # Set up gems listed in the Gemfile.
 ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
diff --git a/tdiary/io/base.rb b/tdiary/io/base.rb
index bdd5f5f..4d91d04 100644
--- a/tdiary/io/base.rb
+++ b/tdiary/io/base.rb
@@ -37,9 +37,12 @@ module TDiary
 
 		def load_styles
 			@styles = {}
-			paths = @tdiary.conf.options['style.path'] || ["#{TDiary::PATH}/tdiary/style", "#{TDiary::PATH}/tdiary"]
-			[paths].flatten.each do |path|
-				path = path.sub(/\/+$/, '')
+			paths = @tdiary.conf.options['style.path'] ||
+				[TDiary::PATH, TDiary.server_root].map {|base|
+					["#{base}/tdiary/style", "#{base}/tdiary"]
+				}
+			[paths].flatten.uniq.each do |path|
+				path = path.sub(/\/+$/, '').untaint
 				Dir.glob("#{path}/*_style.rb") do |style_file|
 					require style_file.untaint
 					style = File.basename(style_file).sub(/_style\.rb$/, '')
diff --git a/tdiary/lang/ja.rb b/tdiary/lang/ja.rb
index b9c63cc..d987001 100644
--- a/tdiary/lang/ja.rb
+++ b/tdiary/lang/ja.rb
@@ -22,29 +22,12 @@ def mobile_encoding
 	'Shift_JIS'
 end
 
-if String.method_defined?(:encode)
-	def to_mobile( str )
-		str.encode(mobile_encoding, {:invalid => :replace, :undef => :replace})
-	end
-
-	def to_mail( str )
-		str.encode('iso-2022-jp', {:invalid => :replace, :undef => :replace})
-	end
-else
-	require 'nkf'
-	require 'iconv'
-
-	def to_mobile( str )
-		NKF::nkf( '-m0 -W -s', str )
-	end
+def to_mobile( str )
+	str.encode(mobile_encoding, {:invalid => :replace, :undef => :replace})
+end
 
-	def to_mail( str )
-		begin
-			Iconv.conv('iso-2022-jp', 'utf-8', str)
-		rescue
-			NKF::nkf('-m0 -W -j', str)
-		end
-	end
+def to_mail( str )
+	str.encode('iso-2022-jp', {:invalid => :replace, :undef => :replace})
 end
 
 def migrate_to_utf8( str )
diff --git a/tdiary/rack.rb b/tdiary/rack.rb
new file mode 100644
index 0000000..82175cf
--- /dev/null
+++ b/tdiary/rack.rb
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+
+module TDiary
+	module Rack
+		autoload :HtmlAnchor,       'tdiary/rack/html_anchor'
+		autoload :ValidRequestPath, 'tdiary/rack/valid_request_path'
+		autoload :Static,           'tdiary/rack/static'
+
+		module Assets
+			autoload :Precompile,    'tdiary/rack/assets/precompile'
+		end
+
+		module Auth
+			autoload :Basic,         'tdiary/rack/auth/basic'
+			autoload :OmniAuth,      'tdiary/rack/auth/omniauth'
+		end
+	end
+end
+
+# Local Variables:
+# mode: ruby
+# indent-tabs-mode: t
+# tab-width: 3
+# ruby-indent-level: 3
+# End:
+# vim: ts=3
diff --git a/tdiary/rack/static.rb b/tdiary/rack/static.rb
new file mode 100644
index 0000000..67bdde4
--- /dev/null
+++ b/tdiary/rack/static.rb
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+require 'rack/file'
+
+module TDiary
+	module Rack
+		class Static
+			def initialize( app, base_dir )
+				@app = app
+				@file = ::Rack::File.new( base_dir )
+			end
+
+			def call( env )
+				result = @file.call( env )
+				if result[0].to_i >= 400 && result[0].to_i < 500
+					@app.call( env )
+				else
+					result
+				end
+			end
+		end
+	end
+end
+
+# Local Variables:
+# mode: ruby
+# indent-tabs-mode: t
+# tab-width: 3
+# ruby-indent-level: 3
+# End:
diff --git a/tdiary/referer_manager.rb b/tdiary/referer_manager.rb
index e5686d4..e30d4b0 100644
--- a/tdiary/referer_manager.rb
+++ b/tdiary/referer_manager.rb
@@ -24,8 +24,8 @@ module TDiary
 			end
 			begin
 				uref = CGI::unescape( ref )
-			rescue => e
-				return if defined?(::Encoding) && e.class == ::Encoding::CompatibilityError
+			rescue ::Encoding::CompatibilityError => e
+				return
 			end
 			if pair = @referers[uref] then
 				pair = [pair, ref] if pair.class != Array # for compatibility
diff --git a/tdiary/request.rb b/tdiary/request.rb
index 6dae93a..b80fac2 100644
--- a/tdiary/request.rb
+++ b/tdiary/request.rb
@@ -1,25 +1,18 @@
 # -*- coding: utf-8 -*-
 # stolen from okkez http://github.com/hiki/hiki/blob/rack/hiki/request.rb
 module TDiary
-	if Object.const_defined?( :Rack )
-		Request = ::Rack::Request
-		class ::Rack::Request
-			alias remote_addr ip
-		end
-		Request.class_eval { include RequestExtension }
-	else
-		raise RuntimeError, 'Do not use CGI class!' if Object.const_defined?( :Rack )
-		# CGI を Rack::Request っぽいインターフェイスに変換する
-		class Request
-			include RequestExtension
+	class Request < ::Rack::Request
+		include RequestExtension
 
-			attr_reader :env, :cgi
-			def initialize( env, cgi = CGI.new )
-				@cgi = cgi
-				@env = env
-			end
+		attr_reader :env, :cgi
+
+		def initialize( env, cgi = nil )
+			@env = env
+			@cgi = cgi
+		end
 
-			def params
+		def params
+			if @cgi
 				return @params if @params
 				@params = { }
 				@cgi.params.each{|k, v|
@@ -34,73 +27,141 @@ module TDiary
 					end
 				}
 				@params
+			else
+				super
 			end
+		end
 
-			def []( key )
+		def []( key )
+			if @cgi
 				params[key.to_s]
+			else
+				super
 			end
+		end
 
-			def []=( key, val )
+		def []=( key, val )
+			if @cgi
 				params[key.to_s] = val
+			else
+				super
 			end
+		end
 
-			def request_method
+		def request_method
+			if @cgi
 				@env['REQUEST_METHOD']
+			else
+				super
 			end
+		end
 
-			def header( header )
+		def header( header )
+			if @cgi
 				@cgi.header( header )
+			else
+				super
 			end
+		end
 
-			def get?
+		def get?
+			if @cgi
 				request_method == 'GET'
+			else
+				super
 			end
+		end
 
-			def head?
+		def head?
+			if @cgi
 				request_method == 'HEAD'
+			else
+				super
 			end
+		end
 
-			def post?
+		def post?
+			if @cgi
 				request_method == 'POST'
+			else
+				super
 			end
+		end
 
-			def put?
+		def put?
+			if @cgi
 				request_method == 'PUT'
+			else
+				super
 			end
+		end
 
-			def delete?
+		def delete?
+			if @cgi
 				request_method == 'DELETE'
+			else
+				super
 			end
+		end
 
-			def xhr?
+		def xhr?
+			if @cgi
 				@env["HTTP_X_REQUESTED_WITH"] == "XMLHttpRequest"
+			else
+				super
 			end
+		end
 
-			def accept_encoding
+		def accept_encoding
+			if @cgi
 				raise NameError, 'not implemented : accept_encoding'
+			else
+				super
 			end
+		end
 
-			def body
+		def body
+			if @cgi
 				raise NameError, 'not implemented : body'
+			else
+				super
 			end
+		end
 
-			def content_charset
+		def content_charset
+			if @cgi
 				@env['CONTENT_CHARSET']
+			else
+				super
 			end
+		end
 
-			def content_length
+		def content_length
+			if @cgi
 				@env['CONTENT_LENGTH']
+			else
+				super
 			end
+		end
 
-			def content_type
+		def content_type
+			if @cgi
 				@env['CONTENT_TYPE']
+			else
+				super
 			end
+		end
 
-			def remote_addr
+		def remote_addr
+			if @cgi
 				@env['REMOTE_ADDR']
+			else
+				super
 			end
+		end
 
-			def cookies
+		def cookies
+			if @cgi
 				return @cookies if @cookies
 				@cookies = { }
 				@cgi.cookies.each{|k, v|
@@ -114,96 +175,187 @@ module TDiary
 					end
 				}
 				@cookies
+			else
+				super
 			end
+		end
 
-			def form_data?
+		def form_data?
+			if @cgi
 				raise NameError, 'not implemented : form_data?'
+			else
+				super
 			end
+		end
 
-			def fullpath
+		def fullpath
+			if @cgi
 				raise NameError, 'not implemented : fullpath'
+			else
+				super
 			end
+		end
 
-			def host
+		def host
+			if @cgi
 				# Remove port number.from Rack::Response
 				( @env["HTTP_HOST"] || @env["SERVER_NAME"] ).gsub( /:\d+\z/, '' )
+			else
+				super
 			end
+		end
 
-			def ip
+		def ip
+			if @cgi
 				raise NameError, 'not implemented : ip'
+			else
+				super
 			end
+		end
+		alias remote_addr ip
 
-			def media_type
+		def media_type
+			if @cgi
 				raise NameError, 'not implemented : madia_type'
+			else
+				super
 			end
+		end
 
-			def media_type_params
+		def media_type_params
+			if @cgi
 				raise NameError, 'not implemented : media_type_params'
+			else
+				super
 			end
+		end
 
-			def openid_request
+		def openid_request
+			if @cgi
 				raise NameError, 'not implemented : openid_request'
+			else
+				super
 			end
+		end
 
-			def openid_response
+		def openid_response
+			if @cgi
 				raise NameError, 'not implemented : openid_response'
+			else
+				super
 			end
+		end
 
-			def parseable_data?
+		def parseable_data?
+			if @cgi
 				raise NameError, 'not implemented : parseable_data?'
+			else
+				super
 			end
+		end
 
-			def path
+		def path
+			if @cgi
 				raise NameError, 'not implemented : path'
+			else
+				super
 			end
+		end
 
-			def path_info
-				@env['PATH_INFO'].to_s
+		def path_info
+			if @cgi
+				raise NameError, 'not implemented : path'
+			else
+				super
 			end
+			w		end
 
-			def path_info=( s )
+		def path_info=( s )
+			if @cgi
 				raise NameError, 'not implemented : path_info='
+			else
+				super
 			end
+		end
 
-			def port
+		def port
+			if @cgi
 				raise NameError, 'not implemented : port'
+			else
+				super
 			end
+		end
 
-			def query_string
+		def query_string
+			if @cgi
 				raise NameError, 'not implemented : query_string'
+			else
+				super
 			end
+		end
 
-			def referer
+		def referer
+			if @cgi
 				raise NameError, 'not implemented : referer'
+			else
+				super
 			end
-			alias referrer referer
+		end
+		alias referrer referer
 
-			def schema
+		def schema
+			if @cgi
 				raise NameError, 'not implemented : schema'
+			else
+				super
 			end
+		end
 
-			def script_name
+		def script_name
+			if @cgi
 				@env['SCRIPT_NAME']
+			else
+				super
 			end
+		end
 
-			def session_options
+		def session_options
+			if @cgi
 				raise NameError, 'not implemented : session_options'
+			else
+				super
 			end
+		end
 
-			def url
+		def url
+			if @cgi
 				raise NameError, 'not implemented : url'
+			else
+				super
 			end
+		end
 
-			def user_agent
+		def user_agent
+			if @cgi
 				@cgi.user_agent
+			else
+				super
 			end
+		end
 
-			def base_url
+		def base_url
+			if @cgi
 				@cgi.base_url
+			else
+				super
 			end
+		end
 
-			def values_at( *keys )
+		def values_at( *keys )
+			if @cgi
 				raise NameError, 'not implemented : values_at'
+			else
+				super
 			end
 		end
 	end
diff --git a/tdiary/response.rb b/tdiary/response.rb
index 6d83df9..e1a20fe 100644
--- a/tdiary/response.rb
+++ b/tdiary/response.rb
@@ -1,23 +1,6 @@
 # -*- coding: utf-8 -*-
-# stolen from okkez http://github.com/hiki/hiki/blob/rack/hiki/response.rb
 module TDiary
-	if Object.const_defined?(:Rack)
-		Response = ::Rack::Response
-	else
-		class Response
-			attr_reader :body, :status, :headers
-			def initialize(body = [], status = 200, headers = {}, &block)
-				@body = body
-				@status = status
-				@headers = headers
-				yield self if block_given?
-			end
-
-			def finish
-				[status, headers, body]
-			end
-			alias to_a finish
-		end
+	class Response < ::Rack::Response
 	end
 end
 
diff --git a/tdiary/style/wiki_style.rb b/tdiary/style/wiki_style.rb
index d87d978..4bf859e 100644
--- a/tdiary/style/wiki_style.rb
+++ b/tdiary/style/wiki_style.rb
@@ -72,8 +72,13 @@ module TDiary
 
 		def valid_plugin_syntax?(code)
 			lambda {
-				$SAFE = 4
-				eval( "BEGIN {return true}\n#{code}", nil, "(plugin)", 0 )
+				begin
+					$SAFE = 4
+				rescue ArgumentError
+					# $SAFE=4 was removed from Ruby 2.1.0.
+				ensure
+					eval( "BEGIN {return true}\n#{code}", nil, "(plugin)", 0 )
+				end
 			}.call
 		rescue SyntaxError
 			lambda { eval('') }.call
diff --git a/tdiary/tasks.rb b/tdiary/tasks.rb
new file mode 100644
index 0000000..58e1782
--- /dev/null
+++ b/tdiary/tasks.rb
@@ -0,0 +1 @@
+Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
diff --git a/tdiary/tasks/release.rake b/tdiary/tasks/release.rake
index d012e9d..27e830b 100644
--- a/tdiary/tasks/release.rake
+++ b/tdiary/tasks/release.rake
@@ -8,24 +8,15 @@ REPOS = %w(tdiary-core tdiary-theme tdiary-blogkit tdiary-contrib)
 DEST_DIR = "/var/www/tdiary.org/htdocs/download"
 TARBALLS = []
 
-#
-# utilities
-#
 def fetch_files( repo )
 	Dir.chdir("tmp") do
 		rm_rf repo rescue true
-		sh "git clone git://github.com/tdiary/#{repo}.git #{repo}"
-	end
-end
-
-REPOS.each_with_index do |repo, i|
-	file REPOS[i] do |t|
-		fetch_files(t.name)
+		sh "git clone --depth 10 https://github.com/tdiary/#{repo}.git #{repo}"
 	end
 end
 
 def make_tarball( repo, version = nil )
-	suffix = version ? "-#{version}" : ''
+	suffix = version ? "-#{version}" : '-snapshot'
 	dest = "#{repo == 'tdiary-core' ? 'tdiary' : repo}#{suffix}"
 
 	if version then
@@ -42,6 +33,12 @@ def make_tarball( repo, version = nil )
 		Dir.chdir 'tdiary-core' do
 			sh "chmod +x index.rb index.fcgi update.rb update.fcgi"
 			sh 'rake doc'
+			Bundler.with_clean_env do
+				sh 'bundle --path .bundle --without coffee:memcached:redis:gfm:server:development:test'
+			end
+			Dir.chdir 'misc/lib' do
+				sh 'gem unpack bundler'
+			end
 		end
 	end
 
@@ -51,13 +48,30 @@ def make_tarball( repo, version = nil )
 	TARBALLS << "#{dest}.tar.gz"
 end
 
-#
-# tasks
-#
+def make_full_package(version = nil)
+	suffix = version ? "-#{version}" : '-snapshot'
+	Dir.chdir("tmp") do
+		TARBALLS.clear
+		REPOS.each do |repo|
+			make_tarball( repo, version )
+		end
+		Dir["tdiary-theme/*"].each do |d|
+			mv d, "tdiary-core/theme/" rescue true
+		end
+		mv "tdiary-core", "tdiary#{suffix}"
+		sh "tar zcf tdiary-full#{suffix}.tar.gz tdiary#{suffix}"
+		TARBALLS << "tdiary-full#{suffix}.tar.gz"
+		rm_rf "tdiary#{suffix}"
+		REPOS.each {|repo| rm_rf repo rescue true }
+	end
+end
+
 task :default => :snapshot
 
 desc 'fetching all files from GitHub.'
-task :fetch => REPOS
+task :fetch do
+	REPOS.each{|r| fetch_files(r) }
+end
 
 desc 'releasing all files'
 task :release do
@@ -70,39 +84,13 @@ task :release do
 end
 
 desc 'making packages of snapshot.'
-task :snapshot => REPOS do
-	Dir.chdir("tmp") do
-		TARBALLS.clear
-		REPOS.each do |repo|
-			make_tarball( repo )
-		end
-		Dir["tdiary-theme/*"].each do |d|
-			mv d, "tdiary-core/theme/"
-		end
-		mv "tdiary-core", "tdiary"
-		sh "tar zcf tdiary-full.tar.gz tdiary"
-		TARBALLS << "tdiary-full.tar.gz"
-		rm_rf "tdiary"
-		REPOS.each {|repo| rm_rf repo rescue true }
-	end
+task :snapshot => :fetch do
+	make_full_package
 end
 
 desc 'making packages of stable.'
-task :stable => REPOS do
-	Dir.chdir("tmp") do
-		TARBALLS.clear
-		REPOS.each do |repo|
-			make_tarball( repo, STABLE )
-		end
-		Dir["tdiary-theme/*"].each do |d|
-			mv d, "tdiary-core/theme/" rescue true
-		end
-		mv "tdiary-core", "tdiary-#{STABLE}"
-		sh "tar zcf tdiary-full-#{STABLE}.tar.gz tdiary-#{STABLE}"
-		TARBALLS << "tdiary-full-#{STABLE}.tar.gz"
-		rm_rf "tdiary-#{STABLE}"
-		REPOS.each {|repo| rm_rf repo rescue true }
-	end
+task :stable => :fetch do
+	make_full_package(STABLE)
 end
 
 desc 'cleanup all files.'
diff --git a/tdiary/tasks/rspec.rake b/tdiary/tasks/rspec.rake
index 718ef59..d38d9b0 100644
--- a/tdiary/tasks/rspec.rake
+++ b/tdiary/tasks/rspec.rake
@@ -1,6 +1,5 @@
 if defined? RSpec
 	require 'rspec/core/rake_task'
-	require 'ci/reporter/rake/rspec'
 
 	desc 'Run the code in spec'
 	RSpec::Core::RakeTask.new(:spec) do |t|
@@ -35,19 +34,10 @@ if defined? RSpec
 			end
 		end
 
-		if defined?(Rcov)
-			desc 'Run the code in specs with RCov'
-			RSpec::Core::RakeTask.new(:report) do |t|
-				t.pattern = "spec/**/*_spec.rb"
-				t.rcov = true
-				t.rcov_opts = IO.readlines(File.join('spec', 'rcov.opts')).map {|line| line.chomp.split(" ") }.flatten
-			end
-		else
-			desc 'Displayed code coverage with SimpleCov'
-			task :report do
-				ENV['COVERAGE'] = 'simplecov'
-				Rake::Task["spec"].invoke
-			end
+		desc 'Displayed code coverage with SimpleCov'
+		task :coverage do
+			ENV['COVERAGE'] = 'simplecov'
+			Rake::Task["spec"].invoke
 		end
 	end
 end
diff --git a/tdiary/tasks/test.rake b/tdiary/tasks/test.rake
index fd5284b..2b5bf77 100644
--- a/tdiary/tasks/test.rake
+++ b/tdiary/tasks/test.rake
@@ -1,6 +1,5 @@
 if defined? Test::Unit
 	require 'rake/testtask'
-	require 'ci/reporter/rake/test_unit'
 
 	Rake::TestTask.new do |t|
 		t.libs << "test"
diff --git a/tdiary/version.rb b/tdiary/version.rb
new file mode 100644
index 0000000..f0e1e14
--- /dev/null
+++ b/tdiary/version.rb
@@ -0,0 +1,3 @@
+module TDiary
+	VERSION = '4.0.0'
+end
diff --git a/tdiary/view.rb b/tdiary/view.rb
index ebfcaf0..4455aa0 100644
--- a/tdiary/view.rb
+++ b/tdiary/view.rb
@@ -83,7 +83,7 @@ module TDiary
 			return if @filters
 
 			@filters = []
-			filter_path = @conf.filter_path || "#{PATH}/tdiary/filter"
+			filter_path = @conf.filter_path || "{#{PATH},#{TDiary.server_root}}/tdiary/filter"
 			Dir::glob( "#{filter_path}/*.rb" ).sort.each do |file|
 				require file.untaint
 				@filters << TDiary::Filter::const_get( "#{File::basename( file, '.rb' ).capitalize}Filter" )::new( @cgi, @conf )
@@ -185,7 +185,7 @@ module TDiary
 			@name = @cgi.params['name'][0]
 			@mail = @cgi.params['mail'][0]
 			@body = @cgi.params['body'][0]
-			if @cgi.mobile_agent? && String.method_defined?(:encode)
+			if @cgi.mobile_agent?
 				@name.force_encoding(conf.mobile_encoding)
 				@body.force_encoding(conf.mobile_encoding)
 			end
diff --git a/update.rb b/update.rb
index c0630d6..91dac25 100755
--- a/update.rb
+++ b/update.rb
@@ -27,12 +27,12 @@ begin
 		@cgi = CGI::new(:accept_charset => 'shift_jis')
 		@cgi.params = cgi.params.dup
 	end
+
 	request = TDiary::Request.new( ENV, @cgi )
 	status, headers, body = TDiary::Dispatcher.update.dispatch_cgi( request, @cgi )
-	headers['type'] = headers.delete('Content-Type')
-	TDiary::Dispatcher.send_headers( status, headers )
-	TDiary::Dispatcher.send_body( body )
 
+	TDiary::Dispatcher.send_headers( status, headers )
+	::Rack::Handler::CGI.send_body(body)
 rescue Exception
 	if @cgi then
 		print @cgi.header( 'status' => '500 Internal Server Error', 'type' => 'text/html' )
diff --git a/public/images/.gitkeep b/vendor/.gitkeep
similarity index 100%
rename from public/images/.gitkeep
rename to vendor/.gitkeep
diff --git a/vendor/hikidoc-0.0.6/README b/vendor/hikidoc-0.0.6/README
deleted file mode 100644
index 4ec8cab..0000000
--- a/vendor/hikidoc-0.0.6/README
+++ /dev/null
@@ -1,86 +0,0 @@
-! HikiDoc
-
-!! Introduction
-
-'HikiDoc' is a text-to-HTML conversion tool for web writers. HikiDoc
-allows you to write using an easy-to-read, easy-to-write plain text
-format, then convert it to structurally valid HTML (or XHTML).
-
-!! Requirements
-
-HikiDoc requires Ruby 1.8.2 or later.
-
-!! Download
-
-Get from the subversion repository http://hikidoc.rubyforge.org/svn/ .
-
- (eg.)
- svn co http://hikidoc.rubyforge.org/svn/trunk/ hikidoc
-
-!! Installation
-
-Run the 'setup.rb' script like so:
-
- $ ruby setup.rb config
- $ ruby setup.rb setup
- # ruby setup.rb install
-
-!! Syntax
-
-See [[TextFormattingRules]].
-
-!! Mailing list
-
-To subscribe the HikiDoc ML, please send the following mail. English
-posts are also welcome.
-
- To: hikidoc at ml.fdiary.net
- Cc: kazuhiko at fdiary.net
- Subject: subscribe        <- any subject
- 
- Hello.                    <- any body
-
-HikiDoc ML's archive is available at http://www.fdiary.net/ml/hikidoc/ .
-
-!! Related softwares
-
-The following softwares use the HikiDoc library or the HikiDoc format.
-
-:[[tDiary|http://www.tdiary.org/]]:a Weblog/Web-diary software
-:[[Hiki|http://hikiwiki.org/]]:a powerful and fast wiki clone
-:[[lily|http://lily.sourceforge.jp/]]:a simple CMS
-:[[Text::HikiDoc|http://search.cpan.org/perldoc?Text::HikiDoc]]:HikiDoc by Perl
-:[[PikiDoc|http://github.com/moro/piki_doc/]]:a library that you can add plugin functions on HikiDoc
-
-!! License
-
-HikiDoc's license is the 'Modified BSD License'.
-
- Copyright (c) 2005, Kazuhiko <kazuhiko at fdiary.net>
- 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 the HikiDoc 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
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/hikidoc-0.0.6/README.ja b/vendor/hikidoc-0.0.6/README.ja
deleted file mode 100644
index aa16872..0000000
--- a/vendor/hikidoc-0.0.6/README.ja
+++ /dev/null
@@ -1,83 +0,0 @@
-! HikiDoc
-
-!! �Ϥ����
-
-'HikiDoc' �ϡ֥ƥ����Ȣ� HTML���Ѵ��ġ���Ǥ����񤭤䤹���ɤߤ䤹��ʸˡ��
-�ƥ����Ȥ�ޤȤ�� HTML (�� XHTML) ���Ѵ����ޤ���
-
-!! ɬ�פʤ��
-
-HikiDoc �μ¹Ԥˤ� Ruby 1.8.2 �ʹߤ�ɬ�פǤ���
-
-!! ���������
-
-Subversion ��ݥ��ȥ� http://hikidoc.rubyforge.org/svn/ �����������
-����������
-
- (��)
- svn co http://hikidoc.rubyforge.org/svn/trunk/ hikidoc
-
-!! ���󥹥ȡ���
-
-�ʲ��Τ褦�� 'setup.rb' ������ץȤ��Ѥ��ƥ��󥹥ȡ��뤷�ޤ���
-
- $ ruby setup.rb config
- $ ruby setup.rb setup
- # ruby setup.rb install
-
-!! ʸˡ
-
-[[TextFormattingRules.ja]] ��������������
-
-!! �᡼��󥰥ꥹ��
-
-���ä��˾��������ϡ��ʲ��Τ褦�ʥ᡼����������Ƥ���������
- To: hikidoc at ml.fdiary.net
- Cc: kazuhiko at fdiary.net
- 
- ��ʸ�˼��ʾҲ�ʤ�
-
-���Υ᡼��� http://www.fdiary.net/ml/hikidoc/ �Ǹ������Ƥ��ޤ���
-
-!! ��Ϣ���륽�եȥ�����
-
-�ʲ��Υ��եȥ������� HikiDoc �饤�֥�ꡢ�ޤ��� HikiDoc �ե����ޥåȤ��Ѥ����Ƥ��ޤ���
-
-:[[tDiary|http://www.tdiary.org/]]:�������������եȥ�����
-:[[Hiki|http://hikiwiki.org/]]:¿��ǽ���Ĺ�®�� Wiki ������
-:[[lily|http://lily.sourceforge.jp/]]:����ץ�� CMS (Web �����ȹ��ۥ����ƥ�)
-:[[Text::HikiDoc|http://search.cpan.org/perldoc?Text::HikiDoc]]:Perl �ˤ�� HikiDoc �μ���
-:[[PikiDoc|http://github.com/moro/piki_doc/]]:HikiDoc�Ρ֥ץ饰����׵�ǽ���ɲäǤ���饤�֥��Ǥ�
-
-!! �饤����
-
-Modified BSD �饤���󥹤Ǥ���
-
- Copyright (c) 2005, Kazuhiko <kazuhiko at fdiary.net>
- 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 the HikiDoc 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
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/hikidoc-0.0.6/Rakefile b/vendor/hikidoc-0.0.6/Rakefile
deleted file mode 100644
index 24c34f2..0000000
--- a/vendor/hikidoc-0.0.6/Rakefile
+++ /dev/null
@@ -1,68 +0,0 @@
-# -*- ruby -*-
-
-require 'rubygems'
-require 'hoe'
-
-require 'find'
-
-base_dir = File.expand_path(File.dirname(__FILE__))
-$LOAD_PATH.unshift(File.join(base_dir, 'lib'))
-require 'hikidoc'
-
-truncate_base_dir = Proc.new do |x|
-  x.gsub(/\A#{Regexp.escape(base_dir + File::SEPARATOR)}/, '')
-end
-
-manifest = File.join(base_dir, "Manifest.txt")
-manifest_contents = []
-base_dir_included_components = %w(COPYING README README.ja Rakefile
-                                  TextFormattingRules TextFormattingRules.ja
-                                  NEWS.ja setup.rb)
-excluded_components = %w(.svn doc log pkg)
-Find.find(base_dir) do |target|
-  target = truncate_base_dir[target]
-  components = target.split(File::SEPARATOR)
-  if components.size == 1 and !File.directory?(target)
-    next unless base_dir_included_components.include?(components[0])
-  end
-  Find.prune if (excluded_components - components) != excluded_components
-  manifest_contents << target if File.file?(target)
-end
-
-File.open(manifest, "w") do |f|
-  f.puts manifest_contents.sort.join("\n")
-end
-at_exit do
-  FileUtils.rm_f(manifest)
-end
-
-ENV["VERSION"] ||= HikiDoc::VERSION
-project = Hoe.spec('hikidoc') do |project|
-  project.version = HikiDoc::VERSION
-  project.author = ['Kazuhiko']
-  project.email = ['kazuhiko at fdiary.net']
-  project.description = project.paragraphs_of('README', 2).join
-  project.summary = project.description.split(/(\.)/, 3)[0, 2].join
-  project.url = 'http://rubyforge.org/projects/hikidoc/'
-  project.test_globs = ['test/test_*.rb']
-  project.extra_rdoc_files = %w(README COPYING NEWS TextFormattingRules)
-  project.changes = File.read("NEWS").split(/^!! .*$/)[1].strip
-end
-
-desc 'Tag the repository for release.'
-task :tag do
-  version = HikiDoc::VERSION
-  message = "Released HikiDoc #{version}!"
-  base = "svn+ssh://rubyforge.org/var/svn/hikidoc/"
-  sh 'svn', 'copy', '-m', message, "#{base}trunk", "#{base}tags/#{version}"
-end
-
-
-# Fix Hoe's uncustomizable options
-rdoc_main = "lib/hikidoc.rb"
-project.spec.rdoc_options.each do |option|
-  option.replace(rdoc_main) if option == "README.txt"
-end
-ObjectSpace.each_object(Rake::RDocTask) do |task|
-  task.main = rdoc_main if task.main == "README.txt"
-end
diff --git a/vendor/hikidoc-0.0.6/test/run-test.rb b/vendor/hikidoc-0.0.6/test/run-test.rb
deleted file mode 100644
index 8079019..0000000
--- a/vendor/hikidoc-0.0.6/test/run-test.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env ruby
-
-require "test/unit"
-
-if Test::Unit.respond_to?(:setup_argv)
-  Test::Unit::setup_argv{[File.dirname($0)]}
-else
-  if Test::Unit::AutoRunner.respond_to?(:standalone?)
-    exit Test::Unit::AutoRunner.run($0, File.dirname($0))
-  else
-    exit Test::Unit::AutoRunner.run(false, File.dirname($0))
-  end
-end
diff --git a/vendor/imagesize-0.1.1/Manifest.txt b/vendor/imagesize-0.1.1/Manifest.txt
deleted file mode 100644
index 3504ea2..0000000
--- a/vendor/imagesize-0.1.1/Manifest.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest.txt
-README.txt
-lib/image_size.rb
-lib/image_size/version.rb
-setup.rb
-test/test_helper.rb
-test/test_image_size.rb
-test/2-4-7.png
-test/4_1_2.gif
-test/bmp.bmp
-test/cursor.xbm
-test/detect.swf
-test/pbm.pbm
-test/pcx.pcx
-test/pgm.pgm
-test/test.xpm
-test/tiff.tiff
-test/tokyo_tower.jpg
-test/tower_e.gif.psd
diff --git a/vendor/imagesize-0.1.1/README.txt b/vendor/imagesize-0.1.1/README.txt
deleted file mode 100644
index e50ecb2..0000000
--- a/vendor/imagesize-0.1.1/README.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-= image_size -- measure image size(GIF, PNG, JPEG ,,, etc)
-
-measure image (GIF, PNG, JPEG ,,, etc) size code by Pure Ruby
-["PCX", "PSD", "XPM", "TIFF", "XBM", "PGM", "PBM", "PPM", "BMP", "JPEG", "PNG", "GIF", "SWF"]
-
-== Download
-
-The latest version of image_size can be found at
-
-* http://rubyforge.org/frs/?group_id=3460
-
-== Installation
-
-=== Normal Installation
-
-You can install image_size with the following command.
-
-  % ruby setup.rb
-
-from its distribution directory.
-
-=== GEM Installation
-
-Download and install  image_size with the following.
-
-   gem install imagesize
-
-== image_size References
-
-* image_size Project Page: http://rubyforge.org/projects/imagesize
-* image_size API Documents: http://imagesize.rubyforge.org
-
-== Simple Example
-
-  ruby "rubygems" # you use rubygems
-  ruby "image_size"
-  ruby "open-uri"
-  open("http://www.rubycgi.org/image/ruby_gtk_book_title.jpg", "rb") do |fh|
-    p ImageSize.new(fh.read).get_size
-  end
-
-== Licence
-
-This code is free to use under the terms of the Ruby's licence. 
-
-== Contact
-
-Comments are welcome. Send an email to "Keisuke Minami":mailto:keisuke at rccn.com
-
diff --git a/vendor/imagesize-0.1.1/lib/image_size.rb b/vendor/imagesize-0.1.1/lib/image_size.rb
deleted file mode 100644
index 9a0703c..0000000
--- a/vendor/imagesize-0.1.1/lib/image_size.rb
+++ /dev/null
@@ -1,305 +0,0 @@
-#!ruby
-# encoding: US-ASCII
-
-class ImageSize
-  require "stringio"
-
-# Image Type Constants
-  module Type
-    OTHER = "OTHER"
-    GIF  = "GIF"
-    PNG  = "PNG"
-    JPEG = "JPEG"
-    BMP  = "BMP"
-    PPM  = "PPM" # PPM is like PBM, PGM, & XV
-    PBM  = "PBM"
-    PGM  = "PGM"
-#   XV   = "XV"
-    XBM  = "XBM"
-    TIFF = "TIFF"
-    XPM  = "XPM"
-    PSD  = "PSD"
-    PCX  = "PCX"
-    SWF  = "SWF"
-  end
-
-  JpegCodeCheck = [
-    "\xc0", "\xc1", "\xc2", "\xc3",
-    "\xc5", "\xc6", "\xc7",
-    "\xc9", "\xca", "\xcb",
-    "\xcd", "\xce", "\xcf",
-  ]
-
-  # image type list
-  def ImageSize.type_list
-    Type.constants 
-  end
-
-  # receive image & make size
-  # argument 1 is image String, StringIO or IO
-  # argument 2 is type(ImageSize::Type::GIF and so on.) or nil
-  def initialize(img_data, img_type = nil)
-    @img_data = img_data.dup
-    @img_width  = nil
-    @img_height = nil
-    @img_type   = nil
-
-    if @img_data.is_a?(IO)
-      img_top = @img_data.read(1024)
-      img_io = def_read_o(@img_data)
-    elsif @img_data.is_a?(StringIO)
-      img_top = @img_data.read(1024)
-      img_io = def_read_o(@img_data)
-    elsif @img_data.is_a?(String)
-      img_top = @img_data[0, 1024]
-#      img_io = StringIO.open(@img_data){|sio| io = def_read_o(sio); io }
-      img_io = StringIO.open(@img_data)
-      img_io = def_read_o(img_io)
-    else
-      raise "argument class error!! #{img_data.type}"
-    end
-    
-    if @img_type.nil?
-      @img_type = check_type(img_top)
-    else
-      type = Type.constants.find{|t| img_type == t }
-      raise("type is failed. #{img_type}\n") if !type
-      @img_type = img_type
-    end
-
-    if @img_type != Type::OTHER
-      @img_width, @img_height = self.__send__("measure_#{@img_type}", img_io)
-    else
-      @img_width, @img_height = [nil, nil]
-    end
-    
-    if @img_data.is_a?(String)
-      img_io.close
-    end
-  end
-
-  # get image type
-  # ex. "GIF", "PNG", "JPEG"
-  def get_type; @img_type; end
-  
-  # get image height
-  def get_height
-    if @img_type == Type::OTHER then nil else @img_height end
-  end
-  
-  # get image width
-  def get_width
-    if @img_type == Type::OTHER then nil else @img_width end
-  end
-  
-  # get image width and height(Array)
-  def get_size
-    [self.get_width, self.get_height]
-  end
-  
-  alias :height :get_height
-  alias :h :get_height
-  
-  alias :width :get_width
-  alias :w :get_width
-  
-  alias :size :get_size
-  
-  
-  private
-  
-  # define read_o
-  def def_read_o(io)
-    io.seek(0, 0)
-    # define Singleton-method definition to IO (byte, offset)
-    def io.read_o(length = 1, offset = nil)
-      self.seek(offset, 0) if offset
-      ret = self.read(length)
-      raise "cannot read!!" unless ret
-      ret
-    end
-    io
-  end
-
-  def check_type(img_top)
-    if img_top =~ /^GIF8[7,9]a/                      then Type::GIF
-    elsif img_top[0, 8] == "\x89PNG\x0d\x0a\x1a\x0a" then Type::PNG
-    elsif img_top[0, 2] == "\xFF\xD8"                then Type::JPEG
-    elsif img_top[0, 2] == 'BM'                      then Type::BMP
-    elsif img_top =~ /^P[1-7]/                       then Type::PPM
-    elsif img_top =~ /\#define\s+\S+\s+\d+/          then Type::XBM
-    elsif img_top[0, 4] == "MM\x00\x2a"              then Type::TIFF
-    elsif img_top[0, 4] == "II\x2a\x00"              then Type::TIFF
-    elsif img_top =~ /\/\* XPM \*\//                 then Type::XPM
-    elsif img_top[0, 4] == "8BPS"                    then Type::PSD
-    elsif img_top[1, 2] == "WS"                      then Type::SWF
-    elsif img_top[0] == 10                           then Type::PCX
-    else Type::OTHER
-    end
-  end
-
-  def measure_GIF(img_io)
-    img_io.read_o(6)
-    img_io.read_o(4).unpack('vv')
-  end
-
-  def measure_PNG(img_io)
-    img_io.read_o(12)
-    raise "This file is not PNG." unless img_io.read_o(4) == "IHDR"
-    img_io.read_o(8).unpack('NN')
-  end
-
-  def measure_JPEG(img_io)
-    c_marker = "\xFF"   # Section marker.
-    img_io.read_o(2)
-    while(true)
-      marker, code, length = img_io.read_o(4).unpack('aan')
-      raise "JPEG marker not found!" if marker != c_marker
-
-      if JpegCodeCheck.include?(code)
-        height, width = img_io.read_o(5).unpack('xnn')
-        return([width, height])
-      end
-      img_io.read_o(length - 2)
-    end
-  end
-
-  def measure_BMP(img_io)
-    img_io.read_o(26).unpack("x18VV");
-  end
-
-  def measure_PPM(img_io)
-    header = img_io.read_o(1024)
-    header.gsub!(/^\#[^\n\r]*/m, "")
-    header =~ /^(P[1-6])\s+?(\d+)\s+?(\d+)/m
-    width = $2.to_i; height = $3.to_i
-    case $1
-      when "P1", "P4" then @img_type = "PBM"
-      when "P2", "P5" then @img_type = "PGM"
-      when "P3", "P6" then @img_type = "PPM"
-#     when "P7"
-#       @img_type = "XV"
-#       header =~ /IMGINFO:(\d+)x(\d+)/m
-#       width = $1.to_i; height = $2.to_i
-    end
-    [width, height]
-  end
-
-  alias :measure_PGM :measure_PPM
-  alias :measure_PBM :measure_PPM
-  
-  def measure_XBM(img_io)
-    img_io.read_o(1024) =~ /^\#define\s*\S*\s*(\d+)\s*\n\#define\s*\S*\s*(\d+)/mi
-    [$1.to_i, $2.to_i]
-  end
-
-  def measure_XPM(img_io)
-    width = height = nil
-    while(line = img_io.read_o(1024))
-      if line =~ /"\s*(\d+)\s+(\d+)(\s+\d+\s+\d+){1,2}\s*"/m
-        width = $1.to_i; height = $2.to_i
-        break
-      end
-    end
-    [width, height]
-  end
-
-  def measure_PSD(img_io)
-    img_io.read_o(26).unpack("x14NN")
-  end
-
-  def measure_TIFF(img_io)
-    endian = if (img_io.read_o(4) =~ /II\x2a\x00/o) then 'v' else 'n' end
-# 'v' little-endian   'n' default to big-endian
-
-    packspec = [
-      nil,           # nothing (shouldn't happen)
-      'C',           # BYTE (8-bit unsigned integer)
-      nil,           # ASCII
-      endian,        # SHORT (16-bit unsigned integer)
-      endian.upcase, # LONG (32-bit unsigned integer)
-      nil,           # RATIONAL
-      'c',           # SBYTE (8-bit signed integer)
-      nil,           # UNDEFINED
-      endian,        # SSHORT (16-bit unsigned integer)
-      endian.upcase, # SLONG (32-bit unsigned integer)
-    ]
-
-    offset = img_io.read_o(4).unpack(endian.upcase)[0] # Get offset to IFD
-
-    ifd = img_io.read_o(2, offset)
-    num_dirent = ifd.unpack(endian)[0]                   # Make it useful
-    offset += 2
-    num_dirent = offset + (num_dirent * 12);             # Calc. maximum offset of IFD
-
-    ifd = width = height = nil
-    while(width.nil? || height.nil?)
-      ifd = img_io.read_o(12, offset)                 # Get first directory entry
-      break if (ifd.nil? || (offset > num_dirent))
-      offset += 12
-      tag = ifd.unpack(endian)[0]                       # ...and decode its tag
-      type = ifd[2, 2].unpack(endian)[0]                # ...and the data type
-
-     # Check the type for sanity.
-      next if (type > packspec.size + 0) || (packspec[type].nil?)
-      if tag == 0x0100                                  # Decode the value
-        width = ifd[8, 4].unpack(packspec[type])[0]
-      elsif tag == 0x0101                               # Decode the value
-        height = ifd[8, 4].unpack(packspec[type])[0]
-      end
-    end
-
-    raise "#{if width.nil? then 'width not defined.' end} #{if height.nil? then 'height not defined.' end}" if width.nil? || height.nil?
-    [width, height]
-  end
-
-  def measure_PCX(img_io)
-    header = img_io.read_o(128)
-    head_part = header.unpack('C4S4')
-    width = head_part[6] - head_part[4] + 1
-    height = head_part[7] - head_part[5] + 1
-    [width, height]
-  end
-
-  def measure_SWF(img_io)
-    header = img_io.read_o(9)
-    
-    sig1 = header[0,1]
-    sig2 = header[1,1]
-    sig3 = header[2,1]
-
-    if !((sig1 == 'F' || sig1 == 'C') && sig2 == 'W' && sig3 == 'S')
-      raise("This file is not SWF.")
-    end
-
-    bit_length = Integer("0b#{header.unpack('@8B5')}")
-    header << img_io.read_o(bit_length*4/8+1)
-    str = header.unpack("@8B#{5+bit_length*4}")[0]
-    last = 5
-    x_min = Integer("0b#{str[last,bit_length]}")
-    x_max = Integer("0b#{str[(last += bit_length),bit_length]}")
-    y_min = Integer("0b#{str[(last += bit_length),bit_length]}")
-    y_max = Integer("0b#{str[(last += bit_length),bit_length]}")
-    width = (x_max - x_min)/20
-    height = (y_max - y_min)/20
-    [width, height]
-  end
-end
-
-
-if __FILE__ == $0
-  print "TypeList: #{ImageSize.type.inspect}\n"
-
-  Dir.glob("*").each do |file|
-    print "#{file} (string)\n"
-    open(file, "rb") do |fh|
-      img = ImageSize.new(fh.read)
-      print <<-EOF
-type:   #{img.get_type.inspect}
-width:  #{img.get_width.inspect}
-height: #{img.get_height.inspect}
-      EOF
-    end
-  end
-end
-
diff --git a/vendor/imagesize-0.1.1/lib/image_size/version.rb b/vendor/imagesize-0.1.1/lib/image_size/version.rb
deleted file mode 100644
index 6c4be82..0000000
--- a/vendor/imagesize-0.1.1/lib/image_size/version.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-module Imagesize #:nodoc:
-  module VERSION #:nodoc:
-    MAJOR = 0
-    MINOR = 1
-    TINY  = 1
-
-    STRING = [MAJOR, MINOR, TINY].join('.')
-  end
-end
diff --git a/vendor/imagesize-0.1.1/setup.rb b/vendor/imagesize-0.1.1/setup.rb
deleted file mode 100644
index 424a5f3..0000000
--- a/vendor/imagesize-0.1.1/setup.rb
+++ /dev/null
@@ -1,1585 +0,0 @@
-#
-# setup.rb
-#
-# Copyright (c) 2000-2005 Minero Aoki
-#
-# This program is free software.
-# You can distribute/modify this program under the terms of
-# the GNU LGPL, Lesser General Public License version 2.1.
-#
-
-unless Enumerable.method_defined?(:map)   # Ruby 1.4.6
-  module Enumerable
-    alias map collect
-  end
-end
-
-unless File.respond_to?(:read)   # Ruby 1.6
-  def File.read(fname)
-    open(fname) {|f|
-      return f.read
-    }
-  end
-end
-
-unless Errno.const_defined?(:ENOTEMPTY)   # Windows?
-  module Errno
-    class ENOTEMPTY
-      # We do not raise this exception, implementation is not needed.
-    end
-  end
-end
-
-def File.binread(fname)
-  open(fname, 'rb') {|f|
-    return f.read
-  }
-end
-
-# for corrupted Windows' stat(2)
-def File.dir?(path)
-  File.directory?((path[-1,1] == '/') ? path : path + '/')
-end
-
-
-class ConfigTable
-
-  include Enumerable
-
-  def initialize(rbconfig)
-    @rbconfig = rbconfig
-    @items = []
-    @table = {}
-    # options
-    @install_prefix = nil
-    @config_opt = nil
-    @verbose = true
-    @no_harm = false
-  end
-
-  attr_accessor :install_prefix
-  attr_accessor :config_opt
-
-  attr_writer :verbose
-
-  def verbose?
-    @verbose
-  end
-
-  attr_writer :no_harm
-
-  def no_harm?
-    @no_harm
-  end
-
-  def [](key)
-    lookup(key).resolve(self)
-  end
-
-  def []=(key, val)
-    lookup(key).set val
-  end
-
-  def names
-    @items.map {|i| i.name }
-  end
-
-  def each(&block)
-    @items.each(&block)
-  end
-
-  def key?(name)
-    @table.key?(name)
-  end
-
-  def lookup(name)
-    @table[name] or setup_rb_error "no such config item: #{name}"
-  end
-
-  def add(item)
-    @items.push item
-    @table[item.name] = item
-  end
-
-  def remove(name)
-    item = lookup(name)
-    @items.delete_if {|i| i.name == name }
-    @table.delete_if {|name, i| i.name == name }
-    item
-  end
-
-  def load_script(path, inst = nil)
-    if File.file?(path)
-      MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path
-    end
-  end
-
-  def savefile
-    '.config'
-  end
-
-  def load_savefile
-    begin
-      File.foreach(savefile()) do |line|
-        k, v = *line.split(/=/, 2)
-        self[k] = v.strip
-      end
-    rescue Errno::ENOENT
-      setup_rb_error $!.message + "\n#{File.basename($0)} config first"
-    end
-  end
-
-  def save
-    @items.each {|i| i.value }
-    File.open(savefile(), 'w') {|f|
-      @items.each do |i|
-        f.printf "%s=%s\n", i.name, i.value if i.value? and i.value
-      end
-    }
-  end
-
-  def load_standard_entries
-    standard_entries(@rbconfig).each do |ent|
-      add ent
-    end
-  end
-
-  def standard_entries(rbconfig)
-    c = rbconfig
-
-    rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT'])
-
-    major = c['MAJOR'].to_i
-    minor = c['MINOR'].to_i
-    teeny = c['TEENY'].to_i
-    version = "#{major}.#{minor}"
-
-    # ruby ver. >= 1.4.4?
-    newpath_p = ((major >= 2) or
-                 ((major == 1) and
-                  ((minor >= 5) or
-                   ((minor == 4) and (teeny >= 4)))))
-
-    if c['rubylibdir']
-      # V > 1.6.3
-      libruby         = "#{c['prefix']}/lib/ruby"
-      librubyver      = c['rubylibdir']
-      librubyverarch  = c['archdir']
-      siteruby        = c['sitedir']
-      siterubyver     = c['sitelibdir']
-      siterubyverarch = c['sitearchdir']
-    elsif newpath_p
-      # 1.4.4 <= V <= 1.6.3
-      libruby         = "#{c['prefix']}/lib/ruby"
-      librubyver      = "#{c['prefix']}/lib/ruby/#{version}"
-      librubyverarch  = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
-      siteruby        = c['sitedir']
-      siterubyver     = "$siteruby/#{version}"
-      siterubyverarch = "$siterubyver/#{c['arch']}"
-    else
-      # V < 1.4.4
-      libruby         = "#{c['prefix']}/lib/ruby"
-      librubyver      = "#{c['prefix']}/lib/ruby/#{version}"
-      librubyverarch  = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
-      siteruby        = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
-      siterubyver     = siteruby
-      siterubyverarch = "$siterubyver/#{c['arch']}"
-    end
-    parameterize = lambda {|path|
-      path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')
-    }
-
-    if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
-      makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
-    else
-      makeprog = 'make'
-    end
-
-    [
-      ExecItem.new('installdirs', 'std/site/home',
-                   'std: install under libruby; site: install under site_ruby; home: install under $HOME')\
-          {|val, table|
-            case val
-            when 'std'
-              table['rbdir'] = '$librubyver'
-              table['sodir'] = '$librubyverarch'
-            when 'site'
-              table['rbdir'] = '$siterubyver'
-              table['sodir'] = '$siterubyverarch'
-            when 'home'
-              setup_rb_error '$HOME was not set' unless ENV['HOME']
-              table['prefix'] = ENV['HOME']
-              table['rbdir'] = '$libdir/ruby'
-              table['sodir'] = '$libdir/ruby'
-            end
-          },
-      PathItem.new('prefix', 'path', c['prefix'],
-                   'path prefix of target environment'),
-      PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
-                   'the directory for commands'),
-      PathItem.new('libdir', 'path', parameterize.call(c['libdir']),
-                   'the directory for libraries'),
-      PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
-                   'the directory for shared data'),
-      PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
-                   'the directory for man pages'),
-      PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
-                   'the directory for system configuration files'),
-      PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']),
-                   'the directory for local state data'),
-      PathItem.new('libruby', 'path', libruby,
-                   'the directory for ruby libraries'),
-      PathItem.new('librubyver', 'path', librubyver,
-                   'the directory for standard ruby libraries'),
-      PathItem.new('librubyverarch', 'path', librubyverarch,
-                   'the directory for standard ruby extensions'),
-      PathItem.new('siteruby', 'path', siteruby,
-          'the directory for version-independent aux ruby libraries'),
-      PathItem.new('siterubyver', 'path', siterubyver,
-                   'the directory for aux ruby libraries'),
-      PathItem.new('siterubyverarch', 'path', siterubyverarch,
-                   'the directory for aux ruby binaries'),
-      PathItem.new('rbdir', 'path', '$siterubyver',
-                   'the directory for ruby scripts'),
-      PathItem.new('sodir', 'path', '$siterubyverarch',
-                   'the directory for ruby extentions'),
-      PathItem.new('rubypath', 'path', rubypath,
-                   'the path to set to #! line'),
-      ProgramItem.new('rubyprog', 'name', rubypath,
-                      'the ruby program using for installation'),
-      ProgramItem.new('makeprog', 'name', makeprog,
-                      'the make program to compile ruby extentions'),
-      SelectItem.new('shebang', 'all/ruby/never', 'ruby',
-                     'shebang line (#!) editing mode'),
-      BoolItem.new('without-ext', 'yes/no', 'no',
-                   'does not compile/install ruby extentions')
-    ]
-  end
-  private :standard_entries
-
-  def load_multipackage_entries
-    multipackage_entries().each do |ent|
-      add ent
-    end
-  end
-
-  def multipackage_entries
-    [
-      PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
-                               'package names that you want to install'),
-      PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
-                               'package names that you do not want to install')
-    ]
-  end
-  private :multipackage_entries
-
-  ALIASES = {
-    'std-ruby'         => 'librubyver',
-    'stdruby'          => 'librubyver',
-    'rubylibdir'       => 'librubyver',
-    'archdir'          => 'librubyverarch',
-    'site-ruby-common' => 'siteruby',     # For backward compatibility
-    'site-ruby'        => 'siterubyver',  # For backward compatibility
-    'bin-dir'          => 'bindir',
-    'bin-dir'          => 'bindir',
-    'rb-dir'           => 'rbdir',
-    'so-dir'           => 'sodir',
-    'data-dir'         => 'datadir',
-    'ruby-path'        => 'rubypath',
-    'ruby-prog'        => 'rubyprog',
-    'ruby'             => 'rubyprog',
-    'make-prog'        => 'makeprog',
-    'make'             => 'makeprog'
-  }
-
-  def fixup
-    ALIASES.each do |ali, name|
-      @table[ali] = @table[name]
-    end
-    @items.freeze
-    @table.freeze
-    @options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/
-  end
-
-  def parse_opt(opt)
-    m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}"
-    m.to_a[1,2]
-  end
-
-  def dllext
-    @rbconfig['DLEXT']
-  end
-
-  def value_config?(name)
-    lookup(name).value?
-  end
-
-  class Item
-    def initialize(name, template, default, desc)
-      @name = name.freeze
-      @template = template
-      @value = default
-      @default = default
-      @description = desc
-    end
-
-    attr_reader :name
-    attr_reader :description
-
-    attr_accessor :default
-    alias help_default default
-
-    def help_opt
-      "--#{@name}=#{@template}"
-    end
-
-    def value?
-      true
-    end
-
-    def value
-      @value
-    end
-
-    def resolve(table)
-      @value.gsub(%r<\$([^/]+)>) { table[$1] }
-    end
-
-    def set(val)
-      @value = check(val)
-    end
-
-    private
-
-    def check(val)
-      setup_rb_error "config: --#{name} requires argument" unless val
-      val
-    end
-  end
-
-  class BoolItem < Item
-    def config_type
-      'bool'
-    end
-
-    def help_opt
-      "--#{@name}"
-    end
-
-    private
-
-    def check(val)
-      return 'yes' unless val
-      case val
-      when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes'
-      when /\An(o)?\z/i, /\Af(alse)\z/i  then 'no'
-      else
-        setup_rb_error "config: --#{@name} accepts only yes/no for argument"
-      end
-    end
-  end
-
-  class PathItem < Item
-    def config_type
-      'path'
-    end
-
-    private
-
-    def check(path)
-      setup_rb_error "config: --#{@name} requires argument"  unless path
-      path[0,1] == '$' ? path : File.expand_path(path)
-    end
-  end
-
-  class ProgramItem < Item
-    def config_type
-      'program'
-    end
-  end
-
-  class SelectItem < Item
-    def initialize(name, selection, default, desc)
-      super
-      @ok = selection.split('/')
-    end
-
-    def config_type
-      'select'
-    end
-
-    private
-
-    def check(val)
-      unless @ok.include?(val.strip)
-        setup_rb_error "config: use --#{@name}=#{@template} (#{val})"
-      end
-      val.strip
-    end
-  end
-
-  class ExecItem < Item
-    def initialize(name, selection, desc, &block)
-      super name, selection, nil, desc
-      @ok = selection.split('/')
-      @action = block
-    end
-
-    def config_type
-      'exec'
-    end
-
-    def value?
-      false
-    end
-
-    def resolve(table)
-      setup_rb_error "$#{name()} wrongly used as option value"
-    end
-
-    undef set
-
-    def evaluate(val, table)
-      v = val.strip.downcase
-      unless @ok.include?(v)
-        setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})"
-      end
-      @action.call v, table
-    end
-  end
-
-  class PackageSelectionItem < Item
-    def initialize(name, template, default, help_default, desc)
-      super name, template, default, desc
-      @help_default = help_default
-    end
-
-    attr_reader :help_default
-
-    def config_type
-      'package'
-    end
-
-    private
-
-    def check(val)
-      unless File.dir?("packages/#{val}")
-        setup_rb_error "config: no such package: #{val}"
-      end
-      val
-    end
-  end
-
-  class MetaConfigEnvironment
-    def initialize(config, installer)
-      @config = config
-      @installer = installer
-    end
-
-    def config_names
-      @config.names
-    end
-
-    def config?(name)
-      @config.key?(name)
-    end
-
-    def bool_config?(name)
-      @config.lookup(name).config_type == 'bool'
-    end
-
-    def path_config?(name)
-      @config.lookup(name).config_type == 'path'
-    end
-
-    def value_config?(name)
-      @config.lookup(name).config_type != 'exec'
-    end
-
-    def add_config(item)
-      @config.add item
-    end
-
-    def add_bool_config(name, default, desc)
-      @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
-    end
-
-    def add_path_config(name, default, desc)
-      @config.add PathItem.new(name, 'path', default, desc)
-    end
-
-    def set_config_default(name, default)
-      @config.lookup(name).default = default
-    end
-
-    def remove_config(name)
-      @config.remove(name)
-    end
-
-    # For only multipackage
-    def packages
-      raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer
-      @installer.packages
-    end
-
-    # For only multipackage
-    def declare_packages(list)
-      raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer
-      @installer.packages = list
-    end
-  end
-
-end   # class ConfigTable
-
-
-# This module requires: #verbose?, #no_harm?
-module FileOperations
-
-  def mkdir_p(dirname, prefix = nil)
-    dirname = prefix + File.expand_path(dirname) if prefix
-    $stderr.puts "mkdir -p #{dirname}" if verbose?
-    return if no_harm?
-
-    # Does not check '/', it's too abnormal.
-    dirs = File.expand_path(dirname).split(%r<(?=/)>)
-    if /\A[a-z]:\z/i =~ dirs[0]
-      disk = dirs.shift
-      dirs[0] = disk + dirs[0]
-    end
-    dirs.each_index do |idx|
-      path = dirs[0..idx].join('')
-      Dir.mkdir path unless File.dir?(path)
-    end
-  end
-
-  def rm_f(path)
-    $stderr.puts "rm -f #{path}" if verbose?
-    return if no_harm?
-    force_remove_file path
-  end
-
-  def rm_rf(path)
-    $stderr.puts "rm -rf #{path}" if verbose?
-    return if no_harm?
-    remove_tree path
-  end
-
-  def remove_tree(path)
-    if File.symlink?(path)
-      remove_file path
-    elsif File.dir?(path)
-      remove_tree0 path
-    else
-      force_remove_file path
-    end
-  end
-
-  def remove_tree0(path)
-    Dir.foreach(path) do |ent|
-      next if ent == '.'
-      next if ent == '..'
-      entpath = "#{path}/#{ent}"
-      if File.symlink?(entpath)
-        remove_file entpath
-      elsif File.dir?(entpath)
-        remove_tree0 entpath
-      else
-        force_remove_file entpath
-      end
-    end
-    begin
-      Dir.rmdir path
-    rescue Errno::ENOTEMPTY
-      # directory may not be empty
-    end
-  end
-
-  def move_file(src, dest)
-    force_remove_file dest
-    begin
-      File.rename src, dest
-    rescue
-      File.open(dest, 'wb') {|f|
-        f.write File.binread(src)
-      }
-      File.chmod File.stat(src).mode, dest
-      File.unlink src
-    end
-  end
-
-  def force_remove_file(path)
-    begin
-      remove_file path
-    rescue
-    end
-  end
-
-  def remove_file(path)
-    File.chmod 0777, path
-    File.unlink path
-  end
-
-  def install(from, dest, mode, prefix = nil)
-    $stderr.puts "install #{from} #{dest}" if verbose?
-    return if no_harm?
-
-    realdest = prefix ? prefix + File.expand_path(dest) : dest
-    realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest)
-    str = File.binread(from)
-    if diff?(str, realdest)
-      verbose_off {
-        rm_f realdest if File.exist?(realdest)
-      }
-      File.open(realdest, 'wb') {|f|
-        f.write str
-      }
-      File.chmod mode, realdest
-
-      File.open("#{objdir_root()}/InstalledFiles", 'a') {|f|
-        if prefix
-          f.puts realdest.sub(prefix, '')
-        else
-          f.puts realdest
-        end
-      }
-    end
-  end
-
-  def diff?(new_content, path)
-    return true unless File.exist?(path)
-    new_content != File.binread(path)
-  end
-
-  def command(*args)
-    $stderr.puts args.join(' ') if verbose?
-    system(*args) or raise RuntimeError,
-        "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
-  end
-
-  def ruby(*args)
-    command config('rubyprog'), *args
-  end
-  
-  def make(task = nil)
-    command(*[config('makeprog'), task].compact)
-  end
-
-  def extdir?(dir)
-    File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb")
-  end
-
-  def files_of(dir)
-    Dir.open(dir) {|d|
-      return d.select {|ent| File.file?("#{dir}/#{ent}") }
-    }
-  end
-
-  DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn )
-
-  def directories_of(dir)
-    Dir.open(dir) {|d|
-      return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT
-    }
-  end
-
-end
-
-
-# This module requires: #srcdir_root, #objdir_root, #relpath
-module HookScriptAPI
-
-  def get_config(key)
-    @config[key]
-  end
-
-  alias config get_config
-
-  # obsolete: use metaconfig to change configuration
-  def set_config(key, val)
-    @config[key] = val
-  end
-
-  #
-  # srcdir/objdir (works only in the package directory)
-  #
-
-  def curr_srcdir
-    "#{srcdir_root()}/#{relpath()}"
-  end
-
-  def curr_objdir
-    "#{objdir_root()}/#{relpath()}"
-  end
-
-  def srcfile(path)
-    "#{curr_srcdir()}/#{path}"
-  end
-
-  def srcexist?(path)
-    File.exist?(srcfile(path))
-  end
-
-  def srcdirectory?(path)
-    File.dir?(srcfile(path))
-  end
-  
-  def srcfile?(path)
-    File.file?(srcfile(path))
-  end
-
-  def srcentries(path = '.')
-    Dir.open("#{curr_srcdir()}/#{path}") {|d|
-      return d.to_a - %w(. ..)
-    }
-  end
-
-  def srcfiles(path = '.')
-    srcentries(path).select {|fname|
-      File.file?(File.join(curr_srcdir(), path, fname))
-    }
-  end
-
-  def srcdirectories(path = '.')
-    srcentries(path).select {|fname|
-      File.dir?(File.join(curr_srcdir(), path, fname))
-    }
-  end
-
-end
-
-
-class ToplevelInstaller
-
-  Version   = '3.4.1'
-  Copyright = 'Copyright (c) 2000-2005 Minero Aoki'
-
-  TASKS = [
-    [ 'all',      'do config, setup, then install' ],
-    [ 'config',   'saves your configurations' ],
-    [ 'show',     'shows current configuration' ],
-    [ 'setup',    'compiles ruby extentions and others' ],
-    [ 'install',  'installs files' ],
-    [ 'test',     'run all tests in test/' ],
-    [ 'clean',    "does `make clean' for each extention" ],
-    [ 'distclean',"does `make distclean' for each extention" ]
-  ]
-
-  def ToplevelInstaller.invoke
-    config = ConfigTable.new(load_rbconfig())
-    config.load_standard_entries
-    config.load_multipackage_entries if multipackage?
-    config.fixup
-    klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller)
-    klass.new(File.dirname($0), config).invoke
-  end
-
-  def ToplevelInstaller.multipackage?
-    File.dir?(File.dirname($0) + '/packages')
-  end
-
-  def ToplevelInstaller.load_rbconfig
-    if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg }
-      ARGV.delete(arg)
-      load File.expand_path(arg.split(/=/, 2)[1])
-      $".push 'rbconfig.rb'
-    else
-      require 'rbconfig'
-    end
-    ::Config::CONFIG
-  end
-
-  def initialize(ardir_root, config)
-    @ardir = File.expand_path(ardir_root)
-    @config = config
-    # cache
-    @valid_task_re = nil
-  end
-
-  def config(key)
-    @config[key]
-  end
-
-  def inspect
-    "#<#{self.class} #{__id__()}>"
-  end
-
-  def invoke
-    run_metaconfigs
-    case task = parsearg_global()
-    when nil, 'all'
-      parsearg_config
-      init_installers
-      exec_config
-      exec_setup
-      exec_install
-    else
-      case task
-      when 'config', 'test'
-        ;
-      when 'clean', 'distclean'
-        @config.load_savefile if File.exist?(@config.savefile)
-      else
-        @config.load_savefile
-      end
-      __send__ "parsearg_#{task}"
-      init_installers
-      __send__ "exec_#{task}"
-    end
-  end
-  
-  def run_metaconfigs
-    @config.load_script "#{@ardir}/metaconfig"
-  end
-
-  def init_installers
-    @installer = Installer.new(@config, @ardir, File.expand_path('.'))
-  end
-
-  #
-  # Hook Script API bases
-  #
-
-  def srcdir_root
-    @ardir
-  end
-
-  def objdir_root
-    '.'
-  end
-
-  def relpath
-    '.'
-  end
-
-  #
-  # Option Parsing
-  #
-
-  def parsearg_global
-    while arg = ARGV.shift
-      case arg
-      when /\A\w+\z/
-        setup_rb_error "invalid task: #{arg}" unless valid_task?(arg)
-        return arg
-      when '-q', '--quiet'
-        @config.verbose = false
-      when '--verbose'
-        @config.verbose = true
-      when '--help'
-        print_usage $stdout
-        exit 0
-      when '--version'
-        puts "#{File.basename($0)} version #{Version}"
-        exit 0
-      when '--copyright'
-        puts Copyright
-        exit 0
-      else
-        setup_rb_error "unknown global option '#{arg}'"
-      end
-    end
-    nil
-  end
-
-  def valid_task?(t)
-    valid_task_re() =~ t
-  end
-
-  def valid_task_re
-    @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/
-  end
-
-  def parsearg_no_options
-    unless ARGV.empty?
-      task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1)
-      setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}"
-    end
-  end
-
-  alias parsearg_show       parsearg_no_options
-  alias parsearg_setup      parsearg_no_options
-  alias parsearg_test       parsearg_no_options
-  alias parsearg_clean      parsearg_no_options
-  alias parsearg_distclean  parsearg_no_options
-
-  def parsearg_config
-    evalopt = []
-    set = []
-    @config.config_opt = []
-    while i = ARGV.shift
-      if /\A--?\z/ =~ i
-        @config.config_opt = ARGV.dup
-        break
-      end
-      name, value = *@config.parse_opt(i)
-      if @config.value_config?(name)
-        @config[name] = value
-      else
-        evalopt.push [name, value]
-      end
-      set.push name
-    end
-    evalopt.each do |name, value|
-      @config.lookup(name).evaluate value, @config
-    end
-    # Check if configuration is valid
-    set.each do |n|
-      @config[n] if @config.value_config?(n)
-    end
-  end
-
-  def parsearg_install
-    @config.no_harm = false
-    @config.install_prefix = ''
-    while a = ARGV.shift
-      case a
-      when '--no-harm'
-        @config.no_harm = true
-      when /\A--prefix=/
-        path = a.split(/=/, 2)[1]
-        path = File.expand_path(path) unless path[0,1] == '/'
-        @config.install_prefix = path
-      else
-        setup_rb_error "install: unknown option #{a}"
-      end
-    end
-  end
-
-  def print_usage(out)
-    out.puts 'Typical Installation Procedure:'
-    out.puts "  $ ruby #{File.basename $0} config"
-    out.puts "  $ ruby #{File.basename $0} setup"
-    out.puts "  # ruby #{File.basename $0} install (may require root privilege)"
-    out.puts
-    out.puts 'Detailed Usage:'
-    out.puts "  ruby #{File.basename $0} <global option>"
-    out.puts "  ruby #{File.basename $0} [<global options>] <task> [<task options>]"
-
-    fmt = "  %-24s %s\n"
-    out.puts
-    out.puts 'Global options:'
-    out.printf fmt, '-q,--quiet',   'suppress message outputs'
-    out.printf fmt, '   --verbose', 'output messages verbosely'
-    out.printf fmt, '   --help',    'print this message'
-    out.printf fmt, '   --version', 'print version and quit'
-    out.printf fmt, '   --copyright',  'print copyright and quit'
-    out.puts
-    out.puts 'Tasks:'
-    TASKS.each do |name, desc|
-      out.printf fmt, name, desc
-    end
-
-    fmt = "  %-24s %s [%s]\n"
-    out.puts
-    out.puts 'Options for CONFIG or ALL:'
-    @config.each do |item|
-      out.printf fmt, item.help_opt, item.description, item.help_default
-    end
-    out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's"
-    out.puts
-    out.puts 'Options for INSTALL:'
-    out.printf fmt, '--no-harm', 'only display what to do if given', 'off'
-    out.printf fmt, '--prefix=path',  'install path prefix', ''
-    out.puts
-  end
-
-  #
-  # Task Handlers
-  #
-
-  def exec_config
-    @installer.exec_config
-    @config.save   # must be final
-  end
-
-  def exec_setup
-    @installer.exec_setup
-  end
-
-  def exec_install
-    @installer.exec_install
-  end
-
-  def exec_test
-    @installer.exec_test
-  end
-
-  def exec_show
-    @config.each do |i|
-      printf "%-20s %s\n", i.name, i.value if i.value?
-    end
-  end
-
-  def exec_clean
-    @installer.exec_clean
-  end
-
-  def exec_distclean
-    @installer.exec_distclean
-  end
-
-end   # class ToplevelInstaller
-
-
-class ToplevelInstallerMulti < ToplevelInstaller
-
-  include FileOperations
-
-  def initialize(ardir_root, config)
-    super
-    @packages = directories_of("#{@ardir}/packages")
-    raise 'no package exists' if @packages.empty?
-    @root_installer = Installer.new(@config, @ardir, File.expand_path('.'))
-  end
-
-  def run_metaconfigs
-    @config.load_script "#{@ardir}/metaconfig", self
-    @packages.each do |name|
-      @config.load_script "#{@ardir}/packages/#{name}/metaconfig"
-    end
-  end
-
-  attr_reader :packages
-
-  def packages=(list)
-    raise 'package list is empty' if list.empty?
-    list.each do |name|
-      raise "directory packages/#{name} does not exist"\
-              unless File.dir?("#{@ardir}/packages/#{name}")
-    end
-    @packages = list
-  end
-
-  def init_installers
-    @installers = {}
-    @packages.each do |pack|
-      @installers[pack] = Installer.new(@config,
-                                       "#{@ardir}/packages/#{pack}",
-                                       "packages/#{pack}")
-    end
-    with    = extract_selection(config('with'))
-    without = extract_selection(config('without'))
-    @selected = @installers.keys.select {|name|
-                  (with.empty? or with.include?(name)) \
-                      and not without.include?(name)
-                }
-  end
-
-  def extract_selection(list)
-    a = list.split(/,/)
-    a.each do |name|
-      setup_rb_error "no such package: #{name}"  unless @installers.key?(name)
-    end
-    a
-  end
-
-  def print_usage(f)
-    super
-    f.puts 'Inluded packages:'
-    f.puts '  ' + @packages.sort.join(' ')
-    f.puts
-  end
-
-  #
-  # Task Handlers
-  #
-
-  def exec_config
-    run_hook 'pre-config'
-    each_selected_installers {|inst| inst.exec_config }
-    run_hook 'post-config'
-    @config.save   # must be final
-  end
-
-  def exec_setup
-    run_hook 'pre-setup'
-    each_selected_installers {|inst| inst.exec_setup }
-    run_hook 'post-setup'
-  end
-
-  def exec_install
-    run_hook 'pre-install'
-    each_selected_installers {|inst| inst.exec_install }
-    run_hook 'post-install'
-  end
-
-  def exec_test
-    run_hook 'pre-test'
-    each_selected_installers {|inst| inst.exec_test }
-    run_hook 'post-test'
-  end
-
-  def exec_clean
-    rm_f @config.savefile
-    run_hook 'pre-clean'
-    each_selected_installers {|inst| inst.exec_clean }
-    run_hook 'post-clean'
-  end
-
-  def exec_distclean
-    rm_f @config.savefile
-    run_hook 'pre-distclean'
-    each_selected_installers {|inst| inst.exec_distclean }
-    run_hook 'post-distclean'
-  end
-
-  #
-  # lib
-  #
-
-  def each_selected_installers
-    Dir.mkdir 'packages' unless File.dir?('packages')
-    @selected.each do |pack|
-      $stderr.puts "Processing the package `#{pack}' ..." if verbose?
-      Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}")
-      Dir.chdir "packages/#{pack}"
-      yield @installers[pack]
-      Dir.chdir '../..'
-    end
-  end
-
-  def run_hook(id)
-    @root_installer.run_hook id
-  end
-
-  # module FileOperations requires this
-  def verbose?
-    @config.verbose?
-  end
-
-  # module FileOperations requires this
-  def no_harm?
-    @config.no_harm?
-  end
-
-end   # class ToplevelInstallerMulti
-
-
-class Installer
-
-  FILETYPES = %w( bin lib ext data conf man )
-
-  include FileOperations
-  include HookScriptAPI
-
-  def initialize(config, srcroot, objroot)
-    @config = config
-    @srcdir = File.expand_path(srcroot)
-    @objdir = File.expand_path(objroot)
-    @currdir = '.'
-  end
-
-  def inspect
-    "#<#{self.class} #{File.basename(@srcdir)}>"
-  end
-
-  def noop(rel)
-  end
-
-  #
-  # Hook Script API base methods
-  #
-
-  def srcdir_root
-    @srcdir
-  end
-
-  def objdir_root
-    @objdir
-  end
-
-  def relpath
-    @currdir
-  end
-
-  #
-  # Config Access
-  #
-
-  # module FileOperations requires this
-  def verbose?
-    @config.verbose?
-  end
-
-  # module FileOperations requires this
-  def no_harm?
-    @config.no_harm?
-  end
-
-  def verbose_off
-    begin
-      save, @config.verbose = @config.verbose?, false
-      yield
-    ensure
-      @config.verbose = save
-    end
-  end
-
-  #
-  # TASK config
-  #
-
-  def exec_config
-    exec_task_traverse 'config'
-  end
-
-  alias config_dir_bin noop
-  alias config_dir_lib noop
-
-  def config_dir_ext(rel)
-    extconf if extdir?(curr_srcdir())
-  end
-
-  alias config_dir_data noop
-  alias config_dir_conf noop
-  alias config_dir_man noop
-
-  def extconf
-    ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt
-  end
-
-  #
-  # TASK setup
-  #
-
-  def exec_setup
-    exec_task_traverse 'setup'
-  end
-
-  def setup_dir_bin(rel)
-    files_of(curr_srcdir()).each do |fname|
-      update_shebang_line "#{curr_srcdir()}/#{fname}"
-    end
-  end
-
-  alias setup_dir_lib noop
-
-  def setup_dir_ext(rel)
-    make if extdir?(curr_srcdir())
-  end
-
-  alias setup_dir_data noop
-  alias setup_dir_conf noop
-  alias setup_dir_man noop
-
-  def update_shebang_line(path)
-    return if no_harm?
-    return if config('shebang') == 'never'
-    old = Shebang.load(path)
-    if old
-      $stderr.puts "warning: #{path}: Shebang line includes too many args.  It is not portable and your program may not work." if old.args.size > 1
-      new = new_shebang(old)
-      return if new.to_s == old.to_s
-    else
-      return unless config('shebang') == 'all'
-      new = Shebang.new(config('rubypath'))
-    end
-    $stderr.puts "updating shebang: #{File.basename(path)}" if verbose?
-    open_atomic_writer(path) {|output|
-      File.open(path, 'rb') {|f|
-        f.gets if old   # discard
-        output.puts new.to_s
-        output.print f.read
-      }
-    }
-  end
-
-  def new_shebang(old)
-    if /\Aruby/ =~ File.basename(old.cmd)
-      Shebang.new(config('rubypath'), old.args)
-    elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby'
-      Shebang.new(config('rubypath'), old.args[1..-1])
-    else
-      return old unless config('shebang') == 'all'
-      Shebang.new(config('rubypath'))
-    end
-  end
-
-  def open_atomic_writer(path, &block)
-    tmpfile = File.basename(path) + '.tmp'
-    begin
-      File.open(tmpfile, 'wb', &block)
-      File.rename tmpfile, File.basename(path)
-    ensure
-      File.unlink tmpfile if File.exist?(tmpfile)
-    end
-  end
-
-  class Shebang
-    def Shebang.load(path)
-      line = nil
-      File.open(path) {|f|
-        line = f.gets
-      }
-      return nil unless /\A#!/ =~ line
-      parse(line)
-    end
-
-    def Shebang.parse(line)
-      cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ')
-      new(cmd, args)
-    end
-
-    def initialize(cmd, args = [])
-      @cmd = cmd
-      @args = args
-    end
-
-    attr_reader :cmd
-    attr_reader :args
-
-    def to_s
-      "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}")
-    end
-  end
-
-  #
-  # TASK install
-  #
-
-  def exec_install
-    rm_f 'InstalledFiles'
-    exec_task_traverse 'install'
-  end
-
-  def install_dir_bin(rel)
-    install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755
-  end
-
-  def install_dir_lib(rel)
-    install_files libfiles(), "#{config('rbdir')}/#{rel}", 0644
-  end
-
-  def install_dir_ext(rel)
-    return unless extdir?(curr_srcdir())
-    install_files rubyextentions('.'),
-                  "#{config('sodir')}/#{File.dirname(rel)}",
-                  0555
-  end
-
-  def install_dir_data(rel)
-    install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644
-  end
-
-  def install_dir_conf(rel)
-    # FIXME: should not remove current config files
-    # (rename previous file to .old/.org)
-    install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644
-  end
-
-  def install_dir_man(rel)
-    install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644
-  end
-
-  def install_files(list, dest, mode)
-    mkdir_p dest, @config.install_prefix
-    list.each do |fname|
-      install fname, dest, mode, @config.install_prefix
-    end
-  end
-
-  def libfiles
-    glob_reject(%w(*.y *.output), targetfiles())
-  end
-
-  def rubyextentions(dir)
-    ents = glob_select("*.#{@config.dllext}", targetfiles())
-    if ents.empty?
-      setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first"
-    end
-    ents
-  end
-
-  def targetfiles
-    mapdir(existfiles() - hookfiles())
-  end
-
-  def mapdir(ents)
-    ents.map {|ent|
-      if File.exist?(ent)
-      then ent                         # objdir
-      else "#{curr_srcdir()}/#{ent}"   # srcdir
-      end
-    }
-  end
-
-  # picked up many entries from cvs-1.11.1/src/ignore.c
-  JUNK_FILES = %w( 
-    core RCSLOG tags TAGS .make.state
-    .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb
-    *~ *.old *.bak *.BAK *.orig *.rej _$* *$
-
-    *.org *.in .*
-  )
-
-  def existfiles
-    glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.')))
-  end
-
-  def hookfiles
-    %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt|
-      %w( config setup install clean ).map {|t| sprintf(fmt, t) }
-    }.flatten
-  end
-
-  def glob_select(pat, ents)
-    re = globs2re([pat])
-    ents.select {|ent| re =~ ent }
-  end
-
-  def glob_reject(pats, ents)
-    re = globs2re(pats)
-    ents.reject {|ent| re =~ ent }
-  end
-
-  GLOB2REGEX = {
-    '.' => '\.',
-    '$' => '\$',
-    '#' => '\#',
-    '*' => '.*'
-  }
-
-  def globs2re(pats)
-    /\A(?:#{
-      pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|')
-    })\z/
-  end
-
-  #
-  # TASK test
-  #
-
-  TESTDIR = 'test'
-
-  def exec_test
-    unless File.directory?('test')
-      $stderr.puts 'no test in this package' if verbose?
-      return
-    end
-    $stderr.puts 'Running tests...' if verbose?
-    begin
-      require 'test/unit'
-    rescue LoadError
-      setup_rb_error 'test/unit cannot loaded.  You need Ruby 1.8 or later to invoke this task.'
-    end
-    runner = Test::Unit::AutoRunner.new(true)
-    runner.to_run << TESTDIR
-    runner.run
-  end
-
-  #
-  # TASK clean
-  #
-
-  def exec_clean
-    exec_task_traverse 'clean'
-    rm_f @config.savefile
-    rm_f 'InstalledFiles'
-  end
-
-  alias clean_dir_bin noop
-  alias clean_dir_lib noop
-  alias clean_dir_data noop
-  alias clean_dir_conf noop
-  alias clean_dir_man noop
-
-  def clean_dir_ext(rel)
-    return unless extdir?(curr_srcdir())
-    make 'clean' if File.file?('Makefile')
-  end
-
-  #
-  # TASK distclean
-  #
-
-  def exec_distclean
-    exec_task_traverse 'distclean'
-    rm_f @config.savefile
-    rm_f 'InstalledFiles'
-  end
-
-  alias distclean_dir_bin noop
-  alias distclean_dir_lib noop
-
-  def distclean_dir_ext(rel)
-    return unless extdir?(curr_srcdir())
-    make 'distclean' if File.file?('Makefile')
-  end
-
-  alias distclean_dir_data noop
-  alias distclean_dir_conf noop
-  alias distclean_dir_man noop
-
-  #
-  # Traversing
-  #
-
-  def exec_task_traverse(task)
-    run_hook "pre-#{task}"
-    FILETYPES.each do |type|
-      if type == 'ext' and config('without-ext') == 'yes'
-        $stderr.puts 'skipping ext/* by user option' if verbose?
-        next
-      end
-      traverse task, type, "#{task}_dir_#{type}"
-    end
-    run_hook "post-#{task}"
-  end
-
-  def traverse(task, rel, mid)
-    dive_into(rel) {
-      run_hook "pre-#{task}"
-      __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')
-      directories_of(curr_srcdir()).each do |d|
-        traverse task, "#{rel}/#{d}", mid
-      end
-      run_hook "post-#{task}"
-    }
-  end
-
-  def dive_into(rel)
-    return unless File.dir?("#{@srcdir}/#{rel}")
-
-    dir = File.basename(rel)
-    Dir.mkdir dir unless File.dir?(dir)
-    prevdir = Dir.pwd
-    Dir.chdir dir
-    $stderr.puts '---> ' + rel if verbose?
-    @currdir = rel
-    yield
-    Dir.chdir prevdir
-    $stderr.puts '<--- ' + rel if verbose?
-    @currdir = File.dirname(rel)
-  end
-
-  def run_hook(id)
-    path = [ "#{curr_srcdir()}/#{id}",
-             "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) }
-    return unless path
-    begin
-      instance_eval File.read(path), path, 1
-    rescue
-      raise if $DEBUG
-      setup_rb_error "hook #{path} failed:\n" + $!.message
-    end
-  end
-
-end   # class Installer
-
-
-class SetupError < StandardError; end
-
-def setup_rb_error(msg)
-  raise SetupError, msg
-end
-
-if $0 == __FILE__
-  begin
-    ToplevelInstaller.invoke
-  rescue SetupError
-    raise if $DEBUG
-    $stderr.puts $!.message
-    $stderr.puts "Try 'ruby #{$0} --help' for detailed usage."
-    exit 1
-  end
-end
diff --git a/vendor/imagesize-0.1.1/test/2-4-7.png b/vendor/imagesize-0.1.1/test/2-4-7.png
deleted file mode 100644
index cc14a31..0000000
Binary files a/vendor/imagesize-0.1.1/test/2-4-7.png and /dev/null differ
diff --git a/vendor/imagesize-0.1.1/test/4_1_2.gif b/vendor/imagesize-0.1.1/test/4_1_2.gif
deleted file mode 100644
index 2374a13..0000000
Binary files a/vendor/imagesize-0.1.1/test/4_1_2.gif and /dev/null differ
diff --git a/vendor/imagesize-0.1.1/test/bmp.bmp b/vendor/imagesize-0.1.1/test/bmp.bmp
deleted file mode 100644
index 7fc6e9d..0000000
Binary files a/vendor/imagesize-0.1.1/test/bmp.bmp and /dev/null differ
diff --git a/vendor/imagesize-0.1.1/test/cursor.xbm b/vendor/imagesize-0.1.1/test/cursor.xbm
deleted file mode 100644
index f9d1853..0000000
--- a/vendor/imagesize-0.1.1/test/cursor.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define cursor_width 16
-#define cursor_height 16
-static unsigned char cursor_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x84, 0x10, 0xe8, 0x0b, 0x90, 0x04,
-   0xa8, 0x0a, 0x88, 0x08, 0xfe, 0x3f, 0x88, 0x08, 0xa8, 0x0a, 0x90, 0x04,
-   0xe8, 0x0b, 0x84, 0x10, 0x80, 0x00, 0x00, 0x00};
diff --git a/vendor/imagesize-0.1.1/test/detect.swf b/vendor/imagesize-0.1.1/test/detect.swf
deleted file mode 100644
index 14f4438..0000000
Binary files a/vendor/imagesize-0.1.1/test/detect.swf and /dev/null differ
diff --git a/vendor/imagesize-0.1.1/test/pbm.pbm b/vendor/imagesize-0.1.1/test/pbm.pbm
deleted file mode 100644
index f61ccf5..0000000
Binary files a/vendor/imagesize-0.1.1/test/pbm.pbm and /dev/null differ
diff --git a/vendor/imagesize-0.1.1/test/pcx.pcx b/vendor/imagesize-0.1.1/test/pcx.pcx
deleted file mode 100644
index 4796cb6..0000000
Binary files a/vendor/imagesize-0.1.1/test/pcx.pcx and /dev/null differ
diff --git a/vendor/imagesize-0.1.1/test/pgm.pgm b/vendor/imagesize-0.1.1/test/pgm.pgm
deleted file mode 100644
index 8fdff82..0000000
--- a/vendor/imagesize-0.1.1/test/pgm.pgm
+++ /dev/null
@@ -1,5 +0,0 @@
-P5
-#Created with The GIMP
-90 55
-255
-������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ [...]
\ No newline at end of file
diff --git a/vendor/imagesize-0.1.1/test/test.xpm b/vendor/imagesize-0.1.1/test/test.xpm
deleted file mode 100644
index 5b3b702..0000000
--- a/vendor/imagesize-0.1.1/test/test.xpm
+++ /dev/null
@@ -1,38 +0,0 @@
-/* XPM */
-static char * sample2_xpm[] = {
-"32 32 3 1",
-" 	c None",
-".	c #FFFFFF",
-"+	c #FF0000",
-"................................",
-"................................",
-"................................",
-"................................",
-"................................",
-"................................",
-"......++..................++....",
-"......+++................+++....",
-".......+++..............+++.....",
-"........+++............+++......",
-".........+++..........+++.......",
-"..........+++........+++........",
-"...........+++......+++.........",
-"............+++....+++..........",
-".............+++..+++...........",
-"..............++++++............",
-"...............++++.............",
-"................+++.............",
-"...............+++++............",
-"..............+++.+++...........",
-".............+++...+++..........",
-"............+++.....+++.........",
-"...........+++.......+++........",
-"..........+++.........+++.......",
-".........+++...........+++......",
-"........+++.............+++.....",
-".......+++...............+++....",
-"......+++.................+++...",
-"......++...................++...",
-"................................",
-"................................",
-"................................"};
diff --git a/vendor/imagesize-0.1.1/test/test_helper.rb b/vendor/imagesize-0.1.1/test/test_helper.rb
deleted file mode 100644
index f63e92b..0000000
--- a/vendor/imagesize-0.1.1/test/test_helper.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-require 'test/unit'
-require File.dirname(__FILE__) + '/../lib/image_size'
diff --git a/vendor/imagesize-0.1.1/test/test_image_size.rb b/vendor/imagesize-0.1.1/test/test_image_size.rb
deleted file mode 100644
index e04cd39..0000000
--- a/vendor/imagesize-0.1.1/test/test_image_size.rb
+++ /dev/null
@@ -1,71 +0,0 @@
-require File.dirname(__FILE__) + '/test_helper.rb'
-
-class TestImageSize < Test::Unit::TestCase
-
-	def setup
-		@files = ['4_1_2.gif', '2-4-7.png', 'tokyo_tower.jpg', 'bmp.bmp', 
-		          'ppm.ppm', 'pgm.pgm', 'pbm.pbm', 
-		          'cursor.xbm', 'tiff.tiff', 'test.xpm', 
-		          'tower_e.gif.psd', 'pcx.pcx', 'detect.swf']
-		@results = [
-		  ['GIF' ,668,481],
-		  ['PNG' ,640,532],
-		  ['JPEG',320,240],
-		  ['BMP' , 50, 50],
-		  ['PPM' , 80, 50],
-		  ['PGM' , 90, 55],
-		  ['PBM' , 85, 55],
-		  ['XBM' , 16, 16],
-		  ['TIFF', 64, 64],
-		  ['XPM' , 32, 32],
-		  ['PSD' , 20, 20],
-		  ['PCX' , 70, 60],
-		  ['SWF' ,450,200],
-		]
-	end
-
-	def teardown
-	end
-
-	def test_0_string
-#		puts "\n" if $VERBOSE
-
-		@files.each_index do |i|
-			file = @files[i]
-			result = @results[i]
-
-			open("test/#{file}", "rb") do |fh|
-				img_data = fh.read
-#				puts "file  =#{file}" if $VERBOSE
-
-				img = ImageSize.new(img_data, result[0])
-
-				assert_equal(result[1], img.get_width)
-				assert_equal(result[2], img.get_height)
-
-				img = ImageSize.new(img_data)
-				assert_equal(result[0], img.get_type)
-				assert_equal(result[1], img.get_width)
-				assert_equal(result[2], img.get_height)
-			end
-		end
-	end
-
-	def test_1_io
-#		puts "\n" if $VERBOSE
-
-		@files.each_index do |i|
-			file = @files[i]
-			result = @results[i]
-
-			open("test/#{file}", "rb") do |fh|
-#				puts "file  =#{file}" if $VERBOSE
-
-				img = ImageSize.new(fh)
-				assert_equal(result[0], img.get_type)
-				assert_equal(result[1], img.get_width)
-				assert_equal(result[2], img.get_height)
-			end
-		end
-	end
-end
diff --git a/vendor/imagesize-0.1.1/test/tiff.tiff b/vendor/imagesize-0.1.1/test/tiff.tiff
deleted file mode 100644
index b95e444..0000000
Binary files a/vendor/imagesize-0.1.1/test/tiff.tiff and /dev/null differ
diff --git a/vendor/imagesize-0.1.1/test/tokyo_tower.jpg b/vendor/imagesize-0.1.1/test/tokyo_tower.jpg
deleted file mode 100644
index bcedafd..0000000
Binary files a/vendor/imagesize-0.1.1/test/tokyo_tower.jpg and /dev/null differ
diff --git a/vendor/imagesize-0.1.1/test/tower_e.gif.psd b/vendor/imagesize-0.1.1/test/tower_e.gif.psd
deleted file mode 100644
index 3018957..0000000
Binary files a/vendor/imagesize-0.1.1/test/tower_e.gif.psd and /dev/null differ
diff --git a/vendor/jasmine-jquery-1.4.2/jasmine-jquery.js b/vendor/jasmine-jquery-1.4.2/jasmine-jquery.js
deleted file mode 100644
index 19b7fb1..0000000
--- a/vendor/jasmine-jquery-1.4.2/jasmine-jquery.js
+++ /dev/null
@@ -1,548 +0,0 @@
-var readFixtures = function() {
-  return jasmine.getFixtures().proxyCallTo_('read', arguments)
-}
-
-var preloadFixtures = function() {
-  jasmine.getFixtures().proxyCallTo_('preload', arguments)
-}
-
-var loadFixtures = function() {
-  jasmine.getFixtures().proxyCallTo_('load', arguments)
-}
-
-var appendLoadFixtures = function() {
-  jasmine.getFixtures().proxyCallTo_('appendLoad', arguments)
-}
-
-var setFixtures = function(html) {
-  jasmine.getFixtures().proxyCallTo_('set', arguments)
-}
-
-var appendSetFixtures = function() {
-  jasmine.getFixtures().proxyCallTo_('appendSet', arguments)
-}
-
-var sandbox = function(attributes) {
-  return jasmine.getFixtures().sandbox(attributes)
-}
-
-var spyOnEvent = function(selector, eventName) {
-  return jasmine.JQuery.events.spyOn(selector, eventName)
-}
-
-var preloadStyleFixtures = function() {
-  jasmine.getStyleFixtures().proxyCallTo_('preload', arguments)
-}
-
-var loadStyleFixtures = function() {
-  jasmine.getStyleFixtures().proxyCallTo_('load', arguments)
-}
-
-var appendLoadStyleFixtures = function() {
-  jasmine.getStyleFixtures().proxyCallTo_('appendLoad', arguments)
-}
-
-var setStyleFixtures = function(html) {
-  jasmine.getStyleFixtures().proxyCallTo_('set', arguments)
-}
-
-var appendSetStyleFixtures = function(html) {
-  jasmine.getStyleFixtures().proxyCallTo_('appendSet', arguments)
-}
-
-var loadJSONFixtures = function() {
-  return jasmine.getJSONFixtures().proxyCallTo_('load', arguments)
-}
-
-var getJSONFixture = function(url) {
-  return jasmine.getJSONFixtures().proxyCallTo_('read', arguments)[url]
-}
-
-jasmine.spiedEventsKey = function (selector, eventName) {
-  return [$(selector).selector, eventName].toString()
-}
-
-jasmine.getFixtures = function() {
-  return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures()
-}
-
-jasmine.getStyleFixtures = function() {
-  return jasmine.currentStyleFixtures_ = jasmine.currentStyleFixtures_ || new jasmine.StyleFixtures()
-}
-
-jasmine.Fixtures = function() {
-  this.containerId = 'jasmine-fixtures'
-  this.fixturesCache_ = {}
-  this.fixturesPath = 'spec/javascripts/fixtures'
-}
-
-jasmine.Fixtures.prototype.set = function(html) {
-  this.cleanUp()
-  this.createContainer_(html)
-}
-
-jasmine.Fixtures.prototype.appendSet= function(html) {
-  this.addToContainer_(html)
-}
-
-jasmine.Fixtures.prototype.preload = function() {
-  this.read.apply(this, arguments)
-}
-
-jasmine.Fixtures.prototype.load = function() {
-  this.cleanUp()
-  this.createContainer_(this.read.apply(this, arguments))
-}
-
-jasmine.Fixtures.prototype.appendLoad = function() {
-  this.addToContainer_(this.read.apply(this, arguments))
-}
-
-jasmine.Fixtures.prototype.read = function() {
-  var htmlChunks = []
-
-  var fixtureUrls = arguments
-  for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
-    htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex]))
-  }
-
-  return htmlChunks.join('')
-}
-
-jasmine.Fixtures.prototype.clearCache = function() {
-  this.fixturesCache_ = {}
-}
-
-jasmine.Fixtures.prototype.cleanUp = function() {
-  jQuery('#' + this.containerId).remove()
-}
-
-jasmine.Fixtures.prototype.sandbox = function(attributes) {
-  var attributesToSet = attributes || {}
-  return jQuery('<div id="sandbox" />').attr(attributesToSet)
-}
-
-jasmine.Fixtures.prototype.createContainer_ = function(html) {
-  var container
-  if(html instanceof jQuery) {
-    container = jQuery('<div id="' + this.containerId + '" />')
-    container.html(html)
-  } else {
-    container = '<div id="' + this.containerId + '">' + html + '</div>'
-  }
-  jQuery('body').append(container)
-}
-
-jasmine.Fixtures.prototype.addToContainer_ = function(html){
-  var container = jQuery('body').find('#'+this.containerId).append(html)
-  if(!container.length){
-    this.createContainer_(html)
-  }
-}
-
-jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) {
-  if (typeof this.fixturesCache_[url] === 'undefined') {
-    this.loadFixtureIntoCache_(url)
-  }
-  return this.fixturesCache_[url]
-}
-
-jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
-  var url = this.makeFixtureUrl_(relativeUrl)
-  var request = jQuery.ajax({
-    type: "GET",
-    url: url + "?" + new Date().getTime(),
-    async: false
-  })
-  this.fixturesCache_[relativeUrl] = request.responseText
-}
-
-jasmine.Fixtures.prototype.makeFixtureUrl_ = function(relativeUrl){
-  return this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl
-}
-
-jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
-  return this[methodName].apply(this, passedArguments)
-}
-
-
-jasmine.StyleFixtures = function() {
-  this.fixturesCache_ = {}
-  this.fixturesNodes_ = []
-  this.fixturesPath = 'spec/javascripts/fixtures'
-}
-
-jasmine.StyleFixtures.prototype.set = function(css) {
-  this.cleanUp()
-  this.createStyle_(css)
-}
-
-jasmine.StyleFixtures.prototype.appendSet = function(css) {
-  this.createStyle_(css)
-}
-
-jasmine.StyleFixtures.prototype.preload = function() {
-  this.read_.apply(this, arguments)
-}
-
-jasmine.StyleFixtures.prototype.load = function() {
-  this.cleanUp()
-  this.createStyle_(this.read_.apply(this, arguments))
-}
-
-jasmine.StyleFixtures.prototype.appendLoad = function() {
-  this.createStyle_(this.read_.apply(this, arguments))
-}
-
-jasmine.StyleFixtures.prototype.cleanUp = function() {
-  while(this.fixturesNodes_.length) {
-    this.fixturesNodes_.pop().remove()
-  }
-}
-
-jasmine.StyleFixtures.prototype.createStyle_ = function(html) {
-  var style = jQuery('<style></style>').text(html)
-
-  this.fixturesNodes_.push(style)
-
-  jQuery('head').append(style)
-}
-
-jasmine.StyleFixtures.prototype.clearCache = jasmine.Fixtures.prototype.clearCache
-
-jasmine.StyleFixtures.prototype.read_ = jasmine.Fixtures.prototype.read
-
-jasmine.StyleFixtures.prototype.getFixtureHtml_ = jasmine.Fixtures.prototype.getFixtureHtml_
-
-jasmine.StyleFixtures.prototype.loadFixtureIntoCache_ = jasmine.Fixtures.prototype.loadFixtureIntoCache_
-
-jasmine.StyleFixtures.prototype.makeFixtureUrl_ = jasmine.Fixtures.prototype.makeFixtureUrl_
-
-jasmine.StyleFixtures.prototype.proxyCallTo_ = jasmine.Fixtures.prototype.proxyCallTo_
-
-/** jasmine json fixtures */
-
-jasmine.getJSONFixtures = function() {
-  return jasmine.currentJSONFixtures_ = jasmine.currentJSONFixtures_ || new jasmine.JSONFixtures()
-}
-
-jasmine.JSONFixtures = function() {
-  this.fixturesCache_ = {}
-  this.fixturesPath = 'spec/javascripts/fixtures/json'
-}
-
-jasmine.JSONFixtures.prototype.load = function() {
-  this.read.apply(this, arguments)
-  return this.fixturesCache_
-}
-
-jasmine.JSONFixtures.prototype.read = function() {
-  var fixtureUrls = arguments
-  for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
-    this.getFixtureData_(fixtureUrls[urlIndex])
-  }
-  return this.fixturesCache_
-}
-
-jasmine.JSONFixtures.prototype.clearCache = function() {
-  this.fixturesCache_ = {}
-}
-
-jasmine.JSONFixtures.prototype.getFixtureData_ = function(url) {  
-  this.loadFixtureIntoCache_(url)
-  return this.fixturesCache_[url]
-}
-
-jasmine.JSONFixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
-  var self = this
-  var url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl
-  jQuery.ajax({
-    async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
-    cache: false,
-    dataType: 'json',
-    url: url,
-    success: function(data) {
-      console.log("Loading data into " + relativeUrl)
-      self.fixturesCache_[relativeUrl] = data
-    },
-    error: function(jqXHR, status, errorThrown) {
-        throw Error('JSONFixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')')
-    }
-  })
-}
-
-jasmine.JSONFixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
-  return this[methodName].apply(this, passedArguments)
-}
-
-jasmine.JQuery = function() {}
-
-jasmine.JQuery.browserTagCaseIndependentHtml = function(html) {
-  return jQuery('<div/>').append(html).html()
-}
-
-jasmine.JQuery.elementToString = function(element) {
-  var domEl = $(element).get(0)
-  if (domEl == undefined || domEl.cloneNode)
-    return jQuery('<div />').append($(element).clone()).html()
-  else
-    return element.toString()
-}
-
-jasmine.JQuery.matchersClass = {}
-
-!function(namespace) {
-  var data = {
-    spiedEvents: {},
-    handlers:    []
-  }
-
-  namespace.events = {
-    spyOn: function(selector, eventName) {
-      var handler = function(e) {
-        data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)] = e
-      }
-      jQuery(selector).bind(eventName, handler)
-      data.handlers.push(handler)
-      return {
-        selector: selector,
-        eventName: eventName,
-        handler: handler,
-        reset: function(){
-          delete data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)]
-        }
-      }
-    },
-
-    wasTriggered: function(selector, eventName) {
-      return !!(data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)])
-    },
-
-    wasPrevented: function(selector, eventName) {
-      return data.spiedEvents[jasmine.spiedEventsKey(selector, eventName)].isDefaultPrevented()
-    },
-
-    cleanUp: function() {
-      data.spiedEvents = {}
-      data.handlers    = []
-    }
-  }
-}(jasmine.JQuery)
-
-!function(){
-  var jQueryMatchers = {
-    toHaveClass: function(className) {
-      return this.actual.hasClass(className)
-    },
-
-    toHaveCss: function(css){
-      for (var prop in css){
-        if (this.actual.css(prop) !== css[prop]) return false
-      }
-      return true
-    },
-
-    toBeVisible: function() {
-      return this.actual.is(':visible')
-    },
-
-    toBeHidden: function() {
-      return this.actual.is(':hidden')
-    },
-
-    toBeSelected: function() {
-      return this.actual.is(':selected')
-    },
-
-    toBeChecked: function() {
-      return this.actual.is(':checked')
-    },
-
-    toBeEmpty: function() {
-      return this.actual.is(':empty')
-    },
-
-    toExist: function() {
-      return $(document).find(this.actual).length
-    },
-
-    toHaveAttr: function(attributeName, expectedAttributeValue) {
-      return hasProperty(this.actual.attr(attributeName), expectedAttributeValue)
-    },
-
-    toHaveProp: function(propertyName, expectedPropertyValue) {
-      return hasProperty(this.actual.prop(propertyName), expectedPropertyValue)
-    },
-
-    toHaveId: function(id) {
-      return this.actual.attr('id') == id
-    },
-
-    toHaveHtml: function(html) {
-      return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html)
-    },
-
-    toContainHtml: function(html){
-      var actualHtml = this.actual.html()
-      var expectedHtml = jasmine.JQuery.browserTagCaseIndependentHtml(html)
-      return (actualHtml.indexOf(expectedHtml) >= 0)
-    },
-
-    toHaveText: function(text) {
-      var trimmedText = $.trim(this.actual.text())
-      if (text && jQuery.isFunction(text.test)) {
-        return text.test(trimmedText)
-      } else {
-        return trimmedText == text
-      }
-    },
-
-    toHaveValue: function(value) {
-      return this.actual.val() == value
-    },
-
-    toHaveData: function(key, expectedValue) {
-      return hasProperty(this.actual.data(key), expectedValue)
-    },
-
-    toBe: function(selector) {
-      return this.actual.is(selector)
-    },
-
-    toContain: function(selector) {
-      return this.actual.find(selector).length
-    },
-
-    toBeDisabled: function(selector){
-      return this.actual.is(':disabled')
-    },
-
-    toBeFocused: function(selector) {
-      return this.actual.is(':focus')
-    },
-
-    toHandle: function(event) {
-
-      var events = $._data(this.actual.get(0), "events")
-
-      if(!events || !event || typeof event !== "string") {
-        return false
-      }
-
-      var namespaces = event.split(".")
-      var eventType = namespaces.shift()
-      var sortedNamespaces = namespaces.slice(0).sort()
-      var namespaceRegExp = new RegExp("(^|\\.)" + sortedNamespaces.join("\\.(?:.*\\.)?") + "(\\.|$)")
-
-      if(events[eventType] && namespaces.length) {
-        for(var i = 0; i < events[eventType].length; i++) {
-          var namespace = events[eventType][i].namespace
-          if(namespaceRegExp.test(namespace)) {
-            return true
-          }
-        }
-      } else {
-        return events[eventType] && events[eventType].length > 0
-      }
-    },
-
-    // tests the existence of a specific event binding + handler
-    toHandleWith: function(eventName, eventHandler) {
-      var stack = $._data(this.actual.get(0), "events")[eventName]
-      for (var i = 0; i < stack.length; i++) {
-        if (stack[i].handler == eventHandler) return true
-      }
-      return false
-    }
-  }
-
-  var hasProperty = function(actualValue, expectedValue) {
-    if (expectedValue === undefined) return actualValue !== undefined
-    return actualValue == expectedValue
-  }
-
-  var bindMatcher = function(methodName) {
-    var builtInMatcher = jasmine.Matchers.prototype[methodName]
-
-    jasmine.JQuery.matchersClass[methodName] = function() {
-      if (this.actual
-        && (this.actual instanceof jQuery
-          || jasmine.isDomNode(this.actual))) {
-            this.actual = $(this.actual)
-            var result = jQueryMatchers[methodName].apply(this, arguments)
-            var element
-            if (this.actual.get && (element = this.actual.get()[0]) && !$.isWindow(element) && element.tagName !== "HTML")
-              this.actual = jasmine.JQuery.elementToString(this.actual)
-            return result
-          }
-
-          if (builtInMatcher) {
-            return builtInMatcher.apply(this, arguments)
-          }
-
-          return false
-    }
-  }
-
-  for(var methodName in jQueryMatchers) {
-    bindMatcher(methodName)
-  }
-}()
-
-beforeEach(function() {
-  this.addMatchers(jasmine.JQuery.matchersClass)
-  this.addMatchers({
-    toHaveBeenTriggeredOn: function(selector) {
-      this.message = function() {
-        return [
-          "Expected event " + this.actual + " to have been triggered on " + selector,
-          "Expected event " + this.actual + " not to have been triggered on " + selector
-        ]
-      }
-      return jasmine.JQuery.events.wasTriggered(selector, this.actual)
-    }
-  })
-  this.addMatchers({
-    toHaveBeenTriggered: function(){
-      var eventName = this.actual.eventName,
-          selector = this.actual.selector
-      this.message = function() {
-        return [
-          "Expected event " + eventName + " to have been triggered on " + selector,
-          "Expected event " + eventName + " not to have been triggered on " + selector
-        ]
-      }
-      return jasmine.JQuery.events.wasTriggered(selector, eventName)
-     }
-  })
-  this.addMatchers({
-    toHaveBeenPreventedOn: function(selector) {
-      this.message = function() {
-        return [
-          "Expected event " + this.actual + " to have been prevented on " + selector,
-          "Expected event " + this.actual + " not to have been prevented on " + selector
-        ]
-      }
-      return jasmine.JQuery.events.wasPrevented(selector, this.actual)
-    }
-  })
-  this.addMatchers({
-    toHaveBeenPrevented: function() {
-      var eventName = this.actual.eventName,
-          selector = this.actual.selector
-      this.message = function() {
-        return [
-          "Expected event " + eventName + " to have been prevented on " + selector,
-          "Expected event " + eventName + " not to have been prevented on " + selector
-        ]
-      }
-      return jasmine.JQuery.events.wasPrevented(selector, eventName)
-    }
-  })
-})
-
-afterEach(function() {
-  jasmine.getFixtures().cleanUp()
-  jasmine.getStyleFixtures().cleanUp()
-  jasmine.JQuery.events.cleanUp()
-})
diff --git a/vendor/jquery-1.8/jquery.js b/vendor/jquery-1.8/jquery.js
deleted file mode 100644
index 0770682..0000000
--- a/vendor/jquery-1.8/jquery.js
+++ /dev/null
@@ -1,9227 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.8.0
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: Thu Aug 09 2012 16:24:48 GMT-0400 (Eastern Daylight Time)
- */
-(function( window, undefined ) {
-var
-	// A central reference to the root jQuery(document)
-	rootjQuery,
-
-	// The deferred used on DOM ready
-	readyList,
-
-	// Use the correct document accordingly with window argument (sandbox)
-	document = window.document,
-	location = window.location,
-	navigator = window.navigator,
-
-	// Map over jQuery in case of overwrite
-	_jQuery = window.jQuery,
-
-	// Map over the $ in case of overwrite
-	_$ = window.$,
-
-	// Save a reference to some core methods
-	core_push = Array.prototype.push,
-	core_slice = Array.prototype.slice,
-	core_indexOf = Array.prototype.indexOf,
-	core_toString = Object.prototype.toString,
-	core_hasOwn = Object.prototype.hasOwnProperty,
-	core_trim = String.prototype.trim,
-
-	// Define a local copy of jQuery
-	jQuery = function( selector, context ) {
-		// The jQuery object is actually just the init constructor 'enhanced'
-		return new jQuery.fn.init( selector, context, rootjQuery );
-	},
-
-	// Used for matching numbers
-	core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
-
-	// Used for detecting and trimming whitespace
-	core_rnotwhite = /\S/,
-	core_rspace = /\s+/,
-
-	// IE doesn't match non-breaking spaces with \s
-	rtrim = core_rnotwhite.test("\xA0") ? (/^[\s\xA0]+|[\s\xA0]+$/g) : /^\s+|\s+$/g,
-
-	// A simple way to check for HTML strings
-	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-	rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
-	// Match a standalone tag
-	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
-
-	// JSON RegExp
-	rvalidchars = /^[\],:{}\s]*$/,
-	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
-	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
-
-	// Matches dashed string for camelizing
-	rmsPrefix = /^-ms-/,
-	rdashAlpha = /-([\da-z])/gi,
-
-	// Used by jQuery.camelCase as callback to replace()
-	fcamelCase = function( all, letter ) {
-		return ( letter + "" ).toUpperCase();
-	},
-
-	// The ready event handler and self cleanup method
-	DOMContentLoaded = function() {
-		if ( document.addEventListener ) {
-			document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-			jQuery.ready();
-		} else if ( document.readyState === "complete" ) {
-			// we're here because readyState === "complete" in oldIE
-			// which is good enough for us to call the dom ready!
-			document.detachEvent( "onreadystatechange", DOMContentLoaded );
-			jQuery.ready();
-		}
-	},
-
-	// [[Class]] -> type pairs
-	class2type = {};
-
-jQuery.fn = jQuery.prototype = {
-	constructor: jQuery,
-	init: function( selector, context, rootjQuery ) {
-		var match, elem, ret, doc;
-
-		// Handle $(""), $(null), $(undefined), $(false)
-		if ( !selector ) {
-			return this;
-		}
-
-		// Handle $(DOMElement)
-		if ( selector.nodeType ) {
-			this.context = this[0] = selector;
-			this.length = 1;
-			return this;
-		}
-
-		// Handle HTML strings
-		if ( typeof selector === "string" ) {
-			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
-				// Assume that strings that start and end with <> are HTML and skip the regex check
-				match = [ null, selector, null ];
-
-			} else {
-				match = rquickExpr.exec( selector );
-			}
-
-			// Match html or make sure no context is specified for #id
-			if ( match && (match[1] || !context) ) {
-
-				// HANDLE: $(html) -> $(array)
-				if ( match[1] ) {
-					context = context instanceof jQuery ? context[0] : context;
-					doc = ( context && context.nodeType ? context.ownerDocument || context : document );
-
-					// scripts is true for back-compat
-					selector = jQuery.parseHTML( match[1], doc, true );
-					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
-						this.attr.call( selector, context, true );
-					}
-
-					return jQuery.merge( this, selector );
-
-				// HANDLE: $(#id)
-				} else {
-					elem = document.getElementById( match[2] );
-
-					// Check parentNode to catch when Blackberry 4.6 returns
-					// nodes that are no longer in the document #6963
-					if ( elem && elem.parentNode ) {
-						// Handle the case where IE and Opera return items
-						// by name instead of ID
-						if ( elem.id !== match[2] ) {
-							return rootjQuery.find( selector );
-						}
-
-						// Otherwise, we inject the element directly into the jQuery object
-						this.length = 1;
-						this[0] = elem;
-					}
-
-					this.context = document;
-					this.selector = selector;
-					return this;
-				}
-
-			// HANDLE: $(expr, $(...))
-			} else if ( !context || context.jquery ) {
-				return ( context || rootjQuery ).find( selector );
-
-			// HANDLE: $(expr, context)
-			// (which is just equivalent to: $(context).find(expr)
-			} else {
-				return this.constructor( context ).find( selector );
-			}
-
-		// HANDLE: $(function)
-		// Shortcut for document ready
-		} else if ( jQuery.isFunction( selector ) ) {
-			return rootjQuery.ready( selector );
-		}
-
-		if ( selector.selector !== undefined ) {
-			this.selector = selector.selector;
-			this.context = selector.context;
-		}
-
-		return jQuery.makeArray( selector, this );
-	},
-
-	// Start with an empty selector
-	selector: "",
-
-	// The current version of jQuery being used
-	jquery: "1.8.0",
-
-	// The default length of a jQuery object is 0
-	length: 0,
-
-	// The number of elements contained in the matched element set
-	size: function() {
-		return this.length;
-	},
-
-	toArray: function() {
-		return core_slice.call( this );
-	},
-
-	// Get the Nth element in the matched element set OR
-	// Get the whole matched element set as a clean array
-	get: function( num ) {
-		return num == null ?
-
-			// Return a 'clean' array
-			this.toArray() :
-
-			// Return just the object
-			( num < 0 ? this[ this.length + num ] : this[ num ] );
-	},
-
-	// Take an array of elements and push it onto the stack
-	// (returning the new matched element set)
-	pushStack: function( elems, name, selector ) {
-
-		// Build a new jQuery matched element set
-		var ret = jQuery.merge( this.constructor(), elems );
-
-		// Add the old object onto the stack (as a reference)
-		ret.prevObject = this;
-
-		ret.context = this.context;
-
-		if ( name === "find" ) {
-			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
-		} else if ( name ) {
-			ret.selector = this.selector + "." + name + "(" + selector + ")";
-		}
-
-		// Return the newly-formed element set
-		return ret;
-	},
-
-	// Execute a callback for every element in the matched set.
-	// (You can seed the arguments with an array of args, but this is
-	// only used internally.)
-	each: function( callback, args ) {
-		return jQuery.each( this, callback, args );
-	},
-
-	ready: function( fn ) {
-		// Add the callback
-		jQuery.ready.promise().done( fn );
-
-		return this;
-	},
-
-	eq: function( i ) {
-		i = +i;
-		return i === -1 ?
-			this.slice( i ) :
-			this.slice( i, i + 1 );
-	},
-
-	first: function() {
-		return this.eq( 0 );
-	},
-
-	last: function() {
-		return this.eq( -1 );
-	},
-
-	slice: function() {
-		return this.pushStack( core_slice.apply( this, arguments ),
-			"slice", core_slice.call(arguments).join(",") );
-	},
-
-	map: function( callback ) {
-		return this.pushStack( jQuery.map(this, function( elem, i ) {
-			return callback.call( elem, i, elem );
-		}));
-	},
-
-	end: function() {
-		return this.prevObject || this.constructor(null);
-	},
-
-	// For internal use only.
-	// Behaves like an Array's method, not like a jQuery method.
-	push: core_push,
-	sort: [].sort,
-	splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
-	var options, name, src, copy, copyIsArray, clone,
-		target = arguments[0] || {},
-		i = 1,
-		length = arguments.length,
-		deep = false;
-
-	// Handle a deep copy situation
-	if ( typeof target === "boolean" ) {
-		deep = target;
-		target = arguments[1] || {};
-		// skip the boolean and the target
-		i = 2;
-	}
-
-	// Handle case when target is a string or something (possible in deep copy)
-	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
-		target = {};
-	}
-
-	// extend jQuery itself if only one argument is passed
-	if ( length === i ) {
-		target = this;
-		--i;
-	}
-
-	for ( ; i < length; i++ ) {
-		// Only deal with non-null/undefined values
-		if ( (options = arguments[ i ]) != null ) {
-			// Extend the base object
-			for ( name in options ) {
-				src = target[ name ];
-				copy = options[ name ];
-
-				// Prevent never-ending loop
-				if ( target === copy ) {
-					continue;
-				}
-
-				// Recurse if we're merging plain objects or arrays
-				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
-					if ( copyIsArray ) {
-						copyIsArray = false;
-						clone = src && jQuery.isArray(src) ? src : [];
-
-					} else {
-						clone = src && jQuery.isPlainObject(src) ? src : {};
-					}
-
-					// Never move original objects, clone them
-					target[ name ] = jQuery.extend( deep, clone, copy );
-
-				// Don't bring in undefined values
-				} else if ( copy !== undefined ) {
-					target[ name ] = copy;
-				}
-			}
-		}
-	}
-
-	// Return the modified object
-	return target;
-};
-
-jQuery.extend({
-	noConflict: function( deep ) {
-		if ( window.$ === jQuery ) {
-			window.$ = _$;
-		}
-
-		if ( deep && window.jQuery === jQuery ) {
-			window.jQuery = _jQuery;
-		}
-
-		return jQuery;
-	},
-
-	// Is the DOM ready to be used? Set to true once it occurs.
-	isReady: false,
-
-	// A counter to track how many items to wait for before
-	// the ready event fires. See #6781
-	readyWait: 1,
-
-	// Hold (or release) the ready event
-	holdReady: function( hold ) {
-		if ( hold ) {
-			jQuery.readyWait++;
-		} else {
-			jQuery.ready( true );
-		}
-	},
-
-	// Handle when the DOM is ready
-	ready: function( wait ) {
-
-		// Abort if there are pending holds or we're already ready
-		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-			return;
-		}
-
-		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-		if ( !document.body ) {
-			return setTimeout( jQuery.ready, 1 );
-		}
-
-		// Remember that the DOM is ready
-		jQuery.isReady = true;
-
-		// If a normal DOM Ready event fired, decrement, and wait if need be
-		if ( wait !== true && --jQuery.readyWait > 0 ) {
-			return;
-		}
-
-		// If there are functions bound, to execute
-		readyList.resolveWith( document, [ jQuery ] );
-
-		// Trigger any bound ready events
-		if ( jQuery.fn.trigger ) {
-			jQuery( document ).trigger("ready").off("ready");
-		}
-	},
-
-	// See test/unit/core.js for details concerning isFunction.
-	// Since version 1.3, DOM methods and functions like alert
-	// aren't supported. They return false on IE (#2968).
-	isFunction: function( obj ) {
-		return jQuery.type(obj) === "function";
-	},
-
-	isArray: Array.isArray || function( obj ) {
-		return jQuery.type(obj) === "array";
-	},
-
-	isWindow: function( obj ) {
-		return obj != null && obj == obj.window;
-	},
-
-	isNumeric: function( obj ) {
-		return !isNaN( parseFloat(obj) ) && isFinite( obj );
-	},
-
-	type: function( obj ) {
-		return obj == null ?
-			String( obj ) :
-			class2type[ core_toString.call(obj) ] || "object";
-	},
-
-	isPlainObject: function( obj ) {
-		// Must be an Object.
-		// Because of IE, we also have to check the presence of the constructor property.
-		// Make sure that DOM nodes and window objects don't pass through, as well
-		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-			return false;
-		}
-
-		try {
-			// Not own constructor property must be Object
-			if ( obj.constructor &&
-				!core_hasOwn.call(obj, "constructor") &&
-				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
-				return false;
-			}
-		} catch ( e ) {
-			// IE8,9 Will throw exceptions on certain host objects #9897
-			return false;
-		}
-
-		// Own properties are enumerated firstly, so to speed up,
-		// if last one is own, then all properties are own.
-
-		var key;
-		for ( key in obj ) {}
-
-		return key === undefined || core_hasOwn.call( obj, key );
-	},
-
-	isEmptyObject: function( obj ) {
-		var name;
-		for ( name in obj ) {
-			return false;
-		}
-		return true;
-	},
-
-	error: function( msg ) {
-		throw new Error( msg );
-	},
-
-	// data: string of html
-	// context (optional): If specified, the fragment will be created in this context, defaults to document
-	// scripts (optional): If true, will include scripts passed in the html string
-	parseHTML: function( data, context, scripts ) {
-		var parsed;
-		if ( !data || typeof data !== "string" ) {
-			return null;
-		}
-		if ( typeof context === "boolean" ) {
-			scripts = context;
-			context = 0;
-		}
-		context = context || document;
-
-		// Single tag
-		if ( (parsed = rsingleTag.exec( data )) ) {
-			return [ context.createElement( parsed[1] ) ];
-		}
-
-		parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
-		return jQuery.merge( [],
-			(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
-	},
-
-	parseJSON: function( data ) {
-		if ( !data || typeof data !== "string") {
-			return null;
-		}
-
-		// Make sure leading/trailing whitespace is removed (IE can't handle it)
-		data = jQuery.trim( data );
-
-		// Attempt to parse using the native JSON parser first
-		if ( window.JSON && window.JSON.parse ) {
-			return window.JSON.parse( data );
-		}
-
-		// Make sure the incoming data is actual JSON
-		// Logic borrowed from http://json.org/json2.js
-		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-			.replace( rvalidtokens, "]" )
-			.replace( rvalidbraces, "")) ) {
-
-			return ( new Function( "return " + data ) )();
-
-		}
-		jQuery.error( "Invalid JSON: " + data );
-	},
-
-	// Cross-browser xml parsing
-	parseXML: function( data ) {
-		var xml, tmp;
-		if ( !data || typeof data !== "string" ) {
-			return null;
-		}
-		try {
-			if ( window.DOMParser ) { // Standard
-				tmp = new DOMParser();
-				xml = tmp.parseFromString( data , "text/xml" );
-			} else { // IE
-				xml = new ActiveXObject( "Microsoft.XMLDOM" );
-				xml.async = "false";
-				xml.loadXML( data );
-			}
-		} catch( e ) {
-			xml = undefined;
-		}
-		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
-			jQuery.error( "Invalid XML: " + data );
-		}
-		return xml;
-	},
-
-	noop: function() {},
-
-	// Evaluates a script in a global context
-	// Workarounds based on findings by Jim Driscoll
-	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
-	globalEval: function( data ) {
-		if ( data && core_rnotwhite.test( data ) ) {
-			// We use execScript on Internet Explorer
-			// We use an anonymous function so that context is window
-			// rather than jQuery in Firefox
-			( window.execScript || function( data ) {
-				window[ "eval" ].call( window, data );
-			} )( data );
-		}
-	},
-
-	// Convert dashed to camelCase; used by the css and data modules
-	// Microsoft forgot to hump their vendor prefix (#9572)
-	camelCase: function( string ) {
-		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-	},
-
-	nodeName: function( elem, name ) {
-		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
-	},
-
-	// args is for internal usage only
-	each: function( obj, callback, args ) {
-		var name,
-			i = 0,
-			length = obj.length,
-			isObj = length === undefined || jQuery.isFunction( obj );
-
-		if ( args ) {
-			if ( isObj ) {
-				for ( name in obj ) {
-					if ( callback.apply( obj[ name ], args ) === false ) {
-						break;
-					}
-				}
-			} else {
-				for ( ; i < length; ) {
-					if ( callback.apply( obj[ i++ ], args ) === false ) {
-						break;
-					}
-				}
-			}
-
-		// A special, fast, case for the most common use of each
-		} else {
-			if ( isObj ) {
-				for ( name in obj ) {
-					if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
-						break;
-					}
-				}
-			} else {
-				for ( ; i < length; ) {
-					if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
-						break;
-					}
-				}
-			}
-		}
-
-		return obj;
-	},
-
-	// Use native String.trim function wherever possible
-	trim: core_trim ?
-		function( text ) {
-			return text == null ?
-				"" :
-				core_trim.call( text );
-		} :
-
-		// Otherwise use our own trimming functionality
-		function( text ) {
-			return text == null ?
-				"" :
-				text.toString().replace( rtrim, "" );
-		},
-
-	// results is for internal usage only
-	makeArray: function( arr, results ) {
-		var type,
-			ret = results || [];
-
-		if ( arr != null ) {
-			// The window, strings (and functions) also have 'length'
-			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
-			type = jQuery.type( arr );
-
-			if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
-				core_push.call( ret, arr );
-			} else {
-				jQuery.merge( ret, arr );
-			}
-		}
-
-		return ret;
-	},
-
-	inArray: function( elem, arr, i ) {
-		var len;
-
-		if ( arr ) {
-			if ( core_indexOf ) {
-				return core_indexOf.call( arr, elem, i );
-			}
-
-			len = arr.length;
-			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
-			for ( ; i < len; i++ ) {
-				// Skip accessing in sparse arrays
-				if ( i in arr && arr[ i ] === elem ) {
-					return i;
-				}
-			}
-		}
-
-		return -1;
-	},
-
-	merge: function( first, second ) {
-		var l = second.length,
-			i = first.length,
-			j = 0;
-
-		if ( typeof l === "number" ) {
-			for ( ; j < l; j++ ) {
-				first[ i++ ] = second[ j ];
-			}
-
-		} else {
-			while ( second[j] !== undefined ) {
-				first[ i++ ] = second[ j++ ];
-			}
-		}
-
-		first.length = i;
-
-		return first;
-	},
-
-	grep: function( elems, callback, inv ) {
-		var retVal,
-			ret = [],
-			i = 0,
-			length = elems.length;
-		inv = !!inv;
-
-		// Go through the array, only saving the items
-		// that pass the validator function
-		for ( ; i < length; i++ ) {
-			retVal = !!callback( elems[ i ], i );
-			if ( inv !== retVal ) {
-				ret.push( elems[ i ] );
-			}
-		}
-
-		return ret;
-	},
-
-	// arg is for internal usage only
-	map: function( elems, callback, arg ) {
-		var value, key,
-			ret = [],
-			i = 0,
-			length = elems.length,
-			// jquery objects are treated as arrays
-			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-
-		// Go through the array, translating each of the items to their
-		if ( isArray ) {
-			for ( ; i < length; i++ ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret[ ret.length ] = value;
-				}
-			}
-
-		// Go through every key on the object,
-		} else {
-			for ( key in elems ) {
-				value = callback( elems[ key ], key, arg );
-
-				if ( value != null ) {
-					ret[ ret.length ] = value;
-				}
-			}
-		}
-
-		// Flatten any nested arrays
-		return ret.concat.apply( [], ret );
-	},
-
-	// A global GUID counter for objects
-	guid: 1,
-
-	// Bind a function to a context, optionally partially applying any
-	// arguments.
-	proxy: function( fn, context ) {
-		var tmp, args, proxy;
-
-		if ( typeof context === "string" ) {
-			tmp = fn[ context ];
-			context = fn;
-			fn = tmp;
-		}
-
-		// Quick check to determine if target is callable, in the spec
-		// this throws a TypeError, but we will just return undefined.
-		if ( !jQuery.isFunction( fn ) ) {
-			return undefined;
-		}
-
-		// Simulated bind
-		args = core_slice.call( arguments, 2 );
-		proxy = function() {
-			return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
-		};
-
-		// Set the guid of unique handler to the same of original handler, so it can be removed
-		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-
-		return proxy;
-	},
-
-	// Multifunctional method to get and set values of a collection
-	// The value/s can optionally be executed if it's a function
-	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
-		var exec,
-			bulk = key == null,
-			i = 0,
-			length = elems.length;
-
-		// Sets many values
-		if ( key && typeof key === "object" ) {
-			for ( i in key ) {
-				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
-			}
-			chainable = 1;
-
-		// Sets one value
-		} else if ( value !== undefined ) {
-			// Optionally, function values get executed if exec is true
-			exec = pass === undefined && jQuery.isFunction( value );
-
-			if ( bulk ) {
-				// Bulk operations only iterate when executing function values
-				if ( exec ) {
-					exec = fn;
-					fn = function( elem, key, value ) {
-						return exec.call( jQuery( elem ), value );
-					};
-
-				// Otherwise they run against the entire set
-				} else {
-					fn.call( elems, value );
-					fn = null;
-				}
-			}
-
-			if ( fn ) {
-				for (; i < length; i++ ) {
-					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
-				}
-			}
-
-			chainable = 1;
-		}
-
-		return chainable ?
-			elems :
-
-			// Gets
-			bulk ?
-				fn.call( elems ) :
-				length ? fn( elems[0], key ) : emptyGet;
-	},
-
-	now: function() {
-		return ( new Date() ).getTime();
-	}
-});
-
-jQuery.ready.promise = function( obj ) {
-	if ( !readyList ) {
-
-		readyList = jQuery.Deferred();
-
-		// Catch cases where $(document).ready() is called after the
-		// browser event has already occurred.
-		if ( document.readyState === "complete" || ( document.readyState !== "loading" && document.addEventListener ) ) {
-			// Handle it asynchronously to allow scripts the opportunity to delay ready
-			setTimeout( jQuery.ready, 1 );
-
-		// Standards-based browsers support DOMContentLoaded
-		} else if ( document.addEventListener ) {
-			// Use the handy event callback
-			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
-			// A fallback to window.onload, that will always work
-			window.addEventListener( "load", jQuery.ready, false );
-
-		// If IE event model is used
-		} else {
-			// Ensure firing before onload, maybe late but safe also for iframes
-			document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
-			// A fallback to window.onload, that will always work
-			window.attachEvent( "onload", jQuery.ready );
-
-			// If IE and not a frame
-			// continually check to see if the document is ready
-			var top = false;
-
-			try {
-				top = window.frameElement == null && document.documentElement;
-			} catch(e) {}
-
-			if ( top && top.doScroll ) {
-				(function doScrollCheck() {
-					if ( !jQuery.isReady ) {
-
-						try {
-							// Use the trick by Diego Perini
-							// http://javascript.nwbox.com/IEContentLoaded/
-							top.doScroll("left");
-						} catch(e) {
-							return setTimeout( doScrollCheck, 50 );
-						}
-
-						// and execute any waiting functions
-						jQuery.ready();
-					}
-				})();
-			}
-		}
-	}
-	return readyList.promise( obj );
-};
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
-	class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-// String to Object options format cache
-var optionsCache = {};
-
-// Convert String-formatted options into Object-formatted ones and store in cache
-function createOptions( options ) {
-	var object = optionsCache[ options ] = {};
-	jQuery.each( options.split( core_rspace ), function( _, flag ) {
-		object[ flag ] = true;
-	});
-	return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- *	options: an optional list of space-separated options that will change how
- *			the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *	once:			will ensure the callback list can only be fired once (like a Deferred)
- *
- *	memory:			will keep track of previous values and will call any callback added
- *					after the list has been fired right away with the latest "memorized"
- *					values (like a Deferred)
- *
- *	unique:			will ensure a callback can only be added once (no duplicate in the list)
- *
- *	stopOnFalse:	interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
-	// Convert options from String-formatted to Object-formatted if needed
-	// (we check in cache first)
-	options = typeof options === "string" ?
-		( optionsCache[ options ] || createOptions( options ) ) :
-		jQuery.extend( {}, options );
-
-	var // Last fire value (for non-forgettable lists)
-		memory,
-		// Flag to know if list was already fired
-		fired,
-		// Flag to know if list is currently firing
-		firing,
-		// First callback to fire (used internally by add and fireWith)
-		firingStart,
-		// End of the loop when firing
-		firingLength,
-		// Index of currently firing callback (modified by remove if needed)
-		firingIndex,
-		// Actual callback list
-		list = [],
-		// Stack of fire calls for repeatable lists
-		stack = !options.once && [],
-		// Fire callbacks
-		fire = function( data ) {
-			memory = options.memory && data;
-			fired = true;
-			firingIndex = firingStart || 0;
-			firingStart = 0;
-			firingLength = list.length;
-			firing = true;
-			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
-				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
-					memory = false; // To prevent further calls using add
-					break;
-				}
-			}
-			firing = false;
-			if ( list ) {
-				if ( stack ) {
-					if ( stack.length ) {
-						fire( stack.shift() );
-					}
-				} else if ( memory ) {
-					list = [];
-				} else {
-					self.disable();
-				}
-			}
-		},
-		// Actual Callbacks object
-		self = {
-			// Add a callback or a collection of callbacks to the list
-			add: function() {
-				if ( list ) {
-					// First, we save the current length
-					var start = list.length;
-					(function add( args ) {
-						jQuery.each( args, function( _, arg ) {
-							if ( jQuery.isFunction( arg ) && ( !options.unique || !self.has( arg ) ) ) {
-								list.push( arg );
-							} else if ( arg && arg.length ) {
-								// Inspect recursively
-								add( arg );
-							}
-						});
-					})( arguments );
-					// Do we need to add the callbacks to the
-					// current firing batch?
-					if ( firing ) {
-						firingLength = list.length;
-					// With memory, if we're not firing then
-					// we should call right away
-					} else if ( memory ) {
-						firingStart = start;
-						fire( memory );
-					}
-				}
-				return this;
-			},
-			// Remove a callback from the list
-			remove: function() {
-				if ( list ) {
-					jQuery.each( arguments, function( _, arg ) {
-						var index;
-						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-							list.splice( index, 1 );
-							// Handle firing indexes
-							if ( firing ) {
-								if ( index <= firingLength ) {
-									firingLength--;
-								}
-								if ( index <= firingIndex ) {
-									firingIndex--;
-								}
-							}
-						}
-					});
-				}
-				return this;
-			},
-			// Control if a given callback is in the list
-			has: function( fn ) {
-				return jQuery.inArray( fn, list ) > -1;
-			},
-			// Remove all callbacks from the list
-			empty: function() {
-				list = [];
-				return this;
-			},
-			// Have the list do nothing anymore
-			disable: function() {
-				list = stack = memory = undefined;
-				return this;
-			},
-			// Is it disabled?
-			disabled: function() {
-				return !list;
-			},
-			// Lock the list in its current state
-			lock: function() {
-				stack = undefined;
-				if ( !memory ) {
-					self.disable();
-				}
-				return this;
-			},
-			// Is it locked?
-			locked: function() {
-				return !stack;
-			},
-			// Call all callbacks with the given context and arguments
-			fireWith: function( context, args ) {
-				args = args || [];
-				args = [ context, args.slice ? args.slice() : args ];
-				if ( list && ( !fired || stack ) ) {
-					if ( firing ) {
-						stack.push( args );
-					} else {
-						fire( args );
-					}
-				}
-				return this;
-			},
-			// Call all the callbacks with the given arguments
-			fire: function() {
-				self.fireWith( this, arguments );
-				return this;
-			},
-			// To know if the callbacks have already been called at least once
-			fired: function() {
-				return !!fired;
-			}
-		};
-
-	return self;
-};
-jQuery.extend({
-
-	Deferred: function( func ) {
-		var tuples = [
-				// action, add listener, listener list, final state
-				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
-				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
-				[ "notify", "progress", jQuery.Callbacks("memory") ]
-			],
-			state = "pending",
-			promise = {
-				state: function() {
-					return state;
-				},
-				always: function() {
-					deferred.done( arguments ).fail( arguments );
-					return this;
-				},
-				then: function( /* fnDone, fnFail, fnProgress */ ) {
-					var fns = arguments;
-					return jQuery.Deferred(function( newDefer ) {
-						jQuery.each( tuples, function( i, tuple ) {
-							var action = tuple[ 0 ],
-								fn = fns[ i ];
-							// deferred[ done | fail | progress ] for forwarding actions to newDefer
-							deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
-								function() {
-									var returned = fn.apply( this, arguments );
-									if ( returned && jQuery.isFunction( returned.promise ) ) {
-										returned.promise()
-											.done( newDefer.resolve )
-											.fail( newDefer.reject )
-											.progress( newDefer.notify );
-									} else {
-										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
-									}
-								} :
-								newDefer[ action ]
-							);
-						});
-						fns = null;
-					}).promise();
-				},
-				// Get a promise for this deferred
-				// If obj is provided, the promise aspect is added to the object
-				promise: function( obj ) {
-					return typeof obj === "object" ? jQuery.extend( obj, promise ) : promise;
-				}
-			},
-			deferred = {};
-
-		// Keep pipe for back-compat
-		promise.pipe = promise.then;
-
-		// Add list-specific methods
-		jQuery.each( tuples, function( i, tuple ) {
-			var list = tuple[ 2 ],
-				stateString = tuple[ 3 ];
-
-			// promise[ done | fail | progress ] = list.add
-			promise[ tuple[1] ] = list.add;
-
-			// Handle state
-			if ( stateString ) {
-				list.add(function() {
-					// state = [ resolved | rejected ]
-					state = stateString;
-
-				// [ reject_list | resolve_list ].disable; progress_list.lock
-				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
-			}
-
-			// deferred[ resolve | reject | notify ] = list.fire
-			deferred[ tuple[0] ] = list.fire;
-			deferred[ tuple[0] + "With" ] = list.fireWith;
-		});
-
-		// Make the deferred a promise
-		promise.promise( deferred );
-
-		// Call given func if any
-		if ( func ) {
-			func.call( deferred, deferred );
-		}
-
-		// All done!
-		return deferred;
-	},
-
-	// Deferred helper
-	when: function( subordinate /* , ..., subordinateN */ ) {
-		var i = 0,
-			resolveValues = core_slice.call( arguments ),
-			length = resolveValues.length,
-
-			// the count of uncompleted subordinates
-			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
-			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
-			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
-			// Update function for both resolve and progress values
-			updateFunc = function( i, contexts, values ) {
-				return function( value ) {
-					contexts[ i ] = this;
-					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
-					if( values === progressValues ) {
-						deferred.notifyWith( contexts, values );
-					} else if ( !( --remaining ) ) {
-						deferred.resolveWith( contexts, values );
-					}
-				};
-			},
-
-			progressValues, progressContexts, resolveContexts;
-
-		// add listeners to Deferred subordinates; treat others as resolved
-		if ( length > 1 ) {
-			progressValues = new Array( length );
-			progressContexts = new Array( length );
-			resolveContexts = new Array( length );
-			for ( ; i < length; i++ ) {
-				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
-					resolveValues[ i ].promise()
-						.done( updateFunc( i, resolveContexts, resolveValues ) )
-						.fail( deferred.reject )
-						.progress( updateFunc( i, progressContexts, progressValues ) );
-				} else {
-					--remaining;
-				}
-			}
-		}
-
-		// if we're not waiting on anything, resolve the master
-		if ( !remaining ) {
-			deferred.resolveWith( resolveContexts, resolveValues );
-		}
-
-		return deferred.promise();
-	}
-});
-jQuery.support = (function() {
-
-	var support,
-		all,
-		a,
-		select,
-		opt,
-		input,
-		fragment,
-		eventName,
-		i,
-		isSupported,
-		clickFn,
-		div = document.createElement("div");
-
-	// Preliminary tests
-	div.setAttribute( "className", "t" );
-	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-
-	all = div.getElementsByTagName("*");
-	a = div.getElementsByTagName("a")[ 0 ];
-	a.style.cssText = "top:1px;float:left;opacity:.5";
-
-	// Can't get basic test support
-	if ( !all || !all.length || !a ) {
-		return {};
-	}
-
-	// First batch of supports tests
-	select = document.createElement("select");
-	opt = select.appendChild( document.createElement("option") );
-	input = div.getElementsByTagName("input")[ 0 ];
-
-	support = {
-		// IE strips leading whitespace when .innerHTML is used
-		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
-		// Make sure that tbody elements aren't automatically inserted
-		// IE will insert them into empty tables
-		tbody: !div.getElementsByTagName("tbody").length,
-
-		// Make sure that link elements get serialized correctly by innerHTML
-		// This requires a wrapper element in IE
-		htmlSerialize: !!div.getElementsByTagName("link").length,
-
-		// Get the style information from getAttribute
-		// (IE uses .cssText instead)
-		style: /top/.test( a.getAttribute("style") ),
-
-		// Make sure that URLs aren't manipulated
-		// (IE normalizes it by default)
-		hrefNormalized: ( a.getAttribute("href") === "/a" ),
-
-		// Make sure that element opacity exists
-		// (IE uses filter instead)
-		// Use a regex to work around a WebKit issue. See #5145
-		opacity: /^0.5/.test( a.style.opacity ),
-
-		// Verify style float existence
-		// (IE uses styleFloat instead of cssFloat)
-		cssFloat: !!a.style.cssFloat,
-
-		// Make sure that if no value is specified for a checkbox
-		// that it defaults to "on".
-		// (WebKit defaults to "" instead)
-		checkOn: ( input.value === "on" ),
-
-		// Make sure that a selected-by-default option has a working selected property.
-		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
-		optSelected: opt.selected,
-
-		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-		getSetAttribute: div.className !== "t",
-
-		// Tests for enctype support on a form(#6743)
-		enctype: !!document.createElement("form").enctype,
-
-		// Makes sure cloning an html5 element does not cause problems
-		// Where outerHTML is undefined, this still works
-		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
-
-		// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
-		boxModel: ( document.compatMode === "CSS1Compat" ),
-
-		// Will be defined later
-		submitBubbles: true,
-		changeBubbles: true,
-		focusinBubbles: false,
-		deleteExpando: true,
-		noCloneEvent: true,
-		inlineBlockNeedsLayout: false,
-		shrinkWrapBlocks: false,
-		reliableMarginRight: true,
-		boxSizingReliable: true,
-		pixelPosition: false
-	};
-
-	// Make sure checked status is properly cloned
-	input.checked = true;
-	support.noCloneChecked = input.cloneNode( true ).checked;
-
-	// Make sure that the options inside disabled selects aren't marked as disabled
-	// (WebKit marks them as disabled)
-	select.disabled = true;
-	support.optDisabled = !opt.disabled;
-
-	// Test to see if it's possible to delete an expando from an element
-	// Fails in Internet Explorer
-	try {
-		delete div.test;
-	} catch( e ) {
-		support.deleteExpando = false;
-	}
-
-	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
-		div.attachEvent( "onclick", clickFn = function() {
-			// Cloning a node shouldn't copy over any
-			// bound event handlers (IE does this)
-			support.noCloneEvent = false;
-		});
-		div.cloneNode( true ).fireEvent("onclick");
-		div.detachEvent( "onclick", clickFn );
-	}
-
-	// Check if a radio maintains its value
-	// after being appended to the DOM
-	input = document.createElement("input");
-	input.value = "t";
-	input.setAttribute( "type", "radio" );
-	support.radioValue = input.value === "t";
-
-	input.setAttribute( "checked", "checked" );
-
-	// #11217 - WebKit loses check when the name is after the checked attribute
-	input.setAttribute( "name", "t" );
-
-	div.appendChild( input );
-	fragment = document.createDocumentFragment();
-	fragment.appendChild( div.lastChild );
-
-	// WebKit doesn't clone checked state correctly in fragments
-	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-	// Check if a disconnected checkbox will retain its checked
-	// value of true after appended to the DOM (IE6/7)
-	support.appendChecked = input.checked;
-
-	fragment.removeChild( input );
-	fragment.appendChild( div );
-
-	// Technique from Juriy Zaytsev
-	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
-	// We only care about the case where non-standard event systems
-	// are used, namely in IE. Short-circuiting here helps us to
-	// avoid an eval call (in setAttribute) which can cause CSP
-	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
-	if ( div.attachEvent ) {
-		for ( i in {
-			submit: true,
-			change: true,
-			focusin: true
-		}) {
-			eventName = "on" + i;
-			isSupported = ( eventName in div );
-			if ( !isSupported ) {
-				div.setAttribute( eventName, "return;" );
-				isSupported = ( typeof div[ eventName ] === "function" );
-			}
-			support[ i + "Bubbles" ] = isSupported;
-		}
-	}
-
-	// Run tests that need a body at doc ready
-	jQuery(function() {
-		var container, div, tds, marginDiv,
-			divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
-			body = document.getElementsByTagName("body")[0];
-
-		if ( !body ) {
-			// Return for frameset docs that don't have a body
-			return;
-		}
-
-		container = document.createElement("div");
-		container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
-		body.insertBefore( container, body.firstChild );
-
-		// Construct the test element
-		div = document.createElement("div");
-		container.appendChild( div );
-
-		// Check if table cells still have offsetWidth/Height when they are set
-		// to display:none and there are still other visible table cells in a
-		// table row; if so, offsetWidth/Height are not reliable for use when
-		// determining if an element has been hidden directly using
-		// display:none (it is still safe to use offsets if a parent element is
-		// hidden; don safety goggles and see bug #4512 for more information).
-		// (only IE 8 fails this test)
-		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
-		tds = div.getElementsByTagName("td");
-		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
-		isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
-		tds[ 0 ].style.display = "";
-		tds[ 1 ].style.display = "none";
-
-		// Check if empty table cells still have offsetWidth/Height
-		// (IE <= 8 fail this test)
-		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
-		// Check box-sizing and margin behavior
-		div.innerHTML = "";
-		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
-		support.boxSizing = ( div.offsetWidth === 4 );
-		support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
-
-		// NOTE: To any future maintainer, window.getComputedStyle was used here
-		// instead of getComputedStyle because it gave a better gzip size.
-		// The difference between window.getComputedStyle and getComputedStyle is
-		// 7 bytes
-		if ( window.getComputedStyle ) {
-			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
-			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
-
-			// Check if div with explicit width and no margin-right incorrectly
-			// gets computed margin-right based on width of container. For more
-			// info see bug #3333
-			// Fails in WebKit before Feb 2011 nightlies
-			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-			marginDiv = document.createElement("div");
-			marginDiv.style.cssText = div.style.cssText = divReset;
-			marginDiv.style.marginRight = marginDiv.style.width = "0";
-			div.style.width = "1px";
-			div.appendChild( marginDiv );
-			support.reliableMarginRight =
-				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
-		}
-
-		if ( typeof div.style.zoom !== "undefined" ) {
-			// Check if natively block-level elements act like inline-block
-			// elements when setting their display to 'inline' and giving
-			// them layout
-			// (IE < 8 does this)
-			div.innerHTML = "";
-			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
-			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
-			// Check if elements with layout shrink-wrap their children
-			// (IE 6 does this)
-			div.style.display = "block";
-			div.style.overflow = "visible";
-			div.innerHTML = "<div></div>";
-			div.firstChild.style.width = "5px";
-			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-
-			container.style.zoom = 1;
-		}
-
-		// Null elements to avoid leaks in IE
-		body.removeChild( container );
-		container = div = tds = marginDiv = null;
-	});
-
-	// Null elements to avoid leaks in IE
-	fragment.removeChild( div );
-	all = a = select = opt = input = fragment = div = null;
-
-	return support;
-})();
-var rbrace = /^(?:\{.*\}|\[.*\])$/,
-	rmultiDash = /([A-Z])/g;
-
-jQuery.extend({
-	cache: {},
-
-	deletedIds: [],
-
-	// Please use with caution
-	uuid: 0,
-
-	// Unique for each copy of jQuery on the page
-	// Non-digits removed to match rinlinejQuery
-	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-
-	// The following elements throw uncatchable exceptions if you
-	// attempt to add expando properties to them.
-	noData: {
-		"embed": true,
-		// Ban all objects except for Flash (which handle expandos)
-		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
-		"applet": true
-	},
-
-	hasData: function( elem ) {
-		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-		return !!elem && !isEmptyDataObject( elem );
-	},
-
-	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
-		if ( !jQuery.acceptData( elem ) ) {
-			return;
-		}
-
-		var thisCache, ret,
-			internalKey = jQuery.expando,
-			getByName = typeof name === "string",
-
-			// We have to handle DOM nodes and JS objects differently because IE6-7
-			// can't GC object references properly across the DOM-JS boundary
-			isNode = elem.nodeType,
-
-			// Only DOM nodes need the global jQuery cache; JS object data is
-			// attached directly to the object so GC can occur automatically
-			cache = isNode ? jQuery.cache : elem,
-
-			// Only defining an ID for JS objects if its cache already exists allows
-			// the code to shortcut on the same path as a DOM node with no cache
-			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
-
-		// Avoid doing any more work than we need to when trying to get data on an
-		// object that has no data at all
-		if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
-			return;
-		}
-
-		if ( !id ) {
-			// Only DOM nodes need a new unique ID for each element since their data
-			// ends up in the global cache
-			if ( isNode ) {
-				elem[ internalKey ] = id = jQuery.deletedIds.pop() || ++jQuery.uuid;
-			} else {
-				id = internalKey;
-			}
-		}
-
-		if ( !cache[ id ] ) {
-			cache[ id ] = {};
-
-			// Avoids exposing jQuery metadata on plain JS objects when the object
-			// is serialized using JSON.stringify
-			if ( !isNode ) {
-				cache[ id ].toJSON = jQuery.noop;
-			}
-		}
-
-		// An object can be passed to jQuery.data instead of a key/value pair; this gets
-		// shallow copied over onto the existing cache
-		if ( typeof name === "object" || typeof name === "function" ) {
-			if ( pvt ) {
-				cache[ id ] = jQuery.extend( cache[ id ], name );
-			} else {
-				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-			}
-		}
-
-		thisCache = cache[ id ];
-
-		// jQuery data() is stored in a separate object inside the object's internal data
-		// cache in order to avoid key collisions between internal data and user-defined
-		// data.
-		if ( !pvt ) {
-			if ( !thisCache.data ) {
-				thisCache.data = {};
-			}
-
-			thisCache = thisCache.data;
-		}
-
-		if ( data !== undefined ) {
-			thisCache[ jQuery.camelCase( name ) ] = data;
-		}
-
-		// Check for both converted-to-camel and non-converted data property names
-		// If a data property was specified
-		if ( getByName ) {
-
-			// First Try to find as-is property data
-			ret = thisCache[ name ];
-
-			// Test for null|undefined property data
-			if ( ret == null ) {
-
-				// Try to find the camelCased property
-				ret = thisCache[ jQuery.camelCase( name ) ];
-			}
-		} else {
-			ret = thisCache;
-		}
-
-		return ret;
-	},
-
-	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
-		if ( !jQuery.acceptData( elem ) ) {
-			return;
-		}
-
-		var thisCache, i, l,
-
-			isNode = elem.nodeType,
-
-			// See jQuery.data for more information
-			cache = isNode ? jQuery.cache : elem,
-			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
-		// If there is already no cache entry for this object, there is no
-		// purpose in continuing
-		if ( !cache[ id ] ) {
-			return;
-		}
-
-		if ( name ) {
-
-			thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
-			if ( thisCache ) {
-
-				// Support array or space separated string names for data keys
-				if ( !jQuery.isArray( name ) ) {
-
-					// try the string as a key before any manipulation
-					if ( name in thisCache ) {
-						name = [ name ];
-					} else {
-
-						// split the camel cased version by spaces unless a key with the spaces exists
-						name = jQuery.camelCase( name );
-						if ( name in thisCache ) {
-							name = [ name ];
-						} else {
-							name = name.split(" ");
-						}
-					}
-				}
-
-				for ( i = 0, l = name.length; i < l; i++ ) {
-					delete thisCache[ name[i] ];
-				}
-
-				// If there is no data left in the cache, we want to continue
-				// and let the cache object itself get destroyed
-				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
-					return;
-				}
-			}
-		}
-
-		// See jQuery.data for more information
-		if ( !pvt ) {
-			delete cache[ id ].data;
-
-			// Don't destroy the parent cache unless the internal data object
-			// had been the only thing left in it
-			if ( !isEmptyDataObject( cache[ id ] ) ) {
-				return;
-			}
-		}
-
-		// Destroy the cache
-		if ( isNode ) {
-			jQuery.cleanData( [ elem ], true );
-
-		// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
-		} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
-			delete cache[ id ];
-
-		// When all else fails, null
-		} else {
-			cache[ id ] = null;
-		}
-	},
-
-	// For internal use only.
-	_data: function( elem, name, data ) {
-		return jQuery.data( elem, name, data, true );
-	},
-
-	// A method for determining if a DOM node can handle the data expando
-	acceptData: function( elem ) {
-		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
-
-		// nodes accept data unless otherwise specified; rejection can be conditional
-		return !noData || noData !== true && elem.getAttribute("classid") === noData;
-	}
-});
-
-jQuery.fn.extend({
-	data: function( key, value ) {
-		var parts, part, attr, name, l,
-			elem = this[0],
-			i = 0,
-			data = null;
-
-		// Gets all values
-		if ( key === undefined ) {
-			if ( this.length ) {
-				data = jQuery.data( elem );
-
-				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
-					attr = elem.attributes;
-					for ( l = attr.length; i < l; i++ ) {
-						name = attr[i].name;
-
-						if ( name.indexOf( "data-" ) === 0 ) {
-							name = jQuery.camelCase( name.substring(5) );
-
-							dataAttr( elem, name, data[ name ] );
-						}
-					}
-					jQuery._data( elem, "parsedAttrs", true );
-				}
-			}
-
-			return data;
-		}
-
-		// Sets multiple values
-		if ( typeof key === "object" ) {
-			return this.each(function() {
-				jQuery.data( this, key );
-			});
-		}
-
-		parts = key.split( ".", 2 );
-		parts[1] = parts[1] ? "." + parts[1] : "";
-		part = parts[1] + "!";
-
-		return jQuery.access( this, function( value ) {
-
-			if ( value === undefined ) {
-				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
-
-				// Try to fetch any internally stored data first
-				if ( data === undefined && elem ) {
-					data = jQuery.data( elem, key );
-					data = dataAttr( elem, key, data );
-				}
-
-				return data === undefined && parts[1] ?
-					this.data( parts[0] ) :
-					data;
-			}
-
-			parts[1] = value;
-			this.each(function() {
-				var self = jQuery( this );
-
-				self.triggerHandler( "setData" + part, parts );
-				jQuery.data( this, key, value );
-				self.triggerHandler( "changeData" + part, parts );
-			});
-		}, null, value, arguments.length > 1, null, false );
-	},
-
-	removeData: function( key ) {
-		return this.each(function() {
-			jQuery.removeData( this, key );
-		});
-	}
-});
-
-function dataAttr( elem, key, data ) {
-	// If nothing was found internally, try to fetch any
-	// data from the HTML5 data-* attribute
-	if ( data === undefined && elem.nodeType === 1 ) {
-
-		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
-		data = elem.getAttribute( name );
-
-		if ( typeof data === "string" ) {
-			try {
-				data = data === "true" ? true :
-				data === "false" ? false :
-				data === "null" ? null :
-				// Only convert to a number if it doesn't change the string
-				+data + "" === data ? +data :
-				rbrace.test( data ) ? jQuery.parseJSON( data ) :
-					data;
-			} catch( e ) {}
-
-			// Make sure we set the data so it isn't changed later
-			jQuery.data( elem, key, data );
-
-		} else {
-			data = undefined;
-		}
-	}
-
-	return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
-	var name;
-	for ( name in obj ) {
-
-		// if the public data object is empty, the private is still empty
-		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-			continue;
-		}
-		if ( name !== "toJSON" ) {
-			return false;
-		}
-	}
-
-	return true;
-}
-jQuery.extend({
-	queue: function( elem, type, data ) {
-		var queue;
-
-		if ( elem ) {
-			type = ( type || "fx" ) + "queue";
-			queue = jQuery._data( elem, type );
-
-			// Speed up dequeue by getting out quickly if this is just a lookup
-			if ( data ) {
-				if ( !queue || jQuery.isArray(data) ) {
-					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
-				} else {
-					queue.push( data );
-				}
-			}
-			return queue || [];
-		}
-	},
-
-	dequeue: function( elem, type ) {
-		type = type || "fx";
-
-		var queue = jQuery.queue( elem, type ),
-			fn = queue.shift(),
-			hooks = jQuery._queueHooks( elem, type ),
-			next = function() {
-				jQuery.dequeue( elem, type );
-			};
-
-		// If the fx queue is dequeued, always remove the progress sentinel
-		if ( fn === "inprogress" ) {
-			fn = queue.shift();
-		}
-
-		if ( fn ) {
-
-			// Add a progress sentinel to prevent the fx queue from being
-			// automatically dequeued
-			if ( type === "fx" ) {
-				queue.unshift( "inprogress" );
-			}
-
-			// clear up the last queue stop function
-			delete hooks.stop;
-			fn.call( elem, next, hooks );
-		}
-		if ( !queue.length && hooks ) {
-			hooks.empty.fire();
-		}
-	},
-
-	// not intended for public consumption - generates a queueHooks object, or returns the current one
-	_queueHooks: function( elem, type ) {
-		var key = type + "queueHooks";
-		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
-			empty: jQuery.Callbacks("once memory").add(function() {
-				jQuery.removeData( elem, type + "queue", true );
-				jQuery.removeData( elem, key, true );
-			})
-		});
-	}
-});
-
-jQuery.fn.extend({
-	queue: function( type, data ) {
-		var setter = 2;
-
-		if ( typeof type !== "string" ) {
-			data = type;
-			type = "fx";
-			setter--;
-		}
-
-		if ( arguments.length < setter ) {
-			return jQuery.queue( this[0], type );
-		}
-
-		return data === undefined ?
-			this :
-			this.each(function() {
-				var queue = jQuery.queue( this, type, data );
-
-				// ensure a hooks for this queue
-				jQuery._queueHooks( this, type );
-
-				if ( type === "fx" && queue[0] !== "inprogress" ) {
-					jQuery.dequeue( this, type );
-				}
-			});
-	},
-	dequeue: function( type ) {
-		return this.each(function() {
-			jQuery.dequeue( this, type );
-		});
-	},
-	// Based off of the plugin by Clint Helfers, with permission.
-	// http://blindsignals.com/index.php/2009/07/jquery-delay/
-	delay: function( time, type ) {
-		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-		type = type || "fx";
-
-		return this.queue( type, function( next, hooks ) {
-			var timeout = setTimeout( next, time );
-			hooks.stop = function() {
-				clearTimeout( timeout );
-			};
-		});
-	},
-	clearQueue: function( type ) {
-		return this.queue( type || "fx", [] );
-	},
-	// Get a promise resolved when queues of a certain type
-	// are emptied (fx is the type by default)
-	promise: function( type, obj ) {
-		var tmp,
-			count = 1,
-			defer = jQuery.Deferred(),
-			elements = this,
-			i = this.length,
-			resolve = function() {
-				if ( !( --count ) ) {
-					defer.resolveWith( elements, [ elements ] );
-				}
-			};
-
-		if ( typeof type !== "string" ) {
-			obj = type;
-			type = undefined;
-		}
-		type = type || "fx";
-
-		while( i-- ) {
-			if ( (tmp = jQuery._data( elements[ i ], type + "queueHooks" )) && tmp.empty ) {
-				count++;
-				tmp.empty.add( resolve );
-			}
-		}
-		resolve();
-		return defer.promise( obj );
-	}
-});
-var nodeHook, boolHook, fixSpecified,
-	rclass = /[\t\r\n]/g,
-	rreturn = /\r/g,
-	rtype = /^(?:button|input)$/i,
-	rfocusable = /^(?:button|input|object|select|textarea)$/i,
-	rclickable = /^a(?:rea|)$/i,
-	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
-	getSetAttribute = jQuery.support.getSetAttribute;
-
-jQuery.fn.extend({
-	attr: function( name, value ) {
-		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
-	},
-
-	removeAttr: function( name ) {
-		return this.each(function() {
-			jQuery.removeAttr( this, name );
-		});
-	},
-
-	prop: function( name, value ) {
-		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
-	},
-
-	removeProp: function( name ) {
-		name = jQuery.propFix[ name ] || name;
-		return this.each(function() {
-			// try/catch handles cases where IE balks (such as removing a property on window)
-			try {
-				this[ name ] = undefined;
-				delete this[ name ];
-			} catch( e ) {}
-		});
-	},
-
-	addClass: function( value ) {
-		var classNames, i, l, elem,
-			setClass, c, cl;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function( j ) {
-				jQuery( this ).addClass( value.call(this, j, this.className) );
-			});
-		}
-
-		if ( value && typeof value === "string" ) {
-			classNames = value.split( core_rspace );
-
-			for ( i = 0, l = this.length; i < l; i++ ) {
-				elem = this[ i ];
-
-				if ( elem.nodeType === 1 ) {
-					if ( !elem.className && classNames.length === 1 ) {
-						elem.className = value;
-
-					} else {
-						setClass = " " + elem.className + " ";
-
-						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
-								setClass += classNames[ c ] + " ";
-							}
-						}
-						elem.className = jQuery.trim( setClass );
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	removeClass: function( value ) {
-		var removes, className, elem, c, cl, i, l;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function( j ) {
-				jQuery( this ).removeClass( value.call(this, j, this.className) );
-			});
-		}
-		if ( (value && typeof value === "string") || value === undefined ) {
-			removes = ( value || "" ).split( core_rspace );
-
-			for ( i = 0, l = this.length; i < l; i++ ) {
-				elem = this[ i ];
-				if ( elem.nodeType === 1 && elem.className ) {
-
-					className = (" " + elem.className + " ").replace( rclass, " " );
-
-					// loop over each item in the removal list
-					for ( c = 0, cl = removes.length; c < cl; c++ ) {
-						// Remove until there is nothing to remove,
-						while ( className.indexOf(" " + removes[ c ] + " ") > -1 ) {
-							className = className.replace( " " + removes[ c ] + " " , " " );
-						}
-					}
-					elem.className = value ? jQuery.trim( className ) : "";
-				}
-			}
-		}
-
-		return this;
-	},
-
-	toggleClass: function( value, stateVal ) {
-		var type = typeof value,
-			isBool = typeof stateVal === "boolean";
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each(function( i ) {
-				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
-			});
-		}
-
-		return this.each(function() {
-			if ( type === "string" ) {
-				// toggle individual class names
-				var className,
-					i = 0,
-					self = jQuery( this ),
-					state = stateVal,
-					classNames = value.split( core_rspace );
-
-				while ( (className = classNames[ i++ ]) ) {
-					// check each className given, space separated list
-					state = isBool ? state : !self.hasClass( className );
-					self[ state ? "addClass" : "removeClass" ]( className );
-				}
-
-			} else if ( type === "undefined" || type === "boolean" ) {
-				if ( this.className ) {
-					// store className if set
-					jQuery._data( this, "__className__", this.className );
-				}
-
-				// toggle whole className
-				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
-			}
-		});
-	},
-
-	hasClass: function( selector ) {
-		var className = " " + selector + " ",
-			i = 0,
-			l = this.length;
-		for ( ; i < l; i++ ) {
-			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
-				return true;
-			}
-		}
-
-		return false;
-	},
-
-	val: function( value ) {
-		var hooks, ret, isFunction,
-			elem = this[0];
-
-		if ( !arguments.length ) {
-			if ( elem ) {
-				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
-					return ret;
-				}
-
-				ret = elem.value;
-
-				return typeof ret === "string" ?
-					// handle most common string cases
-					ret.replace(rreturn, "") :
-					// handle cases where value is null/undef or number
-					ret == null ? "" : ret;
-			}
-
-			return;
-		}
-
-		isFunction = jQuery.isFunction( value );
-
-		return this.each(function( i ) {
-			var val,
-				self = jQuery(this);
-
-			if ( this.nodeType !== 1 ) {
-				return;
-			}
-
-			if ( isFunction ) {
-				val = value.call( this, i, self.val() );
-			} else {
-				val = value;
-			}
-
-			// Treat null/undefined as ""; convert numbers to string
-			if ( val == null ) {
-				val = "";
-			} else if ( typeof val === "number" ) {
-				val += "";
-			} else if ( jQuery.isArray( val ) ) {
-				val = jQuery.map(val, function ( value ) {
-					return value == null ? "" : value + "";
-				});
-			}
-
-			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-			// If set returns undefined, fall back to normal setting
-			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
-				this.value = val;
-			}
-		});
-	}
-});
-
-jQuery.extend({
-	valHooks: {
-		option: {
-			get: function( elem ) {
-				// attributes.value is undefined in Blackberry 4.7 but
-				// uses .value. See #6932
-				var val = elem.attributes.value;
-				return !val || val.specified ? elem.value : elem.text;
-			}
-		},
-		select: {
-			get: function( elem ) {
-				var value, i, max, option,
-					index = elem.selectedIndex,
-					values = [],
-					options = elem.options,
-					one = elem.type === "select-one";
-
-				// Nothing was selected
-				if ( index < 0 ) {
-					return null;
-				}
-
-				// Loop through all the selected options
-				i = one ? index : 0;
-				max = one ? index + 1 : options.length;
-				for ( ; i < max; i++ ) {
-					option = options[ i ];
-
-					// Don't return options that are disabled or in a disabled optgroup
-					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
-							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
-						// Get the specific value for the option
-						value = jQuery( option ).val();
-
-						// We don't need an array for one selects
-						if ( one ) {
-							return value;
-						}
-
-						// Multi-Selects return an array
-						values.push( value );
-					}
-				}
-
-				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
-				if ( one && !values.length && options.length ) {
-					return jQuery( options[ index ] ).val();
-				}
-
-				return values;
-			},
-
-			set: function( elem, value ) {
-				var values = jQuery.makeArray( value );
-
-				jQuery(elem).find("option").each(function() {
-					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
-				});
-
-				if ( !values.length ) {
-					elem.selectedIndex = -1;
-				}
-				return values;
-			}
-		}
-	},
-
-	// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
-	attrFn: {},
-
-	attr: function( elem, name, value, pass ) {
-		var ret, hooks, notxml,
-			nType = elem.nodeType;
-
-		// don't get/set attributes on text, comment and attribute nodes
-		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
-			return jQuery( elem )[ name ]( value );
-		}
-
-		// Fallback to prop when attributes are not supported
-		if ( typeof elem.getAttribute === "undefined" ) {
-			return jQuery.prop( elem, name, value );
-		}
-
-		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-		// All attributes are lowercase
-		// Grab necessary hook if one is defined
-		if ( notxml ) {
-			name = name.toLowerCase();
-			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
-		}
-
-		if ( value !== undefined ) {
-
-			if ( value === null ) {
-				jQuery.removeAttr( elem, name );
-				return;
-
-			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
-				return ret;
-
-			} else {
-				elem.setAttribute( name, "" + value );
-				return value;
-			}
-
-		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
-			return ret;
-
-		} else {
-
-			ret = elem.getAttribute( name );
-
-			// Non-existent attributes return null, we normalize to undefined
-			return ret === null ?
-				undefined :
-				ret;
-		}
-	},
-
-	removeAttr: function( elem, value ) {
-		var propName, attrNames, name, isBool,
-			i = 0;
-
-		if ( value && elem.nodeType === 1 ) {
-
-			attrNames = value.split( core_rspace );
-
-			for ( ; i < attrNames.length; i++ ) {
-				name = attrNames[ i ];
-
-				if ( name ) {
-					propName = jQuery.propFix[ name ] || name;
-					isBool = rboolean.test( name );
-
-					// See #9699 for explanation of this approach (setting first, then removal)
-					// Do not do this for boolean attributes (see #10870)
-					if ( !isBool ) {
-						jQuery.attr( elem, name, "" );
-					}
-					elem.removeAttribute( getSetAttribute ? name : propName );
-
-					// Set corresponding property to false for boolean attributes
-					if ( isBool && propName in elem ) {
-						elem[ propName ] = false;
-					}
-				}
-			}
-		}
-	},
-
-	attrHooks: {
-		type: {
-			set: function( elem, value ) {
-				// We can't allow the type property to be changed (since it causes problems in IE)
-				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
-					jQuery.error( "type property can't be changed" );
-				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
-					// Setting the type on a radio button after the value resets the value in IE6-9
-					// Reset value to it's default in case type is set after value
-					// This is for element creation
-					var val = elem.value;
-					elem.setAttribute( "type", value );
-					if ( val ) {
-						elem.value = val;
-					}
-					return value;
-				}
-			}
-		},
-		// Use the value property for back compat
-		// Use the nodeHook for button elements in IE6/7 (#1954)
-		value: {
-			get: function( elem, name ) {
-				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-					return nodeHook.get( elem, name );
-				}
-				return name in elem ?
-					elem.value :
-					null;
-			},
-			set: function( elem, value, name ) {
-				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-					return nodeHook.set( elem, value, name );
-				}
-				// Does not return so that setAttribute is also used
-				elem.value = value;
-			}
-		}
-	},
-
-	propFix: {
-		tabindex: "tabIndex",
-		readonly: "readOnly",
-		"for": "htmlFor",
-		"class": "className",
-		maxlength: "maxLength",
-		cellspacing: "cellSpacing",
-		cellpadding: "cellPadding",
-		rowspan: "rowSpan",
-		colspan: "colSpan",
-		usemap: "useMap",
-		frameborder: "frameBorder",
-		contenteditable: "contentEditable"
-	},
-
-	prop: function( elem, name, value ) {
-		var ret, hooks, notxml,
-			nType = elem.nodeType;
-
-		// don't get/set properties on text, comment and attribute nodes
-		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-		if ( notxml ) {
-			// Fix name and attach hooks
-			name = jQuery.propFix[ name ] || name;
-			hooks = jQuery.propHooks[ name ];
-		}
-
-		if ( value !== undefined ) {
-			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
-				return ret;
-
-			} else {
-				return ( elem[ name ] = value );
-			}
-
-		} else {
-			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
-				return ret;
-
-			} else {
-				return elem[ name ];
-			}
-		}
-	},
-
-	propHooks: {
-		tabIndex: {
-			get: function( elem ) {
-				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-				var attributeNode = elem.getAttributeNode("tabindex");
-
-				return attributeNode && attributeNode.specified ?
-					parseInt( attributeNode.value, 10 ) :
-					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-						0 :
-						undefined;
-			}
-		}
-	}
-});
-
-// Hook for boolean attributes
-boolHook = {
-	get: function( elem, name ) {
-		// Align boolean attributes with corresponding properties
-		// Fall back to attribute presence where some booleans are not supported
-		var attrNode,
-			property = jQuery.prop( elem, name );
-		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
-			name.toLowerCase() :
-			undefined;
-	},
-	set: function( elem, value, name ) {
-		var propName;
-		if ( value === false ) {
-			// Remove boolean attributes when set to false
-			jQuery.removeAttr( elem, name );
-		} else {
-			// value is true since we know at this point it's type boolean and not false
-			// Set boolean attributes to the same name and set the DOM property
-			propName = jQuery.propFix[ name ] || name;
-			if ( propName in elem ) {
-				// Only set the IDL specifically if it already exists on the element
-				elem[ propName ] = true;
-			}
-
-			elem.setAttribute( name, name.toLowerCase() );
-		}
-		return name;
-	}
-};
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
-	fixSpecified = {
-		name: true,
-		id: true,
-		coords: true
-	};
-
-	// Use this for any attribute in IE6/7
-	// This fixes almost every IE6/7 issue
-	nodeHook = jQuery.valHooks.button = {
-		get: function( elem, name ) {
-			var ret;
-			ret = elem.getAttributeNode( name );
-			return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
-				ret.value :
-				undefined;
-		},
-		set: function( elem, value, name ) {
-			// Set the existing or create a new attribute node
-			var ret = elem.getAttributeNode( name );
-			if ( !ret ) {
-				ret = document.createAttribute( name );
-				elem.setAttributeNode( ret );
-			}
-			return ( ret.value = value + "" );
-		}
-	};
-
-	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
-	// This is for removals
-	jQuery.each([ "width", "height" ], function( i, name ) {
-		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-			set: function( elem, value ) {
-				if ( value === "" ) {
-					elem.setAttribute( name, "auto" );
-					return value;
-				}
-			}
-		});
-	});
-
-	// Set contenteditable to false on removals(#10429)
-	// Setting to empty string throws an error as an invalid value
-	jQuery.attrHooks.contenteditable = {
-		get: nodeHook.get,
-		set: function( elem, value, name ) {
-			if ( value === "" ) {
-				value = "false";
-			}
-			nodeHook.set( elem, value, name );
-		}
-	};
-}
-
-
-// Some attributes require a special call on IE
-if ( !jQuery.support.hrefNormalized ) {
-	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
-		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-			get: function( elem ) {
-				var ret = elem.getAttribute( name, 2 );
-				return ret === null ? undefined : ret;
-			}
-		});
-	});
-}
-
-if ( !jQuery.support.style ) {
-	jQuery.attrHooks.style = {
-		get: function( elem ) {
-			// Return undefined in the case of empty string
-			// Normalize to lowercase since IE uppercases css property names
-			return elem.style.cssText.toLowerCase() || undefined;
-		},
-		set: function( elem, value ) {
-			return ( elem.style.cssText = "" + value );
-		}
-	};
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
-	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
-		get: function( elem ) {
-			var parent = elem.parentNode;
-
-			if ( parent ) {
-				parent.selectedIndex;
-
-				// Make sure that it also works with optgroups, see #5701
-				if ( parent.parentNode ) {
-					parent.parentNode.selectedIndex;
-				}
-			}
-			return null;
-		}
-	});
-}
-
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
-	jQuery.propFix.enctype = "encoding";
-}
-
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
-	jQuery.each([ "radio", "checkbox" ], function() {
-		jQuery.valHooks[ this ] = {
-			get: function( elem ) {
-				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
-				return elem.getAttribute("value") === null ? "on" : elem.value;
-			}
-		};
-	});
-}
-jQuery.each([ "radio", "checkbox" ], function() {
-	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
-		set: function( elem, value ) {
-			if ( jQuery.isArray( value ) ) {
-				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
-			}
-		}
-	});
-});
-var rformElems = /^(?:textarea|input|select)$/i,
-	rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
-	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
-	rkeyEvent = /^key/,
-	rmouseEvent = /^(?:mouse|contextmenu)|click/,
-	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-	hoverHack = function( events ) {
-		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
-	};
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
-	add: function( elem, types, handler, data, selector ) {
-
-		var elemData, eventHandle, events,
-			t, tns, type, namespaces, handleObj,
-			handleObjIn, handlers, special;
-
-		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
-		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
-			return;
-		}
-
-		// Caller can pass in an object of custom data in lieu of the handler
-		if ( handler.handler ) {
-			handleObjIn = handler;
-			handler = handleObjIn.handler;
-			selector = handleObjIn.selector;
-		}
-
-		// Make sure that the handler has a unique ID, used to find/remove it later
-		if ( !handler.guid ) {
-			handler.guid = jQuery.guid++;
-		}
-
-		// Init the element's event structure and main handler, if this is the first
-		events = elemData.events;
-		if ( !events ) {
-			elemData.events = events = {};
-		}
-		eventHandle = elemData.handle;
-		if ( !eventHandle ) {
-			elemData.handle = eventHandle = function( e ) {
-				// Discard the second event of a jQuery.event.trigger() and
-				// when an event is called after a page has unloaded
-				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
-					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
-					undefined;
-			};
-			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
-			eventHandle.elem = elem;
-		}
-
-		// Handle multiple events separated by a space
-		// jQuery(...).bind("mouseover mouseout", fn);
-		types = jQuery.trim( hoverHack(types) ).split( " " );
-		for ( t = 0; t < types.length; t++ ) {
-
-			tns = rtypenamespace.exec( types[t] ) || [];
-			type = tns[1];
-			namespaces = ( tns[2] || "" ).split( "." ).sort();
-
-			// If event changes its type, use the special event handlers for the changed type
-			special = jQuery.event.special[ type ] || {};
-
-			// If selector defined, determine special event api type, otherwise given type
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-
-			// Update special based on newly reset type
-			special = jQuery.event.special[ type ] || {};
-
-			// handleObj is passed to all event handlers
-			handleObj = jQuery.extend({
-				type: type,
-				origType: tns[1],
-				data: data,
-				handler: handler,
-				guid: handler.guid,
-				selector: selector,
-				namespace: namespaces.join(".")
-			}, handleObjIn );
-
-			// Init the event handler queue if we're the first
-			handlers = events[ type ];
-			if ( !handlers ) {
-				handlers = events[ type ] = [];
-				handlers.delegateCount = 0;
-
-				// Only use addEventListener/attachEvent if the special events handler returns false
-				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-					// Bind the global event handler to the element
-					if ( elem.addEventListener ) {
-						elem.addEventListener( type, eventHandle, false );
-
-					} else if ( elem.attachEvent ) {
-						elem.attachEvent( "on" + type, eventHandle );
-					}
-				}
-			}
-
-			if ( special.add ) {
-				special.add.call( elem, handleObj );
-
-				if ( !handleObj.handler.guid ) {
-					handleObj.handler.guid = handler.guid;
-				}
-			}
-
-			// Add to the element's handler list, delegates in front
-			if ( selector ) {
-				handlers.splice( handlers.delegateCount++, 0, handleObj );
-			} else {
-				handlers.push( handleObj );
-			}
-
-			// Keep track of which events have ever been used, for event optimization
-			jQuery.event.global[ type ] = true;
-		}
-
-		// Nullify elem to prevent memory leaks in IE
-		elem = null;
-	},
-
-	global: {},
-
-	// Detach an event or set of events from an element
-	remove: function( elem, types, handler, selector, mappedTypes ) {
-
-		var t, tns, type, origType, namespaces, origCount,
-			j, events, special, eventType, handleObj,
-			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
-
-		if ( !elemData || !(events = elemData.events) ) {
-			return;
-		}
-
-		// Once for each type.namespace in types; type may be omitted
-		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
-		for ( t = 0; t < types.length; t++ ) {
-			tns = rtypenamespace.exec( types[t] ) || [];
-			type = origType = tns[1];
-			namespaces = tns[2];
-
-			// Unbind all events (on this namespace, if provided) for the element
-			if ( !type ) {
-				for ( type in events ) {
-					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-				}
-				continue;
-			}
-
-			special = jQuery.event.special[ type ] || {};
-			type = ( selector? special.delegateType : special.bindType ) || type;
-			eventType = events[ type ] || [];
-			origCount = eventType.length;
-			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
-
-			// Remove matching events
-			for ( j = 0; j < eventType.length; j++ ) {
-				handleObj = eventType[ j ];
-
-				if ( ( mappedTypes || origType === handleObj.origType ) &&
-					 ( !handler || handler.guid === handleObj.guid ) &&
-					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
-					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
-					eventType.splice( j--, 1 );
-
-					if ( handleObj.selector ) {
-						eventType.delegateCount--;
-					}
-					if ( special.remove ) {
-						special.remove.call( elem, handleObj );
-					}
-				}
-			}
-
-			// Remove generic event handler if we removed something and no more handlers exist
-			// (avoids potential for endless recursion during removal of special event handlers)
-			if ( eventType.length === 0 && origCount !== eventType.length ) {
-				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-					jQuery.removeEvent( elem, type, elemData.handle );
-				}
-
-				delete events[ type ];
-			}
-		}
-
-		// Remove the expando if it's no longer used
-		if ( jQuery.isEmptyObject( events ) ) {
-			delete elemData.handle;
-
-			// removeData also checks for emptiness and clears the expando if empty
-			// so use it instead of delete
-			jQuery.removeData( elem, "events", true );
-		}
-	},
-
-	// Events that are safe to short-circuit if no handlers are attached.
-	// Native DOM events should not be added, they may have inline handlers.
-	customEvent: {
-		"getData": true,
-		"setData": true,
-		"changeData": true
-	},
-
-	trigger: function( event, data, elem, onlyHandlers ) {
-		// Don't do events on text and comment nodes
-		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
-			return;
-		}
-
-		// Event object or event type
-		var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
-			type = event.type || event,
-			namespaces = [];
-
-		// focus/blur morphs to focusin/out; ensure we're not firing them right now
-		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-			return;
-		}
-
-		if ( type.indexOf( "!" ) >= 0 ) {
-			// Exclusive events trigger only for the exact event (no namespaces)
-			type = type.slice(0, -1);
-			exclusive = true;
-		}
-
-		if ( type.indexOf( "." ) >= 0 ) {
-			// Namespaced trigger; create a regexp to match event type in handle()
-			namespaces = type.split(".");
-			type = namespaces.shift();
-			namespaces.sort();
-		}
-
-		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
-			// No jQuery handlers for this event type, and it can't have inline handlers
-			return;
-		}
-
-		// Caller can pass in an Event, Object, or just an event type string
-		event = typeof event === "object" ?
-			// jQuery.Event object
-			event[ jQuery.expando ] ? event :
-			// Object literal
-			new jQuery.Event( type, event ) :
-			// Just the event type (string)
-			new jQuery.Event( type );
-
-		event.type = type;
-		event.isTrigger = true;
-		event.exclusive = exclusive;
-		event.namespace = namespaces.join( "." );
-		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
-		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-
-		// Handle a global trigger
-		if ( !elem ) {
-
-			// TODO: Stop taunting the data cache; remove global events and always attach to document
-			cache = jQuery.cache;
-			for ( i in cache ) {
-				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
-					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
-				}
-			}
-			return;
-		}
-
-		// Clean up the event in case it is being reused
-		event.result = undefined;
-		if ( !event.target ) {
-			event.target = elem;
-		}
-
-		// Clone any incoming data and prepend the event, creating the handler arg list
-		data = data != null ? jQuery.makeArray( data ) : [];
-		data.unshift( event );
-
-		// Allow special events to draw outside the lines
-		special = jQuery.event.special[ type ] || {};
-		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
-			return;
-		}
-
-		// Determine event propagation path in advance, per W3C events spec (#9951)
-		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-		eventPath = [[ elem, special.bindType || type ]];
-		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
-			bubbleType = special.delegateType || type;
-			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
-			for ( old = elem; cur; cur = cur.parentNode ) {
-				eventPath.push([ cur, bubbleType ]);
-				old = cur;
-			}
-
-			// Only add window if we got to document (e.g., not plain obj or detached DOM)
-			if ( old === (elem.ownerDocument || document) ) {
-				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
-			}
-		}
-
-		// Fire handlers on the event path
-		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
-
-			cur = eventPath[i][0];
-			event.type = eventPath[i][1];
-
-			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
-			if ( handle ) {
-				handle.apply( cur, data );
-			}
-			// Note that this is a bare JS function and not a jQuery handler
-			handle = ontype && cur[ ontype ];
-			if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
-				event.preventDefault();
-			}
-		}
-		event.type = type;
-
-		// If nobody prevented the default action, do it now
-		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
-				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
-				// Call a native DOM method on the target with the same name name as the event.
-				// Can't use an .isFunction() check here because IE6/7 fails that test.
-				// Don't do default actions on window, that's where global variables be (#6170)
-				// IE<9 dies on focus/blur to hidden element (#1486)
-				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
-
-					// Don't re-trigger an onFOO event when we call its FOO() method
-					old = elem[ ontype ];
-
-					if ( old ) {
-						elem[ ontype ] = null;
-					}
-
-					// Prevent re-triggering of the same event, since we already bubbled it above
-					jQuery.event.triggered = type;
-					elem[ type ]();
-					jQuery.event.triggered = undefined;
-
-					if ( old ) {
-						elem[ ontype ] = old;
-					}
-				}
-			}
-		}
-
-		return event.result;
-	},
-
-	dispatch: function( event ) {
-
-		// Make a writable jQuery.Event from the native event object
-		event = jQuery.event.fix( event || window.event );
-
-		var i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related,
-			handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
-			delegateCount = handlers.delegateCount,
-			args = [].slice.call( arguments ),
-			run_all = !event.exclusive && !event.namespace,
-			special = jQuery.event.special[ event.type ] || {},
-			handlerQueue = [];
-
-		// Use the fix-ed jQuery.Event rather than the (read-only) native event
-		args[0] = event;
-		event.delegateTarget = this;
-
-		// Call the preDispatch hook for the mapped type, and let it bail if desired
-		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-			return;
-		}
-
-		// Determine handlers that should run if there are delegated events
-		// Avoid non-left-click bubbling in Firefox (#3861)
-		if ( delegateCount && !(event.button && event.type === "click") ) {
-
-			// Pregenerate a single jQuery object for reuse with .is()
-			jqcur = jQuery(this);
-			jqcur.context = this;
-
-			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
-
-				// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #xxxx)
-				if ( cur.disabled !== true || event.type !== "click" ) {
-					selMatch = {};
-					matches = [];
-					jqcur[0] = cur;
-					for ( i = 0; i < delegateCount; i++ ) {
-						handleObj = handlers[ i ];
-						sel = handleObj.selector;
-
-						if ( selMatch[ sel ] === undefined ) {
-							selMatch[ sel ] = jqcur.is( sel );
-						}
-						if ( selMatch[ sel ] ) {
-							matches.push( handleObj );
-						}
-					}
-					if ( matches.length ) {
-						handlerQueue.push({ elem: cur, matches: matches });
-					}
-				}
-			}
-		}
-
-		// Add the remaining (directly-bound) handlers
-		if ( handlers.length > delegateCount ) {
-			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
-		}
-
-		// Run delegates first; they may want to stop propagation beneath us
-		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
-			matched = handlerQueue[ i ];
-			event.currentTarget = matched.elem;
-
-			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
-				handleObj = matched.matches[ j ];
-
-				// Triggered event must either 1) be non-exclusive and have no namespace, or
-				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
-				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
-
-					event.data = handleObj.data;
-					event.handleObj = handleObj;
-
-					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
-							.apply( matched.elem, args );
-
-					if ( ret !== undefined ) {
-						event.result = ret;
-						if ( ret === false ) {
-							event.preventDefault();
-							event.stopPropagation();
-						}
-					}
-				}
-			}
-		}
-
-		// Call the postDispatch hook for the mapped type
-		if ( special.postDispatch ) {
-			special.postDispatch.call( this, event );
-		}
-
-		return event.result;
-	},
-
-	// Includes some event props shared by KeyEvent and MouseEvent
-	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
-	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
-	fixHooks: {},
-
-	keyHooks: {
-		props: "char charCode key keyCode".split(" "),
-		filter: function( event, original ) {
-
-			// Add which for key events
-			if ( event.which == null ) {
-				event.which = original.charCode != null ? original.charCode : original.keyCode;
-			}
-
-			return event;
-		}
-	},
-
-	mouseHooks: {
-		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
-		filter: function( event, original ) {
-			var eventDoc, doc, body,
-				button = original.button,
-				fromElement = original.fromElement;
-
-			// Calculate pageX/Y if missing and clientX/Y available
-			if ( event.pageX == null && original.clientX != null ) {
-				eventDoc = event.target.ownerDocument || document;
-				doc = eventDoc.documentElement;
-				body = eventDoc.body;
-
-				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
-			}
-
-			// Add relatedTarget, if necessary
-			if ( !event.relatedTarget && fromElement ) {
-				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-			}
-
-			// Add which for click: 1 === left; 2 === middle; 3 === right
-			// Note: button is not normalized, so don't use it
-			if ( !event.which && button !== undefined ) {
-				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-			}
-
-			return event;
-		}
-	},
-
-	fix: function( event ) {
-		if ( event[ jQuery.expando ] ) {
-			return event;
-		}
-
-		// Create a writable copy of the event object and normalize some properties
-		var i, prop,
-			originalEvent = event,
-			fixHook = jQuery.event.fixHooks[ event.type ] || {},
-			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
-		event = jQuery.Event( originalEvent );
-
-		for ( i = copy.length; i; ) {
-			prop = copy[ --i ];
-			event[ prop ] = originalEvent[ prop ];
-		}
-
-		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
-		if ( !event.target ) {
-			event.target = originalEvent.srcElement || document;
-		}
-
-		// Target should not be a text node (#504, Safari)
-		if ( event.target.nodeType === 3 ) {
-			event.target = event.target.parentNode;
-		}
-
-		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
-		event.metaKey = !!event.metaKey;
-
-		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
-	},
-
-	special: {
-		ready: {
-			// Make sure the ready event is setup
-			setup: jQuery.bindReady
-		},
-
-		load: {
-			// Prevent triggered image.load events from bubbling to window.load
-			noBubble: true
-		},
-
-		focus: {
-			delegateType: "focusin"
-		},
-		blur: {
-			delegateType: "focusout"
-		},
-
-		beforeunload: {
-			setup: function( data, namespaces, eventHandle ) {
-				// We only want to do this special case on windows
-				if ( jQuery.isWindow( this ) ) {
-					this.onbeforeunload = eventHandle;
-				}
-			},
-
-			teardown: function( namespaces, eventHandle ) {
-				if ( this.onbeforeunload === eventHandle ) {
-					this.onbeforeunload = null;
-				}
-			}
-		}
-	},
-
-	simulate: function( type, elem, event, bubble ) {
-		// Piggyback on a donor event to simulate a different one.
-		// Fake originalEvent to avoid donor's stopPropagation, but if the
-		// simulated event prevents default then we do the same on the donor.
-		var e = jQuery.extend(
-			new jQuery.Event(),
-			event,
-			{ type: type,
-				isSimulated: true,
-				originalEvent: {}
-			}
-		);
-		if ( bubble ) {
-			jQuery.event.trigger( e, null, elem );
-		} else {
-			jQuery.event.dispatch.call( elem, e );
-		}
-		if ( e.isDefaultPrevented() ) {
-			event.preventDefault();
-		}
-	}
-};
-
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-jQuery.event.handle = jQuery.event.dispatch;
-
-jQuery.removeEvent = document.removeEventListener ?
-	function( elem, type, handle ) {
-		if ( elem.removeEventListener ) {
-			elem.removeEventListener( type, handle, false );
-		}
-	} :
-	function( elem, type, handle ) {
-		var name = "on" + type;
-
-		if ( elem.detachEvent ) {
-
-			// #8545, #7054, preventing memory leaks for custom events in IE6-8 –
-			// detachEvent needed property on element, by name of that event, to properly expose it to GC
-			if ( typeof elem[ name ] === "undefined" ) {
-				elem[ name ] = null;
-			}
-
-			elem.detachEvent( name, handle );
-		}
-	};
-
-jQuery.Event = function( src, props ) {
-	// Allow instantiation without the 'new' keyword
-	if ( !(this instanceof jQuery.Event) ) {
-		return new jQuery.Event( src, props );
-	}
-
-	// Event object
-	if ( src && src.type ) {
-		this.originalEvent = src;
-		this.type = src.type;
-
-		// Events bubbling up the document may have been marked as prevented
-		// by a handler lower down the tree; reflect the correct value.
-		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
-			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
-	// Event type
-	} else {
-		this.type = src;
-	}
-
-	// Put explicitly provided properties onto the event object
-	if ( props ) {
-		jQuery.extend( this, props );
-	}
-
-	// Create a timestamp if incoming event doesn't have one
-	this.timeStamp = src && src.timeStamp || jQuery.now();
-
-	// Mark it as fixed
-	this[ jQuery.expando ] = true;
-};
-
-function returnFalse() {
-	return false;
-}
-function returnTrue() {
-	return true;
-}
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-	preventDefault: function() {
-		this.isDefaultPrevented = returnTrue;
-
-		var e = this.originalEvent;
-		if ( !e ) {
-			return;
-		}
-
-		// if preventDefault exists run it on the original event
-		if ( e.preventDefault ) {
-			e.preventDefault();
-
-		// otherwise set the returnValue property of the original event to false (IE)
-		} else {
-			e.returnValue = false;
-		}
-	},
-	stopPropagation: function() {
-		this.isPropagationStopped = returnTrue;
-
-		var e = this.originalEvent;
-		if ( !e ) {
-			return;
-		}
-		// if stopPropagation exists run it on the original event
-		if ( e.stopPropagation ) {
-			e.stopPropagation();
-		}
-		// otherwise set the cancelBubble property of the original event to true (IE)
-		e.cancelBubble = true;
-	},
-	stopImmediatePropagation: function() {
-		this.isImmediatePropagationStopped = returnTrue;
-		this.stopPropagation();
-	},
-	isDefaultPrevented: returnFalse,
-	isPropagationStopped: returnFalse,
-	isImmediatePropagationStopped: returnFalse
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-jQuery.each({
-	mouseenter: "mouseover",
-	mouseleave: "mouseout"
-}, function( orig, fix ) {
-	jQuery.event.special[ orig ] = {
-		delegateType: fix,
-		bindType: fix,
-
-		handle: function( event ) {
-			var ret,
-				target = this,
-				related = event.relatedTarget,
-				handleObj = event.handleObj,
-				selector = handleObj.selector;
-
-			// For mousenter/leave call the handler if related is outside the target.
-			// NB: No relatedTarget if the mouse left/entered the browser window
-			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
-				event.type = handleObj.origType;
-				ret = handleObj.handler.apply( this, arguments );
-				event.type = fix;
-			}
-			return ret;
-		}
-	};
-});
-
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
-	jQuery.event.special.submit = {
-		setup: function() {
-			// Only need this for delegated form submit events
-			if ( jQuery.nodeName( this, "form" ) ) {
-				return false;
-			}
-
-			// Lazy-add a submit handler when a descendant form may potentially be submitted
-			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-				// Node name check avoids a VML-related crash in IE (#9807)
-				var elem = e.target,
-					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-				if ( form && !jQuery._data( form, "_submit_attached" ) ) {
-					jQuery.event.add( form, "submit._submit", function( event ) {
-						event._submit_bubble = true;
-					});
-					jQuery._data( form, "_submit_attached", true );
-				}
-			});
-			// return undefined since we don't need an event listener
-		},
-
-		postDispatch: function( event ) {
-			// If form was submitted by the user, bubble the event up the tree
-			if ( event._submit_bubble ) {
-				delete event._submit_bubble;
-				if ( this.parentNode && !event.isTrigger ) {
-					jQuery.event.simulate( "submit", this.parentNode, event, true );
-				}
-			}
-		},
-
-		teardown: function() {
-			// Only need this for delegated form submit events
-			if ( jQuery.nodeName( this, "form" ) ) {
-				return false;
-			}
-
-			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-			jQuery.event.remove( this, "._submit" );
-		}
-	};
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
-
-	jQuery.event.special.change = {
-
-		setup: function() {
-
-			if ( rformElems.test( this.nodeName ) ) {
-				// IE doesn't fire change on a check/radio until blur; trigger it on click
-				// after a propertychange. Eat the blur-change in special.change.handle.
-				// This still fires onchange a second time for check/radio after blur.
-				if ( this.type === "checkbox" || this.type === "radio" ) {
-					jQuery.event.add( this, "propertychange._change", function( event ) {
-						if ( event.originalEvent.propertyName === "checked" ) {
-							this._just_changed = true;
-						}
-					});
-					jQuery.event.add( this, "click._change", function( event ) {
-						if ( this._just_changed && !event.isTrigger ) {
-							this._just_changed = false;
-						}
-						// Allow triggered, simulated change events (#11500)
-						jQuery.event.simulate( "change", this, event, true );
-					});
-				}
-				return false;
-			}
-			// Delegated event; lazy-add a change handler on descendant inputs
-			jQuery.event.add( this, "beforeactivate._change", function( e ) {
-				var elem = e.target;
-
-				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
-					jQuery.event.add( elem, "change._change", function( event ) {
-						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-							jQuery.event.simulate( "change", this.parentNode, event, true );
-						}
-					});
-					jQuery._data( elem, "_change_attached", true );
-				}
-			});
-		},
-
-		handle: function( event ) {
-			var elem = event.target;
-
-			// Swallow native change events from checkbox/radio, we already triggered them above
-			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
-				return event.handleObj.handler.apply( this, arguments );
-			}
-		},
-
-		teardown: function() {
-			jQuery.event.remove( this, "._change" );
-
-			return rformElems.test( this.nodeName );
-		}
-	};
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
-	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-		// Attach a single capturing handler while someone wants focusin/focusout
-		var attaches = 0,
-			handler = function( event ) {
-				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
-			};
-
-		jQuery.event.special[ fix ] = {
-			setup: function() {
-				if ( attaches++ === 0 ) {
-					document.addEventListener( orig, handler, true );
-				}
-			},
-			teardown: function() {
-				if ( --attaches === 0 ) {
-					document.removeEventListener( orig, handler, true );
-				}
-			}
-		};
-	});
-}
-
-jQuery.fn.extend({
-
-	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-		var origFn, type;
-
-		// Types can be a map of types/handlers
-		if ( typeof types === "object" ) {
-			// ( types-Object, selector, data )
-			if ( typeof selector !== "string" ) { // && selector != null
-				// ( types-Object, data )
-				data = data || selector;
-				selector = undefined;
-			}
-			for ( type in types ) {
-				this.on( type, selector, data, types[ type ], one );
-			}
-			return this;
-		}
-
-		if ( data == null && fn == null ) {
-			// ( types, fn )
-			fn = selector;
-			data = selector = undefined;
-		} else if ( fn == null ) {
-			if ( typeof selector === "string" ) {
-				// ( types, selector, fn )
-				fn = data;
-				data = undefined;
-			} else {
-				// ( types, data, fn )
-				fn = data;
-				data = selector;
-				selector = undefined;
-			}
-		}
-		if ( fn === false ) {
-			fn = returnFalse;
-		} else if ( !fn ) {
-			return this;
-		}
-
-		if ( one === 1 ) {
-			origFn = fn;
-			fn = function( event ) {
-				// Can use an empty set, since event contains the info
-				jQuery().off( event );
-				return origFn.apply( this, arguments );
-			};
-			// Use same guid so caller can remove using origFn
-			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-		}
-		return this.each( function() {
-			jQuery.event.add( this, types, fn, data, selector );
-		});
-	},
-	one: function( types, selector, data, fn ) {
-		return this.on( types, selector, data, fn, 1 );
-	},
-	off: function( types, selector, fn ) {
-		var handleObj, type;
-		if ( types && types.preventDefault && types.handleObj ) {
-			// ( event )  dispatched jQuery.Event
-			handleObj = types.handleObj;
-			jQuery( types.delegateTarget ).off(
-				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
-				handleObj.selector,
-				handleObj.handler
-			);
-			return this;
-		}
-		if ( typeof types === "object" ) {
-			// ( types-object [, selector] )
-			for ( type in types ) {
-				this.off( type, selector, types[ type ] );
-			}
-			return this;
-		}
-		if ( selector === false || typeof selector === "function" ) {
-			// ( types [, fn] )
-			fn = selector;
-			selector = undefined;
-		}
-		if ( fn === false ) {
-			fn = returnFalse;
-		}
-		return this.each(function() {
-			jQuery.event.remove( this, types, fn, selector );
-		});
-	},
-
-	bind: function( types, data, fn ) {
-		return this.on( types, null, data, fn );
-	},
-	unbind: function( types, fn ) {
-		return this.off( types, null, fn );
-	},
-
-	live: function( types, data, fn ) {
-		jQuery( this.context ).on( types, this.selector, data, fn );
-		return this;
-	},
-	die: function( types, fn ) {
-		jQuery( this.context ).off( types, this.selector || "**", fn );
-		return this;
-	},
-
-	delegate: function( selector, types, data, fn ) {
-		return this.on( types, selector, data, fn );
-	},
-	undelegate: function( selector, types, fn ) {
-		// ( namespace ) or ( selector, types [, fn] )
-		return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
-	},
-
-	trigger: function( type, data ) {
-		return this.each(function() {
-			jQuery.event.trigger( type, data, this );
-		});
-	},
-	triggerHandler: function( type, data ) {
-		if ( this[0] ) {
-			return jQuery.event.trigger( type, data, this[0], true );
-		}
-	},
-
-	toggle: function( fn ) {
-		// Save reference to arguments for access in closure
-		var args = arguments,
-			guid = fn.guid || jQuery.guid++,
-			i = 0,
-			toggler = function( event ) {
-				// Figure out which function to execute
-				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
-				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
-				// Make sure that clicks stop
-				event.preventDefault();
-
-				// and execute the function
-				return args[ lastToggle ].apply( this, arguments ) || false;
-			};
-
-		// link all the functions, so any of them can unbind this click handler
-		toggler.guid = guid;
-		while ( i < args.length ) {
-			args[ i++ ].guid = guid;
-		}
-
-		return this.click( toggler );
-	},
-
-	hover: function( fnOver, fnOut ) {
-		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-	}
-});
-
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
-	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
-
-	// Handle event binding
-	jQuery.fn[ name ] = function( data, fn ) {
-		if ( fn == null ) {
-			fn = data;
-			data = null;
-		}
-
-		return arguments.length > 0 ?
-			this.on( name, null, data, fn ) :
-			this.trigger( name );
-	};
-
-	if ( rkeyEvent.test( name ) ) {
-		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
-	}
-
-	if ( rmouseEvent.test( name ) ) {
-		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
-	}
-});
-/*!
- * Sizzle CSS Selector Engine
- *  Copyright 2012 jQuery Foundation and other contributors
- *  Released under the MIT license
- *  http://sizzlejs.com/
- */
-(function( window, undefined ) {
-
-var cachedruns,
-	dirruns,
-	sortOrder,
-	siblingCheck,
-	assertGetIdNotName,
-
-	document = window.document,
-	docElem = document.documentElement,
-
-	strundefined = "undefined",
-	hasDuplicate = false,
-	baseHasDuplicate = true,
-	done = 0,
-	slice = [].slice,
-	push = [].push,
-
-	expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
-
-	// Regex
-
-	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
-	whitespace = "[\\x20\\t\\r\\n\\f]",
-	// http://www.w3.org/TR/css3-syntax/#characters
-	characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
-
-	// Loosely modeled on CSS identifier characters
-	// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
-	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-	identifier = characterEncoding.replace( "w", "w#" ),
-
-	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
-	operators = "([*^$|!~]?=)",
-	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
-		"*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
-	pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",
-	pos = ":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",
-	combinators = whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*",
-	groups = "(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|" + attributes + "|" + pseudos.replace( 2, 7 ) + "|[^\\\\(),])+",
-
-	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
-	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
-	rcombinators = new RegExp( "^" + combinators ),
-
-	// All simple (non-comma) selectors, excluding insignifant trailing whitespace
-	rgroups = new RegExp( groups + "?(?=" + whitespace + "*,|$)", "g" ),
-
-	// A selector, or everything after leading whitespace
-	// Optionally followed in either case by a ")" for terminating sub-selectors
-	rselector = new RegExp( "^(?:(?!,)(?:(?:^|,)" + whitespace + "*" + groups + ")*?|" + whitespace + "*(.*?))(\\)|$)" ),
-
-	// All combinators and selector components (attribute test, tag, pseudo, etc.), the latter appearing together when consecutive
-	rtokens = new RegExp( groups.slice( 19, -6 ) + "\\x20\\t\\r\\n\\f>+~])+|" + combinators, "g" ),
-
-	// Easily-parseable/retrievable ID or TAG or CLASS selectors
-	rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
-
-	rsibling = /[\x20\t\r\n\f]*[+~]/,
-	rendsWithNot = /:not\($/,
-
-	rheader = /h\d/i,
-	rinputs = /input|select|textarea|button/i,
-
-	rbackslash = /\\(?!\\)/g,
-
-	matchExpr = {
-		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
-		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
-		"NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
-		"TAG": new RegExp( "^(" + characterEncoding.replace( "[-", "[-\\*" ) + ")" ),
-		"ATTR": new RegExp( "^" + attributes ),
-		"PSEUDO": new RegExp( "^" + pseudos ),
-		"CHILD": new RegExp( "^:(only|nth|last|first)-child(?:\\(" + whitespace +
-			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
-			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
-		"POS": new RegExp( pos, "ig" ),
-		// For use in libraries implementing .is()
-		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
-	},
-
-	classCache = {},
-	cachedClasses = [],
-	compilerCache = {},
-	cachedSelectors = [],
-
-	// Mark a function for use in filtering
-	markFunction = function( fn ) {
-		fn.sizzleFilter = true;
-		return fn;
-	},
-
-	// Returns a function to use in pseudos for input types
-	createInputFunction = function( type ) {
-		return function( elem ) {
-			// Check the input's nodeName and type
-			return elem.nodeName.toLowerCase() === "input" && elem.type === type;
-		};
-	},
-
-	// Returns a function to use in pseudos for buttons
-	createButtonFunction = function( type ) {
-		return function( elem ) {
-			var name = elem.nodeName.toLowerCase();
-			return (name === "input" || name === "button") && elem.type === type;
-		};
-	},
-
-	// Used for testing something on an element
-	assert = function( fn ) {
-		var pass = false,
-			div = document.createElement("div");
-		try {
-			pass = fn( div );
-		} catch (e) {}
-		// release memory in IE
-		div = null;
-		return pass;
-	},
-
-	// Check if attributes should be retrieved by attribute nodes
-	assertAttributes = assert(function( div ) {
-		div.innerHTML = "<select></select>";
-		var type = typeof div.lastChild.getAttribute("multiple");
-		// IE8 returns a string for some attributes even when not present
-		return type !== "boolean" && type !== "string";
-	}),
-
-	// Check if getElementById returns elements by name
-	// Check if getElementsByName privileges form controls or returns elements by ID
-	assertUsableName = assert(function( div ) {
-		// Inject content
-		div.id = expando + 0;
-		div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
-		docElem.insertBefore( div, docElem.firstChild );
-
-		// Test
-		var pass = document.getElementsByName &&
-			// buggy browsers will return fewer than the correct 2
-			document.getElementsByName( expando ).length ===
-			// buggy browsers will return more than the correct 0
-			2 + document.getElementsByName( expando + 0 ).length;
-		assertGetIdNotName = !document.getElementById( expando );
-
-		// Cleanup
-		docElem.removeChild( div );
-
-		return pass;
-	}),
-
-	// Check if the browser returns only elements
-	// when doing getElementsByTagName("*")
-	assertTagNameNoComments = assert(function( div ) {
-		div.appendChild( document.createComment("") );
-		return div.getElementsByTagName("*").length === 0;
-	}),
-
-	// Check if getAttribute returns normalized href attributes
-	assertHrefNotNormalized = assert(function( div ) {
-		div.innerHTML = "<a href='#'></a>";
-		return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
-			div.firstChild.getAttribute("href") === "#";
-	}),
-
-	// Check if getElementsByClassName can be trusted
-	assertUsableClassName = assert(function( div ) {
-		// Opera can't find a second classname (in 9.6)
-		div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
-		if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
-			return false;
-		}
-
-		// Safari caches class attributes, doesn't catch changes (in 3.2)
-		div.lastChild.className = "e";
-		return div.getElementsByClassName("e").length !== 1;
-	});
-
-var Sizzle = function( selector, context, results, seed ) {
-	results = results || [];
-	context = context || document;
-	var match, elem, xml, m,
-		nodeType = context.nodeType;
-
-	if ( nodeType !== 1 && nodeType !== 9 ) {
-		return [];
-	}
-
-	if ( !selector || typeof selector !== "string" ) {
-		return results;
-	}
-
-	xml = isXML( context );
-
-	if ( !xml && !seed ) {
-		if ( (match = rquickExpr.exec( selector )) ) {
-			// Speed-up: Sizzle("#ID")
-			if ( (m = match[1]) ) {
-				if ( nodeType === 9 ) {
-					elem = context.getElementById( m );
-					// Check parentNode to catch when Blackberry 4.6 returns
-					// nodes that are no longer in the document #6963
-					if ( elem && elem.parentNode ) {
-						// Handle the case where IE, Opera, and Webkit return items
-						// by name instead of ID
-						if ( elem.id === m ) {
-							results.push( elem );
-							return results;
-						}
-					} else {
-						return results;
-					}
-				} else {
-					// Context is not a document
-					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
-						contains( context, elem ) && elem.id === m ) {
-						results.push( elem );
-						return results;
-					}
-				}
-
-			// Speed-up: Sizzle("TAG")
-			} else if ( match[2] ) {
-				push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
-				return results;
-
-			// Speed-up: Sizzle(".CLASS")
-			} else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
-				push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
-				return results;
-			}
-		}
-	}
-
-	// All others
-	return select( selector, context, results, seed, xml );
-};
-
-var Expr = Sizzle.selectors = {
-
-	// Can be adjusted by the user
-	cacheLength: 50,
-
-	match: matchExpr,
-
-	order: [ "ID", "TAG" ],
-
-	attrHandle: {},
-
-	createPseudo: markFunction,
-
-	find: {
-		"ID": assertGetIdNotName ?
-			function( id, context, xml ) {
-				if ( typeof context.getElementById !== strundefined && !xml ) {
-					var m = context.getElementById( id );
-					// Check parentNode to catch when Blackberry 4.6 returns
-					// nodes that are no longer in the document #6963
-					return m && m.parentNode ? [m] : [];
-				}
-			} :
-			function( id, context, xml ) {
-				if ( typeof context.getElementById !== strundefined && !xml ) {
-					var m = context.getElementById( id );
-
-					return m ?
-						m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
-							[m] :
-							undefined :
-						[];
-				}
-			},
-
-		"TAG": assertTagNameNoComments ?
-			function( tag, context ) {
-				if ( typeof context.getElementsByTagName !== strundefined ) {
-					return context.getElementsByTagName( tag );
-				}
-			} :
-			function( tag, context ) {
-				var results = context.getElementsByTagName( tag );
-
-				// Filter out possible comments
-				if ( tag === "*" ) {
-					var elem,
-						tmp = [],
-						i = 0;
-
-					for ( ; (elem = results[i]); i++ ) {
-						if ( elem.nodeType === 1 ) {
-							tmp.push( elem );
-						}
-					}
-
-					return tmp;
-				}
-				return results;
-			}
-	},
-
-	relative: {
-		">": { dir: "parentNode", first: true },
-		" ": { dir: "parentNode" },
-		"+": { dir: "previousSibling", first: true },
-		"~": { dir: "previousSibling" }
-	},
-
-	preFilter: {
-		"ATTR": function( match ) {
-			match[1] = match[1].replace( rbackslash, "" );
-
-			// Move the given value to match[3] whether quoted or unquoted
-			match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
-
-			if ( match[2] === "~=" ) {
-				match[3] = " " + match[3] + " ";
-			}
-
-			return match.slice( 0, 4 );
-		},
-
-		"CHILD": function( match ) {
-			/* matches from matchExpr.CHILD
-				1 type (only|nth|...)
-				2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
-				3 xn-component of xn+y argument ([+-]?\d*n|)
-				4 sign of xn-component
-				5 x of xn-component
-				6 sign of y-component
-				7 y of y-component
-			*/
-			match[1] = match[1].toLowerCase();
-
-			if ( match[1] === "nth" ) {
-				// nth-child requires argument
-				if ( !match[2] ) {
-					Sizzle.error( match[0] );
-				}
-
-				// numeric x and y parameters for Expr.filter.CHILD
-				// remember that false/true cast respectively to 0/1
-				match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
-				match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
-
-			// other types prohibit arguments
-			} else if ( match[2] ) {
-				Sizzle.error( match[0] );
-			}
-
-			return match;
-		},
-
-		"PSEUDO": function( match ) {
-			var argument,
-				unquoted = match[4];
-
-			if ( matchExpr["CHILD"].test( match[0] ) ) {
-				return null;
-			}
-
-			// Relinquish our claim on characters in `unquoted` from a closing parenthesis on
-			if ( unquoted && (argument = rselector.exec( unquoted )) && argument.pop() ) {
-
-				match[0] = match[0].slice( 0, argument[0].length - unquoted.length - 1 );
-				unquoted = argument[0].slice( 0, -1 );
-			}
-
-			// Quoted or unquoted, we have the full argument
-			// Return only captures needed by the pseudo filter method (type and argument)
-			match.splice( 2, 3, unquoted || match[3] );
-			return match;
-		}
-	},
-
-	filter: {
-		"ID": assertGetIdNotName ?
-			function( id ) {
-				id = id.replace( rbackslash, "" );
-				return function( elem ) {
-					return elem.getAttribute("id") === id;
-				};
-			} :
-			function( id ) {
-				id = id.replace( rbackslash, "" );
-				return function( elem ) {
-					var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
-					return node && node.value === id;
-				};
-			},
-
-		"TAG": function( nodeName ) {
-			if ( nodeName === "*" ) {
-				return function() { return true; };
-			}
-			nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
-
-			return function( elem ) {
-				return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
-			};
-		},
-
-		"CLASS": function( className ) {
-			var pattern = classCache[ className ];
-			if ( !pattern ) {
-				pattern = classCache[ className ] = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" );
-				cachedClasses.push( className );
-				// Avoid too large of a cache
-				if ( cachedClasses.length > Expr.cacheLength ) {
-					delete classCache[ cachedClasses.shift() ];
-				}
-			}
-			return function( elem ) {
-				return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
-			};
-		},
-
-		"ATTR": function( name, operator, check ) {
-			if ( !operator ) {
-				return function( elem ) {
-					return Sizzle.attr( elem, name ) != null;
-				};
-			}
-
-			return function( elem ) {
-				var result = Sizzle.attr( elem, name ),
-					value = result + "";
-
-				if ( result == null ) {
-					return operator === "!=";
-				}
-
-				switch ( operator ) {
-					case "=":
-						return value === check;
-					case "!=":
-						return value !== check;
-					case "^=":
-						return check && value.indexOf( check ) === 0;
-					case "*=":
-						return check && value.indexOf( check ) > -1;
-					case "$=":
-						return check && value.substr( value.length - check.length ) === check;
-					case "~=":
-						return ( " " + value + " " ).indexOf( check ) > -1;
-					case "|=":
-						return value === check || value.substr( 0, check.length + 1 ) === check + "-";
-				}
-			};
-		},
-
-		"CHILD": function( type, argument, first, last ) {
-
-			if ( type === "nth" ) {
-				var doneName = done++;
-
-				return function( elem ) {
-					var parent, diff,
-						count = 0,
-						node = elem;
-
-					if ( first === 1 && last === 0 ) {
-						return true;
-					}
-
-					parent = elem.parentNode;
-
-					if ( parent && (parent[ expando ] !== doneName || !elem.sizset) ) {
-						for ( node = parent.firstChild; node; node = node.nextSibling ) {
-							if ( node.nodeType === 1 ) {
-								node.sizset = ++count;
-								if ( node === elem ) {
-									break;
-								}
-							}
-						}
-
-						parent[ expando ] = doneName;
-					}
-
-					diff = elem.sizset - last;
-
-					if ( first === 0 ) {
-						return diff === 0;
-
-					} else {
-						return ( diff % first === 0 && diff / first >= 0 );
-					}
-				};
-			}
-
-			return function( elem ) {
-				var node = elem;
-
-				switch ( type ) {
-					case "only":
-					case "first":
-						while ( (node = node.previousSibling) ) {
-							if ( node.nodeType === 1 ) {
-								return false;
-							}
-						}
-
-						if ( type === "first" ) {
-							return true;
-						}
-
-						node = elem;
-
-						/* falls through */
-					case "last":
-						while ( (node = node.nextSibling) ) {
-							if ( node.nodeType === 1 ) {
-								return false;
-							}
-						}
-
-						return true;
-				}
-			};
-		},
-
-		"PSEUDO": function( pseudo, argument, context, xml ) {
-			// pseudo-class names are case-insensitive
-			// http://www.w3.org/TR/selectors/#pseudo-classes
-			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
-			var fn = Expr.pseudos[ pseudo ] || Expr.pseudos[ pseudo.toLowerCase() ];
-
-			if ( !fn ) {
-				Sizzle.error( "unsupported pseudo: " + pseudo );
-			}
-
-			// The user may set fn.sizzleFilter to indicate
-			// that arguments are needed to create the filter function
-			// just as Sizzle does
-			if ( !fn.sizzleFilter ) {
-				return fn;
-			}
-
-			return fn( argument, context, xml );
-		}
-	},
-
-	pseudos: {
-		"not": markFunction(function( selector, context, xml ) {
-			// Trim the selector passed to compile
-			// to avoid treating leading and trailing
-			// spaces as combinators
-			var matcher = compile( selector.replace( rtrim, "$1" ), context, xml );
-			return function( elem ) {
-				return !matcher( elem );
-			};
-		}),
-
-		"enabled": function( elem ) {
-			return elem.disabled === false;
-		},
-
-		"disabled": function( elem ) {
-			return elem.disabled === true;
-		},
-
-		"checked": function( elem ) {
-			// In CSS3, :checked should return both checked and selected elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			var nodeName = elem.nodeName.toLowerCase();
-			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
-		},
-
-		"selected": function( elem ) {
-			// Accessing this property makes selected-by-default
-			// options in Safari work properly
-			if ( elem.parentNode ) {
-				elem.parentNode.selectedIndex;
-			}
-
-			return elem.selected === true;
-		},
-
-		"parent": function( elem ) {
-			return !Expr.pseudos["empty"]( elem );
-		},
-
-		"empty": function( elem ) {
-			// http://www.w3.org/TR/selectors/#empty-pseudo
-			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
-			//   not comment, processing instructions, or others
-			// Thanks to Diego Perini for the nodeName shortcut
-			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
-			var nodeType;
-			elem = elem.firstChild;
-			while ( elem ) {
-				if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
-					return false;
-				}
-				elem = elem.nextSibling;
-			}
-			return true;
-		},
-
-		"contains": markFunction(function( text ) {
-			return function( elem ) {
-				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
-			};
-		}),
-
-		"has": markFunction(function( selector ) {
-			return function( elem ) {
-				return Sizzle( selector, elem ).length > 0;
-			};
-		}),
-
-		"header": function( elem ) {
-			return rheader.test( elem.nodeName );
-		},
-
-		"text": function( elem ) {
-			var type, attr;
-			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
-			// use getAttribute instead to test this case
-			return elem.nodeName.toLowerCase() === "input" &&
-				(type = elem.type) === "text" &&
-				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
-		},
-
-		// Input types
-		"radio": createInputFunction("radio"),
-		"checkbox": createInputFunction("checkbox"),
-		"file": createInputFunction("file"),
-		"password": createInputFunction("password"),
-		"image": createInputFunction("image"),
-
-		"submit": createButtonFunction("submit"),
-		"reset": createButtonFunction("reset"),
-
-		"button": function( elem ) {
-			var name = elem.nodeName.toLowerCase();
-			return name === "input" && elem.type === "button" || name === "button";
-		},
-
-		"input": function( elem ) {
-			return rinputs.test( elem.nodeName );
-		},
-
-		"focus": function( elem ) {
-			var doc = elem.ownerDocument;
-			return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);
-		},
-
-		"active": function( elem ) {
-			return elem === elem.ownerDocument.activeElement;
-		}
-	},
-
-	setFilters: {
-		"first": function( elements, argument, not ) {
-			return not ? elements.slice( 1 ) : [ elements[0] ];
-		},
-
-		"last": function( elements, argument, not ) {
-			var elem = elements.pop();
-			return not ? elements : [ elem ];
-		},
-
-		"even": function( elements, argument, not ) {
-			var results = [],
-				i = not ? 1 : 0,
-				len = elements.length;
-			for ( ; i < len; i = i + 2 ) {
-				results.push( elements[i] );
-			}
-			return results;
-		},
-
-		"odd": function( elements, argument, not ) {
-			var results = [],
-				i = not ? 0 : 1,
-				len = elements.length;
-			for ( ; i < len; i = i + 2 ) {
-				results.push( elements[i] );
-			}
-			return results;
-		},
-
-		"lt": function( elements, argument, not ) {
-			return not ? elements.slice( +argument ) : elements.slice( 0, +argument );
-		},
-
-		"gt": function( elements, argument, not ) {
-			return not ? elements.slice( 0, +argument + 1 ) : elements.slice( +argument + 1 );
-		},
-
-		"eq": function( elements, argument, not ) {
-			var elem = elements.splice( +argument, 1 );
-			return not ? elements : elem;
-		}
-	}
-};
-
-// Deprecated
-Expr.setFilters["nth"] = Expr.setFilters["eq"];
-
-// Back-compat
-Expr.filters = Expr.pseudos;
-
-// IE6/7 return a modified href
-if ( !assertHrefNotNormalized ) {
-	Expr.attrHandle = {
-		"href": function( elem ) {
-			return elem.getAttribute( "href", 2 );
-		},
-		"type": function( elem ) {
-			return elem.getAttribute("type");
-		}
-	};
-}
-
-// Add getElementsByName if usable
-if ( assertUsableName ) {
-	Expr.order.push("NAME");
-	Expr.find["NAME"] = function( name, context ) {
-		if ( typeof context.getElementsByName !== strundefined ) {
-			return context.getElementsByName( name );
-		}
-	};
-}
-
-// Add getElementsByClassName if usable
-if ( assertUsableClassName ) {
-	Expr.order.splice( 1, 0, "CLASS" );
-	Expr.find["CLASS"] = function( className, context, xml ) {
-		if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
-			return context.getElementsByClassName( className );
-		}
-	};
-}
-
-// If slice is not available, provide a backup
-try {
-	slice.call( docElem.childNodes, 0 )[0].nodeType;
-} catch ( e ) {
-	slice = function( i ) {
-		var elem, results = [];
-		for ( ; (elem = this[i]); i++ ) {
-			results.push( elem );
-		}
-		return results;
-	};
-}
-
-var isXML = Sizzle.isXML = function( elem ) {
-	// documentElement is verified for cases where it doesn't yet exist
-	// (such as loading iframes in IE - #4833)
-	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
-	return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-// Element contains another
-var contains = Sizzle.contains = docElem.compareDocumentPosition ?
-	function( a, b ) {
-		return !!( a.compareDocumentPosition( b ) & 16 );
-	} :
-	docElem.contains ?
-	function( a, b ) {
-		var adown = a.nodeType === 9 ? a.documentElement : a,
-			bup = b.parentNode;
-		return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
-	} :
-	function( a, b ) {
-		while ( (b = b.parentNode) ) {
-			if ( b === a ) {
-				return true;
-			}
-		}
-		return false;
-	};
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-var getText = Sizzle.getText = function( elem ) {
-	var node,
-		ret = "",
-		i = 0,
-		nodeType = elem.nodeType;
-
-	if ( nodeType ) {
-		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-			// Use textContent for elements
-			// innerText usage removed for consistency of new lines (see #11153)
-			if ( typeof elem.textContent === "string" ) {
-				return elem.textContent;
-			} else {
-				// Traverse its children
-				for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-					ret += getText( elem );
-				}
-			}
-		} else if ( nodeType === 3 || nodeType === 4 ) {
-			return elem.nodeValue;
-		}
-		// Do not include comment or processing instruction nodes
-	} else {
-
-		// If no nodeType, this is expected to be an array
-		for ( ; (node = elem[i]); i++ ) {
-			// Do not traverse comment nodes
-			ret += getText( node );
-		}
-	}
-	return ret;
-};
-
-Sizzle.attr = function( elem, name ) {
-	var attr,
-		xml = isXML( elem );
-
-	if ( !xml ) {
-		name = name.toLowerCase();
-	}
-	if ( Expr.attrHandle[ name ] ) {
-		return Expr.attrHandle[ name ]( elem );
-	}
-	if ( assertAttributes || xml ) {
-		return elem.getAttribute( name );
-	}
-	attr = elem.getAttributeNode( name );
-	return attr ?
-		typeof elem[ name ] === "boolean" ?
-			elem[ name ] ? name : null :
-			attr.specified ? attr.value : null :
-		null;
-};
-
-Sizzle.error = function( msg ) {
-	throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-// Check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-//   Thus far that includes Google Chrome.
-[0, 0].sort(function() {
-	return (baseHasDuplicate = 0);
-});
-
-
-if ( docElem.compareDocumentPosition ) {
-	sortOrder = function( a, b ) {
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
-			a.compareDocumentPosition :
-			a.compareDocumentPosition(b) & 4
-		) ? -1 : 1;
-	};
-
-} else {
-	sortOrder = function( a, b ) {
-		// The nodes are identical, we can exit early
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-
-		// Fallback to using sourceIndex (in IE) if it's available on both nodes
-		} else if ( a.sourceIndex && b.sourceIndex ) {
-			return a.sourceIndex - b.sourceIndex;
-		}
-
-		var al, bl,
-			ap = [],
-			bp = [],
-			aup = a.parentNode,
-			bup = b.parentNode,
-			cur = aup;
-
-		// If the nodes are siblings (or identical) we can do a quick check
-		if ( aup === bup ) {
-			return siblingCheck( a, b );
-
-		// If no parents were found then the nodes are disconnected
-		} else if ( !aup ) {
-			return -1;
-
-		} else if ( !bup ) {
-			return 1;
-		}
-
-		// Otherwise they're somewhere else in the tree so we need
-		// to build up a full list of the parentNodes for comparison
-		while ( cur ) {
-			ap.unshift( cur );
-			cur = cur.parentNode;
-		}
-
-		cur = bup;
-
-		while ( cur ) {
-			bp.unshift( cur );
-			cur = cur.parentNode;
-		}
-
-		al = ap.length;
-		bl = bp.length;
-
-		// Start walking down the tree looking for a discrepancy
-		for ( var i = 0; i < al && i < bl; i++ ) {
-			if ( ap[i] !== bp[i] ) {
-				return siblingCheck( ap[i], bp[i] );
-			}
-		}
-
-		// We ended someplace up the tree so do a sibling check
-		return i === al ?
-			siblingCheck( a, bp[i], -1 ) :
-			siblingCheck( ap[i], b, 1 );
-	};
-
-	siblingCheck = function( a, b, ret ) {
-		if ( a === b ) {
-			return ret;
-		}
-
-		var cur = a.nextSibling;
-
-		while ( cur ) {
-			if ( cur === b ) {
-				return -1;
-			}
-
-			cur = cur.nextSibling;
-		}
-
-		return 1;
-	};
-}
-
-// Document sorting and removing duplicates
-Sizzle.uniqueSort = function( results ) {
-	var elem,
-		i = 1;
-
-	if ( sortOrder ) {
-		hasDuplicate = baseHasDuplicate;
-		results.sort( sortOrder );
-
-		if ( hasDuplicate ) {
-			for ( ; (elem = results[i]); i++ ) {
-				if ( elem === results[ i - 1 ] ) {
-					results.splice( i--, 1 );
-				}
-			}
-		}
-	}
-
-	return results;
-};
-
-function multipleContexts( selector, contexts, results, seed ) {
-	var i = 0,
-		len = contexts.length;
-	for ( ; i < len; i++ ) {
-		Sizzle( selector, contexts[i], results, seed );
-	}
-}
-
-function handlePOSGroup( selector, posfilter, argument, contexts, seed, not ) {
-	var results,
-		fn = Expr.setFilters[ posfilter.toLowerCase() ];
-
-	if ( !fn ) {
-		Sizzle.error( posfilter );
-	}
-
-	if ( selector || !(results = seed) ) {
-		multipleContexts( selector || "*", contexts, (results = []), seed );
-	}
-
-	return results.length > 0 ? fn( results, argument, not ) : [];
-}
-
-function handlePOS( selector, context, results, seed, groups ) {
-	var match, not, anchor, ret, elements, currentContexts, part, lastIndex,
-		i = 0,
-		len = groups.length,
-		rpos = matchExpr["POS"],
-		// This is generated here in case matchExpr["POS"] is extended
-		rposgroups = new RegExp( "^" + rpos.source + "(?!" + whitespace + ")", "i" ),
-		// This is for making sure non-participating
-		// matching groups are represented cross-browser (IE6-8)
-		setUndefined = function() {
-			var i = 1,
-				len = arguments.length - 2;
-			for ( ; i < len; i++ ) {
-				if ( arguments[i] === undefined ) {
-					match[i] = undefined;
-				}
-			}
-		};
-
-	for ( ; i < len; i++ ) {
-		// Reset regex index to 0
-		rpos.exec("");
-		selector = groups[i];
-		ret = [];
-		anchor = 0;
-		elements = seed;
-		while ( (match = rpos.exec( selector )) ) {
-			lastIndex = rpos.lastIndex = match.index + match[0].length;
-			if ( lastIndex > anchor ) {
-				part = selector.slice( anchor, match.index );
-				anchor = lastIndex;
-				currentContexts = [ context ];
-
-				if ( rcombinators.test(part) ) {
-					if ( elements ) {
-						currentContexts = elements;
-					}
-					elements = seed;
-				}
-
-				if ( (not = rendsWithNot.test( part )) ) {
-					part = part.slice( 0, -5 ).replace( rcombinators, "$&*" );
-				}
-
-				if ( match.length > 1 ) {
-					match[0].replace( rposgroups, setUndefined );
-				}
-				elements = handlePOSGroup( part, match[1], match[2], currentContexts, elements, not );
-			}
-		}
-
-		if ( elements ) {
-			ret = ret.concat( elements );
-
-			if ( (part = selector.slice( anchor )) && part !== ")" ) {
-				if ( rcombinators.test(part) ) {
-					multipleContexts( part, ret, results, seed );
-				} else {
-					Sizzle( part, context, results, seed ? seed.concat(elements) : elements );
-				}
-			} else {
-				push.apply( results, ret );
-			}
-		} else {
-			Sizzle( selector, context, results, seed );
-		}
-	}
-
-	// Do not sort if this is a single filter
-	return len === 1 ? results : Sizzle.uniqueSort( results );
-}
-
-function tokenize( selector, context, xml ) {
-	var tokens, soFar, type,
-		groups = [],
-		i = 0,
-
-		// Catch obvious selector issues: terminal ")"; nonempty fallback match
-		// rselector never fails to match *something*
-		match = rselector.exec( selector ),
-		matched = !match.pop() && !match.pop(),
-		selectorGroups = matched && selector.match( rgroups ) || [""],
-
-		preFilters = Expr.preFilter,
-		filters = Expr.filter,
-		checkContext = !xml && context !== document;
-
-	for ( ; (soFar = selectorGroups[i]) != null && matched; i++ ) {
-		groups.push( tokens = [] );
-
-		// Need to make sure we're within a narrower context if necessary
-		// Adding a descendant combinator will generate what is needed
-		if ( checkContext ) {
-			soFar = " " + soFar;
-		}
-
-		while ( soFar ) {
-			matched = false;
-
-			// Combinators
-			if ( (match = rcombinators.exec( soFar )) ) {
-				soFar = soFar.slice( match[0].length );
-
-				// Cast descendant combinators to space
-				matched = tokens.push({ part: match.pop().replace( rtrim, " " ), captures: match });
-			}
-
-			// Filters
-			for ( type in filters ) {
-				if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
-					(match = preFilters[ type ]( match, context, xml )) ) ) {
-
-					soFar = soFar.slice( match.shift().length );
-					matched = tokens.push({ part: type, captures: match });
-				}
-			}
-
-			if ( !matched ) {
-				break;
-			}
-		}
-	}
-
-	if ( !matched ) {
-		Sizzle.error( selector );
-	}
-
-	return groups;
-}
-
-function addCombinator( matcher, combinator, context ) {
-	var dir = combinator.dir,
-		doneName = done++;
-
-	if ( !matcher ) {
-		// If there is no matcher to check, check against the context
-		matcher = function( elem ) {
-			return elem === context;
-		};
-	}
-	return combinator.first ?
-		function( elem, context ) {
-			while ( (elem = elem[ dir ]) ) {
-				if ( elem.nodeType === 1 ) {
-					return matcher( elem, context ) && elem;
-				}
-			}
-		} :
-		function( elem, context ) {
-			var cache,
-				dirkey = doneName + "." + dirruns,
-				cachedkey = dirkey + "." + cachedruns;
-			while ( (elem = elem[ dir ]) ) {
-				if ( elem.nodeType === 1 ) {
-					if ( (cache = elem[ expando ]) === cachedkey ) {
-						return elem.sizset;
-					} else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
-						if ( elem.sizset ) {
-							return elem;
-						}
-					} else {
-						elem[ expando ] = cachedkey;
-						if ( matcher( elem, context ) ) {
-							elem.sizset = true;
-							return elem;
-						}
-						elem.sizset = false;
-					}
-				}
-			}
-		};
-}
-
-function addMatcher( higher, deeper ) {
-	return higher ?
-		function( elem, context ) {
-			var result = deeper( elem, context );
-			return result && higher( result === true ? elem : result, context );
-		} :
-		deeper;
-}
-
-// ["TAG", ">", "ID", " ", "CLASS"]
-function matcherFromTokens( tokens, context, xml ) {
-	var token, matcher,
-		i = 0;
-
-	for ( ; (token = tokens[i]); i++ ) {
-		if ( Expr.relative[ token.part ] ) {
-			matcher = addCombinator( matcher, Expr.relative[ token.part ], context );
-		} else {
-			token.captures.push( context, xml );
-			matcher = addMatcher( matcher, Expr.filter[ token.part ].apply( null, token.captures ) );
-		}
-	}
-
-	return matcher;
-}
-
-function matcherFromGroupMatchers( matchers ) {
-	return function( elem, context ) {
-		var matcher,
-			j = 0;
-		for ( ; (matcher = matchers[j]); j++ ) {
-			if ( matcher(elem, context) ) {
-				return true;
-			}
-		}
-		return false;
-	};
-}
-
-var compile = Sizzle.compile = function( selector, context, xml ) {
-	var tokens, group, i,
-		cached = compilerCache[ selector ];
-
-	// Return a cached group function if already generated (context dependent)
-	if ( cached && cached.context === context ) {
-		return cached;
-	}
-
-	// Generate a function of recursive functions that can be used to check each element
-	group = tokenize( selector, context, xml );
-	for ( i = 0; (tokens = group[i]); i++ ) {
-		group[i] = matcherFromTokens( tokens, context, xml );
-	}
-
-	// Cache the compiled function
-	cached = compilerCache[ selector ] = matcherFromGroupMatchers( group );
-	cached.context = context;
-	cached.runs = cached.dirruns = 0;
-	cachedSelectors.push( selector );
-	// Ensure only the most recent are cached
-	if ( cachedSelectors.length > Expr.cacheLength ) {
-		delete compilerCache[ cachedSelectors.shift() ];
-	}
-	return cached;
-};
-
-Sizzle.matches = function( expr, elements ) {
-	return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
-	return Sizzle( expr, null, null, [ elem ] ).length > 0;
-};
-
-var select = function( selector, context, results, seed, xml ) {
-	// Remove excessive whitespace
-	selector = selector.replace( rtrim, "$1" );
-	var elements, matcher, i, len, elem, token,
-		type, findContext, notTokens,
-		match = selector.match( rgroups ),
-		tokens = selector.match( rtokens ),
-		contextNodeType = context.nodeType;
-
-	// POS handling
-	if ( matchExpr["POS"].test(selector) ) {
-		return handlePOS( selector, context, results, seed, match );
-	}
-
-	if ( seed ) {
-		elements = slice.call( seed, 0 );
-
-	// To maintain document order, only narrow the
-	// set if there is one group
-	} else if ( match && match.length === 1 ) {
-
-		// Take a shortcut and set the context if the root selector is an ID
-		if ( tokens.length > 1 && contextNodeType === 9 && !xml &&
-				(match = matchExpr["ID"].exec( tokens[0] )) ) {
-
-			context = Expr.find["ID"]( match[1], context, xml )[0];
-			if ( !context ) {
-				return results;
-			}
-
-			selector = selector.slice( tokens.shift().length );
-		}
-
-		findContext = ( (match = rsibling.exec( tokens[0] )) && !match.index && context.parentNode ) || context;
-
-		// Get the last token, excluding :not
-		notTokens = tokens.pop();
-		token = notTokens.split(":not")[0];
-
-		for ( i = 0, len = Expr.order.length; i < len; i++ ) {
-			type = Expr.order[i];
-
-			if ( (match = matchExpr[ type ].exec( token )) ) {
-				elements = Expr.find[ type ]( (match[1] || "").replace( rbackslash, "" ), findContext, xml );
-
-				if ( elements == null ) {
-					continue;
-				}
-
-				if ( token === notTokens ) {
-					selector = selector.slice( 0, selector.length - notTokens.length ) +
-						token.replace( matchExpr[ type ], "" );
-
-					if ( !selector ) {
-						push.apply( results, slice.call(elements, 0) );
-					}
-				}
-				break;
-			}
-		}
-	}
-
-	// Only loop over the given elements once
-	// If selector is empty, we're already done
-	if ( selector ) {
-		matcher = compile( selector, context, xml );
-		dirruns = matcher.dirruns++;
-
-		if ( elements == null ) {
-			elements = Expr.find["TAG"]( "*", (rsibling.test( selector ) && context.parentNode) || context );
-		}
-		for ( i = 0; (elem = elements[i]); i++ ) {
-			cachedruns = matcher.runs++;
-			if ( matcher(elem, context) ) {
-				results.push( elem );
-			}
-		}
-	}
-
-	return results;
-};
-
-if ( document.querySelectorAll ) {
-	(function() {
-		var disconnectedMatch,
-			oldSelect = select,
-			rescape = /'|\\/g,
-			rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
-			rbuggyQSA = [],
-			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
-			// A support test would require too much code (would include document ready)
-			// just skip matchesSelector for :active
-			rbuggyMatches = [":active"],
-			matches = docElem.matchesSelector ||
-				docElem.mozMatchesSelector ||
-				docElem.webkitMatchesSelector ||
-				docElem.oMatchesSelector ||
-				docElem.msMatchesSelector;
-
-		// Build QSA regex
-		// Regex strategy adopted from Diego Perini
-		assert(function( div ) {
-			div.innerHTML = "<select><option selected></option></select>";
-
-			// IE8 - Some boolean attributes are not treated correctly
-			if ( !div.querySelectorAll("[selected]").length ) {
-				rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
-			}
-
-			// Webkit/Opera - :checked should return selected option elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			// IE8 throws error here (do not put tests after this one)
-			if ( !div.querySelectorAll(":checked").length ) {
-				rbuggyQSA.push(":checked");
-			}
-		});
-
-		assert(function( div ) {
-
-			// Opera 10-12/IE9 - ^= $= *= and empty values
-			// Should not select anything
-			div.innerHTML = "<p test=''></p>";
-			if ( div.querySelectorAll("[test^='']").length ) {
-				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
-			}
-
-			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-			// IE8 throws error here (do not put tests after this one)
-			div.innerHTML = "<input type='hidden'>";
-			if ( !div.querySelectorAll(":enabled").length ) {
-				rbuggyQSA.push(":enabled", ":disabled");
-			}
-		});
-
-		rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
-
-		select = function( selector, context, results, seed, xml ) {
-			// Only use querySelectorAll when not filtering,
-			// when this is not xml,
-			// and when no QSA bugs apply
-			if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
-				if ( context.nodeType === 9 ) {
-					try {
-						push.apply( results, slice.call(context.querySelectorAll( selector ), 0) );
-						return results;
-					} catch(qsaError) {}
-				// qSA works strangely on Element-rooted queries
-				// We can work around this by specifying an extra ID on the root
-				// and working up from there (Thanks to Andrew Dupont for the technique)
-				// IE 8 doesn't work on object elements
-				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
-					var old = context.getAttribute("id"),
-						nid = old || expando,
-						newContext = rsibling.test( selector ) && context.parentNode || context;
-
-					if ( old ) {
-						nid = nid.replace( rescape, "\\$&" );
-					} else {
-						context.setAttribute( "id", nid );
-					}
-
-					try {
-						push.apply( results, slice.call( newContext.querySelectorAll(
-							selector.replace( rgroups, "[id='" + nid + "'] $&" )
-						), 0 ) );
-						return results;
-					} catch(qsaError) {
-					} finally {
-						if ( !old ) {
-							context.removeAttribute("id");
-						}
-					}
-				}
-			}
-
-			return oldSelect( selector, context, results, seed, xml );
-		};
-
-		if ( matches ) {
-			assert(function( div ) {
-				// Check to see if it's possible to do matchesSelector
-				// on a disconnected node (IE 9)
-				disconnectedMatch = matches.call( div, "div" );
-
-				// This should fail with an exception
-				// Gecko does not error, returns false instead
-				try {
-					matches.call( div, "[test!='']:sizzle" );
-					rbuggyMatches.push( Expr.match.PSEUDO );
-				} catch ( e ) {}
-			});
-
-			// rbuggyMatches always contains :active, so no need for a length check
-			rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
-
-			Sizzle.matchesSelector = function( elem, expr ) {
-				// Make sure that attribute selectors are quoted
-				expr = expr.replace( rattributeQuotes, "='$1']" );
-
-				// rbuggyMatches always contains :active, so no need for an existence check
-				if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {
-					try {
-						var ret = matches.call( elem, expr );
-
-						// IE 9's matchesSelector returns false on disconnected nodes
-						if ( ret || disconnectedMatch ||
-								// As well, disconnected nodes are said to be in a document
-								// fragment in IE 9
-								elem.document && elem.document.nodeType !== 11 ) {
-							return ret;
-						}
-					} catch(e) {}
-				}
-
-				return Sizzle( expr, null, null, [ elem ] ).length > 0;
-			};
-		}
-	})();
-}
-
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.pseudos;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})( window );
-var runtil = /Until$/,
-	rparentsprev = /^(?:parents|prev(?:Until|All))/,
-	isSimple = /^.[^:#\[\.,]*$/,
-	rneedsContext = jQuery.expr.match.needsContext,
-	// methods guaranteed to produce a unique set when starting from a unique set
-	guaranteedUnique = {
-		children: true,
-		contents: true,
-		next: true,
-		prev: true
-	};
-
-jQuery.fn.extend({
-	find: function( selector ) {
-		var i, l, length, n, r, ret,
-			self = this;
-
-		if ( typeof selector !== "string" ) {
-			return jQuery( selector ).filter(function() {
-				for ( i = 0, l = self.length; i < l; i++ ) {
-					if ( jQuery.contains( self[ i ], this ) ) {
-						return true;
-					}
-				}
-			});
-		}
-
-		ret = this.pushStack( "", "find", selector );
-
-		for ( i = 0, l = this.length; i < l; i++ ) {
-			length = ret.length;
-			jQuery.find( selector, this[i], ret );
-
-			if ( i > 0 ) {
-				// Make sure that the results are unique
-				for ( n = length; n < ret.length; n++ ) {
-					for ( r = 0; r < length; r++ ) {
-						if ( ret[r] === ret[n] ) {
-							ret.splice(n--, 1);
-							break;
-						}
-					}
-				}
-			}
-		}
-
-		return ret;
-	},
-
-	has: function( target ) {
-		var i,
-			targets = jQuery( target, this ),
-			len = targets.length;
-
-		return this.filter(function() {
-			for ( i = 0; i < len; i++ ) {
-				if ( jQuery.contains( this, targets[i] ) ) {
-					return true;
-				}
-			}
-		});
-	},
-
-	not: function( selector ) {
-		return this.pushStack( winnow(this, selector, false), "not", selector);
-	},
-
-	filter: function( selector ) {
-		return this.pushStack( winnow(this, selector, true), "filter", selector );
-	},
-
-	is: function( selector ) {
-		return !!selector && (
-			typeof selector === "string" ?
-				// If this is a positional/relative selector, check membership in the returned set
-				// so $("p:first").is("p:last") won't return true for a doc with two "p".
-				rneedsContext.test( selector ) ?
-					jQuery( selector, this.context ).index( this[0] ) >= 0 :
-					jQuery.filter( selector, this ).length > 0 :
-				this.filter( selector ).length > 0 );
-	},
-
-	closest: function( selectors, context ) {
-		var cur,
-			i = 0,
-			l = this.length,
-			ret = [],
-			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
-				jQuery( selectors, context || this.context ) :
-				0;
-
-		for ( ; i < l; i++ ) {
-			cur = this[i];
-
-			while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
-				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
-					ret.push( cur );
-					break;
-				}
-				cur = cur.parentNode;
-			}
-		}
-
-		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
-		return this.pushStack( ret, "closest", selectors );
-	},
-
-	// Determine the position of an element within
-	// the matched set of elements
-	index: function( elem ) {
-
-		// No argument, return index in parent
-		if ( !elem ) {
-			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
-		}
-
-		// index in selector
-		if ( typeof elem === "string" ) {
-			return jQuery.inArray( this[0], jQuery( elem ) );
-		}
-
-		// Locate the position of the desired element
-		return jQuery.inArray(
-			// If it receives a jQuery object, the first element is used
-			elem.jquery ? elem[0] : elem, this );
-	},
-
-	add: function( selector, context ) {
-		var set = typeof selector === "string" ?
-				jQuery( selector, context ) :
-				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
-			all = jQuery.merge( this.get(), set );
-
-		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
-			all :
-			jQuery.unique( all ) );
-	},
-
-	addBack: function( selector ) {
-		return this.add( selector == null ?
-			this.prevObject : this.prevObject.filter(selector)
-		);
-	}
-});
-
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
-	return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
-function sibling( cur, dir ) {
-	do {
-		cur = cur[ dir ];
-	} while ( cur && cur.nodeType !== 1 );
-
-	return cur;
-}
-
-jQuery.each({
-	parent: function( elem ) {
-		var parent = elem.parentNode;
-		return parent && parent.nodeType !== 11 ? parent : null;
-	},
-	parents: function( elem ) {
-		return jQuery.dir( elem, "parentNode" );
-	},
-	parentsUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "parentNode", until );
-	},
-	next: function( elem ) {
-		return sibling( elem, "nextSibling" );
-	},
-	prev: function( elem ) {
-		return sibling( elem, "previousSibling" );
-	},
-	nextAll: function( elem ) {
-		return jQuery.dir( elem, "nextSibling" );
-	},
-	prevAll: function( elem ) {
-		return jQuery.dir( elem, "previousSibling" );
-	},
-	nextUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "nextSibling", until );
-	},
-	prevUntil: function( elem, i, until ) {
-		return jQuery.dir( elem, "previousSibling", until );
-	},
-	siblings: function( elem ) {
-		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
-	},
-	children: function( elem ) {
-		return jQuery.sibling( elem.firstChild );
-	},
-	contents: function( elem ) {
-		return jQuery.nodeName( elem, "iframe" ) ?
-			elem.contentDocument || elem.contentWindow.document :
-			jQuery.merge( [], elem.childNodes );
-	}
-}, function( name, fn ) {
-	jQuery.fn[ name ] = function( until, selector ) {
-		var ret = jQuery.map( this, fn, until );
-
-		if ( !runtil.test( name ) ) {
-			selector = until;
-		}
-
-		if ( selector && typeof selector === "string" ) {
-			ret = jQuery.filter( selector, ret );
-		}
-
-		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
-		if ( this.length > 1 && rparentsprev.test( name ) ) {
-			ret = ret.reverse();
-		}
-
-		return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
-	};
-});
-
-jQuery.extend({
-	filter: function( expr, elems, not ) {
-		if ( not ) {
-			expr = ":not(" + expr + ")";
-		}
-
-		return elems.length === 1 ?
-			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
-			jQuery.find.matches(expr, elems);
-	},
-
-	dir: function( elem, dir, until ) {
-		var matched = [],
-			cur = elem[ dir ];
-
-		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-			if ( cur.nodeType === 1 ) {
-				matched.push( cur );
-			}
-			cur = cur[dir];
-		}
-		return matched;
-	},
-
-	sibling: function( n, elem ) {
-		var r = [];
-
-		for ( ; n; n = n.nextSibling ) {
-			if ( n.nodeType === 1 && n !== elem ) {
-				r.push( n );
-			}
-		}
-
-		return r;
-	}
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-
-	// Can't pass null or undefined to indexOf in Firefox 4
-	// Set to 0 to skip string check
-	qualifier = qualifier || 0;
-
-	if ( jQuery.isFunction( qualifier ) ) {
-		return jQuery.grep(elements, function( elem, i ) {
-			var retVal = !!qualifier.call( elem, i, elem );
-			return retVal === keep;
-		});
-
-	} else if ( qualifier.nodeType ) {
-		return jQuery.grep(elements, function( elem, i ) {
-			return ( elem === qualifier ) === keep;
-		});
-
-	} else if ( typeof qualifier === "string" ) {
-		var filtered = jQuery.grep(elements, function( elem ) {
-			return elem.nodeType === 1;
-		});
-
-		if ( isSimple.test( qualifier ) ) {
-			return jQuery.filter(qualifier, filtered, !keep);
-		} else {
-			qualifier = jQuery.filter( qualifier, filtered );
-		}
-	}
-
-	return jQuery.grep(elements, function( elem, i ) {
-		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
-	});
-}
-function createSafeFragment( document ) {
-	var list = nodeNames.split( "|" ),
-	safeFrag = document.createDocumentFragment();
-
-	if ( safeFrag.createElement ) {
-		while ( list.length ) {
-			safeFrag.createElement(
-				list.pop()
-			);
-		}
-	}
-	return safeFrag;
-}
-
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
-		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
-	rleadingWhitespace = /^\s+/,
-	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
-	rtagName = /<([\w:]+)/,
-	rtbody = /<tbody/i,
-	rhtml = /<|&#?\w+;/,
-	rnoInnerhtml = /<(?:script|style|link)/i,
-	rnocache = /<(?:script|object|embed|option|style)/i,
-	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
-	rcheckableType = /^(?:checkbox|radio)$/,
-	// checked="checked" or checked
-	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-	rscriptType = /\/(java|ecma)script/i,
-	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
-	wrapMap = {
-		option: [ 1, "<select multiple='multiple'>", "</select>" ],
-		legend: [ 1, "<fieldset>", "</fieldset>" ],
-		thead: [ 1, "<table>", "</table>" ],
-		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
-		area: [ 1, "<map>", "</map>" ],
-		_default: [ 0, "", "" ]
-	},
-	safeFragment = createSafeFragment( document ),
-	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-// unless wrapped in a div with non-breaking characters in front of it.
-if ( !jQuery.support.htmlSerialize ) {
-	wrapMap._default = [ 1, "X<div>", "</div>" ];
-}
-
-jQuery.fn.extend({
-	text: function( value ) {
-		return jQuery.access( this, function( value ) {
-			return value === undefined ?
-				jQuery.text( this ) :
-				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
-		}, null, value, arguments.length );
-	},
-
-	wrapAll: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each(function(i) {
-				jQuery(this).wrapAll( html.call(this, i) );
-			});
-		}
-
-		if ( this[0] ) {
-			// The elements to wrap the target around
-			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
-			if ( this[0].parentNode ) {
-				wrap.insertBefore( this[0] );
-			}
-
-			wrap.map(function() {
-				var elem = this;
-
-				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-					elem = elem.firstChild;
-				}
-
-				return elem;
-			}).append( this );
-		}
-
-		return this;
-	},
-
-	wrapInner: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each(function(i) {
-				jQuery(this).wrapInner( html.call(this, i) );
-			});
-		}
-
-		return this.each(function() {
-			var self = jQuery( this ),
-				contents = self.contents();
-
-			if ( contents.length ) {
-				contents.wrapAll( html );
-
-			} else {
-				self.append( html );
-			}
-		});
-	},
-
-	wrap: function( html ) {
-		var isFunction = jQuery.isFunction( html );
-
-		return this.each(function(i) {
-			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
-		});
-	},
-
-	unwrap: function() {
-		return this.parent().each(function() {
-			if ( !jQuery.nodeName( this, "body" ) ) {
-				jQuery( this ).replaceWith( this.childNodes );
-			}
-		}).end();
-	},
-
-	append: function() {
-		return this.domManip(arguments, true, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 ) {
-				this.appendChild( elem );
-			}
-		});
-	},
-
-	prepend: function() {
-		return this.domManip(arguments, true, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 ) {
-				this.insertBefore( elem, this.firstChild );
-			}
-		});
-	},
-
-	before: function() {
-		if ( !isDisconnected( this[0] ) ) {
-			return this.domManip(arguments, false, function( elem ) {
-				this.parentNode.insertBefore( elem, this );
-			});
-		}
-
-		if ( arguments.length ) {
-			var set = jQuery.clean( arguments );
-			return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
-		}
-	},
-
-	after: function() {
-		if ( !isDisconnected( this[0] ) ) {
-			return this.domManip(arguments, false, function( elem ) {
-				this.parentNode.insertBefore( elem, this.nextSibling );
-			});
-		}
-
-		if ( arguments.length ) {
-			var set = jQuery.clean( arguments );
-			return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
-		}
-	},
-
-	// keepData is for internal use only--do not document
-	remove: function( selector, keepData ) {
-		var elem,
-			i = 0;
-
-		for ( ; (elem = this[i]) != null; i++ ) {
-			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
-				if ( !keepData && elem.nodeType === 1 ) {
-					jQuery.cleanData( elem.getElementsByTagName("*") );
-					jQuery.cleanData( [ elem ] );
-				}
-
-				if ( elem.parentNode ) {
-					elem.parentNode.removeChild( elem );
-				}
-			}
-		}
-
-		return this;
-	},
-
-	empty: function() {
-		var elem,
-			i = 0;
-
-		for ( ; (elem = this[i]) != null; i++ ) {
-			// Remove element nodes and prevent memory leaks
-			if ( elem.nodeType === 1 ) {
-				jQuery.cleanData( elem.getElementsByTagName("*") );
-			}
-
-			// Remove any remaining nodes
-			while ( elem.firstChild ) {
-				elem.removeChild( elem.firstChild );
-			}
-		}
-
-		return this;
-	},
-
-	clone: function( dataAndEvents, deepDataAndEvents ) {
-		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-		return this.map( function () {
-			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-		});
-	},
-
-	html: function( value ) {
-		return jQuery.access( this, function( value ) {
-			var elem = this[0] || {},
-				i = 0,
-				l = this.length;
-
-			if ( value === undefined ) {
-				return elem.nodeType === 1 ?
-					elem.innerHTML.replace( rinlinejQuery, "" ) :
-					undefined;
-			}
-
-			// See if we can take a shortcut and just use innerHTML
-			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
-				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
-				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
-
-				value = value.replace( rxhtmlTag, "<$1></$2>" );
-
-				try {
-					for (; i < l; i++ ) {
-						// Remove element nodes and prevent memory leaks
-						elem = this[i] || {};
-						if ( elem.nodeType === 1 ) {
-							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
-							elem.innerHTML = value;
-						}
-					}
-
-					elem = 0;
-
-				// If using innerHTML throws an exception, use the fallback method
-				} catch(e) {}
-			}
-
-			if ( elem ) {
-				this.empty().append( value );
-			}
-		}, null, value, arguments.length );
-	},
-
-	replaceWith: function( value ) {
-		if ( !isDisconnected( this[0] ) ) {
-			// Make sure that the elements are removed from the DOM before they are inserted
-			// this can help fix replacing a parent with child elements
-			if ( jQuery.isFunction( value ) ) {
-				return this.each(function(i) {
-					var self = jQuery(this), old = self.html();
-					self.replaceWith( value.call( this, i, old ) );
-				});
-			}
-
-			if ( typeof value !== "string" ) {
-				value = jQuery( value ).detach();
-			}
-
-			return this.each(function() {
-				var next = this.nextSibling,
-					parent = this.parentNode;
-
-				jQuery( this ).remove();
-
-				if ( next ) {
-					jQuery(next).before( value );
-				} else {
-					jQuery(parent).append( value );
-				}
-			});
-		}
-
-		return this.length ?
-			this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
-			this;
-	},
-
-	detach: function( selector ) {
-		return this.remove( selector, true );
-	},
-
-	domManip: function( args, table, callback ) {
-
-		// Flatten any nested arrays
-		args = [].concat.apply( [], args );
-
-		var results, first, fragment, iNoClone,
-			i = 0,
-			value = args[0],
-			scripts = [],
-			l = this.length;
-
-		// We can't cloneNode fragments that contain checked, in WebKit
-		if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
-			return this.each(function() {
-				jQuery(this).domManip( args, table, callback );
-			});
-		}
-
-		if ( jQuery.isFunction(value) ) {
-			return this.each(function(i) {
-				var self = jQuery(this);
-				args[0] = value.call( this, i, table ? self.html() : undefined );
-				self.domManip( args, table, callback );
-			});
-		}
-
-		if ( this[0] ) {
-			results = jQuery.buildFragment( args, this, scripts );
-			fragment = results.fragment;
-			first = fragment.firstChild;
-
-			if ( fragment.childNodes.length === 1 ) {
-				fragment = first;
-			}
-
-			if ( first ) {
-				table = table && jQuery.nodeName( first, "tr" );
-
-				// Use the original fragment for the last item instead of the first because it can end up
-				// being emptied incorrectly in certain situations (#8070).
-				// Fragments from the fragment cache must always be cloned and never used in place.
-				for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
-					callback.call(
-						table && jQuery.nodeName( this[i], "table" ) ?
-							findOrAppend( this[i], "tbody" ) :
-							this[i],
-						i === iNoClone ?
-							fragment :
-							jQuery.clone( fragment, true, true )
-					);
-				}
-			}
-
-			// Fix #11809: Avoid leaking memory
-			fragment = first = null;
-
-			if ( scripts.length ) {
-				jQuery.each( scripts, function( i, elem ) {
-					if ( elem.src ) {
-						if ( jQuery.ajax ) {
-							jQuery.ajax({
-								url: elem.src,
-								type: "GET",
-								dataType: "script",
-								async: false,
-								global: false,
-								"throws": true
-							});
-						} else {
-							jQuery.error("no ajax");
-						}
-					} else {
-						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
-					}
-
-					if ( elem.parentNode ) {
-						elem.parentNode.removeChild( elem );
-					}
-				});
-			}
-		}
-
-		return this;
-	}
-});
-
-function findOrAppend( elem, tag ) {
-	return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
-}
-
-function cloneCopyEvent( src, dest ) {
-
-	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-		return;
-	}
-
-	var type, i, l,
-		oldData = jQuery._data( src ),
-		curData = jQuery._data( dest, oldData ),
-		events = oldData.events;
-
-	if ( events ) {
-		delete curData.handle;
-		curData.events = {};
-
-		for ( type in events ) {
-			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-				jQuery.event.add( dest, type, events[ type ][ i ] );
-			}
-		}
-	}
-
-	// make the cloned public data object a copy from the original
-	if ( curData.data ) {
-		curData.data = jQuery.extend( {}, curData.data );
-	}
-}
-
-function cloneFixAttributes( src, dest ) {
-	var nodeName;
-
-	// We do not need to do anything for non-Elements
-	if ( dest.nodeType !== 1 ) {
-		return;
-	}
-
-	// clearAttributes removes the attributes, which we don't want,
-	// but also removes the attachEvent events, which we *do* want
-	if ( dest.clearAttributes ) {
-		dest.clearAttributes();
-	}
-
-	// mergeAttributes, in contrast, only merges back on the
-	// original attributes, not the events
-	if ( dest.mergeAttributes ) {
-		dest.mergeAttributes( src );
-	}
-
-	nodeName = dest.nodeName.toLowerCase();
-
-	if ( nodeName === "object" ) {
-		// IE6-10 improperly clones children of object elements using classid.
-		// IE10 throws NoModificationAllowedError if parent is null, #12132.
-		if ( dest.parentNode ) {
-			dest.outerHTML = src.outerHTML;
-		}
-
-		// This path appears unavoidable for IE9. When cloning an object
-		// element in IE9, the outerHTML strategy above is not sufficient.
-		// If the src has innerHTML and the destination does not,
-		// copy the src.innerHTML into the dest.innerHTML. #10324
-		if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
-			dest.innerHTML = src.innerHTML;
-		}
-
-	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-		// IE6-8 fails to persist the checked state of a cloned checkbox
-		// or radio button. Worse, IE6-7 fail to give the cloned element
-		// a checked appearance if the defaultChecked value isn't also set
-
-		dest.defaultChecked = dest.checked = src.checked;
-
-		// IE6-7 get confused and end up setting the value of a cloned
-		// checkbox/radio button to an empty string instead of "on"
-		if ( dest.value !== src.value ) {
-			dest.value = src.value;
-		}
-
-	// IE6-8 fails to return the selected option to the default selected
-	// state when cloning options
-	} else if ( nodeName === "option" ) {
-		dest.selected = src.defaultSelected;
-
-	// IE6-8 fails to set the defaultValue to the correct value when
-	// cloning other types of input fields
-	} else if ( nodeName === "input" || nodeName === "textarea" ) {
-		dest.defaultValue = src.defaultValue;
-
-	// IE blanks contents when cloning scripts
-	} else if ( nodeName === "script" && dest.text !== src.text ) {
-		dest.text = src.text;
-	}
-
-	// Event data gets referenced instead of copied if the expando
-	// gets copied too
-	dest.removeAttribute( jQuery.expando );
-}
-
-jQuery.buildFragment = function( args, context, scripts ) {
-	var fragment, cacheable, cachehit,
-		first = args[ 0 ];
-
-	// Set context from what may come in as undefined or a jQuery collection or a node
-	context = context || document;
-	context = (context[0] || context).ownerDocument || context[0] || context;
-
-	// Ensure that an attr object doesn't incorrectly stand in as a document object
-	// Chrome and Firefox seem to allow this to occur and will throw exception
-	// Fixes #8950
-	if ( typeof context.createDocumentFragment === "undefined" ) {
-		context = document;
-	}
-
-	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
-	// Cloning options loses the selected state, so don't cache them
-	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
-	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
-	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
-	if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
-		first.charAt(0) === "<" && !rnocache.test( first ) &&
-		(jQuery.support.checkClone || !rchecked.test( first )) &&
-		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
-
-		// Mark cacheable and look for a hit
-		cacheable = true;
-		fragment = jQuery.fragments[ first ];
-		cachehit = fragment !== undefined;
-	}
-
-	if ( !fragment ) {
-		fragment = context.createDocumentFragment();
-		jQuery.clean( args, context, fragment, scripts );
-
-		// Update the cache, but only store false
-		// unless this is a second parsing of the same content
-		if ( cacheable ) {
-			jQuery.fragments[ first ] = cachehit && fragment;
-		}
-	}
-
-	return { fragment: fragment, cacheable: cacheable };
-};
-
-jQuery.fragments = {};
-
-jQuery.each({
-	appendTo: "append",
-	prependTo: "prepend",
-	insertBefore: "before",
-	insertAfter: "after",
-	replaceAll: "replaceWith"
-}, function( name, original ) {
-	jQuery.fn[ name ] = function( selector ) {
-		var elems,
-			i = 0,
-			ret = [],
-			insert = jQuery( selector ),
-			l = insert.length,
-			parent = this.length === 1 && this[0].parentNode;
-
-		if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
-			insert[ original ]( this[0] );
-			return this;
-		} else {
-			for ( ; i < l; i++ ) {
-				elems = ( i > 0 ? this.clone(true) : this ).get();
-				jQuery( insert[i] )[ original ]( elems );
-				ret = ret.concat( elems );
-			}
-
-			return this.pushStack( ret, name, insert.selector );
-		}
-	};
-});
-
-function getAll( elem ) {
-	if ( typeof elem.getElementsByTagName !== "undefined" ) {
-		return elem.getElementsByTagName( "*" );
-
-	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
-		return elem.querySelectorAll( "*" );
-
-	} else {
-		return [];
-	}
-}
-
-// Used in clean, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
-	if ( rcheckableType.test( elem.type ) ) {
-		elem.defaultChecked = elem.checked;
-	}
-}
-
-jQuery.extend({
-	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-		var srcElements,
-			destElements,
-			i,
-			clone;
-
-		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-			clone = elem.cloneNode( true );
-
-		// IE<=8 does not properly clone detached, unknown element nodes
-		} else {
-			fragmentDiv.innerHTML = elem.outerHTML;
-			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
-		}
-
-		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
-				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-			// IE copies events bound via attachEvent when using cloneNode.
-			// Calling detachEvent on the clone will also remove the events
-			// from the original. In order to get around this, we use some
-			// proprietary methods to clear the events. Thanks to MooTools
-			// guys for this hotness.
-
-			cloneFixAttributes( elem, clone );
-
-			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
-			srcElements = getAll( elem );
-			destElements = getAll( clone );
-
-			// Weird iteration because IE will replace the length property
-			// with an element if you are cloning the body and one of the
-			// elements on the page has a name or id of "length"
-			for ( i = 0; srcElements[i]; ++i ) {
-				// Ensure that the destination node is not null; Fixes #9587
-				if ( destElements[i] ) {
-					cloneFixAttributes( srcElements[i], destElements[i] );
-				}
-			}
-		}
-
-		// Copy the events from the original to the clone
-		if ( dataAndEvents ) {
-			cloneCopyEvent( elem, clone );
-
-			if ( deepDataAndEvents ) {
-				srcElements = getAll( elem );
-				destElements = getAll( clone );
-
-				for ( i = 0; srcElements[i]; ++i ) {
-					cloneCopyEvent( srcElements[i], destElements[i] );
-				}
-			}
-		}
-
-		srcElements = destElements = null;
-
-		// Return the cloned set
-		return clone;
-	},
-
-	clean: function( elems, context, fragment, scripts ) {
-		var j, safe, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
-			i = 0,
-			ret = [];
-
-		// Ensure that context is a document
-		if ( !context || typeof context.createDocumentFragment === "undefined" ) {
-			context = document;
-		}
-
-		// Use the already-created safe fragment if context permits
-		for ( safe = context === document && safeFragment; (elem = elems[i]) != null; i++ ) {
-			if ( typeof elem === "number" ) {
-				elem += "";
-			}
-
-			if ( !elem ) {
-				continue;
-			}
-
-			// Convert html string into DOM nodes
-			if ( typeof elem === "string" ) {
-				if ( !rhtml.test( elem ) ) {
-					elem = context.createTextNode( elem );
-				} else {
-					// Ensure a safe container in which to render the html
-					safe = safe || createSafeFragment( context );
-					div = div || safe.appendChild( context.createElement("div") );
-
-					// Fix "XHTML"-style tags in all browsers
-					elem = elem.replace(rxhtmlTag, "<$1></$2>");
-
-					// Go to html and back, then peel off extra wrappers
-					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
-					wrap = wrapMap[ tag ] || wrapMap._default;
-					depth = wrap[0];
-					div.innerHTML = wrap[1] + elem + wrap[2];
-
-					// Move to the right depth
-					while ( depth-- ) {
-						div = div.lastChild;
-					}
-
-					// Remove IE's autoinserted <tbody> from table fragments
-					if ( !jQuery.support.tbody ) {
-
-						// String was a <table>, *may* have spurious <tbody>
-						hasBody = rtbody.test(elem);
-							tbody = tag === "table" && !hasBody ?
-								div.firstChild && div.firstChild.childNodes :
-
-								// String was a bare <thead> or <tfoot>
-								wrap[1] === "<table>" && !hasBody ?
-									div.childNodes :
-									[];
-
-						for ( j = tbody.length - 1; j >= 0 ; --j ) {
-							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
-								tbody[ j ].parentNode.removeChild( tbody[ j ] );
-							}
-						}
-					}
-
-					// IE completely kills leading whitespace when innerHTML is used
-					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
-					}
-
-					elem = div.childNodes;
-
-					// Remember the top-level container for proper cleanup
-					div = safe.lastChild;
-				}
-			}
-
-			if ( elem.nodeType ) {
-				ret.push( elem );
-			} else {
-				ret = jQuery.merge( ret, elem );
-			}
-		}
-
-		// Fix #11356: Clear elements from safeFragment
-		if ( div ) {
-			safe.removeChild( div );
-			elem = div = safe = null;
-		}
-
-		// Reset defaultChecked for any radios and checkboxes
-		// about to be appended to the DOM in IE 6/7 (#8060)
-		if ( !jQuery.support.appendChecked ) {
-			for ( i = 0; (elem = ret[i]) != null; i++ ) {
-				if ( jQuery.nodeName( elem, "input" ) ) {
-					fixDefaultChecked( elem );
-				} else if ( typeof elem.getElementsByTagName !== "undefined" ) {
-					jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
-				}
-			}
-		}
-
-		// Append elements to a provided document fragment
-		if ( fragment ) {
-			// Special handling of each script element
-			handleScript = function( elem ) {
-				// Check if we consider it executable
-				if ( !elem.type || rscriptType.test( elem.type ) ) {
-					// Detach the script and store it in the scripts array (if provided) or the fragment
-					// Return truthy to indicate that it has been handled
-					return scripts ?
-						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
-						fragment.appendChild( elem );
-				}
-			};
-
-			for ( i = 0; (elem = ret[i]) != null; i++ ) {
-				// Check if we're done after handling an executable script
-				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
-					// Append to fragment and handle embedded scripts
-					fragment.appendChild( elem );
-					if ( typeof elem.getElementsByTagName !== "undefined" ) {
-						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
-						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
-
-						// Splice the scripts into ret after their former ancestor and advance our index beyond them
-						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
-						i += jsTags.length;
-					}
-				}
-			}
-		}
-
-		return ret;
-	},
-
-	cleanData: function( elems, /* internal */ acceptData ) {
-		var data, id, elem, type,
-			i = 0,
-			internalKey = jQuery.expando,
-			cache = jQuery.cache,
-			deleteExpando = jQuery.support.deleteExpando,
-			special = jQuery.event.special;
-
-		for ( ; (elem = elems[i]) != null; i++ ) {
-
-			if ( acceptData || jQuery.acceptData( elem ) ) {
-
-				id = elem[ internalKey ];
-				data = id && cache[ id ];
-
-				if ( data ) {
-					if ( data.events ) {
-						for ( type in data.events ) {
-							if ( special[ type ] ) {
-								jQuery.event.remove( elem, type );
-
-							// This is a shortcut to avoid jQuery.event.remove's overhead
-							} else {
-								jQuery.removeEvent( elem, type, data.handle );
-							}
-						}
-					}
-
-					// Remove cache only if it was not already removed by jQuery.event.remove
-					if ( cache[ id ] ) {
-
-						delete cache[ id ];
-
-						// IE does not allow us to delete expando properties from nodes,
-						// nor does it have a removeAttribute function on Document nodes;
-						// we must handle all of these cases
-						if ( deleteExpando ) {
-							delete elem[ internalKey ];
-
-						} else if ( elem.removeAttribute ) {
-							elem.removeAttribute( internalKey );
-
-						} else {
-							elem[ internalKey ] = null;
-						}
-
-						jQuery.deletedIds.push( id );
-					}
-				}
-			}
-		}
-	}
-});
-// Limit scope pollution from any deprecated API
-(function() {
-
-var matched, browser;
-
-// Use of jQuery.browser is frowned upon.
-// More details: http://api.jquery.com/jQuery.browser
-// jQuery.uaMatch maintained for back-compat
-jQuery.uaMatch = function( ua ) {
-	ua = ua.toLowerCase();
-
-	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
-		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
-		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
-		/(msie) ([\w.]+)/.exec( ua ) ||
-		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
-		[];
-
-	return {
-		browser: match[ 1 ] || "",
-		version: match[ 2 ] || "0"
-	};
-};
-
-matched = jQuery.uaMatch( navigator.userAgent );
-browser = {};
-
-if ( matched.browser ) {
-	browser[ matched.browser ] = true;
-	browser.version = matched.version;
-}
-
-// Deprecated, use jQuery.browser.webkit instead
-// Maintained for back-compat only
-if ( browser.webkit ) {
-	browser.safari = true;
-}
-
-jQuery.browser = browser;
-
-jQuery.sub = function() {
-	function jQuerySub( selector, context ) {
-		return new jQuerySub.fn.init( selector, context );
-	}
-	jQuery.extend( true, jQuerySub, this );
-	jQuerySub.superclass = this;
-	jQuerySub.fn = jQuerySub.prototype = this();
-	jQuerySub.fn.constructor = jQuerySub;
-	jQuerySub.sub = this.sub;
-	jQuerySub.fn.init = function init( selector, context ) {
-		if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
-			context = jQuerySub( context );
-		}
-
-		return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
-	};
-	jQuerySub.fn.init.prototype = jQuerySub.fn;
-	var rootjQuerySub = jQuerySub(document);
-	return jQuerySub;
-};
-	
-})();
-var curCSS, iframe, iframeDoc,
-	ralpha = /alpha\([^)]*\)/i,
-	ropacity = /opacity=([^)]*)/,
-	rposition = /^(top|right|bottom|left)$/,
-	rmargin = /^margin/,
-	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
-	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
-	rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
-	elemdisplay = {},
-
-	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-	cssNormalTransform = {
-		letterSpacing: 0,
-		fontWeight: 400,
-		lineHeight: 1
-	},
-
-	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
-	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
-
-	eventsToggle = jQuery.fn.toggle;
-
-// return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( style, name ) {
-
-	// shortcut for names that are not vendor prefixed
-	if ( name in style ) {
-		return name;
-	}
-
-	// check for vendor prefixed names
-	var capName = name.charAt(0).toUpperCase() + name.slice(1),
-		origName = name,
-		i = cssPrefixes.length;
-
-	while ( i-- ) {
-		name = cssPrefixes[ i ] + capName;
-		if ( name in style ) {
-			return name;
-		}
-	}
-
-	return origName;
-}
-
-function isHidden( elem, el ) {
-	elem = el || elem;
-	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
-}
-
-function showHide( elements, show ) {
-	var elem, display,
-		values = [],
-		index = 0,
-		length = elements.length;
-
-	for ( ; index < length; index++ ) {
-		elem = elements[ index ];
-		if ( !elem.style ) {
-			continue;
-		}
-		values[ index ] = jQuery._data( elem, "olddisplay" );
-		if ( show ) {
-			// Reset the inline display of this element to learn if it is
-			// being hidden by cascaded rules or not
-			if ( !values[ index ] && elem.style.display === "none" ) {
-				elem.style.display = "";
-			}
-
-			// Set elements which have been overridden with display: none
-			// in a stylesheet to whatever the default browser style is
-			// for such an element
-			if ( elem.style.display === "" && isHidden( elem ) ) {
-				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
-			}
-		} else {
-			display = curCSS( elem, "display" );
-
-			if ( !values[ index ] && display !== "none" ) {
-				jQuery._data( elem, "olddisplay", display );
-			}
-		}
-	}
-
-	// Set the display of most of the elements in a second loop
-	// to avoid the constant reflow
-	for ( index = 0; index < length; index++ ) {
-		elem = elements[ index ];
-		if ( !elem.style ) {
-			continue;
-		}
-		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
-			elem.style.display = show ? values[ index ] || "" : "none";
-		}
-	}
-
-	return elements;
-}
-
-jQuery.fn.extend({
-	css: function( name, value ) {
-		return jQuery.access( this, function( elem, name, value ) {
-			return value !== undefined ?
-				jQuery.style( elem, name, value ) :
-				jQuery.css( elem, name );
-		}, name, value, arguments.length > 1 );
-	},
-	show: function() {
-		return showHide( this, true );
-	},
-	hide: function() {
-		return showHide( this );
-	},
-	toggle: function( state, fn2 ) {
-		var bool = typeof state === "boolean";
-
-		if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
-			return eventsToggle.apply( this, arguments );
-		}
-
-		return this.each(function() {
-			if ( bool ? state : isHidden( this ) ) {
-				jQuery( this ).show();
-			} else {
-				jQuery( this ).hide();
-			}
-		});
-	}
-});
-
-jQuery.extend({
-	// Add in style property hooks for overriding the default
-	// behavior of getting and setting a style property
-	cssHooks: {
-		opacity: {
-			get: function( elem, computed ) {
-				if ( computed ) {
-					// We should always get a number back from opacity
-					var ret = curCSS( elem, "opacity" );
-					return ret === "" ? "1" : ret;
-
-				}
-			}
-		}
-	},
-
-	// Exclude the following css properties to add px
-	cssNumber: {
-		"fillOpacity": true,
-		"fontWeight": true,
-		"lineHeight": true,
-		"opacity": true,
-		"orphans": true,
-		"widows": true,
-		"zIndex": true,
-		"zoom": true
-	},
-
-	// Add in properties whose names you wish to fix before
-	// setting or getting the value
-	cssProps: {
-		// normalize float css property
-		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
-	},
-
-	// Get and set the style property on a DOM Node
-	style: function( elem, name, value, extra ) {
-		// Don't set styles on text and comment nodes
-		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-			return;
-		}
-
-		// Make sure that we're working with the right name
-		var ret, type, hooks,
-			origName = jQuery.camelCase( name ),
-			style = elem.style;
-
-		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
-
-		// gets hook for the prefixed version
-		// followed by the unprefixed version
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// Check if we're setting a value
-		if ( value !== undefined ) {
-			type = typeof value;
-
-			// convert relative number strings (+= or -=) to relative numbers. #7345
-			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
-				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
-				// Fixes bug #9237
-				type = "number";
-			}
-
-			// Make sure that NaN and null values aren't set. See: #7116
-			if ( value == null || type === "number" && isNaN( value ) ) {
-				return;
-			}
-
-			// If a number was passed in, add 'px' to the (except for certain CSS properties)
-			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
-				value += "px";
-			}
-
-			// If a hook was provided, use that value, otherwise just set the specified value
-			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
-				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
-				// Fixes bug #5509
-				try {
-					style[ name ] = value;
-				} catch(e) {}
-			}
-
-		} else {
-			// If a hook was provided get the non-computed value from there
-			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
-				return ret;
-			}
-
-			// Otherwise just get the value from the style object
-			return style[ name ];
-		}
-	},
-
-	css: function( elem, name, numeric, extra ) {
-		var val, num, hooks,
-			origName = jQuery.camelCase( name );
-
-		// Make sure that we're working with the right name
-		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
-
-		// gets hook for the prefixed version
-		// followed by the unprefixed version
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// If a hook was provided get the computed value from there
-		if ( hooks && "get" in hooks ) {
-			val = hooks.get( elem, true, extra );
-		}
-
-		// Otherwise, if a way to get the computed value exists, use that
-		if ( val === undefined ) {
-			val = curCSS( elem, name );
-		}
-
-		//convert "normal" to computed value
-		if ( val === "normal" && name in cssNormalTransform ) {
-			val = cssNormalTransform[ name ];
-		}
-
-		// Return, converting to number if forced or a qualifier was provided and val looks numeric
-		if ( numeric || extra !== undefined ) {
-			num = parseFloat( val );
-			return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
-		}
-		return val;
-	},
-
-	// A method for quickly swapping in/out CSS properties to get correct calculations
-	swap: function( elem, options, callback ) {
-		var ret, name,
-			old = {};
-
-		// Remember the old values, and insert the new ones
-		for ( name in options ) {
-			old[ name ] = elem.style[ name ];
-			elem.style[ name ] = options[ name ];
-		}
-
-		ret = callback.call( elem );
-
-		// Revert the old values
-		for ( name in options ) {
-			elem.style[ name ] = old[ name ];
-		}
-
-		return ret;
-	}
-});
-
-// NOTE: To any future maintainer, we've used both window.getComputedStyle
-// and getComputedStyle here to produce a better gzip size
-if ( window.getComputedStyle ) {
-	curCSS = function( elem, name ) {
-		var ret, width, minWidth, maxWidth,
-			computed = getComputedStyle( elem, null ),
-			style = elem.style;
-
-		if ( computed ) {
-
-			ret = computed[ name ];
-			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
-				ret = jQuery.style( elem, name );
-			}
-
-			// A tribute to the "awesome hack by Dean Edwards"
-			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
-			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
-			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
-			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-				width = style.width;
-				minWidth = style.minWidth;
-				maxWidth = style.maxWidth;
-
-				style.minWidth = style.maxWidth = style.width = ret;
-				ret = computed.width;
-
-				style.width = width;
-				style.minWidth = minWidth;
-				style.maxWidth = maxWidth;
-			}
-		}
-
-		return ret;
-	};
-} else if ( document.documentElement.currentStyle ) {
-	curCSS = function( elem, name ) {
-		var left, rsLeft,
-			ret = elem.currentStyle && elem.currentStyle[ name ],
-			style = elem.style;
-
-		// Avoid setting ret to empty string here
-		// so we don't default to auto
-		if ( ret == null && style && style[ name ] ) {
-			ret = style[ name ];
-		}
-
-		// From the awesome hack by Dean Edwards
-		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
-		// If we're not dealing with a regular pixel number
-		// but a number that has a weird ending, we need to convert it to pixels
-		// but not position css attributes, as those are proportional to the parent element instead
-		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
-		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
-
-			// Remember the original values
-			left = style.left;
-			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
-
-			// Put in the new values to get a computed value out
-			if ( rsLeft ) {
-				elem.runtimeStyle.left = elem.currentStyle.left;
-			}
-			style.left = name === "fontSize" ? "1em" : ret;
-			ret = style.pixelLeft + "px";
-
-			// Revert the changed values
-			style.left = left;
-			if ( rsLeft ) {
-				elem.runtimeStyle.left = rsLeft;
-			}
-		}
-
-		return ret === "" ? "auto" : ret;
-	};
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-	var matches = rnumsplit.exec( value );
-	return matches ?
-			Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
-			value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
-	var i = extra === ( isBorderBox ? "border" : "content" ) ?
-		// If we already have the right measurement, avoid augmentation
-		4 :
-		// Otherwise initialize for horizontal or vertical properties
-		name === "width" ? 1 : 0,
-
-		val = 0;
-
-	for ( ; i < 4; i += 2 ) {
-		// both box models exclude margin, so add it if we want it
-		if ( extra === "margin" ) {
-			// we use jQuery.css instead of curCSS here
-			// because of the reliableMarginRight CSS hook!
-			val += jQuery.css( elem, extra + cssExpand[ i ], true );
-		}
-
-		// From this point on we use curCSS for maximum performance (relevant in animations)
-		if ( isBorderBox ) {
-			// border-box includes padding, so remove it if we want content
-			if ( extra === "content" ) {
-				val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
-			}
-
-			// at this point, extra isn't border nor margin, so remove border
-			if ( extra !== "margin" ) {
-				val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-			}
-		} else {
-			// at this point, extra isn't content, so add padding
-			val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
-
-			// at this point, extra isn't content nor padding, so add border
-			if ( extra !== "padding" ) {
-				val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-			}
-		}
-	}
-
-	return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
-	// Start with offset property, which is equivalent to the border-box value
-	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-		valueIsBorderBox = true,
-		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
-
-	if ( val <= 0 ) {
-		// Fall back to computed then uncomputed css if necessary
-		val = curCSS( elem, name );
-		if ( val < 0 || val == null ) {
-			val = elem.style[ name ];
-		}
-
-		// Computed unit is not pixels. Stop here and return.
-		if ( rnumnonpx.test(val) ) {
-			return val;
-		}
-
-		// we need the check for style in case a browser which returns unreliable values
-		// for getComputedStyle silently falls back to the reliable elem.style
-		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
-
-		// Normalize "", auto, and prepare for extra
-		val = parseFloat( val ) || 0;
-	}
-
-	// use the active box-sizing model to add/subtract irrelevant styles
-	return ( val +
-		augmentWidthOrHeight(
-			elem,
-			name,
-			extra || ( isBorderBox ? "border" : "content" ),
-			valueIsBorderBox
-		)
-	) + "px";
-}
-
-
-// Try to determine the default display value of an element
-function css_defaultDisplay( nodeName ) {
-	if ( elemdisplay[ nodeName ] ) {
-		return elemdisplay[ nodeName ];
-	}
-
-	var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
-		display = elem.css("display");
-	elem.remove();
-
-	// If the simple way fails,
-	// get element's real default display by attaching it to a temp iframe
-	if ( display === "none" || display === "" ) {
-		// Use the already-created iframe if possible
-		iframe = document.body.appendChild(
-			iframe || jQuery.extend( document.createElement("iframe"), {
-				frameBorder: 0,
-				width: 0,
-				height: 0
-			})
-		);
-
-		// Create a cacheable copy of the iframe document on first call.
-		// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
-		// document to it; WebKit & Firefox won't allow reusing the iframe document.
-		if ( !iframeDoc || !iframe.createElement ) {
-			iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
-			iframeDoc.write("<!doctype html><html><body>");
-			iframeDoc.close();
-		}
-
-		elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
-
-		display = curCSS( elem, "display" );
-		document.body.removeChild( iframe );
-	}
-
-	// Store the correct default display
-	elemdisplay[ nodeName ] = display;
-
-	return display;
-}
-
-jQuery.each([ "height", "width" ], function( i, name ) {
-	jQuery.cssHooks[ name ] = {
-		get: function( elem, computed, extra ) {
-			if ( computed ) {
-				if ( elem.offsetWidth !== 0 || curCSS( elem, "display" ) !== "none" ) {
-					return getWidthOrHeight( elem, name, extra );
-				} else {
-					return jQuery.swap( elem, cssShow, function() {
-						return getWidthOrHeight( elem, name, extra );
-					});
-				}
-			}
-		},
-
-		set: function( elem, value, extra ) {
-			return setPositiveNumber( elem, value, extra ?
-				augmentWidthOrHeight(
-					elem,
-					name,
-					extra,
-					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
-				) : 0
-			);
-		}
-	};
-});
-
-if ( !jQuery.support.opacity ) {
-	jQuery.cssHooks.opacity = {
-		get: function( elem, computed ) {
-			// IE uses filters for opacity
-			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
-				computed ? "1" : "";
-		},
-
-		set: function( elem, value ) {
-			var style = elem.style,
-				currentStyle = elem.currentStyle,
-				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-				filter = currentStyle && currentStyle.filter || style.filter || "";
-
-			// IE has trouble with opacity if it does not have layout
-			// Force it by setting the zoom level
-			style.zoom = 1;
-
-			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
-				style.removeAttribute ) {
-
-				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-				// if "filter:" is present at all, clearType is disabled, we want to avoid this
-				// style.removeAttribute is IE Only, but so apparently is this code path...
-				style.removeAttribute( "filter" );
-
-				// if there there is no filter style applied in a css rule, we are done
-				if ( currentStyle && !currentStyle.filter ) {
-					return;
-				}
-			}
-
-			// otherwise, set new filter values
-			style.filter = ralpha.test( filter ) ?
-				filter.replace( ralpha, opacity ) :
-				filter + " " + opacity;
-		}
-	};
-}
-
-// These hooks cannot be added until DOM ready because the support test
-// for it is not run until after DOM ready
-jQuery(function() {
-	if ( !jQuery.support.reliableMarginRight ) {
-		jQuery.cssHooks.marginRight = {
-			get: function( elem, computed ) {
-				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-				// Work around by temporarily setting element display to inline-block
-				return jQuery.swap( elem, { "display": "inline-block" }, function() {
-					if ( computed ) {
-						return curCSS( elem, "marginRight" );
-					}
-				});
-			}
-		};
-	}
-
-	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-	// getComputedStyle returns percent when specified for top/left/bottom/right
-	// rather than make the css module depend on the offset module, we just check for it here
-	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
-		jQuery.each( [ "top", "left" ], function( i, prop ) {
-			jQuery.cssHooks[ prop ] = {
-				get: function( elem, computed ) {
-					if ( computed ) {
-						var ret = curCSS( elem, prop );
-						// if curCSS returns percentage, fallback to offset
-						return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
-					}
-				}
-			};
-		});
-	}
-
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-	jQuery.expr.filters.hidden = function( elem ) {
-		return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
-	};
-
-	jQuery.expr.filters.visible = function( elem ) {
-		return !jQuery.expr.filters.hidden( elem );
-	};
-}
-
-// These hooks are used by animate to expand properties
-jQuery.each({
-	margin: "",
-	padding: "",
-	border: "Width"
-}, function( prefix, suffix ) {
-	jQuery.cssHooks[ prefix + suffix ] = {
-		expand: function( value ) {
-			var i,
-
-				// assumes a single number if not a string
-				parts = typeof value === "string" ? value.split(" ") : [ value ],
-				expanded = {};
-
-			for ( i = 0; i < 4; i++ ) {
-				expanded[ prefix + cssExpand[ i ] + suffix ] =
-					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-			}
-
-			return expanded;
-		}
-	};
-
-	if ( !rmargin.test( prefix ) ) {
-		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-	}
-});
-var r20 = /%20/g,
-	rbracket = /\[\]$/,
-	rCRLF = /\r?\n/g,
-	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
-	rselectTextarea = /^(?:select|textarea)/i;
-
-jQuery.fn.extend({
-	serialize: function() {
-		return jQuery.param( this.serializeArray() );
-	},
-	serializeArray: function() {
-		return this.map(function(){
-			return this.elements ? jQuery.makeArray( this.elements ) : this;
-		})
-		.filter(function(){
-			return this.name && !this.disabled &&
-				( this.checked || rselectTextarea.test( this.nodeName ) ||
-					rinput.test( this.type ) );
-		})
-		.map(function( i, elem ){
-			var val = jQuery( this ).val();
-
-			return val == null ?
-				null :
-				jQuery.isArray( val ) ?
-					jQuery.map( val, function( val, i ){
-						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-					}) :
-					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-		}).get();
-	}
-});
-
-//Serialize an array of form elements or a set of
-//key/values into a query string
-jQuery.param = function( a, traditional ) {
-	var prefix,
-		s = [],
-		add = function( key, value ) {
-			// If value is a function, invoke it and return its value
-			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
-			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-		};
-
-	// Set traditional to true for jQuery <= 1.3.2 behavior.
-	if ( traditional === undefined ) {
-		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
-	}
-
-	// If an array was passed in, assume that it is an array of form elements.
-	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-		// Serialize the form elements
-		jQuery.each( a, function() {
-			add( this.name, this.value );
-		});
-
-	} else {
-		// If traditional, encode the "old" way (the way 1.3.2 or older
-		// did it), otherwise encode params recursively.
-		for ( prefix in a ) {
-			buildParams( prefix, a[ prefix ], traditional, add );
-		}
-	}
-
-	// Return the resulting serialization
-	return s.join( "&" ).replace( r20, "+" );
-};
-
-function buildParams( prefix, obj, traditional, add ) {
-	var name;
-
-	if ( jQuery.isArray( obj ) ) {
-		// Serialize array item.
-		jQuery.each( obj, function( i, v ) {
-			if ( traditional || rbracket.test( prefix ) ) {
-				// Treat each array item as a scalar.
-				add( prefix, v );
-
-			} else {
-				// If array item is non-scalar (array or object), encode its
-				// numeric index to resolve deserialization ambiguity issues.
-				// Note that rack (as of 1.0.0) can't currently deserialize
-				// nested arrays properly, and attempting to do so may cause
-				// a server error. Possible fixes are to modify rack's
-				// deserialization algorithm or to provide an option or flag
-				// to force array serialization to be shallow.
-				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
-			}
-		});
-
-	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
-		// Serialize object item.
-		for ( name in obj ) {
-			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-		}
-
-	} else {
-		// Serialize scalar item.
-		add( prefix, obj );
-	}
-}
-var // Document location
-	ajaxLocation,
-	// Document location segments
-	ajaxLocParts,
-
-	rhash = /#.*$/,
-	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
-	// #7653, #8125, #8152: local protocol detection
-	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
-	rnoContent = /^(?:GET|HEAD)$/,
-	rprotocol = /^\/\//,
-	rquery = /\?/,
-	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
-	rts = /([?&])_=[^&]*/,
-	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
-
-	// Keep a copy of the old load method
-	_load = jQuery.fn.load,
-
-	/* Prefilters
-	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-	 * 2) These are called:
-	 *    - BEFORE asking for a transport
-	 *    - AFTER param serialization (s.data is a string if s.processData is true)
-	 * 3) key is the dataType
-	 * 4) the catchall symbol "*" can be used
-	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-	 */
-	prefilters = {},
-
-	/* Transports bindings
-	 * 1) key is the dataType
-	 * 2) the catchall symbol "*" can be used
-	 * 3) selection will start with transport dataType and THEN go to "*" if needed
-	 */
-	transports = {},
-
-	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-	allTypes = ["*/"] + ["*"];
-
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-try {
-	ajaxLocation = location.href;
-} catch( e ) {
-	// Use the href attribute of an A element
-	// since IE will modify it given document.location
-	ajaxLocation = document.createElement( "a" );
-	ajaxLocation.href = "";
-	ajaxLocation = ajaxLocation.href;
-}
-
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
-	// dataTypeExpression is optional and defaults to "*"
-	return function( dataTypeExpression, func ) {
-
-		if ( typeof dataTypeExpression !== "string" ) {
-			func = dataTypeExpression;
-			dataTypeExpression = "*";
-		}
-
-		var dataType, list, placeBefore,
-			dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
-			i = 0,
-			length = dataTypes.length;
-
-		if ( jQuery.isFunction( func ) ) {
-			// For each dataType in the dataTypeExpression
-			for ( ; i < length; i++ ) {
-				dataType = dataTypes[ i ];
-				// We control if we're asked to add before
-				// any existing element
-				placeBefore = /^\+/.test( dataType );
-				if ( placeBefore ) {
-					dataType = dataType.substr( 1 ) || "*";
-				}
-				list = structure[ dataType ] = structure[ dataType ] || [];
-				// then we add to the structure accordingly
-				list[ placeBefore ? "unshift" : "push" ]( func );
-			}
-		}
-	};
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
-		dataType /* internal */, inspected /* internal */ ) {
-
-	dataType = dataType || options.dataTypes[ 0 ];
-	inspected = inspected || {};
-
-	inspected[ dataType ] = true;
-
-	var selection,
-		list = structure[ dataType ],
-		i = 0,
-		length = list ? list.length : 0,
-		executeOnly = ( structure === prefilters );
-
-	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
-		selection = list[ i ]( options, originalOptions, jqXHR );
-		// If we got redirected to another dataType
-		// we try there if executing only and not done already
-		if ( typeof selection === "string" ) {
-			if ( !executeOnly || inspected[ selection ] ) {
-				selection = undefined;
-			} else {
-				options.dataTypes.unshift( selection );
-				selection = inspectPrefiltersOrTransports(
-						structure, options, originalOptions, jqXHR, selection, inspected );
-			}
-		}
-	}
-	// If we're only executing or nothing was selected
-	// we try the catchall dataType if not done already
-	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
-		selection = inspectPrefiltersOrTransports(
-				structure, options, originalOptions, jqXHR, "*", inspected );
-	}
-	// unnecessary when only executing (prefilters)
-	// but it'll be ignored by the caller in that case
-	return selection;
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
-	var key, deep,
-		flatOptions = jQuery.ajaxSettings.flatOptions || {};
-	for ( key in src ) {
-		if ( src[ key ] !== undefined ) {
-			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
-		}
-	}
-	if ( deep ) {
-		jQuery.extend( true, target, deep );
-	}
-}
-
-jQuery.fn.load = function( url, params, callback ) {
-	if ( typeof url !== "string" && _load ) {
-		return _load.apply( this, arguments );
-	}
-
-	// Don't do a request if no elements are being requested
-	if ( !this.length ) {
-		return this;
-	}
-
-	var selector, type, response,
-		self = this,
-		off = url.indexOf(" ");
-
-	if ( off >= 0 ) {
-		selector = url.slice( off, url.length );
-		url = url.slice( 0, off );
-	}
-
-	// If it's a function
-	if ( jQuery.isFunction( params ) ) {
-
-		// We assume that it's the callback
-		callback = params;
-		params = undefined;
-
-	// Otherwise, build a param string
-	} else if ( typeof params === "object" ) {
-		type = "POST";
-	}
-
-	// Request the remote document
-	jQuery.ajax({
-		url: url,
-
-		// if "type" variable is undefined, then "GET" method will be used
-		type: type,
-		dataType: "html",
-		data: params,
-		complete: function( jqXHR, status ) {
-			if ( callback ) {
-				self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
-			}
-		}
-	}).done(function( responseText ) {
-
-		// Save response for use in complete callback
-		response = arguments;
-
-		// See if a selector was specified
-		self.html( selector ?
-
-			// Create a dummy div to hold the results
-			jQuery("<div>")
-
-				// inject the contents of the document in, removing the scripts
-				// to avoid any 'Permission Denied' errors in IE
-				.append( responseText.replace( rscript, "" ) )
-
-				// Locate the specified elements
-				.find( selector ) :
-
-			// If not, just inject the full result
-			responseText );
-
-	});
-
-	return this;
-};
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
-	jQuery.fn[ o ] = function( f ){
-		return this.on( o, f );
-	};
-});
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
-	jQuery[ method ] = function( url, data, callback, type ) {
-		// shift arguments if data argument was omitted
-		if ( jQuery.isFunction( data ) ) {
-			type = type || callback;
-			callback = data;
-			data = undefined;
-		}
-
-		return jQuery.ajax({
-			type: method,
-			url: url,
-			data: data,
-			success: callback,
-			dataType: type
-		});
-	};
-});
-
-jQuery.extend({
-
-	getScript: function( url, callback ) {
-		return jQuery.get( url, undefined, callback, "script" );
-	},
-
-	getJSON: function( url, data, callback ) {
-		return jQuery.get( url, data, callback, "json" );
-	},
-
-	// Creates a full fledged settings object into target
-	// with both ajaxSettings and settings fields.
-	// If target is omitted, writes into ajaxSettings.
-	ajaxSetup: function( target, settings ) {
-		if ( settings ) {
-			// Building a settings object
-			ajaxExtend( target, jQuery.ajaxSettings );
-		} else {
-			// Extending ajaxSettings
-			settings = target;
-			target = jQuery.ajaxSettings;
-		}
-		ajaxExtend( target, settings );
-		return target;
-	},
-
-	ajaxSettings: {
-		url: ajaxLocation,
-		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
-		global: true,
-		type: "GET",
-		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-		processData: true,
-		async: true,
-		/*
-		timeout: 0,
-		data: null,
-		dataType: null,
-		username: null,
-		password: null,
-		cache: null,
-		throws: false,
-		traditional: false,
-		headers: {},
-		*/
-
-		accepts: {
-			xml: "application/xml, text/xml",
-			html: "text/html",
-			text: "text/plain",
-			json: "application/json, text/javascript",
-			"*": allTypes
-		},
-
-		contents: {
-			xml: /xml/,
-			html: /html/,
-			json: /json/
-		},
-
-		responseFields: {
-			xml: "responseXML",
-			text: "responseText"
-		},
-
-		// List of data converters
-		// 1) key format is "source_type destination_type" (a single space in-between)
-		// 2) the catchall symbol "*" can be used for source_type
-		converters: {
-
-			// Convert anything to text
-			"* text": window.String,
-
-			// Text to html (true = no transformation)
-			"text html": true,
-
-			// Evaluate text as a json expression
-			"text json": jQuery.parseJSON,
-
-			// Parse text as xml
-			"text xml": jQuery.parseXML
-		},
-
-		// For options that shouldn't be deep extended:
-		// you can add your own custom options here if
-		// and when you create one that shouldn't be
-		// deep extended (see ajaxExtend)
-		flatOptions: {
-			context: true,
-			url: true
-		}
-	},
-
-	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-	ajaxTransport: addToPrefiltersOrTransports( transports ),
-
-	// Main method
-	ajax: function( url, options ) {
-
-		// If url is an object, simulate pre-1.5 signature
-		if ( typeof url === "object" ) {
-			options = url;
-			url = undefined;
-		}
-
-		// Force options to be an object
-		options = options || {};
-
-		var // ifModified key
-			ifModifiedKey,
-			// Response headers
-			responseHeadersString,
-			responseHeaders,
-			// transport
-			transport,
-			// timeout handle
-			timeoutTimer,
-			// Cross-domain detection vars
-			parts,
-			// To know if global events are to be dispatched
-			fireGlobals,
-			// Loop variable
-			i,
-			// Create the final options object
-			s = jQuery.ajaxSetup( {}, options ),
-			// Callbacks context
-			callbackContext = s.context || s,
-			// Context for global events
-			// It's the callbackContext if one was provided in the options
-			// and if it's a DOM node or a jQuery collection
-			globalEventContext = callbackContext !== s &&
-				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
-						jQuery( callbackContext ) : jQuery.event,
-			// Deferreds
-			deferred = jQuery.Deferred(),
-			completeDeferred = jQuery.Callbacks( "once memory" ),
-			// Status-dependent callbacks
-			statusCode = s.statusCode || {},
-			// Headers (they are sent all at once)
-			requestHeaders = {},
-			requestHeadersNames = {},
-			// The jqXHR state
-			state = 0,
-			// Default abort message
-			strAbort = "canceled",
-			// Fake xhr
-			jqXHR = {
-
-				readyState: 0,
-
-				// Caches the header
-				setRequestHeader: function( name, value ) {
-					if ( !state ) {
-						var lname = name.toLowerCase();
-						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-						requestHeaders[ name ] = value;
-					}
-					return this;
-				},
-
-				// Raw string
-				getAllResponseHeaders: function() {
-					return state === 2 ? responseHeadersString : null;
-				},
-
-				// Builds headers hashtable if needed
-				getResponseHeader: function( key ) {
-					var match;
-					if ( state === 2 ) {
-						if ( !responseHeaders ) {
-							responseHeaders = {};
-							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
-								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
-							}
-						}
-						match = responseHeaders[ key.toLowerCase() ];
-					}
-					return match === undefined ? null : match;
-				},
-
-				// Overrides response content-type header
-				overrideMimeType: function( type ) {
-					if ( !state ) {
-						s.mimeType = type;
-					}
-					return this;
-				},
-
-				// Cancel the request
-				abort: function( statusText ) {
-					statusText = statusText || strAbort;
-					if ( transport ) {
-						transport.abort( statusText );
-					}
-					done( 0, statusText );
-					return this;
-				}
-			};
-
-		// Callback for when everything is done
-		// It is defined here because jslint complains if it is declared
-		// at the end of the function (which would be more logical and readable)
-		function done( status, nativeStatusText, responses, headers ) {
-			var isSuccess, success, error, response, modified,
-				statusText = nativeStatusText;
-
-			// Called once
-			if ( state === 2 ) {
-				return;
-			}
-
-			// State is "done" now
-			state = 2;
-
-			// Clear timeout if it exists
-			if ( timeoutTimer ) {
-				clearTimeout( timeoutTimer );
-			}
-
-			// Dereference transport for early garbage collection
-			// (no matter how long the jqXHR object will be used)
-			transport = undefined;
-
-			// Cache response headers
-			responseHeadersString = headers || "";
-
-			// Set readyState
-			jqXHR.readyState = status > 0 ? 4 : 0;
-
-			// Get response data
-			if ( responses ) {
-				response = ajaxHandleResponses( s, jqXHR, responses );
-			}
-
-			// If successful, handle type chaining
-			if ( status >= 200 && status < 300 || status === 304 ) {
-
-				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-				if ( s.ifModified ) {
-
-					modified = jqXHR.getResponseHeader("Last-Modified");
-					if ( modified ) {
-						jQuery.lastModified[ ifModifiedKey ] = modified;
-					}
-					modified = jqXHR.getResponseHeader("Etag");
-					if ( modified ) {
-						jQuery.etag[ ifModifiedKey ] = modified;
-					}
-				}
-
-				// If not modified
-				if ( status === 304 ) {
-
-					statusText = "notmodified";
-					isSuccess = true;
-
-				// If we have data
-				} else {
-
-					isSuccess = ajaxConvert( s, response );
-					statusText = isSuccess.state;
-					success = isSuccess.data;
-					error = isSuccess.error;
-					isSuccess = !error;
-				}
-			} else {
-				// We extract error from statusText
-				// then normalize statusText and status for non-aborts
-				error = statusText;
-				if ( !statusText || status ) {
-					statusText = "error";
-					if ( status < 0 ) {
-						status = 0;
-					}
-				}
-			}
-
-			// Set data for the fake xhr object
-			jqXHR.status = status;
-			jqXHR.statusText = "" + ( nativeStatusText || statusText );
-
-			// Success/Error
-			if ( isSuccess ) {
-				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-			} else {
-				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-			}
-
-			// Status-dependent callbacks
-			jqXHR.statusCode( statusCode );
-			statusCode = undefined;
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
-						[ jqXHR, s, isSuccess ? success : error ] );
-			}
-
-			// Complete
-			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-				// Handle the global AJAX counter
-				if ( !( --jQuery.active ) ) {
-					jQuery.event.trigger( "ajaxStop" );
-				}
-			}
-		}
-
-		// Attach deferreds
-		deferred.promise( jqXHR );
-		jqXHR.success = jqXHR.done;
-		jqXHR.error = jqXHR.fail;
-		jqXHR.complete = completeDeferred.add;
-
-		// Status-dependent callbacks
-		jqXHR.statusCode = function( map ) {
-			if ( map ) {
-				var tmp;
-				if ( state < 2 ) {
-					for ( tmp in map ) {
-						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
-					}
-				} else {
-					tmp = map[ jqXHR.status ];
-					jqXHR.always( tmp );
-				}
-			}
-			return this;
-		};
-
-		// Remove hash character (#7531: and string promotion)
-		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
-		// We also use the url parameter if available
-		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
-		// Extract dataTypes list
-		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
-
-		// Determine if a cross-domain request is in order
-		if ( s.crossDomain == null ) {
-			parts = rurl.exec( s.url.toLowerCase() );
-			s.crossDomain = !!( parts &&
-				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
-					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
-						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
-			);
-		}
-
-		// Convert data if not already a string
-		if ( s.data && s.processData && typeof s.data !== "string" ) {
-			s.data = jQuery.param( s.data, s.traditional );
-		}
-
-		// Apply prefilters
-		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-		// If request was aborted inside a prefilter, stop there
-		if ( state === 2 ) {
-			return jqXHR;
-		}
-
-		// We can fire global events as of now if asked to
-		fireGlobals = s.global;
-
-		// Uppercase the type
-		s.type = s.type.toUpperCase();
-
-		// Determine if request has content
-		s.hasContent = !rnoContent.test( s.type );
-
-		// Watch for a new set of requests
-		if ( fireGlobals && jQuery.active++ === 0 ) {
-			jQuery.event.trigger( "ajaxStart" );
-		}
-
-		// More options handling for requests with no content
-		if ( !s.hasContent ) {
-
-			// If data is available, append data to url
-			if ( s.data ) {
-				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
-				// #9682: remove data so that it's not used in an eventual retry
-				delete s.data;
-			}
-
-			// Get ifModifiedKey before adding the anti-cache parameter
-			ifModifiedKey = s.url;
-
-			// Add anti-cache in url if needed
-			if ( s.cache === false ) {
-
-				var ts = jQuery.now(),
-					// try replacing _= if it is there
-					ret = s.url.replace( rts, "$1_=" + ts );
-
-				// if nothing was replaced, add timestamp to the end
-				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
-			}
-		}
-
-		// Set the correct header, if data is being sent
-		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-			jqXHR.setRequestHeader( "Content-Type", s.contentType );
-		}
-
-		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-		if ( s.ifModified ) {
-			ifModifiedKey = ifModifiedKey || s.url;
-			if ( jQuery.lastModified[ ifModifiedKey ] ) {
-				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
-			}
-			if ( jQuery.etag[ ifModifiedKey ] ) {
-				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
-			}
-		}
-
-		// Set the Accepts header for the server, depending on the dataType
-		jqXHR.setRequestHeader(
-			"Accept",
-			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
-				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-				s.accepts[ "*" ]
-		);
-
-		// Check for headers option
-		for ( i in s.headers ) {
-			jqXHR.setRequestHeader( i, s.headers[ i ] );
-		}
-
-		// Allow custom headers/mimetypes and early abort
-		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-				// Abort if not done already and return
-				return jqXHR.abort();
-
-		}
-
-		// aborting is no longer a cancellation
-		strAbort = "abort";
-
-		// Install callbacks on deferreds
-		for ( i in { success: 1, error: 1, complete: 1 } ) {
-			jqXHR[ i ]( s[ i ] );
-		}
-
-		// Get transport
-		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
-		// If no transport, we auto-abort
-		if ( !transport ) {
-			done( -1, "No Transport" );
-		} else {
-			jqXHR.readyState = 1;
-			// Send global event
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-			}
-			// Timeout
-			if ( s.async && s.timeout > 0 ) {
-				timeoutTimer = setTimeout( function(){
-					jqXHR.abort( "timeout" );
-				}, s.timeout );
-			}
-
-			try {
-				state = 1;
-				transport.send( requestHeaders, done );
-			} catch (e) {
-				// Propagate exception as error if not done
-				if ( state < 2 ) {
-					done( -1, e );
-				// Simply rethrow otherwise
-				} else {
-					throw e;
-				}
-			}
-		}
-
-		return jqXHR;
-	},
-
-	// Counter for holding the number of active queries
-	active: 0,
-
-	// Last-Modified header cache for next request
-	lastModified: {},
-	etag: {}
-
-});
-
-/* Handles responses to an ajax request:
- * - sets all responseXXX fields accordingly
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-
-	var ct, type, finalDataType, firstDataType,
-		contents = s.contents,
-		dataTypes = s.dataTypes,
-		responseFields = s.responseFields;
-
-	// Fill responseXXX fields
-	for ( type in responseFields ) {
-		if ( type in responses ) {
-			jqXHR[ responseFields[type] ] = responses[ type ];
-		}
-	}
-
-	// Remove auto dataType and get content-type in the process
-	while( dataTypes[ 0 ] === "*" ) {
-		dataTypes.shift();
-		if ( ct === undefined ) {
-			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
-		}
-	}
-
-	// Check if we're dealing with a known content-type
-	if ( ct ) {
-		for ( type in contents ) {
-			if ( contents[ type ] && contents[ type ].test( ct ) ) {
-				dataTypes.unshift( type );
-				break;
-			}
-		}
-	}
-
-	// Check to see if we have a response for the expected dataType
-	if ( dataTypes[ 0 ] in responses ) {
-		finalDataType = dataTypes[ 0 ];
-	} else {
-		// Try convertible dataTypes
-		for ( type in responses ) {
-			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
-				finalDataType = type;
-				break;
-			}
-			if ( !firstDataType ) {
-				firstDataType = type;
-			}
-		}
-		// Or just use first one
-		finalDataType = finalDataType || firstDataType;
-	}
-
-	// If we found a dataType
-	// We add the dataType to the list if needed
-	// and return the corresponding response
-	if ( finalDataType ) {
-		if ( finalDataType !== dataTypes[ 0 ] ) {
-			dataTypes.unshift( finalDataType );
-		}
-		return responses[ finalDataType ];
-	}
-}
-
-// Chain conversions given the request and the original response
-function ajaxConvert( s, response ) {
-
-	var conv, conv2, current, tmp,
-		// Work with a copy of dataTypes in case we need to modify it for conversion
-		dataTypes = s.dataTypes.slice(),
-		prev = dataTypes[ 0 ],
-		converters = {},
-		i = 0;
-
-	// Apply the dataFilter if provided
-	if ( s.dataFilter ) {
-		response = s.dataFilter( response, s.dataType );
-	}
-
-	// Create converters map with lowercased keys
-	if ( dataTypes[ 1 ] ) {
-		for ( conv in s.converters ) {
-			converters[ conv.toLowerCase() ] = s.converters[ conv ];
-		}
-	}
-
-	// Convert to each sequential dataType, tolerating list modification
-	for ( ; (current = dataTypes[++i]); ) {
-
-		// There's only work to do if current dataType is non-auto
-		if ( current !== "*" ) {
-
-			// Convert response if prev dataType is non-auto and differs from current
-			if ( prev !== "*" && prev !== current ) {
-
-				// Seek a direct converter
-				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
-				// If none found, seek a pair
-				if ( !conv ) {
-					for ( conv2 in converters ) {
-
-						// If conv2 outputs current
-						tmp = conv2.split(" ");
-						if ( tmp[ 1 ] === current ) {
-
-							// If prev can be converted to accepted input
-							conv = converters[ prev + " " + tmp[ 0 ] ] ||
-								converters[ "* " + tmp[ 0 ] ];
-							if ( conv ) {
-								// Condense equivalence converters
-								if ( conv === true ) {
-									conv = converters[ conv2 ];
-
-								// Otherwise, insert the intermediate dataType
-								} else if ( converters[ conv2 ] !== true ) {
-									current = tmp[ 0 ];
-									dataTypes.splice( i--, 0, current );
-								}
-
-								break;
-							}
-						}
-					}
-				}
-
-				// Apply converter (if not an equivalence)
-				if ( conv !== true ) {
-
-					// Unless errors are allowed to bubble, catch and return them
-					if ( conv && s["throws"] ) {
-						response = conv( response );
-					} else {
-						try {
-							response = conv( response );
-						} catch ( e ) {
-							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
-						}
-					}
-				}
-			}
-
-			// Update prev for next iteration
-			prev = current;
-		}
-	}
-
-	return { state: "success", data: response };
-}
-var oldCallbacks = [],
-	rquestion = /\?/,
-	rjsonp = /(=)\?(?=&|$)|\?\?/,
-	nonce = jQuery.now();
-
-// Default jsonp settings
-jQuery.ajaxSetup({
-	jsonp: "callback",
-	jsonpCallback: function() {
-		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
-		this[ callback ] = true;
-		return callback;
-	}
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-	var callbackName, overwritten, responseContainer,
-		data = s.data,
-		url = s.url,
-		hasCallback = s.jsonp !== false,
-		replaceInUrl = hasCallback && rjsonp.test( url ),
-		replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
-			!( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
-			rjsonp.test( data );
-
-	// Handle iff the expected data type is "jsonp" or we have a parameter to set
-	if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
-
-		// Get callback name, remembering preexisting value associated with it
-		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
-			s.jsonpCallback() :
-			s.jsonpCallback;
-		overwritten = window[ callbackName ];
-
-		// Insert callback into url or form data
-		if ( replaceInUrl ) {
-			s.url = url.replace( rjsonp, "$1" + callbackName );
-		} else if ( replaceInData ) {
-			s.data = data.replace( rjsonp, "$1" + callbackName );
-		} else if ( hasCallback ) {
-			s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
-		}
-
-		// Use data converter to retrieve json after script execution
-		s.converters["script json"] = function() {
-			if ( !responseContainer ) {
-				jQuery.error( callbackName + " was not called" );
-			}
-			return responseContainer[ 0 ];
-		};
-
-		// force json dataType
-		s.dataTypes[ 0 ] = "json";
-
-		// Install callback
-		window[ callbackName ] = function() {
-			responseContainer = arguments;
-		};
-
-		// Clean-up function (fires after converters)
-		jqXHR.always(function() {
-			// Restore preexisting value
-			window[ callbackName ] = overwritten;
-
-			// Save back as free
-			if ( s[ callbackName ] ) {
-				// make sure that re-using the options doesn't screw things around
-				s.jsonpCallback = originalSettings.jsonpCallback;
-
-				// save the callback name for future use
-				oldCallbacks.push( callbackName );
-			}
-
-			// Call if it was a function and we have a response
-			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
-				overwritten( responseContainer[ 0 ] );
-			}
-
-			responseContainer = overwritten = undefined;
-		});
-
-		// Delegate to script
-		return "script";
-	}
-});
-// Install script dataType
-jQuery.ajaxSetup({
-	accepts: {
-		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
-	},
-	contents: {
-		script: /javascript|ecmascript/
-	},
-	converters: {
-		"text script": function( text ) {
-			jQuery.globalEval( text );
-			return text;
-		}
-	}
-});
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
-	if ( s.cache === undefined ) {
-		s.cache = false;
-	}
-	if ( s.crossDomain ) {
-		s.type = "GET";
-		s.global = false;
-	}
-});
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
-	// This transport only deals with cross domain requests
-	if ( s.crossDomain ) {
-
-		var script,
-			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
-
-		return {
-
-			send: function( _, callback ) {
-
-				script = document.createElement( "script" );
-
-				script.async = "async";
-
-				if ( s.scriptCharset ) {
-					script.charset = s.scriptCharset;
-				}
-
-				script.src = s.url;
-
-				// Attach handlers for all browsers
-				script.onload = script.onreadystatechange = function( _, isAbort ) {
-
-					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
-						// Handle memory leak in IE
-						script.onload = script.onreadystatechange = null;
-
-						// Remove the script
-						if ( head && script.parentNode ) {
-							head.removeChild( script );
-						}
-
-						// Dereference the script
-						script = undefined;
-
-						// Callback if not abort
-						if ( !isAbort ) {
-							callback( 200, "success" );
-						}
-					}
-				};
-				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
-				// This arises when a base node is used (#2709 and #4378).
-				head.insertBefore( script, head.firstChild );
-			},
-
-			abort: function() {
-				if ( script ) {
-					script.onload( 0, 1 );
-				}
-			}
-		};
-	}
-});
-var xhrCallbacks,
-	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
-	xhrOnUnloadAbort = window.ActiveXObject ? function() {
-		// Abort all pending requests
-		for ( var key in xhrCallbacks ) {
-			xhrCallbacks[ key ]( 0, 1 );
-		}
-	} : false,
-	xhrId = 0;
-
-// Functions to create xhrs
-function createStandardXHR() {
-	try {
-		return new window.XMLHttpRequest();
-	} catch( e ) {}
-}
-
-function createActiveXHR() {
-	try {
-		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
-	} catch( e ) {}
-}
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
-	/* Microsoft failed to properly
-	 * implement the XMLHttpRequest in IE7 (can't request local files),
-	 * so we use the ActiveXObject when it is available
-	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
-	 * we need a fallback.
-	 */
-	function() {
-		return !this.isLocal && createStandardXHR() || createActiveXHR();
-	} :
-	// For all other browsers, use the standard XMLHttpRequest object
-	createStandardXHR;
-
-// Determine support properties
-(function( xhr ) {
-	jQuery.extend( jQuery.support, {
-		ajax: !!xhr,
-		cors: !!xhr && ( "withCredentials" in xhr )
-	});
-})( jQuery.ajaxSettings.xhr() );
-
-// Create transport if the browser can provide an xhr
-if ( jQuery.support.ajax ) {
-
-	jQuery.ajaxTransport(function( s ) {
-		// Cross domain only allowed if supported through XMLHttpRequest
-		if ( !s.crossDomain || jQuery.support.cors ) {
-
-			var callback;
-
-			return {
-				send: function( headers, complete ) {
-
-					// Get a new xhr
-					var handle, i,
-						xhr = s.xhr();
-
-					// Open the socket
-					// Passing null username, generates a login popup on Opera (#2865)
-					if ( s.username ) {
-						xhr.open( s.type, s.url, s.async, s.username, s.password );
-					} else {
-						xhr.open( s.type, s.url, s.async );
-					}
-
-					// Apply custom fields if provided
-					if ( s.xhrFields ) {
-						for ( i in s.xhrFields ) {
-							xhr[ i ] = s.xhrFields[ i ];
-						}
-					}
-
-					// Override mime type if needed
-					if ( s.mimeType && xhr.overrideMimeType ) {
-						xhr.overrideMimeType( s.mimeType );
-					}
-
-					// X-Requested-With header
-					// For cross-domain requests, seeing as conditions for a preflight are
-					// akin to a jigsaw puzzle, we simply never set it to be sure.
-					// (it can always be set on a per-request basis or even using ajaxSetup)
-					// For same-domain requests, won't change header if already provided.
-					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
-						headers[ "X-Requested-With" ] = "XMLHttpRequest";
-					}
-
-					// Need an extra try/catch for cross domain requests in Firefox 3
-					try {
-						for ( i in headers ) {
-							xhr.setRequestHeader( i, headers[ i ] );
-						}
-					} catch( _ ) {}
-
-					// Do send the request
-					// This may raise an exception which is actually
-					// handled in jQuery.ajax (so no try/catch here)
-					xhr.send( ( s.hasContent && s.data ) || null );
-
-					// Listener
-					callback = function( _, isAbort ) {
-
-						var status,
-							statusText,
-							responseHeaders,
-							responses,
-							xml;
-
-						// Firefox throws exceptions when accessing properties
-						// of an xhr when a network error occurred
-						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
-						try {
-
-							// Was never called and is aborted or complete
-							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
-								// Only called once
-								callback = undefined;
-
-								// Do not keep as active anymore
-								if ( handle ) {
-									xhr.onreadystatechange = jQuery.noop;
-									if ( xhrOnUnloadAbort ) {
-										delete xhrCallbacks[ handle ];
-									}
-								}
-
-								// If it's an abort
-								if ( isAbort ) {
-									// Abort it manually if needed
-									if ( xhr.readyState !== 4 ) {
-										xhr.abort();
-									}
-								} else {
-									status = xhr.status;
-									responseHeaders = xhr.getAllResponseHeaders();
-									responses = {};
-									xml = xhr.responseXML;
-
-									// Construct response list
-									if ( xml && xml.documentElement /* #4958 */ ) {
-										responses.xml = xml;
-									}
-
-									// When requesting binary data, IE6-9 will throw an exception
-									// on any attempt to access responseText (#11426)
-									try {
-										responses.text = xhr.responseText;
-									} catch( _ ) {
-									}
-
-									// Firefox throws an exception when accessing
-									// statusText for faulty cross-domain requests
-									try {
-										statusText = xhr.statusText;
-									} catch( e ) {
-										// We normalize with Webkit giving an empty statusText
-										statusText = "";
-									}
-
-									// Filter status for non standard behaviors
-
-									// If the request is local and we have data: assume a success
-									// (success with no data won't get notified, that's the best we
-									// can do given current implementations)
-									if ( !status && s.isLocal && !s.crossDomain ) {
-										status = responses.text ? 200 : 404;
-									// IE - #1450: sometimes returns 1223 when it should be 204
-									} else if ( status === 1223 ) {
-										status = 204;
-									}
-								}
-							}
-						} catch( firefoxAccessException ) {
-							if ( !isAbort ) {
-								complete( -1, firefoxAccessException );
-							}
-						}
-
-						// Call complete if needed
-						if ( responses ) {
-							complete( status, statusText, responses, responseHeaders );
-						}
-					};
-
-					if ( !s.async ) {
-						// if we're in sync mode we fire the callback
-						callback();
-					} else if ( xhr.readyState === 4 ) {
-						// (IE6 & IE7) if it's in cache and has been
-						// retrieved directly we need to fire the callback
-						setTimeout( callback, 0 );
-					} else {
-						handle = ++xhrId;
-						if ( xhrOnUnloadAbort ) {
-							// Create the active xhrs callbacks list if needed
-							// and attach the unload handler
-							if ( !xhrCallbacks ) {
-								xhrCallbacks = {};
-								jQuery( window ).unload( xhrOnUnloadAbort );
-							}
-							// Add to list of active xhrs callbacks
-							xhrCallbacks[ handle ] = callback;
-						}
-						xhr.onreadystatechange = callback;
-					}
-				},
-
-				abort: function() {
-					if ( callback ) {
-						callback(0,1);
-					}
-				}
-			};
-		}
-	});
-}
-var fxNow, timerId,
-	rfxtypes = /^(?:toggle|show|hide)$/,
-	rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
-	rrun = /queueHooks$/,
-	animationPrefilters = [ defaultPrefilter ],
-	tweeners = {
-		"*": [function( prop, value ) {
-			var end, unit, prevScale,
-				tween = this.createTween( prop, value ),
-				parts = rfxnum.exec( value ),
-				target = tween.cur(),
-				start = +target || 0,
-				scale = 1;
-
-			if ( parts ) {
-				end = +parts[2];
-				unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-
-				// We need to compute starting value
-				if ( unit !== "px" && start ) {
-					// Iteratively approximate from a nonzero starting point
-					// Prefer the current property, because this process will be trivial if it uses the same units
-					// Fallback to end or a simple constant
-					start = jQuery.css( tween.elem, prop, true ) || end || 1;
-
-					do {
-						// If previous iteration zeroed out, double until we get *something*
-						// Use a string for doubling factor so we don't accidentally see scale as unchanged below
-						prevScale = scale = scale || ".5";
-
-						// Adjust and apply
-						start = start / scale;
-						jQuery.style( tween.elem, prop, start + unit );
-
-						// Update scale, tolerating zeroes from tween.cur()
-						scale = tween.cur() / target;
-
-					// Stop looping if we've hit the mark or scale is unchanged
-					} while ( scale !== 1 && scale !== prevScale );
-				}
-
-				tween.unit = unit;
-				tween.start = start;
-				// If a +=/-= token was provided, we're doing a relative animation
-				tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
-			}
-			return tween;
-		}]
-	};
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
-	setTimeout(function() {
-		fxNow = undefined;
-	}, 0 );
-	return ( fxNow = jQuery.now() );
-}
-
-function createTweens( animation, props ) {
-	jQuery.each( props, function( prop, value ) {
-		var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
-			index = 0,
-			length = collection.length;
-		for ( ; index < length; index++ ) {
-			if ( collection[ index ].call( animation, prop, value ) ) {
-
-				// we're done with this property
-				return;
-			}
-		}
-	});
-}
-
-function Animation( elem, properties, options ) {
-	var result,
-		index = 0,
-		tweenerIndex = 0,
-		length = animationPrefilters.length,
-		deferred = jQuery.Deferred().always( function() {
-			// don't match elem in the :animated selector
-			delete tick.elem;
-		}),
-		tick = function() {
-			var currentTime = fxNow || createFxNow(),
-				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-				percent = 1 - ( remaining / animation.duration || 0 ),
-				index = 0,
-				length = animation.tweens.length;
-
-			for ( ; index < length ; index++ ) {
-				animation.tweens[ index ].run( percent );
-			}
-
-			deferred.notifyWith( elem, [ animation, percent, remaining ]);
-
-			if ( percent < 1 && length ) {
-				return remaining;
-			} else {
-				deferred.resolveWith( elem, [ animation ] );
-				return false;
-			}
-		},
-		animation = deferred.promise({
-			elem: elem,
-			props: jQuery.extend( {}, properties ),
-			opts: jQuery.extend( true, { specialEasing: {} }, options ),
-			originalProperties: properties,
-			originalOptions: options,
-			startTime: fxNow || createFxNow(),
-			duration: options.duration,
-			tweens: [],
-			createTween: function( prop, end, easing ) {
-				var tween = jQuery.Tween( elem, animation.opts, prop, end,
-						animation.opts.specialEasing[ prop ] || animation.opts.easing );
-				animation.tweens.push( tween );
-				return tween;
-			},
-			stop: function( gotoEnd ) {
-				var index = 0,
-					// if we are going to the end, we want to run all the tweens
-					// otherwise we skip this part
-					length = gotoEnd ? animation.tweens.length : 0;
-
-				for ( ; index < length ; index++ ) {
-					animation.tweens[ index ].run( 1 );
-				}
-
-				// resolve when we played the last frame
-				// otherwise, reject
-				if ( gotoEnd ) {
-					deferred.resolveWith( elem, [ animation, gotoEnd ] );
-				} else {
-					deferred.rejectWith( elem, [ animation, gotoEnd ] );
-				}
-				return this;
-			}
-		}),
-		props = animation.props;
-
-	propFilter( props, animation.opts.specialEasing );
-
-	for ( ; index < length ; index++ ) {
-		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
-		if ( result ) {
-			return result;
-		}
-	}
-
-	createTweens( animation, props );
-
-	if ( jQuery.isFunction( animation.opts.start ) ) {
-		animation.opts.start.call( elem, animation );
-	}
-
-	jQuery.fx.timer(
-		jQuery.extend( tick, {
-			anim: animation,
-			queue: animation.opts.queue,
-			elem: elem
-		})
-	);
-
-	// attach callbacks from options
-	return animation.progress( animation.opts.progress )
-		.done( animation.opts.done, animation.opts.complete )
-		.fail( animation.opts.fail )
-		.always( animation.opts.always );
-}
-
-function propFilter( props, specialEasing ) {
-	var index, name, easing, value, hooks;
-
-	// camelCase, specialEasing and expand cssHook pass
-	for ( index in props ) {
-		name = jQuery.camelCase( index );
-		easing = specialEasing[ name ];
-		value = props[ index ];
-		if ( jQuery.isArray( value ) ) {
-			easing = value[ 1 ];
-			value = props[ index ] = value[ 0 ];
-		}
-
-		if ( index !== name ) {
-			props[ name ] = value;
-			delete props[ index ];
-		}
-
-		hooks = jQuery.cssHooks[ name ];
-		if ( hooks && "expand" in hooks ) {
-			value = hooks.expand( value );
-			delete props[ name ];
-
-			// not quite $.extend, this wont overwrite keys already present.
-			// also - reusing 'index' from above because we have the correct "name"
-			for ( index in value ) {
-				if ( !( index in props ) ) {
-					props[ index ] = value[ index ];
-					specialEasing[ index ] = easing;
-				}
-			}
-		} else {
-			specialEasing[ name ] = easing;
-		}
-	}
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-
-	tweener: function( props, callback ) {
-		if ( jQuery.isFunction( props ) ) {
-			callback = props;
-			props = [ "*" ];
-		} else {
-			props = props.split(" ");
-		}
-
-		var prop,
-			index = 0,
-			length = props.length;
-
-		for ( ; index < length ; index++ ) {
-			prop = props[ index ];
-			tweeners[ prop ] = tweeners[ prop ] || [];
-			tweeners[ prop ].unshift( callback );
-		}
-	},
-
-	prefilter: function( callback, prepend ) {
-		if ( prepend ) {
-			animationPrefilters.unshift( callback );
-		} else {
-			animationPrefilters.push( callback );
-		}
-	}
-});
-
-function defaultPrefilter( elem, props, opts ) {
-	var index, prop, value, length, dataShow, tween, hooks, oldfire,
-		anim = this,
-		style = elem.style,
-		orig = {},
-		handled = [],
-		hidden = elem.nodeType && isHidden( elem );
-
-	// handle queue: false promises
-	if ( !opts.queue ) {
-		hooks = jQuery._queueHooks( elem, "fx" );
-		if ( hooks.unqueued == null ) {
-			hooks.unqueued = 0;
-			oldfire = hooks.empty.fire;
-			hooks.empty.fire = function() {
-				if ( !hooks.unqueued ) {
-					oldfire();
-				}
-			};
-		}
-		hooks.unqueued++;
-
-		anim.always(function() {
-			// doing this makes sure that the complete handler will be called
-			// before this completes
-			anim.always(function() {
-				hooks.unqueued--;
-				if ( !jQuery.queue( elem, "fx" ).length ) {
-					hooks.empty.fire();
-				}
-			});
-		});
-	}
-
-	// height/width overflow pass
-	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
-		// Make sure that nothing sneaks out
-		// Record all 3 overflow attributes because IE does not
-		// change the overflow attribute when overflowX and
-		// overflowY are set to the same value
-		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
-		// Set display property to inline-block for height/width
-		// animations on inline elements that are having width/height animated
-		if ( jQuery.css( elem, "display" ) === "inline" &&
-				jQuery.css( elem, "float" ) === "none" ) {
-
-			// inline-level elements accept inline-block;
-			// block-level elements need to be inline with layout
-			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
-				style.display = "inline-block";
-
-			} else {
-				style.zoom = 1;
-			}
-		}
-	}
-
-	if ( opts.overflow ) {
-		style.overflow = "hidden";
-		if ( !jQuery.support.shrinkWrapBlocks ) {
-			anim.done(function() {
-				style.overflow = opts.overflow[ 0 ];
-				style.overflowX = opts.overflow[ 1 ];
-				style.overflowY = opts.overflow[ 2 ];
-			});
-		}
-	}
-
-
-	// show/hide pass
-	for ( index in props ) {
-		value = props[ index ];
-		if ( rfxtypes.exec( value ) ) {
-			delete props[ index ];
-			if ( value === ( hidden ? "hide" : "show" ) ) {
-				continue;
-			}
-			handled.push( index );
-		}
-	}
-
-	length = handled.length;
-	if ( length ) {
-		dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
-		if ( hidden ) {
-			jQuery( elem ).show();
-		} else {
-			anim.done(function() {
-				jQuery( elem ).hide();
-			});
-		}
-		anim.done(function() {
-			var prop;
-			jQuery.removeData( elem, "fxshow", true );
-			for ( prop in orig ) {
-				jQuery.style( elem, prop, orig[ prop ] );
-			}
-		});
-		for ( index = 0 ; index < length ; index++ ) {
-			prop = handled[ index ];
-			tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
-			orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
-
-			if ( !( prop in dataShow ) ) {
-				dataShow[ prop ] = tween.start;
-				if ( hidden ) {
-					tween.end = tween.start;
-					tween.start = prop === "width" || prop === "height" ? 1 : 0;
-				}
-			}
-		}
-	}
-}
-
-function Tween( elem, options, prop, end, easing ) {
-	return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
-	constructor: Tween,
-	init: function( elem, options, prop, end, easing, unit ) {
-		this.elem = elem;
-		this.prop = prop;
-		this.easing = easing || "swing";
-		this.options = options;
-		this.start = this.now = this.cur();
-		this.end = end;
-		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-	},
-	cur: function() {
-		var hooks = Tween.propHooks[ this.prop ];
-
-		return hooks && hooks.get ?
-			hooks.get( this ) :
-			Tween.propHooks._default.get( this );
-	},
-	run: function( percent ) {
-		var eased,
-			hooks = Tween.propHooks[ this.prop ];
-
-		this.pos = eased = jQuery.easing[ this.easing ]( percent, this.options.duration * percent, 0, 1, this.options.duration );
-		this.now = ( this.end - this.start ) * eased + this.start;
-
-		if ( this.options.step ) {
-			this.options.step.call( this.elem, this.now, this );
-		}
-
-		if ( hooks && hooks.set ) {
-			hooks.set( this );
-		} else {
-			Tween.propHooks._default.set( this );
-		}
-		return this;
-	}
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
-	_default: {
-		get: function( tween ) {
-			var result;
-
-			if ( tween.elem[ tween.prop ] != null &&
-				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
-				return tween.elem[ tween.prop ];
-			}
-
-			// passing any value as a 4th parameter to .css will automatically
-			// attempt a parseFloat and fallback to a string if the parse fails
-			// so, simple values such as "10px" are parsed to Float.
-			// complex values such as "rotate(1rad)" are returned as is.
-			result = jQuery.css( tween.elem, tween.prop, false, "" );
-			// Empty strings, null, undefined and "auto" are converted to 0.
-			return !result || result === "auto" ? 0 : result;
-		},
-		set: function( tween ) {
-			// use step hook for back compat - use cssHook if its there - use .style if its
-			// available and use plain properties where available
-			if ( jQuery.fx.step[ tween.prop ] ) {
-				jQuery.fx.step[ tween.prop ]( tween );
-			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
-				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-			} else {
-				tween.elem[ tween.prop ] = tween.now;
-			}
-		}
-	}
-};
-
-// Remove in 2.0 - this supports IE8's panic based approach
-// to setting things on disconnected nodes
-
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-	set: function( tween ) {
-		if ( tween.elem.nodeType && tween.elem.parentNode ) {
-			tween.elem[ tween.prop ] = tween.now;
-		}
-	}
-};
-
-jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
-	var cssFn = jQuery.fn[ name ];
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return speed == null || typeof speed === "boolean" ||
-			// special check for .toggle( handler, handler, ... )
-			( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
-			cssFn.apply( this, arguments ) :
-			this.animate( genFx( name, true ), speed, easing, callback );
-	};
-});
-
-jQuery.fn.extend({
-	fadeTo: function( speed, to, easing, callback ) {
-
-		// show any hidden elements after setting opacity to 0
-		return this.filter( isHidden ).css( "opacity", 0 ).show()
-
-			// animate to the value specified
-			.end().animate({ opacity: to }, speed, easing, callback );
-	},
-	animate: function( prop, speed, easing, callback ) {
-		var empty = jQuery.isEmptyObject( prop ),
-			optall = jQuery.speed( speed, easing, callback ),
-			doAnimation = function() {
-				// Operate on a copy of prop so per-property easing won't be lost
-				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
-				// Empty animations resolve immediately
-				if ( empty ) {
-					anim.stop( true );
-				}
-			};
-
-		return empty || optall.queue === false ?
-			this.each( doAnimation ) :
-			this.queue( optall.queue, doAnimation );
-	},
-	stop: function( type, clearQueue, gotoEnd ) {
-		var stopQueue = function( hooks ) {
-			var stop = hooks.stop;
-			delete hooks.stop;
-			stop( gotoEnd );
-		};
-
-		if ( typeof type !== "string" ) {
-			gotoEnd = clearQueue;
-			clearQueue = type;
-			type = undefined;
-		}
-		if ( clearQueue && type !== false ) {
-			this.queue( type || "fx", [] );
-		}
-
-		return this.each(function() {
-			var dequeue = true,
-				index = type != null && type + "queueHooks",
-				timers = jQuery.timers,
-				data = jQuery._data( this );
-
-			if ( index ) {
-				if ( data[ index ] && data[ index ].stop ) {
-					stopQueue( data[ index ] );
-				}
-			} else {
-				for ( index in data ) {
-					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-						stopQueue( data[ index ] );
-					}
-				}
-			}
-
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
-					timers[ index ].anim.stop( gotoEnd );
-					dequeue = false;
-					timers.splice( index, 1 );
-				}
-			}
-
-			// start the next in the queue if the last step wasn't forced
-			// timers currently will call their complete callbacks, which will dequeue
-			// but only if they were gotoEnd
-			if ( dequeue || !gotoEnd ) {
-				jQuery.dequeue( this, type );
-			}
-		});
-	}
-});
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
-	var which,
-		attrs = { height: type },
-		i = 0;
-
-	// if we include width, step value is 1 to do all cssExpand values,
-	// if we don't include width, step value is 2 to skip over Left and Right
-	for( ; i < 4 ; i += 2 - includeWidth ) {
-		which = cssExpand[ i ];
-		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-	}
-
-	if ( includeWidth ) {
-		attrs.opacity = attrs.width = type;
-	}
-
-	return attrs;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
-	slideDown: genFx("show"),
-	slideUp: genFx("hide"),
-	slideToggle: genFx("toggle"),
-	fadeIn: { opacity: "show" },
-	fadeOut: { opacity: "hide" },
-	fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return this.animate( props, speed, easing, callback );
-	};
-});
-
-jQuery.speed = function( speed, easing, fn ) {
-	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-		complete: fn || !fn && easing ||
-			jQuery.isFunction( speed ) && speed,
-		duration: speed,
-		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-	};
-
-	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
-	// normalize opt.queue - true/undefined/null -> "fx"
-	if ( opt.queue == null || opt.queue === true ) {
-		opt.queue = "fx";
-	}
-
-	// Queueing
-	opt.old = opt.complete;
-
-	opt.complete = function() {
-		if ( jQuery.isFunction( opt.old ) ) {
-			opt.old.call( this );
-		}
-
-		if ( opt.queue ) {
-			jQuery.dequeue( this, opt.queue );
-		}
-	};
-
-	return opt;
-};
-
-jQuery.easing = {
-	linear: function( p ) {
-		return p;
-	},
-	swing: function( p ) {
-		return 0.5 - Math.cos( p*Math.PI ) / 2;
-	}
-};
-
-jQuery.timers = [];
-jQuery.fx = Tween.prototype.init;
-jQuery.fx.tick = function() {
-	var timer,
-		timers = jQuery.timers,
-		i = 0;
-
-	for ( ; i < timers.length; i++ ) {
-		timer = timers[ i ];
-		// Checks the timer has not already been removed
-		if ( !timer() && timers[ i ] === timer ) {
-			timers.splice( i--, 1 );
-		}
-	}
-
-	if ( !timers.length ) {
-		jQuery.fx.stop();
-	}
-};
-
-jQuery.fx.timer = function( timer ) {
-	if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
-		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
-	}
-};
-
-jQuery.fx.interval = 13;
-
-jQuery.fx.stop = function() {
-	clearInterval( timerId );
-	timerId = null;
-};
-
-jQuery.fx.speeds = {
-	slow: 600,
-	fast: 200,
-	// Default speed
-	_default: 400
-};
-
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-if ( jQuery.expr && jQuery.expr.filters ) {
-	jQuery.expr.filters.animated = function( elem ) {
-		return jQuery.grep(jQuery.timers, function( fn ) {
-			return elem === fn.elem;
-		}).length;
-	};
-}
-var rroot = /^(?:body|html)$/i;
-
-jQuery.fn.offset = function( options ) {
-	if ( arguments.length ) {
-		return options === undefined ?
-			this :
-			this.each(function( i ) {
-				jQuery.offset.setOffset( this, options, i );
-			});
-	}
-
-	var box, docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, top, left,
-		elem = this[ 0 ],
-		doc = elem && elem.ownerDocument;
-
-	if ( !doc ) {
-		return;
-	}
-
-	if ( (body = doc.body) === elem ) {
-		return jQuery.offset.bodyOffset( elem );
-	}
-
-	docElem = doc.documentElement;
-
-	// Make sure we're not dealing with a disconnected DOM node
-	if ( !jQuery.contains( docElem, elem ) ) {
-		return { top: 0, left: 0 };
-	}
-
-	box = elem.getBoundingClientRect();
-	win = getWindow( doc );
-	clientTop  = docElem.clientTop  || body.clientTop  || 0;
-	clientLeft = docElem.clientLeft || body.clientLeft || 0;
-	scrollTop  = win.pageYOffset || docElem.scrollTop;
-	scrollLeft = win.pageXOffset || docElem.scrollLeft;
-	top  = box.top  + scrollTop  - clientTop;
-	left = box.left + scrollLeft - clientLeft;
-
-	return { top: top, left: left };
-};
-
-jQuery.offset = {
-
-	bodyOffset: function( body ) {
-		var top = body.offsetTop,
-			left = body.offsetLeft;
-
-		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
-			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
-			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
-		}
-
-		return { top: top, left: left };
-	},
-
-	setOffset: function( elem, options, i ) {
-		var position = jQuery.css( elem, "position" );
-
-		// set position first, in-case top/left are set even on static elem
-		if ( position === "static" ) {
-			elem.style.position = "relative";
-		}
-
-		var curElem = jQuery( elem ),
-			curOffset = curElem.offset(),
-			curCSSTop = jQuery.css( elem, "top" ),
-			curCSSLeft = jQuery.css( elem, "left" ),
-			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
-			props = {}, curPosition = {}, curTop, curLeft;
-
-		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
-		if ( calculatePosition ) {
-			curPosition = curElem.position();
-			curTop = curPosition.top;
-			curLeft = curPosition.left;
-		} else {
-			curTop = parseFloat( curCSSTop ) || 0;
-			curLeft = parseFloat( curCSSLeft ) || 0;
-		}
-
-		if ( jQuery.isFunction( options ) ) {
-			options = options.call( elem, i, curOffset );
-		}
-
-		if ( options.top != null ) {
-			props.top = ( options.top - curOffset.top ) + curTop;
-		}
-		if ( options.left != null ) {
-			props.left = ( options.left - curOffset.left ) + curLeft;
-		}
-
-		if ( "using" in options ) {
-			options.using.call( elem, props );
-		} else {
-			curElem.css( props );
-		}
-	}
-};
-
-
-jQuery.fn.extend({
-
-	position: function() {
-		if ( !this[0] ) {
-			return;
-		}
-
-		var elem = this[0],
-
-		// Get *real* offsetParent
-		offsetParent = this.offsetParent(),
-
-		// Get correct offsets
-		offset       = this.offset(),
-		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
-
-		// Subtract element margins
-		// note: when an element has margin: auto the offsetLeft and marginLeft
-		// are the same in Safari causing offset.left to incorrectly be 0
-		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
-		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
-
-		// Add offsetParent borders
-		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
-		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
-
-		// Subtract the two offsets
-		return {
-			top:  offset.top  - parentOffset.top,
-			left: offset.left - parentOffset.left
-		};
-	},
-
-	offsetParent: function() {
-		return this.map(function() {
-			var offsetParent = this.offsetParent || document.body;
-			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
-				offsetParent = offsetParent.offsetParent;
-			}
-			return offsetParent || document.body;
-		});
-	}
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
-	var top = /Y/.test( prop );
-
-	jQuery.fn[ method ] = function( val ) {
-		return jQuery.access( this, function( elem, method, val ) {
-			var win = getWindow( elem );
-
-			if ( val === undefined ) {
-				return win ? (prop in win) ? win[ prop ] :
-					win.document.documentElement[ method ] :
-					elem[ method ];
-			}
-
-			if ( win ) {
-				win.scrollTo(
-					!top ? val : jQuery( win ).scrollLeft(),
-					 top ? val : jQuery( win ).scrollTop()
-				);
-
-			} else {
-				elem[ method ] = val;
-			}
-		}, method, val, arguments.length, null );
-	};
-});
-
-function getWindow( elem ) {
-	return jQuery.isWindow( elem ) ?
-		elem :
-		elem.nodeType === 9 ?
-			elem.defaultView || elem.parentWindow :
-			false;
-}
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
-		// margin is only for outerHeight, outerWidth
-		jQuery.fn[ funcName ] = function( margin, value ) {
-			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
-			return jQuery.access( this, function( elem, type, value ) {
-				var doc;
-
-				if ( jQuery.isWindow( elem ) ) {
-					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
-					// isn't a whole lot we can do. See pull request at this URL for discussion:
-					// https://github.com/jquery/jquery/pull/764
-					return elem.document.documentElement[ "client" + name ];
-				}
-
-				// Get document width or height
-				if ( elem.nodeType === 9 ) {
-					doc = elem.documentElement;
-
-					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
-					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
-					return Math.max(
-						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-						elem.body[ "offset" + name ], doc[ "offset" + name ],
-						doc[ "client" + name ]
-					);
-				}
-
-				return value === undefined ?
-					// Get width or height on the element, requesting but not forcing parseFloat
-					jQuery.css( elem, type, value, extra ) :
-
-					// Set width or height on the element
-					jQuery.style( elem, type, value, extra );
-			}, type, chainable ? margin : undefined, chainable );
-		};
-	});
-});
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
-
-// Expose jQuery as an AMD module, but only for AMD loaders that
-// understand the issues with loading multiple versions of jQuery
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// file names, and jQuery is normally delivered in a lowercase file name.
-// Do this after creating the global so that if an AMD module wants to call
-// noConflict to hide this version of jQuery, it will work.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
-	define( "jquery", [], function () { return jQuery; } );
-}
-
-})( window );
diff --git a/vendor/json_pure-1.7.7/.gitignore b/vendor/json_pure-1.7.7/.gitignore
deleted file mode 100644
index c810962..0000000
--- a/vendor/json_pure-1.7.7/.gitignore
+++ /dev/null
@@ -1,12 +0,0 @@
-.*.sw[pon]
-coverage
-tags
-pkg
-.nfs.*
-.idea
-java/Json.iml
-Gemfile.lock
-.rvmrc
-*.rbc
-.rbx
-.AppleDouble
diff --git a/vendor/json_pure-1.7.7/.travis.yml b/vendor/json_pure-1.7.7/.travis.yml
deleted file mode 100644
index 185b3e5..0000000
--- a/vendor/json_pure-1.7.7/.travis.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-# Passes arguments to bundle install (http://gembundler.com/man/bundle-install.1.html)
-bundler_args: --binstubs
-
-# Specify which ruby versions you wish to run your tests on, each version will be used
-rvm:
-  - 1.8.7
-  - 1.9.2
-  - 1.9.3
-  - ree
-  - rbx-18mode
-  - rbx-19mode
-  - jruby-18mode
-  - jruby-19mode
-  - ruby-head
-matrix:
-  allow_failures:
-    - rvm: rbx-18mode
-    - rvm: rbx-19mode
-script: "bundle exec rake"
diff --git a/vendor/json_pure-1.7.7/CHANGES b/vendor/json_pure-1.7.7/CHANGES
deleted file mode 100644
index e3d12a7..0000000
--- a/vendor/json_pure-1.7.7/CHANGES
+++ /dev/null
@@ -1,272 +0,0 @@
-2013-02-04 (1.7.7)
-  * Security fix for JSON create_additions default value and
-    JSON::GenericObject. It should not be possible to create additions unless
-    explicitely requested by setting the create_additions argument to true or
-    using the JSON.load/dump interface. If JSON::GenericObject is supposed to
-    be automatically deserialised, this has to be explicitely enabled by
-    setting
-      JSON::GenericObject.json_createble = true
-    as well.
-  * Remove useless assert in fbuffer implementation.
-  * Apply patch attached to https://github.com/flori/json/issues#issue/155
-    provided by John Shahid <jvshahid at gmail.com>, Thx!
-  * Add license information to rubygems spec data, reported by Jordi Massaguer Pla <jmassaguerpla at suse.de>.
-  * Improve documentation, thx to Zachary Scott <zachary at zacharyscott.net>.
-2012-11-29 (1.7.6)
-  * Add GeneratorState#merge alias for JRuby, fix state accessor methods. Thx to
-   jvshahid at github.
-  * Increase hash likeness of state objects.
-2012-08-17 (1.7.5)
-  * Fix compilation of extension on older rubies.
-2012-07-26 (1.7.4)
-  * Fix compilation problem on AIX, see https://github.com/flori/json/issues/142
-2012-05-12 (1.7.3)
-  * Work around Rubinius encoding issues using iconv for conversion instead.
-2012-05-11 (1.7.2)
-  * Fix some encoding issues, that cause problems for  the pure and the
-    extension variant in jruby 1.9 mode.
-2012-04-28 (1.7.1)
-  * Some small fixes for building
-2012-04-28 (1.7.0)
-  * Add JSON::GenericObject for method access to objects transmitted via JSON.
-2012-04-27 (1.6.7)
-  * Fix possible crash when trying to parse nil value.
-2012-02-11 (1.6.6)
-  * Propagate src encoding to values made from it (fixes 1.9 mode converting
-    everything to ascii-8bit; harmless for 1.8 mode too) (Thomas E. Enebo
-    <tom.enebo at gmail.com>), should fix
-    https://github.com/flori/json/issues#issue/119.
-  * Fix https://github.com/flori/json/issues#issue/124 Thx to Jason Hutchens.
-  * Fix https://github.com/flori/json/issues#issue/117
-2012-01-15 (1.6.5)
-  * Vit Ondruch <v.ondruch at tiscali.cz> reported a bug that shows up when using
-    optimisation under GCC 4.7. Thx to him, Bohuslav Kabrda
-    <bkabrda at redhat.com> and Yui NARUSE <naruse at airemix.jp> for debugging and
-    developing a patch fix.
-2011-12-24 (1.6.4)
-  * Patches that improve speed on JRuby contributed by Charles Oliver Nutter
-    <headius at headius.com>.
-  * Support object_class/array_class with duck typed hash/array.
-2011-12-01 (1.6.3)
-  * Let JSON.load('') return nil as well to make mysql text columns (default to
-    '') work better for serialization.
-2011-11-21 (1.6.2)
-  * Add support for OpenStruct and BigDecimal.
-  * Fix bug when parsing nil in quirks_mode.
-  * Make JSON.dump and JSON.load methods better cooperate with Rails' serialize
-    method. Just use: serialize :value, JSON
-  * Fix bug with time serialization concerning nanoseconds. Thanks for the
-    patch go to Josh Partlow (jpartlow at github).
-  * Improve parsing speed for JSON numbers (integers and floats) in a similar way to
-    what Evan Phoenix <evan at phx.io> suggested in:
-    https://github.com/flori/json/pull/103
-2011-09-18 (1.6.1)
-  * Using -target 1.5 to force Java bits to compile with 1.5.
-2011-09-12 (1.6.0)
-  * Extract utilities (prettifier and GUI-editor) in its own gem json-utils.
-  * Split json/add/core into different files for classes to be serialised.
-2011-08-31 (1.5.4)
-  * Fix memory leak when used from multiple JRuby. (Patch by
-    jfirebaugh at github).
-  * Apply patch by Eric Wong <nocode at yhbt.net> that fixes garbage collection problem
-    reported in https://github.com/flori/json/issues/46.
-  * Add :quirks_mode option to parser and generator.
-  * Add support for Rational and Complex number additions via json/add/complex
-    and json/add/rational requires.
-2011-06-20 (1.5.3)
-  * Alias State#configure method as State#merge to increase duck type synonymy with Hash.
-	* Add as_json methods in json/add/core, so rails can create its json objects
-	  the new way.
-2011-05-11 (1.5.2)
-  * Apply documentation patch by Cory Monty <cory.monty at gmail.com>.
-  * Add gemspecs for json and json_pure.
-  * Fix bug in jruby pretty printing.
-  * Fix bug in object_class and array_class when inheriting from Hash or Array.
-2011-01-24 (1.5.1)
-  * Made rake-compiler build a fat binary gem. This should fix issue
-    https://github.com/flori/json/issues#issue/54.
-2011-01-22 (1.5.0)
-  * Included Java source codes for the Jruby extension made by Daniel Luz
-    <dev at mernen.com>.
-  * Output full exception message of deep_const_get to aid debugging.
-  * Fixed an issue with ruby 1.9 Module#const_defined? method, that was
-    reported by Riley Goodside.
-2010-08-09 (1.4.6)
-  * Fixed oversight reported in http://github.com/flori/json/issues/closed#issue/23,
-    always create a new object from the state prototype.
-  * Made pure and ext api more similar again.
-2010-08-07 (1.4.5)
-  * Manage data structure nesting depth in state object during generation. This
-    should reduce problems with to_json method definіtions that only have one
-    argument.
-  * Some fixes in the state objects and additional tests.
-2010-08-06 (1.4.4)
-  * Fixes build problem for rubinius under OS X, http://github.com/flori/json/issues/closed#issue/25
-  * Fixes crashes described in http://github.com/flori/json/issues/closed#issue/21 and
-    http://github.com/flori/json/issues/closed#issue/23
-2010-05-05 (1.4.3)
-  * Fixed some test assertions, from Ruby r27587 and r27590, patch by nobu.
-  * Fixed issue http://github.com/flori/json/issues/#issue/20 reported by
-    electronicwhisper at github. Thx!
-2010-04-26 (1.4.2)
-  * Applied patch from naruse Yui NARUSE <naruse at airemix.com> to make building with
-    Microsoft Visual C possible again.
-  * Applied patch from devrandom <c1.github at niftybox.net> in order to allow building of
-    json_pure if extensiontask is not present.
-  * Thanks to Dustin Schneider <dustin at stocktwits.com>, who reported a memory
-    leak, which is fixed in this release.
-  * Applied 993f261ccb8f911d2ae57e9db48ec7acd0187283 patch from josh at github.
-2010-04-25 (1.4.1)
-  * Fix for a bug reported by Dan DeLeo <dan at kallistec.com>, caused by T_FIXNUM
-    being different on 32bit/64bit architectures.
-2010-04-23 (1.4.0)
-  * Major speed improvements and building with simplified
-    directory/file-structure.
-  * Extension should at least be comapatible with MRI, YARV and Rubinius.
-2010-04-07 (1.2.4)
-  * Triger const_missing callback to make Rails' dynamic class loading work.
-2010-03-11 (1.2.3)
-  * Added a State#[] method which returns an attribute's value in order to
-    increase duck type compatibility to Hash.
-2010-02-27 (1.2.2)
-  * Made some changes to make the building of the parser/generator compatible
-    to Rubinius.
-2009-11-25 (1.2.1)
-  * Added :symbolize_names option to Parser, which returns symbols instead of
-    strings in object names/keys.
-2009-10-01 (1.2.0)
-  * fast_generate now raises an exeception for nan and infinite floats.
-  * On Ruby 1.8 json supports parsing of UTF-8, UTF-16BE, UTF-16LE, UTF-32BE,
-    and UTF-32LE JSON documents now. Under Ruby 1.9 the M17n conversion
-    functions are used to convert from all supported encodings. ASCII-8BIT
-    encoded strings are handled like all strings under Ruby 1.8 were.
-  * Better documentation
-2009-08-23 (1.1.9)
-  * Added forgotten main doc file extra_rdoc_files.
-2009-08-23 (1.1.8)
-  * Applied a patch by OZAWA Sakuro <sakuro at 2238club.org> to make json/pure
-    work in environments that don't provide iconv.
-  * Applied patch by okkez_ in order to fix Ruby Bug #1768:
-      http://redmine.ruby-lang.org/issues/show/1768.
-  * Finally got around to avoid the rather paranoid escaping of ?/ characters
-    in the generator's output. The parsers aren't affected by this change.
-    Thanks to Rich Apodaca <rapodaca at metamolecular.com> for the suggestion.
-2009-06-29 (1.1.7)
-  * Security Fix for JSON::Pure::Parser. A specially designed string could
-    cause catastrophic backtracking in one of the parser's regular expressions
-    in earlier 1.1.x versions. JSON::Ext::Parser isn't affected by this issue.
-    Thanks to Bartosz Blimke <bartosz at new-bamboo.co.uk> for reporting this
-    problem.
-  * This release also uses a less strict ruby version requirement for the
-    creation of the mswin32 native gem.
-2009-05-10 (1.1.6)
-  * No changes. І tested native linux gems in the last release and they don't
-    play well with different ruby versions other than the one the gem was built
-    with. This release is just to bump the version number in order to skip the
-    native gem on rubyforge.
-2009-05-10 (1.1.5)
-  * Started to build gems with rake-compiler gem.
-  * Applied patch object/array class patch from Brian Candler
-    <B.Candler at pobox.com> and fixes.
-2009-04-01 (1.1.4)
-  * Fixed a bug in the creation of serialized generic rails objects reported by
-    Friedrich Graeter <graeter at hydrixos.org>.
-  * Deleted tests/runner.rb, we're using testrb instead.
-  * Editor supports Infinity in numbers now.
-  * Made some changes in order to get the library to compile/run under Ruby
-    1.9.
-  * Improved speed of the code path for the fast_generate method in the pure
-    variant.
-2008-07-10 (1.1.3)
-  * Wesley Beary <monki at geemus.com> reported a bug in json/add/core's DateTime
-    handling: If the nominator and denominator of the offset were divisible by
-    each other Ruby's Rational#to_s returns them as an integer not a fraction
-    with '/'. This caused a ZeroDivisionError during parsing.
-  * Use Date#start and DateTime#start instead of sg method, while
-    remaining backwards compatible.
-  * Supports ragel >= 6.0 now.
-  * Corrected some tests.
-  * Some minor changes.
-2007-11-27 (1.1.2)
-  * Remember default dir (last used directory) in editor.
-  * JSON::Editor.edit method added, the editor can now receive json texts from
-    the clipboard via C-v.
-  * Load json texts from an URL pasted via middle button press.
-  * Added :create_additions option to Parser. This makes it possible to disable
-    the creation of additions by force, in order to treat json texts as data
-    while having additions loaded.
-  * Jacob Maine <jmaine at blurb.com> reported, that JSON(:foo) outputs a JSON
-    object if the rails addition is enabled, which is wrong. It now outputs a
-    JSON string "foo" instead, like suggested by Jacob Maine.
-  * Discovered a bug in the Ruby Bugs Tracker on rubyforge, that was reported
-    by John Evans lgastako at gmail.com. He could produce a crash in the JSON
-    generator by returning something other than a String instance from a
-    to_json method. I now guard against this by doing a rather crude type
-    check, which raises an exception instead of crashing.
-2007-07-06 (1.1.1)
-  * Yui NARUSE <naruse at airemix.com> sent some patches to fix tests for Ruby
-    1.9. I applied them and adapted some of them a bit to run both on 1.8 and
-    1.9.
-  * Introduced a JSON.parse! method without depth checking for people who like
-    danger.
-  * Made generate and pretty_generate methods configurable by an options hash.
-  * Added :allow_nan option to parser and generator in order to handle NaN,
-    Infinity, and -Infinity correctly - if requested. Floats, which aren't numbers,
-    aren't valid JSON according to RFC4627, so by default an exception will be
-    raised if any of these symbols are encountered. Thanks to Andrea Censi
-    <andrea.censi at dis.uniroma1.it> for his hint about this.
-  * Fixed some more tests for Ruby 1.9.
-  * Implemented dump/load interface of Marshal as suggested in ruby-core:11405
-    by murphy <murphy at rubychan.de>.
-  * Implemented the max_nesting feature for generate methods, too.
-  * Added some implementations for ruby core's custom objects for
-    serialisation/deserialisation purposes.
-2007-05-21 (1.1.0)
-  * Implemented max_nesting feature for parser to avoid stack overflows for
-    data from untrusted sources. If you trust the source, you can disable it
-    with the option max_nesting => false.
-  * Piers Cawley <pdcawley at bofh.org.uk> reported a bug, that not every
-    character can be escaped by ?\ as required by RFC4627. There's a
-    contradiction between David Crockford's JSON checker test vectors (in
-    tests/fixtures) and RFC4627, though. I decided to stick to the RFC, because
-    the JSON checker seems to be a bit older than the RFC.
-  * Extended license to Ruby License, which includes the GPL.
-  * Added keyboard shortcuts, and 'Open location' menu item to edit_json.rb.
-2007-05-09 (1.0.4)
-  * Applied a patch from Yui NARUSE <naruse at airemix.com> to make JSON compile
-    under Ruby 1.9. Thank you very much for mailing it to me!
-  * Made binary variants of JSON fail early, instead of falling back to the
-    pure version. This should avoid overshadowing of eventual problems while
-    loading of the binary.
-2007-03-24 (1.0.3)
-  * Improved performance of pure variant a bit.
-  * The ext variant of this release supports the mswin32 platform. Ugh!
-2007-03-24 (1.0.2)
-  * Ext Parser didn't parse 0e0 correctly into 0.0: Fixed!
-2007-03-24 (1.0.1)
-  * Forgot some object files in the build dir. I really like that - not!
-2007-03-24 (1.0.0)
-  * Added C implementations for the JSON generator and a ragel based JSON
-    parser in C.
-  * Much more tests, especially fixtures from json.org.
-  * Further improved conformance to RFC4627.
-2007-02-09 (0.4.3)
-  * Conform more to RFC4627 for JSON: This means JSON strings
-    now always must contain exactly one object "{ ... }" or array "[ ... ]" in
-    order to be parsed without raising an exception. The definition of what
-    constitutes a whitespace is narrower in JSON than in Ruby ([ \t\r\n]), and
-    there are differences in floats and integers (no octals or hexadecimals) as
-    well.
-  * Added aliases generate and pretty_generate of unparse and pretty_unparse.
-  * Fixed a test case.
-  * Catch an Iconv::InvalidEncoding exception, that seems to occur on some Sun
-    boxes with SunOS 5.8, if iconv doesn't support utf16 conversions. This was
-    reported by Andrew R Jackson <andrewj at bcm.tmc.edu>, thanks a bunch!
-2006-08-25 (0.4.2)
-  * Fixed a bug in handling solidi (/-characters), that was reported by
-    Kevin Gilpin <kevin.gilpin at alum.mit.edu>.
-2006-02-06 (0.4.1)
-  * Fixed a bug related to escaping with backslashes. Thanks for the report go
-    to Florian Munz <surf at theflow.de>.
-2005-09-23 (0.4.0)
-  * Initial Rubyforge Version
diff --git a/vendor/json_pure-1.7.7/COPYING b/vendor/json_pure-1.7.7/COPYING
deleted file mode 100644
index c3a2126..0000000
--- a/vendor/json_pure-1.7.7/COPYING
+++ /dev/null
@@ -1,58 +0,0 @@
-Ruby is copyrighted free software by Yukihiro Matsumoto <matz at netlab.co.jp>.
-You can redistribute it and/or modify it under either the terms of the GPL
-(see GPL file), or the conditions below:
-
-  1. You may make and give away verbatim copies of the source form of the
-     software without restriction, provided that you duplicate all of the
-     original copyright notices and associated disclaimers.
-
-  2. You may modify your copy of the software in any way, provided that
-     you do at least ONE of the following:
-
-       a) place your modifications in the Public Domain or otherwise
-          make them Freely Available, such as by posting said
-	  modifications to Usenet or an equivalent medium, or by allowing
-	  the author to include your modifications in the software.
-
-       b) use the modified software only within your corporation or
-          organization.
-
-       c) rename any non-standard executables so the names do not conflict
-	  with standard executables, which must also be provided.
-
-       d) make other distribution arrangements with the author.
-
-  3. You may distribute the software in object code or executable
-     form, provided that you do at least ONE of the following:
-
-       a) distribute the executables and library files of the software,
-	  together with instructions (in the manual page or equivalent)
-	  on where to get the original distribution.
-
-       b) accompany the distribution with the machine-readable source of
-	  the software.
-
-       c) give non-standard executables non-standard names, with
-          instructions on where to get the original software distribution.
-
-       d) make other distribution arrangements with the author.
-
-  4. You may modify and include the part of the software into any other
-     software (possibly commercial).  But some files in the distribution
-     are not written by the author, so that they are not under this terms.
-
-     They are gc.c(partly), utils.c(partly), regex.[ch], st.[ch] and some
-     files under the ./missing directory.  See each file for the copying
-     condition.
-
-  5. The scripts and library files supplied as input to or produced as 
-     output from the software do not automatically fall under the
-     copyright of the software, but belong to whomever generated them, 
-     and may be sold commercially, and may be aggregated with this
-     software.
-
-  6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
-     IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-     PURPOSE.
-
diff --git a/vendor/json_pure-1.7.7/COPYING-json-jruby b/vendor/json_pure-1.7.7/COPYING-json-jruby
deleted file mode 100644
index 137a3da..0000000
--- a/vendor/json_pure-1.7.7/COPYING-json-jruby
+++ /dev/null
@@ -1,57 +0,0 @@
-JSON-JRuby is copyrighted free software by Daniel Luz <mernen at gmail dot com>,
-and is a derivative work of Florian Frank's json library <flori at ping dot de>.
-You can redistribute it and/or modify it under either the terms of the GPL
-version 2 (see the file GPL), or the conditions below:
-
-  1. You may make and give away verbatim copies of the source form of the
-     software without restriction, provided that you duplicate all of the
-     original copyright notices and associated disclaimers.
-
-  2. You may modify your copy of the software in any way, provided that
-     you do at least ONE of the following:
-
-       a) place your modifications in the Public Domain or otherwise
-          make them Freely Available, such as by posting said
-	  modifications to Usenet or an equivalent medium, or by allowing
-	  the author to include your modifications in the software.
-
-       b) use the modified software only within your corporation or
-          organization.
-
-       c) give non-standard binaries non-standard names, with
-          instructions on where to get the original software distribution.
-
-       d) make other distribution arrangements with the author.
-
-  3. You may distribute the software in object code or binary form,
-     provided that you do at least ONE of the following:
-
-       a) distribute the binaries and library files of the software,
-	  together with instructions (in the manual page or equivalent)
-	  on where to get the original distribution.
-
-       b) accompany the distribution with the machine-readable source of
-	  the software.
-
-       c) give non-standard binaries non-standard names, with
-          instructions on where to get the original software distribution.
-
-       d) make other distribution arrangements with the author.
-
-  4. You may modify and include the part of the software into any other
-     software (possibly commercial).  But some files in the distribution
-     are not written by the author, so that they are not under these terms.
-
-     For the list of those files and their copying conditions, see the
-     file LEGAL.
-
-  5. The scripts and library files supplied as input to or produced as 
-     output from the software do not automatically fall under the
-     copyright of the software, but belong to whomever generated them, 
-     and may be sold commercially, and may be aggregated with this
-     software.
-
-  6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
-     IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-     PURPOSE.
diff --git a/vendor/json_pure-1.7.7/GPL b/vendor/json_pure-1.7.7/GPL
deleted file mode 100644
index db2fc45..0000000
--- a/vendor/json_pure-1.7.7/GPL
+++ /dev/null
@@ -1,340 +0,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-

-                    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-

-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-

-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-

-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                            NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-

-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/vendor/json_pure-1.7.7/Gemfile b/vendor/json_pure-1.7.7/Gemfile
deleted file mode 100644
index e405da2..0000000
--- a/vendor/json_pure-1.7.7/Gemfile
+++ /dev/null
@@ -1,11 +0,0 @@
-# vim: set ft=ruby:
-
-source :rubygems
-
-gemspec :name => 'json'
-gemspec :name => 'json_pure'
-gemspec :name => 'json-java'
-
-gem 'utils'
-gem 'test-unit'
-gem 'debugger', :platform => :mri_19
diff --git a/vendor/json_pure-1.7.7/README-json-jruby.markdown b/vendor/json_pure-1.7.7/README-json-jruby.markdown
deleted file mode 100644
index 1336837..0000000
--- a/vendor/json_pure-1.7.7/README-json-jruby.markdown
+++ /dev/null
@@ -1,33 +0,0 @@
-JSON-JRuby
-==========
-
-JSON-JRuby is a port of Florian Frank's native
-[`json` library](http://json.rubyforge.org/) to JRuby.
-It aims to be a perfect drop-in replacement for `json_pure`.
-
-
-Development version
-===================
-
-The latest version is available from the
-[Git repository](http://github.com/mernen/json-jruby/tree):
-
-    git clone git://github.com/mernen/json-jruby.git
-
-
-Compiling
-=========
-
-You'll need JRuby version 1.2 or greater to build JSON-JRuby.
-Its path must be set on the `jruby.dir` property of
-`nbproject/project.properties` (defaults to `../jruby`).
-
-Additionally, you'll need [Ant](http://ant.apache.org/), and
-[Ragel](http://www.cs.queensu.ca/~thurston/ragel/) 6.4 or greater.
-
-Then, from the folder where the sources are located, type:
-
-    ant clean jar
-
-to clean any leftovers from previous builds and generate the `.jar` files.
-To generate a RubyGem, specify the `gem` action rather than `jar`.
diff --git a/vendor/json_pure-1.7.7/README.rdoc b/vendor/json_pure-1.7.7/README.rdoc
deleted file mode 100644
index eda896f..0000000
--- a/vendor/json_pure-1.7.7/README.rdoc
+++ /dev/null
@@ -1,358 +0,0 @@
-= JSON implementation for Ruby {<img src="https://secure.travis-ci.org/flori/json.png" />}[http://travis-ci.org/flori/json]
-
-== Description
-
-This is a implementation of the JSON specification according to RFC 4627
-http://www.ietf.org/rfc/rfc4627.txt . Starting from version 1.0.0 on there
-will be two variants available:
-
-* A pure ruby variant, that relies on the iconv and the stringscan
-  extensions, which are both part of the ruby standard library.
-* The quite a bit faster C extension variant, which is in parts implemented
-  in C and comes with its own unicode conversion functions and a parser
-  generated by the ragel state machine compiler
-  http://www.cs.queensu.ca/~thurston/ragel .
-
-Both variants of the JSON generator generate UTF-8 character sequences by
-default. If an :ascii_only option with a true value is given, they escape all
-non-ASCII and control characters with \uXXXX escape sequences, and support
-UTF-16 surrogate pairs in order to be able to generate the whole range of
-unicode code points.
-
-All strings, that are to be encoded as JSON strings, should be UTF-8 byte
-sequences on the Ruby side. To encode raw binary strings, that aren't UTF-8
-encoded, please use the to_json_raw_object method of String (which produces
-an object, that contains a byte array) and decode the result on the receiving
-endpoint.
-
-The JSON parsers can parse UTF-8, UTF-16BE, UTF-16LE, UTF-32BE, and UTF-32LE
-JSON documents under Ruby 1.8. Under Ruby 1.9 they take advantage of Ruby's
-M17n features and can parse all documents which have the correct
-String#encoding set. If a document string has ASCII-8BIT as an encoding the
-parser attempts to figure out which of the UTF encodings from above it is and
-trys to parse it.
-
-== Installation
-
-It's recommended to use the extension variant of JSON, because it's faster than
-the pure ruby variant. If you cannot build it on your system, you can settle
-for the latter.
-
-Just type into the command line as root:
-
-  # rake install
-
-The above command will build the extensions and install them on your system.
-
-  # rake install_pure
-
-or
-
-  # ruby install.rb
-
-will just install the pure ruby implementation of JSON.
-
-If you use Rubygems you can type
-
-  # gem install json
-
-instead, to install the newest JSON version.
-
-There is also a pure ruby json only variant of the gem, that can be installed
-with:
-
-  # gem install json_pure
-
-== Compiling the extensions yourself
-
-If you want to build the extensions yourself you need rake:
-
-  You can get it from rubyforge:
-    http://rubyforge.org/projects/rake
-
-  or just type
-
-  # gem install rake
-
-  for the installation via rubygems.
-
-If you want to create the parser.c file from its parser.rl file or draw nice
-graphviz images of the state machines, you need ragel from: http://www.cs.queensu.ca/~thurston/ragel
-
-
-== Usage
-
-To use JSON you can
-  require 'json'
-to load the installed variant (either the extension 'json' or the pure
-variant 'json_pure'). If you have installed the extension variant, you can
-pick either the extension variant or the pure variant by typing
-  require 'json/ext'
-or
-  require 'json/pure'
-
-Now you can parse a JSON document into a ruby data structure by calling
-
-  JSON.parse(document)
-
-If you want to generate a JSON document from a ruby data structure call
-  JSON.generate(data)
-
-You can also use the pretty_generate method (which formats the output more
-verbosely and nicely) or fast_generate (which doesn't do any of the security
-checks generate performs, e. g. nesting deepness checks).
-
-To create a valid JSON document you have to make sure, that the output is
-embedded in either a JSON array [] or a JSON object {}. The easiest way to do
-this, is by putting your values in a Ruby Array or Hash instance.
-
-There are also the JSON and JSON[] methods which use parse on a String or
-generate a JSON document from an array or hash:
-
-  document = JSON 'test'  => 23 # => "{\"test\":23}"
-  document = JSON['test'] => 23 # => "{\"test\":23}"
-
-and
-
-  data = JSON '{"test":23}'  # => {"test"=>23}
-  data = JSON['{"test":23}'] # => {"test"=>23}
-
-You can choose to load a set of common additions to ruby core's objects if
-you
-  require 'json/add/core'
-
-After requiring this you can, e. g., serialise/deserialise Ruby ranges:
-
-  JSON JSON(1..10) # => 1..10
-
-To find out how to add JSON support to other or your own classes, read the
-section "More Examples" below.
-
-To get the best compatibility to rails' JSON implementation, you can
-  require 'json/add/rails'
-
-Both of the additions attempt to require 'json' (like above) first, if it has
-not been required yet.
-
-== More Examples
-
-To create a JSON document from a ruby data structure, you can call
-JSON.generate like that:
-
- json = JSON.generate [1, 2, {"a"=>3.141}, false, true, nil, 4..10]
- # => "[1,2,{\"a\":3.141},false,true,null,\"4..10\"]"
-
-To get back a ruby data structure from a JSON document, you have to call
-JSON.parse on it:
-
- JSON.parse json
- # => [1, 2, {"a"=>3.141}, false, true, nil, "4..10"]
-
-Note, that the range from the original data structure is a simple
-string now. The reason for this is, that JSON doesn't support ranges
-or arbitrary classes. In this case the json library falls back to call
-Object#to_json, which is the same as #to_s.to_json.
-
-It's possible to add JSON support serialization to arbitrary classes by
-simply implementing a more specialized version of the #to_json method, that
-should return a JSON object (a hash converted to JSON with #to_json) like
-this (don't forget the *a for all the arguments):
-
- class Range
-   def to_json(*a)
-     {
-       'json_class'   => self.class.name, # = 'Range'
-       'data'         => [ first, last, exclude_end? ]
-     }.to_json(*a)
-   end
- end
-
-The hash key 'json_class' is the class, that will be asked to deserialise the
-JSON representation later. In this case it's 'Range', but any namespace of
-the form 'A::B' or '::A::B' will do. All other keys are arbitrary and can be
-used to store the necessary data to configure the object to be deserialised.
-
-If a the key 'json_class' is found in a JSON object, the JSON parser checks
-if the given class responds to the json_create class method. If so, it is
-called with the JSON object converted to a Ruby hash. So a range can
-be deserialised by implementing Range.json_create like this:
-
- class Range
-   def self.json_create(o)
-     new(*o['data'])
-   end
- end
-
-Now it possible to serialise/deserialise ranges as well:
-
- json = JSON.generate [1, 2, {"a"=>3.141}, false, true, nil, 4..10]
- # => "[1,2,{\"a\":3.141},false,true,null,{\"json_class\":\"Range\",\"data\":[4,10,false]}]"
- JSON.parse json
- # => [1, 2, {"a"=>3.141}, false, true, nil, 4..10]
-
-JSON.generate always creates the shortest possible string representation of a
-ruby data structure in one line. This is good for data storage or network
-protocols, but not so good for humans to read. Fortunately there's also
-JSON.pretty_generate (or JSON.pretty_generate) that creates a more readable
-output:
-
- puts JSON.pretty_generate([1, 2, {"a"=>3.141}, false, true, nil, 4..10])
- [
-   1,
-   2,
-   {
-     "a": 3.141
-   },
-   false,
-   true,
-   null,
-   {
-     "json_class": "Range",
-     "data": [
-       4,
-       10,
-       false
-     ]
-   }
- ]
-
-There are also the methods Kernel#j for generate, and Kernel#jj for
-pretty_generate output to the console, that work analogous to Core Ruby's p and
-the pp library's pp methods.
-
-The script tools/server.rb contains a small example if you want to test, how
-receiving a JSON object from a webrick server in your browser with the
-javasript prototype library http://www.prototypejs.org works.
-
-== Speed Comparisons
-
-I have created some benchmark results (see the benchmarks/data-p4-3Ghz
-subdir of the package) for the JSON-parser to estimate the speed up in the C
-extension:
-
- Comparing times (call_time_mean):
-  1 ParserBenchmarkExt#parser   900 repeats:
-        553.922304770 (  real) ->   21.500x 
-          0.001805307
-  2 ParserBenchmarkYAML#parser  1000 repeats:
-        224.513358139 (  real) ->    8.714x 
-          0.004454078
-  3 ParserBenchmarkPure#parser  1000 repeats:
-         26.755020642 (  real) ->    1.038x 
-          0.037376163
-  4 ParserBenchmarkRails#parser 1000 repeats:
-         25.763381731 (  real) ->    1.000x 
-          0.038814780
-            calls/sec (  time) ->    speed  covers
-            secs/call
-
-In the table above 1 is JSON::Ext::Parser, 2 is YAML.load with YAML
-compatbile JSON document, 3 is is JSON::Pure::Parser, and 4 is
-ActiveSupport::JSON.decode. The ActiveSupport JSON-decoder converts the
-input first to YAML and then uses the YAML-parser, the conversion seems to
-slow it down so much that it is only as fast as the JSON::Pure::Parser!
-
-If you look at the benchmark data you can see that this is mostly caused by
-the frequent high outliers - the median of the Rails-parser runs is still
-overall smaller than the median of the JSON::Pure::Parser runs:
-
- Comparing times (call_time_median):
-  1 ParserBenchmarkExt#parser   900 repeats:
-        800.592479481 (  real) ->   26.936x 
-          0.001249075
-  2 ParserBenchmarkYAML#parser  1000 repeats:
-        271.002390644 (  real) ->    9.118x 
-          0.003690004
-  3 ParserBenchmarkRails#parser 1000 repeats:
-         30.227910865 (  real) ->    1.017x 
-          0.033082008
-  4 ParserBenchmarkPure#parser  1000 repeats:
-         29.722384421 (  real) ->    1.000x 
-          0.033644676
-            calls/sec (  time) ->    speed  covers
-            secs/call
-
-I have benchmarked the JSON-Generator as well. This generated a few more
-values, because there are different modes that also influence the achieved
-speed:
-
- Comparing times (call_time_mean):
-  1 GeneratorBenchmarkExt#generator_fast    1000 repeats:
-        547.354332608 (  real) ->   15.090x 
-          0.001826970
-  2 GeneratorBenchmarkExt#generator_safe    1000 repeats:
-        443.968212317 (  real) ->   12.240x 
-          0.002252414
-  3 GeneratorBenchmarkExt#generator_pretty  900 repeats:
-        375.104545883 (  real) ->   10.341x 
-          0.002665923
-  4 GeneratorBenchmarkPure#generator_fast   1000 repeats:
-         49.978706968 (  real) ->    1.378x 
-          0.020008521
-  5 GeneratorBenchmarkRails#generator       1000 repeats:
-         38.531868759 (  real) ->    1.062x 
-          0.025952543
-  6 GeneratorBenchmarkPure#generator_safe   1000 repeats:
-         36.927649925 (  real) ->    1.018x 7 (>=3859)
-          0.027079979
-  7 GeneratorBenchmarkPure#generator_pretty 1000 repeats:
-         36.272134441 (  real) ->    1.000x 6 (>=3859)
-          0.027569373
-            calls/sec (  time) ->    speed  covers
-            secs/call
-
-In the table above 1-3 are JSON::Ext::Generator methods. 4, 6, and 7 are
-JSON::Pure::Generator methods and 5 is the Rails JSON generator. It is now a
-bit faster than the generator_safe and generator_pretty methods of the pure
-variant but slower than the others.
-
-To achieve the fastest JSON document output, you can use the fast_generate
-method. Beware, that this will disable the checking for circular Ruby data
-structures, which may cause JSON to go into an infinite loop.
-
-Here are the median comparisons for completeness' sake:
-
- Comparing times (call_time_median):
-  1 GeneratorBenchmarkExt#generator_fast    1000 repeats:
-        708.258020939 (  real) ->   16.547x 
-          0.001411915
-  2 GeneratorBenchmarkExt#generator_safe    1000 repeats:
-        569.105020353 (  real) ->   13.296x 
-          0.001757145
-  3 GeneratorBenchmarkExt#generator_pretty  900 repeats:
-        482.825371244 (  real) ->   11.280x 
-          0.002071142
-  4 GeneratorBenchmarkPure#generator_fast   1000 repeats:
-         62.717626652 (  real) ->    1.465x 
-          0.015944481
-  5 GeneratorBenchmarkRails#generator       1000 repeats:
-         43.965681162 (  real) ->    1.027x 
-          0.022745013
-  6 GeneratorBenchmarkPure#generator_safe   1000 repeats:
-         43.929073409 (  real) ->    1.026x 7 (>=3859)
-          0.022763968
-  7 GeneratorBenchmarkPure#generator_pretty 1000 repeats:
-         42.802514491 (  real) ->    1.000x 6 (>=3859)
-          0.023363113
-            calls/sec (  time) ->    speed  covers
-            secs/call
-
-== Author
-
-Florian Frank <mailto:flori at ping.de>
-
-== License
-
-Ruby License, see the COPYING file included in the source distribution. The
-Ruby License includes the GNU General Public License (GPL), Version 2, so see
-the file GPL as well.
-
-== Download
-
-The latest version of this library can be downloaded at
-
-* http://rubyforge.org/frs?group_id=953
-
-Online Documentation should be located at
-
-* http://json.rubyforge.org
diff --git a/vendor/json_pure-1.7.7/Rakefile b/vendor/json_pure-1.7.7/Rakefile
deleted file mode 100644
index 1d13c2c..0000000
--- a/vendor/json_pure-1.7.7/Rakefile
+++ /dev/null
@@ -1,412 +0,0 @@
-begin
-  require 'rubygems/package_task'
-rescue LoadError
-end
-
-require 'rbconfig'
-include\
-  begin
-    RbConfig
-  rescue NameError
-    Config
-  end
-
-require 'rake/clean'
-CLOBBER.include 'doc', 'Gemfile.lock'
-CLEAN.include FileList['diagrams/*.*'], 'doc', 'coverage', 'tmp',
-  FileList["ext/**/{Makefile,mkmf.log}"], 'build', 'dist', FileList['**/*.rbc'],
-  FileList["{ext,lib}/**/*.{so,bundle,#{CONFIG['DLEXT']},o,obj,pdb,lib,manifest,exp,def,jar,class,dSYM}"],
-  FileList['java/src/**/*.class']
-
-require 'rake/testtask'
-class UndocumentedTestTask < Rake::TestTask
-  def desc(*) end
-end
-
-def skip_sdoc(src)
-  src.gsub(/^.*sdoc.*/) { |s| s + ' if RUBY_VERSION > "1.8.6"' }
-end
-
-MAKE   = ENV['MAKE']   || %w[gmake make].find { |c| system(c, '-v') }
-BUNDLE = ENV['BUNDLE'] || %w[bundle].find { |c| system(c, '-v') }
-PKG_NAME          = 'json'
-PKG_TITLE         = 'JSON Implementation for Ruby'
-PKG_VERSION       = File.read('VERSION').chomp
-PKG_FILES         = FileList[`git ls-files`.split(/\n/)]
-
-EXT_ROOT_DIR      = 'ext/json/ext'
-EXT_PARSER_DIR    = "#{EXT_ROOT_DIR}/parser"
-EXT_PARSER_DL     = "#{EXT_PARSER_DIR}/parser.#{CONFIG['DLEXT']}"
-RAGEL_PATH        = "#{EXT_PARSER_DIR}/parser.rl"
-EXT_PARSER_SRC    = "#{EXT_PARSER_DIR}/parser.c"
-EXT_GENERATOR_DIR = "#{EXT_ROOT_DIR}/generator"
-EXT_GENERATOR_DL  = "#{EXT_GENERATOR_DIR}/generator.#{CONFIG['DLEXT']}"
-EXT_GENERATOR_SRC = "#{EXT_GENERATOR_DIR}/generator.c"
-
-JAVA_DIR            = "java/src/json/ext"
-JAVA_RAGEL_PATH     = "#{JAVA_DIR}/Parser.rl"
-JAVA_PARSER_SRC     = "#{JAVA_DIR}/Parser.java"
-JAVA_SOURCES        = FileList["#{JAVA_DIR}/*.java"]
-JAVA_CLASSES        = []
-JRUBY_PARSER_JAR    = File.expand_path("lib/json/ext/parser.jar")
-JRUBY_GENERATOR_JAR = File.expand_path("lib/json/ext/generator.jar")
-
-RAGEL_CODEGEN     = %w[rlcodegen rlgen-cd ragel].find { |c| system(c, '-v') }
-RAGEL_DOTGEN      = %w[rlgen-dot rlgen-cd ragel].find { |c| system(c, '-v') }
-
-desc "Installing library (pure)"
-task :install_pure => :version do
-  ruby 'install.rb'
-end
-
-task :install_ext_really do
-  sitearchdir = CONFIG["sitearchdir"]
-  cd 'ext' do
-    for file in Dir["json/ext/*.#{CONFIG['DLEXT']}"]
-      d = File.join(sitearchdir, file)
-      mkdir_p File.dirname(d)
-      install(file, d)
-    end
-    warn " *** Installed EXT ruby library."
-  end
-end
-
-desc "Installing library (extension)"
-task :install_ext => [ :compile, :install_pure, :install_ext_really ]
-
-desc "Installing library (extension)"
-task :install => :install_ext
-
-if defined?(Gem) and defined?(Gem::PackageTask)
-  spec_pure = Gem::Specification.new do |s|
-    s.name = 'json_pure'
-    s.version = PKG_VERSION
-    s.summary = PKG_TITLE
-    s.description = "This is a JSON implementation in pure Ruby."
-
-    s.files = PKG_FILES
-
-    s.require_path = 'lib'
-    s.add_development_dependency 'permutation'
-    s.add_development_dependency 'sdoc', '~>0.3.16'
-    s.add_development_dependency 'rake', '~>0.9.2'
-
-    s.extra_rdoc_files << 'README.rdoc'
-    s.rdoc_options <<
-      '--title' <<  'JSON implemention for ruby' << '--main' << 'README.rdoc'
-    s.test_files.concat Dir['./tests/test_*.rb']
-
-    s.author = "Florian Frank"
-    s.email = "flori at ping.de"
-    s.homepage = "http://flori.github.com/#{PKG_NAME}"
-    s.license = 'Ruby'
-  end
-
-  desc 'Creates a json_pure.gemspec file'
-  task :gemspec_pure => :version do
-    File.open('json_pure.gemspec', 'w') do |gemspec|
-      gemspec.write skip_sdoc(spec_pure.to_ruby)
-    end
-  end
-
-  Gem::PackageTask.new(spec_pure) do |pkg|
-      pkg.need_tar = true
-      pkg.package_files = PKG_FILES
-  end
-
-  spec_ext = Gem::Specification.new do |s|
-    s.name = 'json'
-    s.version = PKG_VERSION
-    s.summary = PKG_TITLE
-    s.description = "This is a JSON implementation as a Ruby extension in C."
-
-    s.files = PKG_FILES
-
-    s.extensions = FileList['ext/**/extconf.rb']
-
-    s.require_path = 'lib'
-    s.add_development_dependency 'permutation'
-    s.add_development_dependency 'sdoc', '~>0.3.16'
-
-    s.extra_rdoc_files << 'README.rdoc'
-    s.rdoc_options <<
-      '--title' <<  'JSON implemention for Ruby' << '--main' << 'README.rdoc'
-    s.test_files.concat Dir['./tests/test_*.rb']
-
-    s.author = "Florian Frank"
-    s.email = "flori at ping.de"
-    s.homepage = "http://flori.github.com/#{PKG_NAME}"
-    s.license = 'Ruby'
-  end
-
-  desc 'Creates a json.gemspec file'
-  task :gemspec_ext => :version do
-    File.open('json.gemspec', 'w') do |gemspec|
-      gemspec.write skip_sdoc(spec_ext.to_ruby)
-    end
-  end
-
-  Gem::PackageTask.new(spec_ext) do |pkg|
-    pkg.need_tar      = true
-    pkg.package_files = PKG_FILES
-  end
-
-
-  desc 'Create all gemspec files'
-  task :gemspec => [ :gemspec_pure, :gemspec_ext ]
-end
-
-desc m = "Writing version information for #{PKG_VERSION}"
-task :version do
-  puts m
-  File.open(File.join('lib', 'json', 'version.rb'), 'w') do |v|
-    v.puts <<EOT
-module JSON
-  # JSON version
-  VERSION         = '#{PKG_VERSION}'
-  VERSION_ARRAY   = VERSION.split(/\\./).map { |x| x.to_i } # :nodoc:
-  VERSION_MAJOR   = VERSION_ARRAY[0] # :nodoc:
-  VERSION_MINOR   = VERSION_ARRAY[1] # :nodoc:
-  VERSION_BUILD   = VERSION_ARRAY[2] # :nodoc:
-end
-EOT
-  end
-end
-
-desc "Testing library (pure ruby)"
-task :test_pure => [ :clean, :do_test_pure ]
-
-UndocumentedTestTask.new do |t|
-  t.name = 'do_test_pure'
-  t.libs << 'lib'
-  t.test_files = FileList['tests/test_*.rb']
-  t.verbose = true
-  t.options = '-v'
-end
-
-desc "Testing library (pure ruby and extension)"
-task :test do
-  sh "env JSON=pure #{BUNDLE} exec rake test_pure" or exit 1
-  sh "env JSON=ext #{BUNDLE} exec rake test_ext"  or exit 1
-end
-
-namespace :gems do
-  desc 'Install all development gems'
-  task :install do
-    sh "#{BUNDLE}"
-  end
-end
-
-if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
-  if ENV.key?('JAVA_HOME')
-    warn " *** JAVA_HOME was set to #{ENV['JAVA_HOME'].inspect}"
-  elsif File.directory?(local_java = '/usr/local/java/jdk') ||
-    File.directory?(local_java = '/usr/lib/jvm/java-6-openjdk')
-  then
-    ENV['JAVA_HOME'] = local_java
-  end
-  if ENV['JAVA_HOME']
-    warn " *** JAVA_HOME is set to #{ENV['JAVA_HOME'].inspect}"
-    ENV['PATH'] = ENV['PATH'].split(/:/).unshift(java_path = "#{ENV['JAVA_HOME']}/bin") * ':'
-    warn " *** java binaries are assumed to be in #{java_path.inspect}"
-  else
-    warn " *** JAVA_HOME was not set or could not be guessed!"
-    exit 1
-  end
-
-  file JAVA_PARSER_SRC => JAVA_RAGEL_PATH do
-    cd JAVA_DIR do
-      if RAGEL_CODEGEN == 'ragel'
-        sh "ragel Parser.rl -J -o Parser.java"
-      else
-        sh "ragel -x Parser.rl | #{RAGEL_CODEGEN} -J"
-      end
-    end
-  end
-
-  desc "Generate parser for java with ragel"
-  task :ragel => JAVA_PARSER_SRC
-
-  desc "Delete the ragel generated Java source"
-  task :ragel_clean do
-    rm_rf JAVA_PARSER_SRC
-  end
-
-  JRUBY_JAR = File.join(CONFIG["libdir"], "jruby.jar")
-  if File.exist?(JRUBY_JAR)
-    JAVA_SOURCES.each do |src|
-      classpath = (Dir['java/lib/*.jar'] << 'java/src' << JRUBY_JAR) * ':'
-      obj = src.sub(/\.java\Z/, '.class')
-      file obj => src do
-        sh 'javac', '-classpath', classpath, '-source', '1.5', '-target', '1.5', src
-      end
-      JAVA_CLASSES << obj
-    end
-  else
-    warn "WARNING: Cannot find jruby in path => Cannot build jruby extension!"
-  end
-
-  desc "Compiling jruby extension"
-  task :compile => JAVA_CLASSES
-
-  desc "Package the jruby gem"
-  task :jruby_gem => :create_jar do
-    sh 'gem build json-java.gemspec'
-    mkdir_p 'pkg'
-    mv "json-#{PKG_VERSION}-java.gem", 'pkg'
-  end
-
-  desc "Testing library (jruby)"
-  task :test_ext => [ :create_jar, :do_test_ext ]
-
-  UndocumentedTestTask.new do |t|
-    t.name = 'do_test_ext'
-    t.libs << 'lib'
-    t.test_files = FileList['tests/test_*.rb']
-    t.verbose = true
-    t.options = '-v'
-  end
-
-  file JRUBY_PARSER_JAR => :compile do
-    cd 'java/src' do
-      parser_classes = FileList[
-        "json/ext/ByteListTranscoder*.class",
-        "json/ext/OptionsReader*.class",
-        "json/ext/Parser*.class",
-        "json/ext/RuntimeInfo*.class",
-        "json/ext/StringDecoder*.class",
-        "json/ext/Utils*.class"
-      ]
-      sh 'jar', 'cf', File.basename(JRUBY_PARSER_JAR), *parser_classes
-      mv File.basename(JRUBY_PARSER_JAR), File.dirname(JRUBY_PARSER_JAR)
-    end
-  end
-
-  desc "Create parser jar"
-  task :create_parser_jar => JRUBY_PARSER_JAR
-
-  file JRUBY_GENERATOR_JAR => :compile do
-    cd 'java/src' do
-      generator_classes = FileList[
-        "json/ext/ByteListTranscoder*.class",
-        "json/ext/OptionsReader*.class",
-        "json/ext/Generator*.class",
-        "json/ext/RuntimeInfo*.class",
-        "json/ext/StringEncoder*.class",
-        "json/ext/Utils*.class"
-      ]
-      sh 'jar', 'cf', File.basename(JRUBY_GENERATOR_JAR), *generator_classes
-      mv File.basename(JRUBY_GENERATOR_JAR), File.dirname(JRUBY_GENERATOR_JAR)
-    end
-  end
-
-  desc "Create generator jar"
-  task :create_generator_jar => JRUBY_GENERATOR_JAR
-
-  desc "Create parser and generator jars"
-  task :create_jar => [ :create_parser_jar, :create_generator_jar ]
-
-  desc "Build all gems and archives for a new release of the jruby extension."
-  task :build => [ :clean, :version, :jruby_gem ]
-
-  task :release => :build
-else
-  desc "Compiling extension"
-  task :compile => [ EXT_PARSER_DL, EXT_GENERATOR_DL ]
-
-  file EXT_PARSER_DL => EXT_PARSER_SRC do
-    cd EXT_PARSER_DIR do
-      ruby 'extconf.rb'
-      sh MAKE
-    end
-    cp "#{EXT_PARSER_DIR}/parser.#{CONFIG['DLEXT']}", EXT_ROOT_DIR
-  end
-
-  file EXT_GENERATOR_DL => EXT_GENERATOR_SRC do
-    cd EXT_GENERATOR_DIR do
-      ruby 'extconf.rb'
-      sh MAKE
-    end
-    cp "#{EXT_GENERATOR_DIR}/generator.#{CONFIG['DLEXT']}", EXT_ROOT_DIR
-  end
-
-  desc "Testing library (extension)"
-  task :test_ext => [ :compile, :do_test_ext ]
-
-  UndocumentedTestTask.new do |t|
-    t.name = 'do_test_ext'
-    t.libs << 'ext' << 'lib'
-    t.test_files = FileList['tests/test_*.rb']
-    t.verbose = true
-    t.options = '-v'
-  end
-
-  desc "Create RDOC documentation"
-  task :doc => [ :version, EXT_PARSER_SRC ] do
-    sh "sdoc -o doc -t '#{PKG_TITLE}' -m README.rdoc README.rdoc lib/json.rb #{FileList['lib/json/**/*.rb']} #{EXT_PARSER_SRC} #{EXT_GENERATOR_SRC}"
-  end
-
-  desc "Generate parser with ragel"
-  task :ragel => EXT_PARSER_SRC
-
-  desc "Delete the ragel generated C source"
-  task :ragel_clean do
-    rm_rf EXT_PARSER_SRC
-  end
-
-  desc "Update the tags file"
-  task :tags do
-    system 'ctags', *Dir['**/*.{rb,c,h,java}']
-  end
-
-  file EXT_PARSER_SRC => RAGEL_PATH do
-    cd EXT_PARSER_DIR do
-      if RAGEL_CODEGEN == 'ragel'
-        sh "ragel parser.rl -G2 -o parser.c"
-      else
-        sh "ragel -x parser.rl | #{RAGEL_CODEGEN} -G2"
-      end
-      src = File.read("parser.c").gsub(/[ \t]+$/, '')
-      File.open("parser.c", "w") {|f| f.print src}
-    end
-  end
-
-  desc "Generate diagrams of ragel parser (ps)"
-  task :ragel_dot_ps do
-    root = 'diagrams'
-    specs = []
-    File.new(RAGEL_PATH).grep(/^\s*machine\s*(\S+);\s*$/) { specs << $1 }
-    for s in specs
-      if RAGEL_DOTGEN == 'ragel'
-        sh "ragel #{RAGEL_PATH} -S#{s} -p -V | dot -Tps -o#{root}/#{s}.ps"
-      else
-        sh "ragel -x #{RAGEL_PATH} -S#{s} | #{RAGEL_DOTGEN} -p|dot -Tps -o#{root}/#{s}.ps"
-      end
-    end
-  end
-
-  desc "Generate diagrams of ragel parser (png)"
-  task :ragel_dot_png do
-    root = 'diagrams'
-    specs = []
-    File.new(RAGEL_PATH).grep(/^\s*machine\s*(\S+);\s*$/) { specs << $1 }
-    for s in specs
-      if RAGEL_DOTGEN == 'ragel'
-        sh "ragel #{RAGEL_PATH} -S#{s} -p -V | dot -Tpng -o#{root}/#{s}.png"
-      else
-        sh "ragel -x #{RAGEL_PATH} -S#{s} | #{RAGEL_DOTGEN} -p|dot -Tpng -o#{root}/#{s}.png"
-      end
-    end
-  end
-
-  desc "Generate diagrams of ragel parser"
-  task :ragel_dot => [ :ragel_dot_png, :ragel_dot_ps ]
-
-  desc "Build all gems and archives for a new release of json and json_pure."
-  task :build => [ :clean, :gemspec, :package ]
-
-  task :release => :build
-end
-
-desc "Compile in the the source directory"
-task :default => [ :clean, :gemspec, :test ]
diff --git a/vendor/json_pure-1.7.7/VERSION b/vendor/json_pure-1.7.7/VERSION
deleted file mode 100644
index 91c74a5..0000000
--- a/vendor/json_pure-1.7.7/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-1.7.7
diff --git a/vendor/json_pure-1.7.7/data/example.json b/vendor/json_pure-1.7.7/data/example.json
deleted file mode 100644
index 88b4e82..0000000
--- a/vendor/json_pure-1.7.7/data/example.json
+++ /dev/null
@@ -1 +0,0 @@
-{"a":2,"b":3.141,"TIME":"2007-03-14T11:52:40","c":"c","d":[1,"b",3.14],"COUNT":666,"e":{"foo":"bar"},"foo":"B\u00e4r","g":"\u677e\u672c\u884c\u5f18","h":1000.0,"bar":"\u00a9 \u2260 \u20ac!","i":0.001,"j":"\ud840\udc01"}
diff --git a/vendor/json_pure-1.7.7/data/index.html b/vendor/json_pure-1.7.7/data/index.html
deleted file mode 100644
index abe6fdb..0000000
--- a/vendor/json_pure-1.7.7/data/index.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-  <head>
-    <title>Javascript Example</title>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>    
-    <script src="prototype.js" type="text/javascript"></script>
-  </head>
-
-  <body>
-    <h1>Fetching object from server</h1>
-    <div id="list">
-      Wait...<br/>
-      <noscript><p>Switch on Javascript!</p></noscript>
-    </div>
-    <script type="text/javascript">
-    <!--
-    function pollJSON() {
-      new Ajax.Request('/json',
-        {
-          method: 'get',
-          onSuccess: function(transport) {
-            var response = transport.responseText || "no response text";
-            response = eval("(" + response + ")");
-            var text = "";
-            for (var k in response) {
-              text = text + "<b>" + k + "</b>: " + response[k] + "<br/>"
-            }
-            $("list").update(text);
-          },
-          onFailure: function() { alert('Something went wrong...') }
-        });
-    }
-    new PeriodicalExecuter(pollJSON, 1);
-    -->
-    </script>
-  </body>
-</html>
diff --git a/vendor/json_pure-1.7.7/data/prototype.js b/vendor/json_pure-1.7.7/data/prototype.js
deleted file mode 100644
index 5c73462..0000000
--- a/vendor/json_pure-1.7.7/data/prototype.js
+++ /dev/null
@@ -1,4184 +0,0 @@
-/*  Prototype JavaScript framework, version 1.6.0
- *  (c) 2005-2007 Sam Stephenson
- *
- *  Prototype is freely distributable under the terms of an MIT-style license.
- *  For details, see the Prototype web site: http://www.prototypejs.org/
- *
- *--------------------------------------------------------------------------*/
-
-var Prototype = {
-  Version: '1.6.0',
-
-  Browser: {
-    IE:     !!(window.attachEvent && !window.opera),
-    Opera:  !!window.opera,
-    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
-    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
-    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
-  },
-
-  BrowserFeatures: {
-    XPath: !!document.evaluate,
-    ElementExtensions: !!window.HTMLElement,
-    SpecificElementExtensions:
-      document.createElement('div').__proto__ &&
-      document.createElement('div').__proto__ !==
-        document.createElement('form').__proto__
-  },
-
-  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
-  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
-
-  emptyFunction: function() { },
-  K: function(x) { return x }
-};
-
-if (Prototype.Browser.MobileSafari)
-  Prototype.BrowserFeatures.SpecificElementExtensions = false;
-
-if (Prototype.Browser.WebKit)
-  Prototype.BrowserFeatures.XPath = false;
-
-/* Based on Alex Arnell's inheritance implementation. */
-var Class = {
-  create: function() {
-    var parent = null, properties = $A(arguments);
-    if (Object.isFunction(properties[0]))
-      parent = properties.shift();
-
-    function klass() {
-      this.initialize.apply(this, arguments);
-    }
-
-    Object.extend(klass, Class.Methods);
-    klass.superclass = parent;
-    klass.subclasses = [];
-
-    if (parent) {
-      var subclass = function() { };
-      subclass.prototype = parent.prototype;
-      klass.prototype = new subclass;
-      parent.subclasses.push(klass);
-    }
-
-    for (var i = 0; i < properties.length; i++)
-      klass.addMethods(properties[i]);
-
-    if (!klass.prototype.initialize)
-      klass.prototype.initialize = Prototype.emptyFunction;
-
-    klass.prototype.constructor = klass;
-
-    return klass;
-  }
-};
-
-Class.Methods = {
-  addMethods: function(source) {
-    var ancestor   = this.superclass && this.superclass.prototype;
-    var properties = Object.keys(source);
-
-    if (!Object.keys({ toString: true }).length)
-      properties.push("toString", "valueOf");
-
-    for (var i = 0, length = properties.length; i < length; i++) {
-      var property = properties[i], value = source[property];
-      if (ancestor && Object.isFunction(value) &&
-          value.argumentNames().first() == "$super") {
-        var method = value, value = Object.extend((function(m) {
-          return function() { return ancestor[m].apply(this, arguments) };
-        })(property).wrap(method), {
-          valueOf:  function() { return method },
-          toString: function() { return method.toString() }
-        });
-      }
-      this.prototype[property] = value;
-    }
-
-    return this;
-  }
-};
-
-var Abstract = { };
-
-Object.extend = function(destination, source) {
-  for (var property in source)
-    destination[property] = source[property];
-  return destination;
-};
-
-Object.extend(Object, {
-  inspect: function(object) {
-    try {
-      if (object === undefined) return 'undefined';
-      if (object === null) return 'null';
-      return object.inspect ? object.inspect() : object.toString();
-    } catch (e) {
-      if (e instanceof RangeError) return '...';
-      throw e;
-    }
-  },
-
-  toJSON: function(object) {
-    var type = typeof object;
-    switch (type) {
-      case 'undefined':
-      case 'function':
-      case 'unknown': return;
-      case 'boolean': return object.toString();
-    }
-
-    if (object === null) return 'null';
-    if (object.toJSON) return object.toJSON();
-    if (Object.isElement(object)) return;
-
-    var results = [];
-    for (var property in object) {
-      var value = Object.toJSON(object[property]);
-      if (value !== undefined)
-        results.push(property.toJSON() + ': ' + value);
-    }
-
-    return '{' + results.join(', ') + '}';
-  },
-
-  toQueryString: function(object) {
-    return $H(object).toQueryString();
-  },
-
-  toHTML: function(object) {
-    return object && object.toHTML ? object.toHTML() : String.interpret(object);
-  },
-
-  keys: function(object) {
-    var keys = [];
-    for (var property in object)
-      keys.push(property);
-    return keys;
-  },
-
-  values: function(object) {
-    var values = [];
-    for (var property in object)
-      values.push(object[property]);
-    return values;
-  },
-
-  clone: function(object) {
-    return Object.extend({ }, object);
-  },
-
-  isElement: function(object) {
-    return object && object.nodeType == 1;
-  },
-
-  isArray: function(object) {
-    return object && object.constructor === Array;
-  },
-
-  isHash: function(object) {
-    return object instanceof Hash;
-  },
-
-  isFunction: function(object) {
-    return typeof object == "function";
-  },
-
-  isString: function(object) {
-    return typeof object == "string";
-  },
-
-  isNumber: function(object) {
-    return typeof object == "number";
-  },
-
-  isUndefined: function(object) {
-    return typeof object == "undefined";
-  }
-});
-
-Object.extend(Function.prototype, {
-  argumentNames: function() {
-    var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
-    return names.length == 1 && !names[0] ? [] : names;
-  },
-
-  bind: function() {
-    if (arguments.length < 2 && arguments[0] === undefined) return this;
-    var __method = this, args = $A(arguments), object = args.shift();
-    return function() {
-      return __method.apply(object, args.concat($A(arguments)));
-    }
-  },
-
-  bindAsEventListener: function() {
-    var __method = this, args = $A(arguments), object = args.shift();
-    return function(event) {
-      return __method.apply(object, [event || window.event].concat(args));
-    }
-  },
-
-  curry: function() {
-    if (!arguments.length) return this;
-    var __method = this, args = $A(arguments);
-    return function() {
-      return __method.apply(this, args.concat($A(arguments)));
-    }
-  },
-
-  delay: function() {
-    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
-    return window.setTimeout(function() {
-      return __method.apply(__method, args);
-    }, timeout);
-  },
-
-  wrap: function(wrapper) {
-    var __method = this;
-    return function() {
-      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
-    }
-  },
-
-  methodize: function() {
-    if (this._methodized) return this._methodized;
-    var __method = this;
-    return this._methodized = function() {
-      return __method.apply(null, [this].concat($A(arguments)));
-    };
-  }
-});
-
-Function.prototype.defer = Function.prototype.delay.curry(0.01);
-
-Date.prototype.toJSON = function() {
-  return '"' + this.getUTCFullYear() + '-' +
-    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
-    this.getUTCDate().toPaddedString(2) + 'T' +
-    this.getUTCHours().toPaddedString(2) + ':' +
-    this.getUTCMinutes().toPaddedString(2) + ':' +
-    this.getUTCSeconds().toPaddedString(2) + 'Z"';
-};
-
-var Try = {
-  these: function() {
-    var returnValue;
-
-    for (var i = 0, length = arguments.length; i < length; i++) {
-      var lambda = arguments[i];
-      try {
-        returnValue = lambda();
-        break;
-      } catch (e) { }
-    }
-
-    return returnValue;
-  }
-};
-
-RegExp.prototype.match = RegExp.prototype.test;
-
-RegExp.escape = function(str) {
-  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
-};
-
-/*--------------------------------------------------------------------------*/
-
-var PeriodicalExecuter = Class.create({
-  initialize: function(callback, frequency) {
-    this.callback = callback;
-    this.frequency = frequency;
-    this.currentlyExecuting = false;
-
-    this.registerCallback();
-  },
-
-  registerCallback: function() {
-    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
-  },
-
-  execute: function() {
-    this.callback(this);
-  },
-
-  stop: function() {
-    if (!this.timer) return;
-    clearInterval(this.timer);
-    this.timer = null;
-  },
-
-  onTimerEvent: function() {
-    if (!this.currentlyExecuting) {
-      try {
-        this.currentlyExecuting = true;
-        this.execute();
-      } finally {
-        this.currentlyExecuting = false;
-      }
-    }
-  }
-});
-Object.extend(String, {
-  interpret: function(value) {
-    return value == null ? '' : String(value);
-  },
-  specialChar: {
-    '\b': '\\b',
-    '\t': '\\t',
-    '\n': '\\n',
-    '\f': '\\f',
-    '\r': '\\r',
-    '\\': '\\\\'
-  }
-});
-
-Object.extend(String.prototype, {
-  gsub: function(pattern, replacement) {
-    var result = '', source = this, match;
-    replacement = arguments.callee.prepareReplacement(replacement);
-
-    while (source.length > 0) {
-      if (match = source.match(pattern)) {
-        result += source.slice(0, match.index);
-        result += String.interpret(replacement(match));
-        source  = source.slice(match.index + match[0].length);
-      } else {
-        result += source, source = '';
-      }
-    }
-    return result;
-  },
-
-  sub: function(pattern, replacement, count) {
-    replacement = this.gsub.prepareReplacement(replacement);
-    count = count === undefined ? 1 : count;
-
-    return this.gsub(pattern, function(match) {
-      if (--count < 0) return match[0];
-      return replacement(match);
-    });
-  },
-
-  scan: function(pattern, iterator) {
-    this.gsub(pattern, iterator);
-    return String(this);
-  },
-
-  truncate: function(length, truncation) {
-    length = length || 30;
-    truncation = truncation === undefined ? '...' : truncation;
-    return this.length > length ?
-      this.slice(0, length - truncation.length) + truncation : String(this);
-  },
-
-  strip: function() {
-    return this.replace(/^\s+/, '').replace(/\s+$/, '');
-  },
-
-  stripTags: function() {
-    return this.replace(/<\/?[^>]+>/gi, '');
-  },
-
-  stripScripts: function() {
-    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
-  },
-
-  extractScripts: function() {
-    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
-    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
-    return (this.match(matchAll) || []).map(function(scriptTag) {
-      return (scriptTag.match(matchOne) || ['', ''])[1];
-    });
-  },
-
-  evalScripts: function() {
-    return this.extractScripts().map(function(script) { return eval(script) });
-  },
-
-  escapeHTML: function() {
-    var self = arguments.callee;
-    self.text.data = this;
-    return self.div.innerHTML;
-  },
-
-  unescapeHTML: function() {
-    var div = new Element('div');
-    div.innerHTML = this.stripTags();
-    return div.childNodes[0] ? (div.childNodes.length > 1 ?
-      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
-      div.childNodes[0].nodeValue) : '';
-  },
-
-  toQueryParams: function(separator) {
-    var match = this.strip().match(/([^?#]*)(#.*)?$/);
-    if (!match) return { };
-
-    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
-      if ((pair = pair.split('='))[0]) {
-        var key = decodeURIComponent(pair.shift());
-        var value = pair.length > 1 ? pair.join('=') : pair[0];
-        if (value != undefined) value = decodeURIComponent(value);
-
-        if (key in hash) {
-          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
-          hash[key].push(value);
-        }
-        else hash[key] = value;
-      }
-      return hash;
-    });
-  },
-
-  toArray: function() {
-    return this.split('');
-  },
-
-  succ: function() {
-    return this.slice(0, this.length - 1) +
-      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
-  },
-
-  times: function(count) {
-    return count < 1 ? '' : new Array(count + 1).join(this);
-  },
-
-  camelize: function() {
-    var parts = this.split('-'), len = parts.length;
-    if (len == 1) return parts[0];
-
-    var camelized = this.charAt(0) == '-'
-      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
-      : parts[0];
-
-    for (var i = 1; i < len; i++)
-      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
-
-    return camelized;
-  },
-
-  capitalize: function() {
-    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
-  },
-
-  underscore: function() {
-    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
-  },
-
-  dasherize: function() {
-    return this.gsub(/_/,'-');
-  },
-
-  inspect: function(useDoubleQuotes) {
-    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
-      var character = String.specialChar[match[0]];
-      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
-    });
-    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
-    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
-  },
-
-  toJSON: function() {
-    return this.inspect(true);
-  },
-
-  unfilterJSON: function(filter) {
-    return this.sub(filter || Prototype.JSONFilter, '#{1}');
-  },
-
-  isJSON: function() {
-    var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
-    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
-  },
-
-  evalJSON: function(sanitize) {
-    var json = this.unfilterJSON();
-    try {
-      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
-    } catch (e) { }
-    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
-  },
-
-  include: function(pattern) {
-    return this.indexOf(pattern) > -1;
-  },
-
-  startsWith: function(pattern) {
-    return this.indexOf(pattern) === 0;
-  },
-
-  endsWith: function(pattern) {
-    var d = this.length - pattern.length;
-    return d >= 0 && this.lastIndexOf(pattern) === d;
-  },
-
-  empty: function() {
-    return this == '';
-  },
-
-  blank: function() {
-    return /^\s*$/.test(this);
-  },
-
-  interpolate: function(object, pattern) {
-    return new Template(this, pattern).evaluate(object);
-  }
-});
-
-if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
-  escapeHTML: function() {
-    return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
-  },
-  unescapeHTML: function() {
-    return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
-  }
-});
-
-String.prototype.gsub.prepareReplacement = function(replacement) {
-  if (Object.isFunction(replacement)) return replacement;
-  var template = new Template(replacement);
-  return function(match) { return template.evaluate(match) };
-};
-
-String.prototype.parseQuery = String.prototype.toQueryParams;
-
-Object.extend(String.prototype.escapeHTML, {
-  div:  document.createElement('div'),
-  text: document.createTextNode('')
-});
-
-with (String.prototype.escapeHTML) div.appendChild(text);
-
-var Template = Class.create({
-  initialize: function(template, pattern) {
-    this.template = template.toString();
-    this.pattern = pattern || Template.Pattern;
-  },
-
-  evaluate: function(object) {
-    if (Object.isFunction(object.toTemplateReplacements))
-      object = object.toTemplateReplacements();
-
-    return this.template.gsub(this.pattern, function(match) {
-      if (object == null) return '';
-
-      var before = match[1] || '';
-      if (before == '\\') return match[2];
-
-      var ctx = object, expr = match[3];
-      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match = pattern.exec(expr);
-      if (match == null) return before;
-
-      while (match != null) {
-        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
-        ctx = ctx[comp];
-        if (null == ctx || '' == match[3]) break;
-        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
-        match = pattern.exec(expr);
-      }
-
-      return before + String.interpret(ctx);
-    }.bind(this));
-  }
-});
-Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
-
-var $break = { };
-
-var Enumerable = {
-  each: function(iterator, context) {
-    var index = 0;
-    iterator = iterator.bind(context);
-    try {
-      this._each(function(value) {
-        iterator(value, index++);
-      });
-    } catch (e) {
-      if (e != $break) throw e;
-    }
-    return this;
-  },
-
-  eachSlice: function(number, iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
-    var index = -number, slices = [], array = this.toArray();
-    while ((index += number) < array.length)
-      slices.push(array.slice(index, index+number));
-    return slices.collect(iterator, context);
-  },
-
-  all: function(iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
-    var result = true;
-    this.each(function(value, index) {
-      result = result && !!iterator(value, index);
-      if (!result) throw $break;
-    });
-    return result;
-  },
-
-  any: function(iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
-    var result = false;
-    this.each(function(value, index) {
-      if (result = !!iterator(value, index))
-        throw $break;
-    });
-    return result;
-  },
-
-  collect: function(iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
-    var results = [];
-    this.each(function(value, index) {
-      results.push(iterator(value, index));
-    });
-    return results;
-  },
-
-  detect: function(iterator, context) {
-    iterator = iterator.bind(context);
-    var result;
-    this.each(function(value, index) {
-      if (iterator(value, index)) {
-        result = value;
-        throw $break;
-      }
-    });
-    return result;
-  },
-
-  findAll: function(iterator, context) {
-    iterator = iterator.bind(context);
-    var results = [];
-    this.each(function(value, index) {
-      if (iterator(value, index))
-        results.push(value);
-    });
-    return results;
-  },
-
-  grep: function(filter, iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
-    var results = [];
-
-    if (Object.isString(filter))
-      filter = new RegExp(filter);
-
-    this.each(function(value, index) {
-      if (filter.match(value))
-        results.push(iterator(value, index));
-    });
-    return results;
-  },
-
-  include: function(object) {
-    if (Object.isFunction(this.indexOf))
-      if (this.indexOf(object) != -1) return true;
-
-    var found = false;
-    this.each(function(value) {
-      if (value == object) {
-        found = true;
-        throw $break;
-      }
-    });
-    return found;
-  },
-
-  inGroupsOf: function(number, fillWith) {
-    fillWith = fillWith === undefined ? null : fillWith;
-    return this.eachSlice(number, function(slice) {
-      while(slice.length < number) slice.push(fillWith);
-      return slice;
-    });
-  },
-
-  inject: function(memo, iterator, context) {
-    iterator = iterator.bind(context);
-    this.each(function(value, index) {
-      memo = iterator(memo, value, index);
-    });
-    return memo;
-  },
-
-  invoke: function(method) {
-    var args = $A(arguments).slice(1);
-    return this.map(function(value) {
-      return value[method].apply(value, args);
-    });
-  },
-
-  max: function(iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
-    var result;
-    this.each(function(value, index) {
-      value = iterator(value, index);
-      if (result == undefined || value >= result)
-        result = value;
-    });
-    return result;
-  },
-
-  min: function(iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
-    var result;
-    this.each(function(value, index) {
-      value = iterator(value, index);
-      if (result == undefined || value < result)
-        result = value;
-    });
-    return result;
-  },
-
-  partition: function(iterator, context) {
-    iterator = iterator ? iterator.bind(context) : Prototype.K;
-    var trues = [], falses = [];
-    this.each(function(value, index) {
-      (iterator(value, index) ?
-        trues : falses).push(value);
-    });
-    return [trues, falses];
-  },
-
-  pluck: function(property) {
-    var results = [];
-    this.each(function(value) {
-      results.push(value[property]);
-    });
-    return results;
-  },
-
-  reject: function(iterator, context) {
-    iterator = iterator.bind(context);
-    var results = [];
-    this.each(function(value, index) {
-      if (!iterator(value, index))
-        results.push(value);
-    });
-    return results;
-  },
-
-  sortBy: function(iterator, context) {
-    iterator = iterator.bind(context);
-    return this.map(function(value, index) {
-      return {value: value, criteria: iterator(value, index)};
-    }).sort(function(left, right) {
-      var a = left.criteria, b = right.criteria;
-      return a < b ? -1 : a > b ? 1 : 0;
-    }).pluck('value');
-  },
-
-  toArray: function() {
-    return this.map();
-  },
-
-  zip: function() {
-    var iterator = Prototype.K, args = $A(arguments);
-    if (Object.isFunction(args.last()))
-      iterator = args.pop();
-
-    var collections = [this].concat(args).map($A);
-    return this.map(function(value, index) {
-      return iterator(collections.pluck(index));
-    });
-  },
-
-  size: function() {
-    return this.toArray().length;
-  },
-
-  inspect: function() {
-    return '#<Enumerable:' + this.toArray().inspect() + '>';
-  }
-};
-
-Object.extend(Enumerable, {
-  map:     Enumerable.collect,
-  find:    Enumerable.detect,
-  select:  Enumerable.findAll,
-  filter:  Enumerable.findAll,
-  member:  Enumerable.include,
-  entries: Enumerable.toArray,
-  every:   Enumerable.all,
-  some:    Enumerable.any
-});
-function $A(iterable) {
-  if (!iterable) return [];
-  if (iterable.toArray) return iterable.toArray();
-  var length = iterable.length, results = new Array(length);
-  while (length--) results[length] = iterable[length];
-  return results;
-}
-
-if (Prototype.Browser.WebKit) {
-  function $A(iterable) {
-    if (!iterable) return [];
-    if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&
-        iterable.toArray) return iterable.toArray();
-    var length = iterable.length, results = new Array(length);
-    while (length--) results[length] = iterable[length];
-    return results;
-  }
-}
-
-Array.from = $A;
-
-Object.extend(Array.prototype, Enumerable);
-
-if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
-
-Object.extend(Array.prototype, {
-  _each: function(iterator) {
-    for (var i = 0, length = this.length; i < length; i++)
-      iterator(this[i]);
-  },
-
-  clear: function() {
-    this.length = 0;
-    return this;
-  },
-
-  first: function() {
-    return this[0];
-  },
-
-  last: function() {
-    return this[this.length - 1];
-  },
-
-  compact: function() {
-    return this.select(function(value) {
-      return value != null;
-    });
-  },
-
-  flatten: function() {
-    return this.inject([], function(array, value) {
-      return array.concat(Object.isArray(value) ?
-        value.flatten() : [value]);
-    });
-  },
-
-  without: function() {
-    var values = $A(arguments);
-    return this.select(function(value) {
-      return !values.include(value);
-    });
-  },
-
-  reverse: function(inline) {
-    return (inline !== false ? this : this.toArray())._reverse();
-  },
-
-  reduce: function() {
-    return this.length > 1 ? this : this[0];
-  },
-
-  uniq: function(sorted) {
-    return this.inject([], function(array, value, index) {
-      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
-        array.push(value);
-      return array;
-    });
-  },
-
-  intersect: function(array) {
-    return this.uniq().findAll(function(item) {
-      return array.detect(function(value) { return item === value });
-    });
-  },
-
-  clone: function() {
-    return [].concat(this);
-  },
-
-  size: function() {
-    return this.length;
-  },
-
-  inspect: function() {
-    return '[' + this.map(Object.inspect).join(', ') + ']';
-  },
-
-  toJSON: function() {
-    var results = [];
-    this.each(function(object) {
-      var value = Object.toJSON(object);
-      if (value !== undefined) results.push(value);
-    });
-    return '[' + results.join(', ') + ']';
-  }
-});
-
-// use native browser JS 1.6 implementation if available
-if (Object.isFunction(Array.prototype.forEach))
-  Array.prototype._each = Array.prototype.forEach;
-
-if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
-  i || (i = 0);
-  var length = this.length;
-  if (i < 0) i = length + i;
-  for (; i < length; i++)
-    if (this[i] === item) return i;
-  return -1;
-};
-
-if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
-  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
-  var n = this.slice(0, i).reverse().indexOf(item);
-  return (n < 0) ? n : i - n - 1;
-};
-
-Array.prototype.toArray = Array.prototype.clone;
-
-function $w(string) {
-  if (!Object.isString(string)) return [];
-  string = string.strip();
-  return string ? string.split(/\s+/) : [];
-}
-
-if (Prototype.Browser.Opera){
-  Array.prototype.concat = function() {
-    var array = [];
-    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
-    for (var i = 0, length = arguments.length; i < length; i++) {
-      if (Object.isArray(arguments[i])) {
-        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
-          array.push(arguments[i][j]);
-      } else {
-        array.push(arguments[i]);
-      }
-    }
-    return array;
-  };
-}
-Object.extend(Number.prototype, {
-  toColorPart: function() {
-    return this.toPaddedString(2, 16);
-  },
-
-  succ: function() {
-    return this + 1;
-  },
-
-  times: function(iterator) {
-    $R(0, this, true).each(iterator);
-    return this;
-  },
-
-  toPaddedString: function(length, radix) {
-    var string = this.toString(radix || 10);
-    return '0'.times(length - string.length) + string;
-  },
-
-  toJSON: function() {
-    return isFinite(this) ? this.toString() : 'null';
-  }
-});
-
-$w('abs round ceil floor').each(function(method){
-  Number.prototype[method] = Math[method].methodize();
-});
-function $H(object) {
-  return new Hash(object);
-};
-
-var Hash = Class.create(Enumerable, (function() {
-  if (function() {
-    var i = 0, Test = function(value) { this.key = value };
-    Test.prototype.key = 'foo';
-    for (var property in new Test('bar')) i++;
-    return i > 1;
-  }()) {
-    function each(iterator) {
-      var cache = [];
-      for (var key in this._object) {
-        var value = this._object[key];
-        if (cache.include(key)) continue;
-        cache.push(key);
-        var pair = [key, value];
-        pair.key = key;
-        pair.value = value;
-        iterator(pair);
-      }
-    }
-  } else {
-    function each(iterator) {
-      for (var key in this._object) {
-        var value = this._object[key], pair = [key, value];
-        pair.key = key;
-        pair.value = value;
-        iterator(pair);
-      }
-    }
-  }
-
-  function toQueryPair(key, value) {
-    if (Object.isUndefined(value)) return key;
-    return key + '=' + encodeURIComponent(String.interpret(value));
-  }
-
-  return {
-    initialize: function(object) {
-      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
-    },
-
-    _each: each,
-
-    set: function(key, value) {
-      return this._object[key] = value;
-    },
-
-    get: function(key) {
-      return this._object[key];
-    },
-
-    unset: function(key) {
-      var value = this._object[key];
-      delete this._object[key];
-      return value;
-    },
-
-    toObject: function() {
-      return Object.clone(this._object);
-    },
-
-    keys: function() {
-      return this.pluck('key');
-    },
-
-    values: function() {
-      return this.pluck('value');
-    },
-
-    index: function(value) {
-      var match = this.detect(function(pair) {
-        return pair.value === value;
-      });
-      return match && match.key;
-    },
-
-    merge: function(object) {
-      return this.clone().update(object);
-    },
-
-    update: function(object) {
-      return new Hash(object).inject(this, function(result, pair) {
-        result.set(pair.key, pair.value);
-        return result;
-      });
-    },
-
-    toQueryString: function() {
-      return this.map(function(pair) {
-        var key = encodeURIComponent(pair.key), values = pair.value;
-
-        if (values && typeof values == 'object') {
-          if (Object.isArray(values))
-            return values.map(toQueryPair.curry(key)).join('&');
-        }
-        return toQueryPair(key, values);
-      }).join('&');
-    },
-
-    inspect: function() {
-      return '#<Hash:{' + this.map(function(pair) {
-        return pair.map(Object.inspect).join(': ');
-      }).join(', ') + '}>';
-    },
-
-    toJSON: function() {
-      return Object.toJSON(this.toObject());
-    },
-
-    clone: function() {
-      return new Hash(this);
-    }
-  }
-})());
-
-Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
-Hash.from = $H;
-var ObjectRange = Class.create(Enumerable, {
-  initialize: function(start, end, exclusive) {
-    this.start = start;
-    this.end = end;
-    this.exclusive = exclusive;
-  },
-
-  _each: function(iterator) {
-    var value = this.start;
-    while (this.include(value)) {
-      iterator(value);
-      value = value.succ();
-    }
-  },
-
-  include: function(value) {
-    if (value < this.start)
-      return false;
-    if (this.exclusive)
-      return value < this.end;
-    return value <= this.end;
-  }
-});
-
-var $R = function(start, end, exclusive) {
-  return new ObjectRange(start, end, exclusive);
-};
-
-var Ajax = {
-  getTransport: function() {
-    return Try.these(
-      function() {return new XMLHttpRequest()},
-      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
-      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
-    ) || false;
-  },
-
-  activeRequestCount: 0
-};
-
-Ajax.Responders = {
-  responders: [],
-
-  _each: function(iterator) {
-    this.responders._each(iterator);
-  },
-
-  register: function(responder) {
-    if (!this.include(responder))
-      this.responders.push(responder);
-  },
-
-  unregister: function(responder) {
-    this.responders = this.responders.without(responder);
-  },
-
-  dispatch: function(callback, request, transport, json) {
-    this.each(function(responder) {
-      if (Object.isFunction(responder[callback])) {
-        try {
-          responder[callback].apply(responder, [request, transport, json]);
-        } catch (e) { }
-      }
-    });
-  }
-};
-
-Object.extend(Ajax.Responders, Enumerable);
-
-Ajax.Responders.register({
-  onCreate:   function() { Ajax.activeRequestCount++ },
-  onComplete: function() { Ajax.activeRequestCount-- }
-});
-
-Ajax.Base = Class.create({
-  initialize: function(options) {
-    this.options = {
-      method:       'post',
-      asynchronous: true,
-      contentType:  'application/x-www-form-urlencoded',
-      encoding:     'UTF-8',
-      parameters:   '',
-      evalJSON:     true,
-      evalJS:       true
-    };
-    Object.extend(this.options, options || { });
-
-    this.options.method = this.options.method.toLowerCase();
-    if (Object.isString(this.options.parameters))
-      this.options.parameters = this.options.parameters.toQueryParams();
-  }
-});
-
-Ajax.Request = Class.create(Ajax.Base, {
-  _complete: false,
-
-  initialize: function($super, url, options) {
-    $super(options);
-    this.transport = Ajax.getTransport();
-    this.request(url);
-  },
-
-  request: function(url) {
-    this.url = url;
-    this.method = this.options.method;
-    var params = Object.clone(this.options.parameters);
-
-    if (!['get', 'post'].include(this.method)) {
-      // simulate other verbs over post
-      params['_method'] = this.method;
-      this.method = 'post';
-    }
-
-    this.parameters = params;
-
-    if (params = Object.toQueryString(params)) {
-      // when GET, append parameters to URL
-      if (this.method == 'get')
-        this.url += (this.url.include('?') ? '&' : '?') + params;
-      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
-        params += '&_=';
-    }
-
-    try {
-      var response = new Ajax.Response(this);
-      if (this.options.onCreate) this.options.onCreate(response);
-      Ajax.Responders.dispatch('onCreate', this, response);
-
-      this.transport.open(this.method.toUpperCase(), this.url,
-        this.options.asynchronous);
-
-      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
-
-      this.transport.onreadystatechange = this.onStateChange.bind(this);
-      this.setRequestHeaders();
-
-      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
-      this.transport.send(this.body);
-
-      /* Force Firefox to handle ready state 4 for synchronous requests */
-      if (!this.options.asynchronous && this.transport.overrideMimeType)
-        this.onStateChange();
-
-    }
-    catch (e) {
-      this.dispatchException(e);
-    }
-  },
-
-  onStateChange: function() {
-    var readyState = this.transport.readyState;
-    if (readyState > 1 && !((readyState == 4) && this._complete))
-      this.respondToReadyState(this.transport.readyState);
-  },
-
-  setRequestHeaders: function() {
-    var headers = {
-      'X-Requested-With': 'XMLHttpRequest',
-      'X-Prototype-Version': Prototype.Version,
-      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
-    };
-
-    if (this.method == 'post') {
-      headers['Content-type'] = this.options.contentType +
-        (this.options.encoding ? '; charset=' + this.options.encoding : '');
-
-      /* Force "Connection: close" for older Mozilla browsers to work
-       * around a bug where XMLHttpRequest sends an incorrect
-       * Content-length header. See Mozilla Bugzilla #246651.
-       */
-      if (this.transport.overrideMimeType &&
-          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
-            headers['Connection'] = 'close';
-    }
-
-    // user-defined headers
-    if (typeof this.options.requestHeaders == 'object') {
-      var extras = this.options.requestHeaders;
-
-      if (Object.isFunction(extras.push))
-        for (var i = 0, length = extras.length; i < length; i += 2)
-          headers[extras[i]] = extras[i+1];
-      else
-        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
-    }
-
-    for (var name in headers)
-      this.transport.setRequestHeader(name, headers[name]);
-  },
-
-  success: function() {
-    var status = this.getStatus();
-    return !status || (status >= 200 && status < 300);
-  },
-
-  getStatus: function() {
-    try {
-      return this.transport.status || 0;
-    } catch (e) { return 0 }
-  },
-
-  respondToReadyState: function(readyState) {
-    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
-
-    if (state == 'Complete') {
-      try {
-        this._complete = true;
-        (this.options['on' + response.status]
-         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
-         || Prototype.emptyFunction)(response, response.headerJSON);
-      } catch (e) {
-        this.dispatchException(e);
-      }
-
-      var contentType = response.getHeader('Content-type');
-      if (this.options.evalJS == 'force'
-          || (this.options.evalJS && contentType
-          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
-        this.evalResponse();
-    }
-
-    try {
-      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
-      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
-    } catch (e) {
-      this.dispatchException(e);
-    }
-
-    if (state == 'Complete') {
-      // avoid memory leak in MSIE: clean up
-      this.transport.onreadystatechange = Prototype.emptyFunction;
-    }
-  },
-
-  getHeader: function(name) {
-    try {
-      return this.transport.getResponseHeader(name);
-    } catch (e) { return null }
-  },
-
-  evalResponse: function() {
-    try {
-      return eval((this.transport.responseText || '').unfilterJSON());
-    } catch (e) {
-      this.dispatchException(e);
-    }
-  },
-
-  dispatchException: function(exception) {
-    (this.options.onException || Prototype.emptyFunction)(this, exception);
-    Ajax.Responders.dispatch('onException', this, exception);
-  }
-});
-
-Ajax.Request.Events =
-  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
-
-Ajax.Response = Class.create({
-  initialize: function(request){
-    this.request = request;
-    var transport  = this.transport  = request.transport,
-        readyState = this.readyState = transport.readyState;
-
-    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
-      this.status       = this.getStatus();
-      this.statusText   = this.getStatusText();
-      this.responseText = String.interpret(transport.responseText);
-      this.headerJSON   = this._getHeaderJSON();
-    }
-
-    if(readyState == 4) {
-      var xml = transport.responseXML;
-      this.responseXML  = xml === undefined ? null : xml;
-      this.responseJSON = this._getResponseJSON();
-    }
-  },
-
-  status:      0,
-  statusText: '',
-
-  getStatus: Ajax.Request.prototype.getStatus,
-
-  getStatusText: function() {
-    try {
-      return this.transport.statusText || '';
-    } catch (e) { return '' }
-  },
-
-  getHeader: Ajax.Request.prototype.getHeader,
-
-  getAllHeaders: function() {
-    try {
-      return this.getAllResponseHeaders();
-    } catch (e) { return null }
-  },
-
-  getResponseHeader: function(name) {
-    return this.transport.getResponseHeader(name);
-  },
-
-  getAllResponseHeaders: function() {
-    return this.transport.getAllResponseHeaders();
-  },
-
-  _getHeaderJSON: function() {
-    var json = this.getHeader('X-JSON');
-    if (!json) return null;
-    json = decodeURIComponent(escape(json));
-    try {
-      return json.evalJSON(this.request.options.sanitizeJSON);
-    } catch (e) {
-      this.request.dispatchException(e);
-    }
-  },
-
-  _getResponseJSON: function() {
-    var options = this.request.options;
-    if (!options.evalJSON || (options.evalJSON != 'force' &&
-      !(this.getHeader('Content-type') || '').include('application/json')))
-        return null;
-    try {
-      return this.transport.responseText.evalJSON(options.sanitizeJSON);
-    } catch (e) {
-      this.request.dispatchException(e);
-    }
-  }
-});
-
-Ajax.Updater = Class.create(Ajax.Request, {
-  initialize: function($super, container, url, options) {
-    this.container = {
-      success: (container.success || container),
-      failure: (container.failure || (container.success ? null : container))
-    };
-
-    options = options || { };
-    var onComplete = options.onComplete;
-    options.onComplete = (function(response, param) {
-      this.updateContent(response.responseText);
-      if (Object.isFunction(onComplete)) onComplete(response, param);
-    }).bind(this);
-
-    $super(url, options);
-  },
-
-  updateContent: function(responseText) {
-    var receiver = this.container[this.success() ? 'success' : 'failure'],
-        options = this.options;
-
-    if (!options.evalScripts) responseText = responseText.stripScripts();
-
-    if (receiver = $(receiver)) {
-      if (options.insertion) {
-        if (Object.isString(options.insertion)) {
-          var insertion = { }; insertion[options.insertion] = responseText;
-          receiver.insert(insertion);
-        }
-        else options.insertion(receiver, responseText);
-      }
-      else receiver.update(responseText);
-    }
-
-    if (this.success()) {
-      if (this.onComplete) this.onComplete.bind(this).defer();
-    }
-  }
-});
-
-Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
-  initialize: function($super, container, url, options) {
-    $super(options);
-    this.onComplete = this.options.onComplete;
-
-    this.frequency = (this.options.frequency || 2);
-    this.decay = (this.options.decay || 1);
-
-    this.updater = { };
-    this.container = container;
-    this.url = url;
-
-    this.start();
-  },
-
-  start: function() {
-    this.options.onComplete = this.updateComplete.bind(this);
-    this.onTimerEvent();
-  },
-
-  stop: function() {
-    this.updater.options.onComplete = undefined;
-    clearTimeout(this.timer);
-    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
-  },
-
-  updateComplete: function(response) {
-    if (this.options.decay) {
-      this.decay = (response.responseText == this.lastText ?
-        this.decay * this.options.decay : 1);
-
-      this.lastText = response.responseText;
-    }
-    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
-  },
-
-  onTimerEvent: function() {
-    this.updater = new Ajax.Updater(this.container, this.url, this.options);
-  }
-});
-function $(element) {
-  if (arguments.length > 1) {
-    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
-      elements.push($(arguments[i]));
-    return elements;
-  }
-  if (Object.isString(element))
-    element = document.getElementById(element);
-  return Element.extend(element);
-}
-
-if (Prototype.BrowserFeatures.XPath) {
-  document._getElementsByXPath = function(expression, parentElement) {
-    var results = [];
-    var query = document.evaluate(expression, $(parentElement) || document,
-      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
-    for (var i = 0, length = query.snapshotLength; i < length; i++)
-      results.push(Element.extend(query.snapshotItem(i)));
-    return results;
-  };
-}
-
-/*--------------------------------------------------------------------------*/
-
-if (!window.Node) var Node = { };
-
-if (!Node.ELEMENT_NODE) {
-  // DOM level 2 ECMAScript Language Binding
-  Object.extend(Node, {
-    ELEMENT_NODE: 1,
-    ATTRIBUTE_NODE: 2,
-    TEXT_NODE: 3,
-    CDATA_SECTION_NODE: 4,
-    ENTITY_REFERENCE_NODE: 5,
-    ENTITY_NODE: 6,
-    PROCESSING_INSTRUCTION_NODE: 7,
-    COMMENT_NODE: 8,
-    DOCUMENT_NODE: 9,
-    DOCUMENT_TYPE_NODE: 10,
-    DOCUMENT_FRAGMENT_NODE: 11,
-    NOTATION_NODE: 12
-  });
-}
-
-(function() {
-  var element = this.Element;
-  this.Element = function(tagName, attributes) {
-    attributes = attributes || { };
-    tagName = tagName.toLowerCase();
-    var cache = Element.cache;
-    if (Prototype.Browser.IE && attributes.name) {
-      tagName = '<' + tagName + ' name="' + attributes.name + '">';
-      delete attributes.name;
-      return Element.writeAttribute(document.createElement(tagName), attributes);
-    }
-    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
-    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
-  };
-  Object.extend(this.Element, element || { });
-}).call(window);
-
-Element.cache = { };
-
-Element.Methods = {
-  visible: function(element) {
-    return $(element).style.display != 'none';
-  },
-
-  toggle: function(element) {
-    element = $(element);
-    Element[Element.visible(element) ? 'hide' : 'show'](element);
-    return element;
-  },
-
-  hide: function(element) {
-    $(element).style.display = 'none';
-    return element;
-  },
-
-  show: function(element) {
-    $(element).style.display = '';
-    return element;
-  },
-
-  remove: function(element) {
-    element = $(element);
-    element.parentNode.removeChild(element);
-    return element;
-  },
-
-  update: function(element, content) {
-    element = $(element);
-    if (content && content.toElement) content = content.toElement();
-    if (Object.isElement(content)) return element.update().insert(content);
-    content = Object.toHTML(content);
-    element.innerHTML = content.stripScripts();
-    content.evalScripts.bind(content).defer();
-    return element;
-  },
-
-  replace: function(element, content) {
-    element = $(element);
-    if (content && content.toElement) content = content.toElement();
-    else if (!Object.isElement(content)) {
-      content = Object.toHTML(content);
-      var range = element.ownerDocument.createRange();
-      range.selectNode(element);
-      content.evalScripts.bind(content).defer();
-      content = range.createContextualFragment(content.stripScripts());
-    }
-    element.parentNode.replaceChild(content, element);
-    return element;
-  },
-
-  insert: function(element, insertions) {
-    element = $(element);
-
-    if (Object.isString(insertions) || Object.isNumber(insertions) ||
-        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
-          insertions = {bottom:insertions};
-
-    var content, t, range;
-
-    for (position in insertions) {
-      content  = insertions[position];
-      position = position.toLowerCase();
-      t = Element._insertionTranslations[position];
-
-      if (content && content.toElement) content = content.toElement();
-      if (Object.isElement(content)) {
-        t.insert(element, content);
-        continue;
-      }
-
-      content = Object.toHTML(content);
-
-      range = element.ownerDocument.createRange();
-      t.initializeRange(element, range);
-      t.insert(element, range.createContextualFragment(content.stripScripts()));
-
-      content.evalScripts.bind(content).defer();
-    }
-
-    return element;
-  },
-
-  wrap: function(element, wrapper, attributes) {
-    element = $(element);
-    if (Object.isElement(wrapper))
-      $(wrapper).writeAttribute(attributes || { });
-    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
-    else wrapper = new Element('div', wrapper);
-    if (element.parentNode)
-      element.parentNode.replaceChild(wrapper, element);
-    wrapper.appendChild(element);
-    return wrapper;
-  },
-
-  inspect: function(element) {
-    element = $(element);
-    var result = '<' + element.tagName.toLowerCase();
-    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
-      var property = pair.first(), attribute = pair.last();
-      var value = (element[property] || '').toString();
-      if (value) result += ' ' + attribute + '=' + value.inspect(true);
-    });
-    return result + '>';
-  },
-
-  recursivelyCollect: function(element, property) {
-    element = $(element);
-    var elements = [];
-    while (element = element[property])
-      if (element.nodeType == 1)
-        elements.push(Element.extend(element));
-    return elements;
-  },
-
-  ancestors: function(element) {
-    return $(element).recursivelyCollect('parentNode');
-  },
-
-  descendants: function(element) {
-    return $A($(element).getElementsByTagName('*')).each(Element.extend);
-  },
-
-  firstDescendant: function(element) {
-    element = $(element).firstChild;
-    while (element && element.nodeType != 1) element = element.nextSibling;
-    return $(element);
-  },
-
-  immediateDescendants: function(element) {
-    if (!(element = $(element).firstChild)) return [];
-    while (element && element.nodeType != 1) element = element.nextSibling;
-    if (element) return [element].concat($(element).nextSiblings());
-    return [];
-  },
-
-  previousSiblings: function(element) {
-    return $(element).recursivelyCollect('previousSibling');
-  },
-
-  nextSiblings: function(element) {
-    return $(element).recursivelyCollect('nextSibling');
-  },
-
-  siblings: function(element) {
-    element = $(element);
-    return element.previousSiblings().reverse().concat(element.nextSiblings());
-  },
-
-  match: function(element, selector) {
-    if (Object.isString(selector))
-      selector = new Selector(selector);
-    return selector.match($(element));
-  },
-
-  up: function(element, expression, index) {
-    element = $(element);
-    if (arguments.length == 1) return $(element.parentNode);
-    var ancestors = element.ancestors();
-    return expression ? Selector.findElement(ancestors, expression, index) :
-      ancestors[index || 0];
-  },
-
-  down: function(element, expression, index) {
-    element = $(element);
-    if (arguments.length == 1) return element.firstDescendant();
-    var descendants = element.descendants();
-    return expression ? Selector.findElement(descendants, expression, index) :
-      descendants[index || 0];
-  },
-
-  previous: function(element, expression, index) {
-    element = $(element);
-    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
-    var previousSiblings = element.previousSiblings();
-    return expression ? Selector.findElement(previousSiblings, expression, index) :
-      previousSiblings[index || 0];
-  },
-
-  next: function(element, expression, index) {
-    element = $(element);
-    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
-    var nextSiblings = element.nextSiblings();
-    return expression ? Selector.findElement(nextSiblings, expression, index) :
-      nextSiblings[index || 0];
-  },
-
-  select: function() {
-    var args = $A(arguments), element = $(args.shift());
-    return Selector.findChildElements(element, args);
-  },
-
-  adjacent: function() {
-    var args = $A(arguments), element = $(args.shift());
-    return Selector.findChildElements(element.parentNode, args).without(element);
-  },
-
-  identify: function(element) {
-    element = $(element);
-    var id = element.readAttribute('id'), self = arguments.callee;
-    if (id) return id;
-    do { id = 'anonymous_element_' + self.counter++ } while ($(id));
-    element.writeAttribute('id', id);
-    return id;
-  },
-
-  readAttribute: function(element, name) {
-    element = $(element);
-    if (Prototype.Browser.IE) {
-      var t = Element._attributeTranslations.read;
-      if (t.values[name]) return t.values[name](element, name);
-      if (t.names[name]) name = t.names[name];
-      if (name.include(':')) {
-        return (!element.attributes || !element.attributes[name]) ? null :
-         element.attributes[name].value;
-      }
-    }
-    return element.getAttribute(name);
-  },
-
-  writeAttribute: function(element, name, value) {
-    element = $(element);
-    var attributes = { }, t = Element._attributeTranslations.write;
-
-    if (typeof name == 'object') attributes = name;
-    else attributes[name] = value === undefined ? true : value;
-
-    for (var attr in attributes) {
-      var name = t.names[attr] || attr, value = attributes[attr];
-      if (t.values[attr]) name = t.values[attr](element, value);
-      if (value === false || value === null)
-        element.removeAttribute(name);
-      else if (value === true)
-        element.setAttribute(name, name);
-      else element.setAttribute(name, value);
-    }
-    return element;
-  },
-
-  getHeight: function(element) {
-    return $(element).getDimensions().height;
-  },
-
-  getWidth: function(element) {
-    return $(element).getDimensions().width;
-  },
-
-  classNames: function(element) {
-    return new Element.ClassNames(element);
-  },
-
-  hasClassName: function(element, className) {
-    if (!(element = $(element))) return;
-    var elementClassName = element.className;
-    return (elementClassName.length > 0 && (elementClassName == className ||
-      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
-  },
-
-  addClassName: function(element, className) {
-    if (!(element = $(element))) return;
-    if (!element.hasClassName(className))
-      element.className += (element.className ? ' ' : '') + className;
-    return element;
-  },
-
-  removeClassName: function(element, className) {
-    if (!(element = $(element))) return;
-    element.className = element.className.replace(
-      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
-    return element;
-  },
-
-  toggleClassName: function(element, className) {
-    if (!(element = $(element))) return;
-    return element[element.hasClassName(className) ?
-      'removeClassName' : 'addClassName'](className);
-  },
-
-  // removes whitespace-only text node children
-  cleanWhitespace: function(element) {
-    element = $(element);
-    var node = element.firstChild;
-    while (node) {
-      var nextNode = node.nextSibling;
-      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
-        element.removeChild(node);
-      node = nextNode;
-    }
-    return element;
-  },
-
-  empty: function(element) {
-    return $(element).innerHTML.blank();
-  },
-
-  descendantOf: function(element, ancestor) {
-    element = $(element), ancestor = $(ancestor);
-
-    if (element.compareDocumentPosition)
-      return (element.compareDocumentPosition(ancestor) & 8) === 8;
-
-    if (element.sourceIndex && !Prototype.Browser.Opera) {
-      var e = element.sourceIndex, a = ancestor.sourceIndex,
-       nextAncestor = ancestor.nextSibling;
-      if (!nextAncestor) {
-        do { ancestor = ancestor.parentNode; }
-        while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);
-      }
-      if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex);
-    }
-
-    while (element = element.parentNode)
-      if (element == ancestor) return true;
-    return false;
-  },
-
-  scrollTo: function(element) {
-    element = $(element);
-    var pos = element.cumulativeOffset();
-    window.scrollTo(pos[0], pos[1]);
-    return element;
-  },
-
-  getStyle: function(element, style) {
-    element = $(element);
-    style = style == 'float' ? 'cssFloat' : style.camelize();
-    var value = element.style[style];
-    if (!value) {
-      var css = document.defaultView.getComputedStyle(element, null);
-      value = css ? css[style] : null;
-    }
-    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
-    return value == 'auto' ? null : value;
-  },
-
-  getOpacity: function(element) {
-    return $(element).getStyle('opacity');
-  },
-
-  setStyle: function(element, styles) {
-    element = $(element);
-    var elementStyle = element.style, match;
-    if (Object.isString(styles)) {
-      element.style.cssText += ';' + styles;
-      return styles.include('opacity') ?
-        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
-    }
-    for (var property in styles)
-      if (property == 'opacity') element.setOpacity(styles[property]);
-      else
-        elementStyle[(property == 'float' || property == 'cssFloat') ?
-          (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :
-            property] = styles[property];
-
-    return element;
-  },
-
-  setOpacity: function(element, value) {
-    element = $(element);
-    element.style.opacity = (value == 1 || value === '') ? '' :
-      (value < 0.00001) ? 0 : value;
-    return element;
-  },
-
-  getDimensions: function(element) {
-    element = $(element);
-    var display = $(element).getStyle('display');
-    if (display != 'none' && display != null) // Safari bug
-      return {width: element.offsetWidth, height: element.offsetHeight};
-
-    // All *Width and *Height properties give 0 on elements with display none,
-    // so enable the element temporarily
-    var els = element.style;
-    var originalVisibility = els.visibility;
-    var originalPosition = els.position;
-    var originalDisplay = els.display;
-    els.visibility = 'hidden';
-    els.position = 'absolute';
-    els.display = 'block';
-    var originalWidth = element.clientWidth;
-    var originalHeight = element.clientHeight;
-    els.display = originalDisplay;
-    els.position = originalPosition;
-    els.visibility = originalVisibility;
-    return {width: originalWidth, height: originalHeight};
-  },
-
-  makePositioned: function(element) {
-    element = $(element);
-    var pos = Element.getStyle(element, 'position');
-    if (pos == 'static' || !pos) {
-      element._madePositioned = true;
-      element.style.position = 'relative';
-      // Opera returns the offset relative to the positioning context, when an
-      // element is position relative but top and left have not been defined
-      if (window.opera) {
-        element.style.top = 0;
-        element.style.left = 0;
-      }
-    }
-    return element;
-  },
-
-  undoPositioned: function(element) {
-    element = $(element);
-    if (element._madePositioned) {
-      element._madePositioned = undefined;
-      element.style.position =
-        element.style.top =
-        element.style.left =
-        element.style.bottom =
-        element.style.right = '';
-    }
-    return element;
-  },
-
-  makeClipping: function(element) {
-    element = $(element);
-    if (element._overflow) return element;
-    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
-    if (element._overflow !== 'hidden')
-      element.style.overflow = 'hidden';
-    return element;
-  },
-
-  undoClipping: function(element) {
-    element = $(element);
-    if (!element._overflow) return element;
-    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
-    element._overflow = null;
-    return element;
-  },
-
-  cumulativeOffset: function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
-      element = element.offsetParent;
-    } while (element);
-    return Element._returnOffset(valueL, valueT);
-  },
-
-  positionedOffset: function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
-      element = element.offsetParent;
-      if (element) {
-        if (element.tagName == 'BODY') break;
-        var p = Element.getStyle(element, 'position');
-        if (p == 'relative' || p == 'absolute') break;
-      }
-    } while (element);
-    return Element._returnOffset(valueL, valueT);
-  },
-
-  absolutize: function(element) {
-    element = $(element);
-    if (element.getStyle('position') == 'absolute') return;
-    // Position.prepare(); // To be done manually by Scripty when it needs it.
-
-    var offsets = element.positionedOffset();
-    var top     = offsets[1];
-    var left    = offsets[0];
-    var width   = element.clientWidth;
-    var height  = element.clientHeight;
-
-    element._originalLeft   = left - parseFloat(element.style.left  || 0);
-    element._originalTop    = top  - parseFloat(element.style.top || 0);
-    element._originalWidth  = element.style.width;
-    element._originalHeight = element.style.height;
-
-    element.style.position = 'absolute';
-    element.style.top    = top + 'px';
-    element.style.left   = left + 'px';
-    element.style.width  = width + 'px';
-    element.style.height = height + 'px';
-    return element;
-  },
-
-  relativize: function(element) {
-    element = $(element);
-    if (element.getStyle('position') == 'relative') return;
-    // Position.prepare(); // To be done manually by Scripty when it needs it.
-
-    element.style.position = 'relative';
-    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
-    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
-
-    element.style.top    = top + 'px';
-    element.style.left   = left + 'px';
-    element.style.height = element._originalHeight;
-    element.style.width  = element._originalWidth;
-    return element;
-  },
-
-  cumulativeScrollOffset: function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.scrollTop  || 0;
-      valueL += element.scrollLeft || 0;
-      element = element.parentNode;
-    } while (element);
-    return Element._returnOffset(valueL, valueT);
-  },
-
-  getOffsetParent: function(element) {
-    if (element.offsetParent) return $(element.offsetParent);
-    if (element == document.body) return $(element);
-
-    while ((element = element.parentNode) && element != document.body)
-      if (Element.getStyle(element, 'position') != 'static')
-        return $(element);
-
-    return $(document.body);
-  },
-
-  viewportOffset: function(forElement) {
-    var valueT = 0, valueL = 0;
-
-    var element = forElement;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
-
-      // Safari fix
-      if (element.offsetParent == document.body &&
-        Element.getStyle(element, 'position') == 'absolute') break;
-
-    } while (element = element.offsetParent);
-
-    element = forElement;
-    do {
-      if (!Prototype.Browser.Opera || element.tagName == 'BODY') {
-        valueT -= element.scrollTop  || 0;
-        valueL -= element.scrollLeft || 0;
-      }
-    } while (element = element.parentNode);
-
-    return Element._returnOffset(valueL, valueT);
-  },
-
-  clonePosition: function(element, source) {
-    var options = Object.extend({
-      setLeft:    true,
-      setTop:     true,
-      setWidth:   true,
-      setHeight:  true,
-      offsetTop:  0,
-      offsetLeft: 0
-    }, arguments[2] || { });
-
-    // find page position of source
-    source = $(source);
-    var p = source.viewportOffset();
-
-    // find coordinate system to use
-    element = $(element);
-    var delta = [0, 0];
-    var parent = null;
-    // delta [0,0] will do fine with position: fixed elements,
-    // position:absolute needs offsetParent deltas
-    if (Element.getStyle(element, 'position') == 'absolute') {
-      parent = element.getOffsetParent();
-      delta = parent.viewportOffset();
-    }
-
-    // correct by body offsets (fixes Safari)
-    if (parent == document.body) {
-      delta[0] -= document.body.offsetLeft;
-      delta[1] -= document.body.offsetTop;
-    }
-
-    // set position
-    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
-    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
-    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
-    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
-    return element;
-  }
-};
-
-Element.Methods.identify.counter = 1;
-
-Object.extend(Element.Methods, {
-  getElementsBySelector: Element.Methods.select,
-  childElements: Element.Methods.immediateDescendants
-});
-
-Element._attributeTranslations = {
-  write: {
-    names: {
-      className: 'class',
-      htmlFor:   'for'
-    },
-    values: { }
-  }
-};
-
-
-if (!document.createRange || Prototype.Browser.Opera) {
-  Element.Methods.insert = function(element, insertions) {
-    element = $(element);
-
-    if (Object.isString(insertions) || Object.isNumber(insertions) ||
-        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
-          insertions = { bottom: insertions };
-
-    var t = Element._insertionTranslations, content, position, pos, tagName;
-
-    for (position in insertions) {
-      content  = insertions[position];
-      position = position.toLowerCase();
-      pos      = t[position];
-
-      if (content && content.toElement) content = content.toElement();
-      if (Object.isElement(content)) {
-        pos.insert(element, content);
-        continue;
-      }
-
-      content = Object.toHTML(content);
-      tagName = ((position == 'before' || position == 'after')
-        ? element.parentNode : element).tagName.toUpperCase();
-
-      if (t.tags[tagName]) {
-        var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
-        if (position == 'top' || position == 'after') fragments.reverse();
-        fragments.each(pos.insert.curry(element));
-      }
-      else element.insertAdjacentHTML(pos.adjacency, content.stripScripts());
-
-      content.evalScripts.bind(content).defer();
-    }
-
-    return element;
-  };
-}
-
-if (Prototype.Browser.Opera) {
-  Element.Methods._getStyle = Element.Methods.getStyle;
-  Element.Methods.getStyle = function(element, style) {
-    switch(style) {
-      case 'left':
-      case 'top':
-      case 'right':
-      case 'bottom':
-        if (Element._getStyle(element, 'position') == 'static') return null;
-      default: return Element._getStyle(element, style);
-    }
-  };
-  Element.Methods._readAttribute = Element.Methods.readAttribute;
-  Element.Methods.readAttribute = function(element, attribute) {
-    if (attribute == 'title') return element.title;
-    return Element._readAttribute(element, attribute);
-  };
-}
-
-else if (Prototype.Browser.IE) {
-  $w('positionedOffset getOffsetParent viewportOffset').each(function(method) {
-    Element.Methods[method] = Element.Methods[method].wrap(
-      function(proceed, element) {
-        element = $(element);
-        var position = element.getStyle('position');
-        if (position != 'static') return proceed(element);
-        element.setStyle({ position: 'relative' });
-        var value = proceed(element);
-        element.setStyle({ position: position });
-        return value;
-      }
-    );
-  });
-
-  Element.Methods.getStyle = function(element, style) {
-    element = $(element);
-    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
-    var value = element.style[style];
-    if (!value && element.currentStyle) value = element.currentStyle[style];
-
-    if (style == 'opacity') {
-      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
-        if (value[1]) return parseFloat(value[1]) / 100;
-      return 1.0;
-    }
-
-    if (value == 'auto') {
-      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
-        return element['offset' + style.capitalize()] + 'px';
-      return null;
-    }
-    return value;
-  };
-
-  Element.Methods.setOpacity = function(element, value) {
-    function stripAlpha(filter){
-      return filter.replace(/alpha\([^\)]*\)/gi,'');
-    }
-    element = $(element);
-    var currentStyle = element.currentStyle;
-    if ((currentStyle && !currentStyle.hasLayout) ||
-      (!currentStyle && element.style.zoom == 'normal'))
-        element.style.zoom = 1;
-
-    var filter = element.getStyle('filter'), style = element.style;
-    if (value == 1 || value === '') {
-      (filter = stripAlpha(filter)) ?
-        style.filter = filter : style.removeAttribute('filter');
-      return element;
-    } else if (value < 0.00001) value = 0;
-    style.filter = stripAlpha(filter) +
-      'alpha(opacity=' + (value * 100) + ')';
-    return element;
-  };
-
-  Element._attributeTranslations = {
-    read: {
-      names: {
-        'class': 'className',
-        'for':   'htmlFor'
-      },
-      values: {
-        _getAttr: function(element, attribute) {
-          return element.getAttribute(attribute, 2);
-        },
-        _getAttrNode: function(element, attribute) {
-          var node = element.getAttributeNode(attribute);
-          return node ? node.value : "";
-        },
-        _getEv: function(element, attribute) {
-          var attribute = element.getAttribute(attribute);
-          return attribute ? attribute.toString().slice(23, -2) : null;
-        },
-        _flag: function(element, attribute) {
-          return $(element).hasAttribute(attribute) ? attribute : null;
-        },
-        style: function(element) {
-          return element.style.cssText.toLowerCase();
-        },
-        title: function(element) {
-          return element.title;
-        }
-      }
-    }
-  };
-
-  Element._attributeTranslations.write = {
-    names: Object.clone(Element._attributeTranslations.read.names),
-    values: {
-      checked: function(element, value) {
-        element.checked = !!value;
-      },
-
-      style: function(element, value) {
-        element.style.cssText = value ? value : '';
-      }
-    }
-  };
-
-  Element._attributeTranslations.has = {};
-
-  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
-      'encType maxLength readOnly longDesc').each(function(attr) {
-    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
-    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
-  });
-
-  (function(v) {
-    Object.extend(v, {
-      href:        v._getAttr,
-      src:         v._getAttr,
-      type:        v._getAttr,
-      action:      v._getAttrNode,
-      disabled:    v._flag,
-      checked:     v._flag,
-      readonly:    v._flag,
-      multiple:    v._flag,
-      onload:      v._getEv,
-      onunload:    v._getEv,
-      onclick:     v._getEv,
-      ondblclick:  v._getEv,
-      onmousedown: v._getEv,
-      onmouseup:   v._getEv,
-      onmouseover: v._getEv,
-      onmousemove: v._getEv,
-      onmouseout:  v._getEv,
-      onfocus:     v._getEv,
-      onblur:      v._getEv,
-      onkeypress:  v._getEv,
-      onkeydown:   v._getEv,
-      onkeyup:     v._getEv,
-      onsubmit:    v._getEv,
-      onreset:     v._getEv,
-      onselect:    v._getEv,
-      onchange:    v._getEv
-    });
-  })(Element._attributeTranslations.read.values);
-}
-
-else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
-  Element.Methods.setOpacity = function(element, value) {
-    element = $(element);
-    element.style.opacity = (value == 1) ? 0.999999 :
-      (value === '') ? '' : (value < 0.00001) ? 0 : value;
-    return element;
-  };
-}
-
-else if (Prototype.Browser.WebKit) {
-  Element.Methods.setOpacity = function(element, value) {
-    element = $(element);
-    element.style.opacity = (value == 1 || value === '') ? '' :
-      (value < 0.00001) ? 0 : value;
-
-    if (value == 1)
-      if(element.tagName == 'IMG' && element.width) {
-        element.width++; element.width--;
-      } else try {
-        var n = document.createTextNode(' ');
-        element.appendChild(n);
-        element.removeChild(n);
-      } catch (e) { }
-
-    return element;
-  };
-
-  // Safari returns margins on body which is incorrect if the child is absolutely
-  // positioned.  For performance reasons, redefine Position.cumulativeOffset for
-  // KHTML/WebKit only.
-  Element.Methods.cumulativeOffset = function(element) {
-    var valueT = 0, valueL = 0;
-    do {
-      valueT += element.offsetTop  || 0;
-      valueL += element.offsetLeft || 0;
-      if (element.offsetParent == document.body)
-        if (Element.getStyle(element, 'position') == 'absolute') break;
-
-      element = element.offsetParent;
-    } while (element);
-
-    return Element._returnOffset(valueL, valueT);
-  };
-}
-
-if (Prototype.Browser.IE || Prototype.Browser.Opera) {
-  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
-  Element.Methods.update = function(element, content) {
-    element = $(element);
-
-    if (content && content.toElement) content = content.toElement();
-    if (Object.isElement(content)) return element.update().insert(content);
-
-    content = Object.toHTML(content);
-    var tagName = element.tagName.toUpperCase();
-
-    if (tagName in Element._insertionTranslations.tags) {
-      $A(element.childNodes).each(function(node) { element.removeChild(node) });
-      Element._getContentFromAnonymousElement(tagName, content.stripScripts())
-        .each(function(node) { element.appendChild(node) });
-    }
-    else element.innerHTML = content.stripScripts();
-
-    content.evalScripts.bind(content).defer();
-    return element;
-  };
-}
-
-if (document.createElement('div').outerHTML) {
-  Element.Methods.replace = function(element, content) {
-    element = $(element);
-
-    if (content && content.toElement) content = content.toElement();
-    if (Object.isElement(content)) {
-      element.parentNode.replaceChild(content, element);
-      return element;
-    }
-
-    content = Object.toHTML(content);
-    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
-
-    if (Element._insertionTranslations.tags[tagName]) {
-      var nextSibling = element.next();
-      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
-      parent.removeChild(element);
-      if (nextSibling)
-        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
-      else
-        fragments.each(function(node) { parent.appendChild(node) });
-    }
-    else element.outerHTML = content.stripScripts();
-
-    content.evalScripts.bind(content).defer();
-    return element;
-  };
-}
-
-Element._returnOffset = function(l, t) {
-  var result = [l, t];
-  result.left = l;
-  result.top = t;
-  return result;
-};
-
-Element._getContentFromAnonymousElement = function(tagName, html) {
-  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
-  div.innerHTML = t[0] + html + t[1];
-  t[2].times(function() { div = div.firstChild });
-  return $A(div.childNodes);
-};
-
-Element._insertionTranslations = {
-  before: {
-    adjacency: 'beforeBegin',
-    insert: function(element, node) {
-      element.parentNode.insertBefore(node, element);
-    },
-    initializeRange: function(element, range) {
-      range.setStartBefore(element);
-    }
-  },
-  top: {
-    adjacency: 'afterBegin',
-    insert: function(element, node) {
-      element.insertBefore(node, element.firstChild);
-    },
-    initializeRange: function(element, range) {
-      range.selectNodeContents(element);
-      range.collapse(true);
-    }
-  },
-  bottom: {
-    adjacency: 'beforeEnd',
-    insert: function(element, node) {
-      element.appendChild(node);
-    }
-  },
-  after: {
-    adjacency: 'afterEnd',
-    insert: function(element, node) {
-      element.parentNode.insertBefore(node, element.nextSibling);
-    },
-    initializeRange: function(element, range) {
-      range.setStartAfter(element);
-    }
-  },
-  tags: {
-    TABLE:  ['<table>',                '</table>',                   1],
-    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
-    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
-    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
-    SELECT: ['<select>',               '</select>',                  1]
-  }
-};
-
-(function() {
-  this.bottom.initializeRange = this.top.initializeRange;
-  Object.extend(this.tags, {
-    THEAD: this.tags.TBODY,
-    TFOOT: this.tags.TBODY,
-    TH:    this.tags.TD
-  });
-}).call(Element._insertionTranslations);
-
-Element.Methods.Simulated = {
-  hasAttribute: function(element, attribute) {
-    attribute = Element._attributeTranslations.has[attribute] || attribute;
-    var node = $(element).getAttributeNode(attribute);
-    return node && node.specified;
-  }
-};
-
-Element.Methods.ByTag = { };
-
-Object.extend(Element, Element.Methods);
-
-if (!Prototype.BrowserFeatures.ElementExtensions &&
-    document.createElement('div').__proto__) {
-  window.HTMLElement = { };
-  window.HTMLElement.prototype = document.createElement('div').__proto__;
-  Prototype.BrowserFeatures.ElementExtensions = true;
-}
-
-Element.extend = (function() {
-  if (Prototype.BrowserFeatures.SpecificElementExtensions)
-    return Prototype.K;
-
-  var Methods = { }, ByTag = Element.Methods.ByTag;
-
-  var extend = Object.extend(function(element) {
-    if (!element || element._extendedByPrototype ||
-        element.nodeType != 1 || element == window) return element;
-
-    var methods = Object.clone(Methods),
-      tagName = element.tagName, property, value;
-
-    // extend methods for specific tags
-    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
-
-    for (property in methods) {
-      value = methods[property];
-      if (Object.isFunction(value) && !(property in element))
-        element[property] = value.methodize();
-    }
-
-    element._extendedByPrototype = Prototype.emptyFunction;
-    return element;
-
-  }, {
-    refresh: function() {
-      // extend methods for all tags (Safari doesn't need this)
-      if (!Prototype.BrowserFeatures.ElementExtensions) {
-        Object.extend(Methods, Element.Methods);
-        Object.extend(Methods, Element.Methods.Simulated);
-      }
-    }
-  });
-
-  extend.refresh();
-  return extend;
-})();
-
-Element.hasAttribute = function(element, attribute) {
-  if (element.hasAttribute) return element.hasAttribute(attribute);
-  return Element.Methods.Simulated.hasAttribute(element, attribute);
-};
-
-Element.addMethods = function(methods) {
-  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
-
-  if (!methods) {
-    Object.extend(Form, Form.Methods);
-    Object.extend(Form.Element, Form.Element.Methods);
-    Object.extend(Element.Methods.ByTag, {
-      "FORM":     Object.clone(Form.Methods),
-      "INPUT":    Object.clone(Form.Element.Methods),
-      "SELECT":   Object.clone(Form.Element.Methods),
-      "TEXTAREA": Object.clone(Form.Element.Methods)
-    });
-  }
-
-  if (arguments.length == 2) {
-    var tagName = methods;
-    methods = arguments[1];
-  }
-
-  if (!tagName) Object.extend(Element.Methods, methods || { });
-  else {
-    if (Object.isArray(tagName)) tagName.each(extend);
-    else extend(tagName);
-  }
-
-  function extend(tagName) {
-    tagName = tagName.toUpperCase();
-    if (!Element.Methods.ByTag[tagName])
-      Element.Methods.ByTag[tagName] = { };
-    Object.extend(Element.Methods.ByTag[tagName], methods);
-  }
-
-  function copy(methods, destination, onlyIfAbsent) {
-    onlyIfAbsent = onlyIfAbsent || false;
-    for (var property in methods) {
-      var value = methods[property];
-      if (!Object.isFunction(value)) continue;
-      if (!onlyIfAbsent || !(property in destination))
-        destination[property] = value.methodize();
-    }
-  }
-
-  function findDOMClass(tagName) {
-    var klass;
-    var trans = {
-      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
-      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
-      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
-      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
-      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
-      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
-      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
-      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
-      "FrameSet", "IFRAME": "IFrame"
-    };
-    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
-    if (window[klass]) return window[klass];
-    klass = 'HTML' + tagName + 'Element';
-    if (window[klass]) return window[klass];
-    klass = 'HTML' + tagName.capitalize() + 'Element';
-    if (window[klass]) return window[klass];
-
-    window[klass] = { };
-    window[klass].prototype = document.createElement(tagName).__proto__;
-    return window[klass];
-  }
-
-  if (F.ElementExtensions) {
-    copy(Element.Methods, HTMLElement.prototype);
-    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
-  }
-
-  if (F.SpecificElementExtensions) {
-    for (var tag in Element.Methods.ByTag) {
-      var klass = findDOMClass(tag);
-      if (Object.isUndefined(klass)) continue;
-      copy(T[tag], klass.prototype);
-    }
-  }
-
-  Object.extend(Element, Element.Methods);
-  delete Element.ByTag;
-
-  if (Element.extend.refresh) Element.extend.refresh();
-  Element.cache = { };
-};
-
-document.viewport = {
-  getDimensions: function() {
-    var dimensions = { };
-    $w('width height').each(function(d) {
-      var D = d.capitalize();
-      dimensions[d] = self['inner' + D] ||
-       (document.documentElement['client' + D] || document.body['client' + D]);
-    });
-    return dimensions;
-  },
-
-  getWidth: function() {
-    return this.getDimensions().width;
-  },
-
-  getHeight: function() {
-    return this.getDimensions().height;
-  },
-
-  getScrollOffsets: function() {
-    return Element._returnOffset(
-      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
-      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
-  }
-};
-/* Portions of the Selector class are derived from Jack Slocum’s DomQuery,
- * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
- * license.  Please see http://www.yui-ext.com/ for more information. */
-
-var Selector = Class.create({
-  initialize: function(expression) {
-    this.expression = expression.strip();
-    this.compileMatcher();
-  },
-
-  compileMatcher: function() {
-    // Selectors with namespaced attributes can't use the XPath version
-    if (Prototype.BrowserFeatures.XPath && !(/(\[[\w-]*?:|:checked)/).test(this.expression))
-      return this.compileXPathMatcher();
-
-    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
-        c = Selector.criteria, le, p, m;
-
-    if (Selector._cache[e]) {
-      this.matcher = Selector._cache[e];
-      return;
-    }
-
-    this.matcher = ["this.matcher = function(root) {",
-                    "var r = root, h = Selector.handlers, c = false, n;"];
-
-    while (e && le != e && (/\S/).test(e)) {
-      le = e;
-      for (var i in ps) {
-        p = ps[i];
-        if (m = e.match(p)) {
-          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
-    	      new Template(c[i]).evaluate(m));
-          e = e.replace(m[0], '');
-          break;
-        }
-      }
-    }
-
-    this.matcher.push("return h.unique(n);\n}");
-    eval(this.matcher.join('\n'));
-    Selector._cache[this.expression] = this.matcher;
-  },
-
-  compileXPathMatcher: function() {
-    var e = this.expression, ps = Selector.patterns,
-        x = Selector.xpath, le, m;
-
-    if (Selector._cache[e]) {
-      this.xpath = Selector._cache[e]; return;
-    }
-
-    this.matcher = ['.//*'];
-    while (e && le != e && (/\S/).test(e)) {
-      le = e;
-      for (var i in ps) {
-        if (m = e.match(ps[i])) {
-          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
-            new Template(x[i]).evaluate(m));
-          e = e.replace(m[0], '');
-          break;
-        }
-      }
-    }
-
-    this.xpath = this.matcher.join('');
-    Selector._cache[this.expression] = this.xpath;
-  },
-
-  findElements: function(root) {
-    root = root || document;
-    if (this.xpath) return document._getElementsByXPath(this.xpath, root);
-    return this.matcher(root);
-  },
-
-  match: function(element) {
-    this.tokens = [];
-
-    var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
-    var le, p, m;
-
-    while (e && le !== e && (/\S/).test(e)) {
-      le = e;
-      for (var i in ps) {
-        p = ps[i];
-        if (m = e.match(p)) {
-          // use the Selector.assertions methods unless the selector
-          // is too complex.
-          if (as[i]) {
-            this.tokens.push([i, Object.clone(m)]);
-            e = e.replace(m[0], '');
-          } else {
-            // reluctantly do a document-wide search
-            // and look for a match in the array
-            return this.findElements(document).include(element);
-          }
-        }
-      }
-    }
-
-    var match = true, name, matches;
-    for (var i = 0, token; token = this.tokens[i]; i++) {
-      name = token[0], matches = token[1];
-      if (!Selector.assertions[name](element, matches)) {
-        match = false; break;
-      }
-    }
-
-    return match;
-  },
-
-  toString: function() {
-    return this.expression;
-  },
-
-  inspect: function() {
-    return "#<Selector:" + this.expression.inspect() + ">";
-  }
-});
-
-Object.extend(Selector, {
-  _cache: { },
-
-  xpath: {
-    descendant:   "//*",
-    child:        "/*",
-    adjacent:     "/following-sibling::*[1]",
-    laterSibling: '/following-sibling::*',
-    tagName:      function(m) {
-      if (m[1] == '*') return '';
-      return "[local-name()='" + m[1].toLowerCase() +
-             "' or local-name()='" + m[1].toUpperCase() + "']";
-    },
-    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
-    id:           "[@id='#{1}']",
-    attrPresence: "[@#{1}]",
-    attr: function(m) {
-      m[3] = m[5] || m[6];
-      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
-    },
-    pseudo: function(m) {
-      var h = Selector.xpath.pseudos[m[1]];
-      if (!h) return '';
-      if (Object.isFunction(h)) return h(m);
-      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
-    },
-    operators: {
-      '=':  "[@#{1}='#{3}']",
-      '!=': "[@#{1}!='#{3}']",
-      '^=': "[starts-with(@#{1}, '#{3}')]",
-      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
-      '*=': "[contains(@#{1}, '#{3}')]",
-      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
-      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
-    },
-    pseudos: {
-      'first-child': '[not(preceding-sibling::*)]',
-      'last-child':  '[not(following-sibling::*)]',
-      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
-      'empty':       "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
-      'checked':     "[@checked]",
-      'disabled':    "[@disabled]",
-      'enabled':     "[not(@disabled)]",
-      'not': function(m) {
-        var e = m[6], p = Selector.patterns,
-            x = Selector.xpath, le, m, v;
-
-        var exclusion = [];
-        while (e && le != e && (/\S/).test(e)) {
-          le = e;
-          for (var i in p) {
-            if (m = e.match(p[i])) {
-              v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
-              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
-              e = e.replace(m[0], '');
-              break;
-            }
-          }
-        }
-        return "[not(" + exclusion.join(" and ") + ")]";
-      },
-      'nth-child':      function(m) {
-        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
-      },
-      'nth-last-child': function(m) {
-        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
-      },
-      'nth-of-type':    function(m) {
-        return Selector.xpath.pseudos.nth("position() ", m);
-      },
-      'nth-last-of-type': function(m) {
-        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
-      },
-      'first-of-type':  function(m) {
-        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
-      },
-      'last-of-type':   function(m) {
-        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
-      },
-      'only-of-type':   function(m) {
-        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
-      },
-      nth: function(fragment, m) {
-        var mm, formula = m[6], predicate;
-        if (formula == 'even') formula = '2n+0';
-        if (formula == 'odd')  formula = '2n+1';
-        if (mm = formula.match(/^(\d+)$/)) // digit only
-          return '[' + fragment + "= " + mm[1] + ']';
-        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
-          if (mm[1] == "-") mm[1] = -1;
-          var a = mm[1] ? Number(mm[1]) : 1;
-          var b = mm[2] ? Number(mm[2]) : 0;
-          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
-          "((#{fragment} - #{b}) div #{a} >= 0)]";
-          return new Template(predicate).evaluate({
-            fragment: fragment, a: a, b: b });
-        }
-      }
-    }
-  },
-
-  criteria: {
-    tagName:      'n = h.tagName(n, r, "#{1}", c);   c = false;',
-    className:    'n = h.className(n, r, "#{1}", c); c = false;',
-    id:           'n = h.id(n, r, "#{1}", c);        c = false;',
-    attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;',
-    attr: function(m) {
-      m[3] = (m[5] || m[6]);
-      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m);
-    },
-    pseudo: function(m) {
-      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
-      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
-    },
-    descendant:   'c = "descendant";',
-    child:        'c = "child";',
-    adjacent:     'c = "adjacent";',
-    laterSibling: 'c = "laterSibling";'
-  },
-
-  patterns: {
-    // combinators must be listed first
-    // (and descendant needs to be last combinator)
-    laterSibling: /^\s*~\s*/,
-    child:        /^\s*>\s*/,
-    adjacent:     /^\s*\+\s*/,
-    descendant:   /^\s/,
-
-    // selectors follow
-    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
-    id:           /^#([\w\-\*]+)(\b|$)/,
-    className:    /^\.([\w\-\*]+)(\b|$)/,
-    pseudo:       /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s)|(?=:))/,
-    attrPresence: /^\[([\w]+)\]/,
-    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
-  },
-
-  // for Selector.match and Element#match
-  assertions: {
-    tagName: function(element, matches) {
-      return matches[1].toUpperCase() == element.tagName.toUpperCase();
-    },
-
-    className: function(element, matches) {
-      return Element.hasClassName(element, matches[1]);
-    },
-
-    id: function(element, matches) {
-      return element.id === matches[1];
-    },
-
-    attrPresence: function(element, matches) {
-      return Element.hasAttribute(element, matches[1]);
-    },
-
-    attr: function(element, matches) {
-      var nodeValue = Element.readAttribute(element, matches[1]);
-      return Selector.operators[matches[2]](nodeValue, matches[3]);
-    }
-  },
-
-  handlers: {
-    // UTILITY FUNCTIONS
-    // joins two collections
-    concat: function(a, b) {
-      for (var i = 0, node; node = b[i]; i++)
-        a.push(node);
-      return a;
-    },
-
-    // marks an array of nodes for counting
-    mark: function(nodes) {
-      for (var i = 0, node; node = nodes[i]; i++)
-        node._counted = true;
-      return nodes;
-    },
-
-    unmark: function(nodes) {
-      for (var i = 0, node; node = nodes[i]; i++)
-        node._counted = undefined;
-      return nodes;
-    },
-
-    // mark each child node with its position (for nth calls)
-    // "ofType" flag indicates whether we're indexing for nth-of-type
-    // rather than nth-child
-    index: function(parentNode, reverse, ofType) {
-      parentNode._counted = true;
-      if (reverse) {
-        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
-          var node = nodes[i];
-          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
-        }
-      } else {
-        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
-          if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++;
-      }
-    },
-
-    // filters out duplicates and extends all nodes
-    unique: function(nodes) {
-      if (nodes.length == 0) return nodes;
-      var results = [], n;
-      for (var i = 0, l = nodes.length; i < l; i++)
-        if (!(n = nodes[i])._counted) {
-          n._counted = true;
-          results.push(Element.extend(n));
-        }
-      return Selector.handlers.unmark(results);
-    },
-
-    // COMBINATOR FUNCTIONS
-    descendant: function(nodes) {
-      var h = Selector.handlers;
-      for (var i = 0, results = [], node; node = nodes[i]; i++)
-        h.concat(results, node.getElementsByTagName('*'));
-      return results;
-    },
-
-    child: function(nodes) {
-      var h = Selector.handlers;
-      for (var i = 0, results = [], node; node = nodes[i]; i++) {
-        for (var j = 0, children = [], child; child = node.childNodes[j]; j++)
-          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
-      }
-      return results;
-    },
-
-    adjacent: function(nodes) {
-      for (var i = 0, results = [], node; node = nodes[i]; i++) {
-        var next = this.nextElementSibling(node);
-        if (next) results.push(next);
-      }
-      return results;
-    },
-
-    laterSibling: function(nodes) {
-      var h = Selector.handlers;
-      for (var i = 0, results = [], node; node = nodes[i]; i++)
-        h.concat(results, Element.nextSiblings(node));
-      return results;
-    },
-
-    nextElementSibling: function(node) {
-      while (node = node.nextSibling)
-	      if (node.nodeType == 1) return node;
-      return null;
-    },
-
-    previousElementSibling: function(node) {
-      while (node = node.previousSibling)
-        if (node.nodeType == 1) return node;
-      return null;
-    },
-
-    // TOKEN FUNCTIONS
-    tagName: function(nodes, root, tagName, combinator) {
-      tagName = tagName.toUpperCase();
-      var results = [], h = Selector.handlers;
-      if (nodes) {
-        if (combinator) {
-          // fastlane for ordinary descendant combinators
-          if (combinator == "descendant") {
-            for (var i = 0, node; node = nodes[i]; i++)
-              h.concat(results, node.getElementsByTagName(tagName));
-            return results;
-          } else nodes = this[combinator](nodes);
-          if (tagName == "*") return nodes;
-        }
-        for (var i = 0, node; node = nodes[i]; i++)
-          if (node.tagName.toUpperCase() == tagName) results.push(node);
-        return results;
-      } else return root.getElementsByTagName(tagName);
-    },
-
-    id: function(nodes, root, id, combinator) {
-      var targetNode = $(id), h = Selector.handlers;
-      if (!targetNode) return [];
-      if (!nodes && root == document) return [targetNode];
-      if (nodes) {
-        if (combinator) {
-          if (combinator == 'child') {
-            for (var i = 0, node; node = nodes[i]; i++)
-              if (targetNode.parentNode == node) return [targetNode];
-          } else if (combinator == 'descendant') {
-            for (var i = 0, node; node = nodes[i]; i++)
-              if (Element.descendantOf(targetNode, node)) return [targetNode];
-          } else if (combinator == 'adjacent') {
-            for (var i = 0, node; node = nodes[i]; i++)
-              if (Selector.handlers.previousElementSibling(targetNode) == node)
-                return [targetNode];
-          } else nodes = h[combinator](nodes);
-        }
-        for (var i = 0, node; node = nodes[i]; i++)
-          if (node == targetNode) return [targetNode];
-        return [];
-      }
-      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
-    },
-
-    className: function(nodes, root, className, combinator) {
-      if (nodes && combinator) nodes = this[combinator](nodes);
-      return Selector.handlers.byClassName(nodes, root, className);
-    },
-
-    byClassName: function(nodes, root, className) {
-      if (!nodes) nodes = Selector.handlers.descendant([root]);
-      var needle = ' ' + className + ' ';
-      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
-        nodeClassName = node.className;
-        if (nodeClassName.length == 0) continue;
-        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
-          results.push(node);
-      }
-      return results;
-    },
-
-    attrPresence: function(nodes, root, attr) {
-      if (!nodes) nodes = root.getElementsByTagName("*");
-      var results = [];
-      for (var i = 0, node; node = nodes[i]; i++)
-        if (Element.hasAttribute(node, attr)) results.push(node);
-      return results;
-    },
-
-    attr: function(nodes, root, attr, value, operator) {
-      if (!nodes) nodes = root.getElementsByTagName("*");
-      var handler = Selector.operators[operator], results = [];
-      for (var i = 0, node; node = nodes[i]; i++) {
-        var nodeValue = Element.readAttribute(node, attr);
-        if (nodeValue === null) continue;
-        if (handler(nodeValue, value)) results.push(node);
-      }
-      return results;
-    },
-
-    pseudo: function(nodes, name, value, root, combinator) {
-      if (nodes && combinator) nodes = this[combinator](nodes);
-      if (!nodes) nodes = root.getElementsByTagName("*");
-      return Selector.pseudos[name](nodes, value, root);
-    }
-  },
-
-  pseudos: {
-    'first-child': function(nodes, value, root) {
-      for (var i = 0, results = [], node; node = nodes[i]; i++) {
-        if (Selector.handlers.previousElementSibling(node)) continue;
-          results.push(node);
-      }
-      return results;
-    },
-    'last-child': function(nodes, value, root) {
-      for (var i = 0, results = [], node; node = nodes[i]; i++) {
-        if (Selector.handlers.nextElementSibling(node)) continue;
-          results.push(node);
-      }
-      return results;
-    },
-    'only-child': function(nodes, value, root) {
-      var h = Selector.handlers;
-      for (var i = 0, results = [], node; node = nodes[i]; i++)
-        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
-          results.push(node);
-      return results;
-    },
-    'nth-child':        function(nodes, formula, root) {
-      return Selector.pseudos.nth(nodes, formula, root);
-    },
-    'nth-last-child':   function(nodes, formula, root) {
-      return Selector.pseudos.nth(nodes, formula, root, true);
-    },
-    'nth-of-type':      function(nodes, formula, root) {
-      return Selector.pseudos.nth(nodes, formula, root, false, true);
-    },
-    'nth-last-of-type': function(nodes, formula, root) {
-      return Selector.pseudos.nth(nodes, formula, root, true, true);
-    },
-    'first-of-type':    function(nodes, formula, root) {
-      return Selector.pseudos.nth(nodes, "1", root, false, true);
-    },
-    'last-of-type':     function(nodes, formula, root) {
-      return Selector.pseudos.nth(nodes, "1", root, true, true);
-    },
-    'only-of-type':     function(nodes, formula, root) {
-      var p = Selector.pseudos;
-      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
-    },
-
-    // handles the an+b logic
-    getIndices: function(a, b, total) {
-      if (a == 0) return b > 0 ? [b] : [];
-      return $R(1, total).inject([], function(memo, i) {
-        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
-        return memo;
-      });
-    },
-
-    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
-    nth: function(nodes, formula, root, reverse, ofType) {
-      if (nodes.length == 0) return [];
-      if (formula == 'even') formula = '2n+0';
-      if (formula == 'odd')  formula = '2n+1';
-      var h = Selector.handlers, results = [], indexed = [], m;
-      h.mark(nodes);
-      for (var i = 0, node; node = nodes[i]; i++) {
-        if (!node.parentNode._counted) {
-          h.index(node.parentNode, reverse, ofType);
-          indexed.push(node.parentNode);
-        }
-      }
-      if (formula.match(/^\d+$/)) { // just a number
-        formula = Number(formula);
-        for (var i = 0, node; node = nodes[i]; i++)
-          if (node.nodeIndex == formula) results.push(node);
-      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
-        if (m[1] == "-") m[1] = -1;
-        var a = m[1] ? Number(m[1]) : 1;
-        var b = m[2] ? Number(m[2]) : 0;
-        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
-        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
-          for (var j = 0; j < l; j++)
-            if (node.nodeIndex == indices[j]) results.push(node);
-        }
-      }
-      h.unmark(nodes);
-      h.unmark(indexed);
-      return results;
-    },
-
-    'empty': function(nodes, value, root) {
-      for (var i = 0, results = [], node; node = nodes[i]; i++) {
-        // IE treats comments as element nodes
-        if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
-        results.push(node);
-      }
-      return results;
-    },
-
-    'not': function(nodes, selector, root) {
-      var h = Selector.handlers, selectorType, m;
-      var exclusions = new Selector(selector).findElements(root);
-      h.mark(exclusions);
-      for (var i = 0, results = [], node; node = nodes[i]; i++)
-        if (!node._counted) results.push(node);
-      h.unmark(exclusions);
-      return results;
-    },
-
-    'enabled': function(nodes, value, root) {
-      for (var i = 0, results = [], node; node = nodes[i]; i++)
-        if (!node.disabled) results.push(node);
-      return results;
-    },
-
-    'disabled': function(nodes, value, root) {
-      for (var i = 0, results = [], node; node = nodes[i]; i++)
-        if (node.disabled) results.push(node);
-      return results;
-    },
-
-    'checked': function(nodes, value, root) {
-      for (var i = 0, results = [], node; node = nodes[i]; i++)
-        if (node.checked) results.push(node);
-      return results;
-    }
-  },
-
-  operators: {
-    '=':  function(nv, v) { return nv == v; },
-    '!=': function(nv, v) { return nv != v; },
-    '^=': function(nv, v) { return nv.startsWith(v); },
-    '$=': function(nv, v) { return nv.endsWith(v); },
-    '*=': function(nv, v) { return nv.include(v); },
-    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
-    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
-  },
-
-  matchElements: function(elements, expression) {
-    var matches = new Selector(expression).findElements(), h = Selector.handlers;
-    h.mark(matches);
-    for (var i = 0, results = [], element; element = elements[i]; i++)
-      if (element._counted) results.push(element);
-    h.unmark(matches);
-    return results;
-  },
-
-  findElement: function(elements, expression, index) {
-    if (Object.isNumber(expression)) {
-      index = expression; expression = false;
-    }
-    return Selector.matchElements(elements, expression || '*')[index || 0];
-  },
-
-  findChildElements: function(element, expressions) {
-    var exprs = expressions.join(','), expressions = [];
-    exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
-      expressions.push(m[1].strip());
-    });
-    var results = [], h = Selector.handlers;
-    for (var i = 0, l = expressions.length, selector; i < l; i++) {
-      selector = new Selector(expressions[i].strip());
-      h.concat(results, selector.findElements(element));
-    }
-    return (l > 1) ? h.unique(results) : results;
-  }
-});
-
-function $$() {
-  return Selector.findChildElements(document, $A(arguments));
-}
-var Form = {
-  reset: function(form) {
-    $(form).reset();
-    return form;
-  },
-
-  serializeElements: function(elements, options) {
-    if (typeof options != 'object') options = { hash: !!options };
-    else if (options.hash === undefined) options.hash = true;
-    var key, value, submitted = false, submit = options.submit;
-
-    var data = elements.inject({ }, function(result, element) {
-      if (!element.disabled && element.name) {
-        key = element.name; value = $(element).getValue();
-        if (value != null && (element.type != 'submit' || (!submitted &&
-            submit !== false && (!submit || key == submit) && (submitted = true)))) {
-          if (key in result) {
-            // a key is already present; construct an array of values
-            if (!Object.isArray(result[key])) result[key] = [result[key]];
-            result[key].push(value);
-          }
-          else result[key] = value;
-        }
-      }
-      return result;
-    });
-
-    return options.hash ? data : Object.toQueryString(data);
-  }
-};
-
-Form.Methods = {
-  serialize: function(form, options) {
-    return Form.serializeElements(Form.getElements(form), options);
-  },
-
-  getElements: function(form) {
-    return $A($(form).getElementsByTagName('*')).inject([],
-      function(elements, child) {
-        if (Form.Element.Serializers[child.tagName.toLowerCase()])
-          elements.push(Element.extend(child));
-        return elements;
-      }
-    );
-  },
-
-  getInputs: function(form, typeName, name) {
-    form = $(form);
-    var inputs = form.getElementsByTagName('input');
-
-    if (!typeName && !name) return $A(inputs).map(Element.extend);
-
-    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
-      var input = inputs[i];
-      if ((typeName && input.type != typeName) || (name && input.name != name))
-        continue;
-      matchingInputs.push(Element.extend(input));
-    }
-
-    return matchingInputs;
-  },
-
-  disable: function(form) {
-    form = $(form);
-    Form.getElements(form).invoke('disable');
-    return form;
-  },
-
-  enable: function(form) {
-    form = $(form);
-    Form.getElements(form).invoke('enable');
-    return form;
-  },
-
-  findFirstElement: function(form) {
-    var elements = $(form).getElements().findAll(function(element) {
-      return 'hidden' != element.type && !element.disabled;
-    });
-    var firstByIndex = elements.findAll(function(element) {
-      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
-    }).sortBy(function(element) { return element.tabIndex }).first();
-
-    return firstByIndex ? firstByIndex : elements.find(function(element) {
-      return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
-    });
-  },
-
-  focusFirstElement: function(form) {
-    form = $(form);
-    form.findFirstElement().activate();
-    return form;
-  },
-
-  request: function(form, options) {
-    form = $(form), options = Object.clone(options || { });
-
-    var params = options.parameters, action = form.readAttribute('action') || '';
-    if (action.blank()) action = window.location.href;
-    options.parameters = form.serialize(true);
-
-    if (params) {
-      if (Object.isString(params)) params = params.toQueryParams();
-      Object.extend(options.parameters, params);
-    }
-
-    if (form.hasAttribute('method') && !options.method)
-      options.method = form.method;
-
-    return new Ajax.Request(action, options);
-  }
-};
-
-/*--------------------------------------------------------------------------*/
-
-Form.Element = {
-  focus: function(element) {
-    $(element).focus();
-    return element;
-  },
-
-  select: function(element) {
-    $(element).select();
-    return element;
-  }
-};
-
-Form.Element.Methods = {
-  serialize: function(element) {
-    element = $(element);
-    if (!element.disabled && element.name) {
-      var value = element.getValue();
-      if (value != undefined) {
-        var pair = { };
-        pair[element.name] = value;
-        return Object.toQueryString(pair);
-      }
-    }
-    return '';
-  },
-
-  getValue: function(element) {
-    element = $(element);
-    var method = element.tagName.toLowerCase();
-    return Form.Element.Serializers[method](element);
-  },
-
-  setValue: function(element, value) {
-    element = $(element);
-    var method = element.tagName.toLowerCase();
-    Form.Element.Serializers[method](element, value);
-    return element;
-  },
-
-  clear: function(element) {
-    $(element).value = '';
-    return element;
-  },
-
-  present: function(element) {
-    return $(element).value != '';
-  },
-
-  activate: function(element) {
-    element = $(element);
-    try {
-      element.focus();
-      if (element.select && (element.tagName.toLowerCase() != 'input' ||
-          !['button', 'reset', 'submit'].include(element.type)))
-        element.select();
-    } catch (e) { }
-    return element;
-  },
-
-  disable: function(element) {
-    element = $(element);
-    element.blur();
-    element.disabled = true;
-    return element;
-  },
-
-  enable: function(element) {
-    element = $(element);
-    element.disabled = false;
-    return element;
-  }
-};
-
-/*--------------------------------------------------------------------------*/
-
-var Field = Form.Element;
-var $F = Form.Element.Methods.getValue;
-
-/*--------------------------------------------------------------------------*/
-
-Form.Element.Serializers = {
-  input: function(element, value) {
-    switch (element.type.toLowerCase()) {
-      case 'checkbox':
-      case 'radio':
-        return Form.Element.Serializers.inputSelector(element, value);
-      default:
-        return Form.Element.Serializers.textarea(element, value);
-    }
-  },
-
-  inputSelector: function(element, value) {
-    if (value === undefined) return element.checked ? element.value : null;
-    else element.checked = !!value;
-  },
-
-  textarea: function(element, value) {
-    if (value === undefined) return element.value;
-    else element.value = value;
-  },
-
-  select: function(element, index) {
-    if (index === undefined)
-      return this[element.type == 'select-one' ?
-        'selectOne' : 'selectMany'](element);
-    else {
-      var opt, value, single = !Object.isArray(index);
-      for (var i = 0, length = element.length; i < length; i++) {
-        opt = element.options[i];
-        value = this.optionValue(opt);
-        if (single) {
-          if (value == index) {
-            opt.selected = true;
-            return;
-          }
-        }
-        else opt.selected = index.include(value);
-      }
-    }
-  },
-
-  selectOne: function(element) {
-    var index = element.selectedIndex;
-    return index >= 0 ? this.optionValue(element.options[index]) : null;
-  },
-
-  selectMany: function(element) {
-    var values, length = element.length;
-    if (!length) return null;
-
-    for (var i = 0, values = []; i < length; i++) {
-      var opt = element.options[i];
-      if (opt.selected) values.push(this.optionValue(opt));
-    }
-    return values;
-  },
-
-  optionValue: function(opt) {
-    // extend element because hasAttribute may not be native
-    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
-  }
-};
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
-  initialize: function($super, element, frequency, callback) {
-    $super(callback, frequency);
-    this.element   = $(element);
-    this.lastValue = this.getValue();
-  },
-
-  execute: function() {
-    var value = this.getValue();
-    if (Object.isString(this.lastValue) && Object.isString(value) ?
-        this.lastValue != value : String(this.lastValue) != String(value)) {
-      this.callback(this.element, value);
-      this.lastValue = value;
-    }
-  }
-});
-
-Form.Element.Observer = Class.create(Abstract.TimedObserver, {
-  getValue: function() {
-    return Form.Element.getValue(this.element);
-  }
-});
-
-Form.Observer = Class.create(Abstract.TimedObserver, {
-  getValue: function() {
-    return Form.serialize(this.element);
-  }
-});
-
-/*--------------------------------------------------------------------------*/
-
-Abstract.EventObserver = Class.create({
-  initialize: function(element, callback) {
-    this.element  = $(element);
-    this.callback = callback;
-
-    this.lastValue = this.getValue();
-    if (this.element.tagName.toLowerCase() == 'form')
-      this.registerFormCallbacks();
-    else
-      this.registerCallback(this.element);
-  },
-
-  onElementEvent: function() {
-    var value = this.getValue();
-    if (this.lastValue != value) {
-      this.callback(this.element, value);
-      this.lastValue = value;
-    }
-  },
-
-  registerFormCallbacks: function() {
-    Form.getElements(this.element).each(this.registerCallback, this);
-  },
-
-  registerCallback: function(element) {
-    if (element.type) {
-      switch (element.type.toLowerCase()) {
-        case 'checkbox':
-        case 'radio':
-          Event.observe(element, 'click', this.onElementEvent.bind(this));
-          break;
-        default:
-          Event.observe(element, 'change', this.onElementEvent.bind(this));
-          break;
-      }
-    }
-  }
-});
-
-Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
-  getValue: function() {
-    return Form.Element.getValue(this.element);
-  }
-});
-
-Form.EventObserver = Class.create(Abstract.EventObserver, {
-  getValue: function() {
-    return Form.serialize(this.element);
-  }
-});
-if (!window.Event) var Event = { };
-
-Object.extend(Event, {
-  KEY_BACKSPACE: 8,
-  KEY_TAB:       9,
-  KEY_RETURN:   13,
-  KEY_ESC:      27,
-  KEY_LEFT:     37,
-  KEY_UP:       38,
-  KEY_RIGHT:    39,
-  KEY_DOWN:     40,
-  KEY_DELETE:   46,
-  KEY_HOME:     36,
-  KEY_END:      35,
-  KEY_PAGEUP:   33,
-  KEY_PAGEDOWN: 34,
-  KEY_INSERT:   45,
-
-  cache: { },
-
-  relatedTarget: function(event) {
-    var element;
-    switch(event.type) {
-      case 'mouseover': element = event.fromElement; break;
-      case 'mouseout':  element = event.toElement;   break;
-      default: return null;
-    }
-    return Element.extend(element);
-  }
-});
-
-Event.Methods = (function() {
-  var isButton;
-
-  if (Prototype.Browser.IE) {
-    var buttonMap = { 0: 1, 1: 4, 2: 2 };
-    isButton = function(event, code) {
-      return event.button == buttonMap[code];
-    };
-
-  } else if (Prototype.Browser.WebKit) {
-    isButton = function(event, code) {
-      switch (code) {
-        case 0: return event.which == 1 && !event.metaKey;
-        case 1: return event.which == 1 && event.metaKey;
-        default: return false;
-      }
-    };
-
-  } else {
-    isButton = function(event, code) {
-      return event.which ? (event.which === code + 1) : (event.button === code);
-    };
-  }
-
-  return {
-    isLeftClick:   function(event) { return isButton(event, 0) },
-    isMiddleClick: function(event) { return isButton(event, 1) },
-    isRightClick:  function(event) { return isButton(event, 2) },
-
-    element: function(event) {
-      var node = Event.extend(event).target;
-      return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node);
-    },
-
-    findElement: function(event, expression) {
-      var element = Event.element(event);
-      return element.match(expression) ? element : element.up(expression);
-    },
-
-    pointer: function(event) {
-      return {
-        x: event.pageX || (event.clientX +
-          (document.documentElement.scrollLeft || document.body.scrollLeft)),
-        y: event.pageY || (event.clientY +
-          (document.documentElement.scrollTop || document.body.scrollTop))
-      };
-    },
-
-    pointerX: function(event) { return Event.pointer(event).x },
-    pointerY: function(event) { return Event.pointer(event).y },
-
-    stop: function(event) {
-      Event.extend(event);
-      event.preventDefault();
-      event.stopPropagation();
-      event.stopped = true;
-    }
-  };
-})();
-
-Event.extend = (function() {
-  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
-    m[name] = Event.Methods[name].methodize();
-    return m;
-  });
-
-  if (Prototype.Browser.IE) {
-    Object.extend(methods, {
-      stopPropagation: function() { this.cancelBubble = true },
-      preventDefault:  function() { this.returnValue = false },
-      inspect: function() { return "[object Event]" }
-    });
-
-    return function(event) {
-      if (!event) return false;
-      if (event._extendedByPrototype) return event;
-
-      event._extendedByPrototype = Prototype.emptyFunction;
-      var pointer = Event.pointer(event);
-      Object.extend(event, {
-        target: event.srcElement,
-        relatedTarget: Event.relatedTarget(event),
-        pageX:  pointer.x,
-        pageY:  pointer.y
-      });
-      return Object.extend(event, methods);
-    };
-
-  } else {
-    Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
-    Object.extend(Event.prototype, methods);
-    return Prototype.K;
-  }
-})();
-
-Object.extend(Event, (function() {
-  var cache = Event.cache;
-
-  function getEventID(element) {
-    if (element._eventID) return element._eventID;
-    arguments.callee.id = arguments.callee.id || 1;
-    return element._eventID = ++arguments.callee.id;
-  }
-
-  function getDOMEventName(eventName) {
-    if (eventName && eventName.include(':')) return "dataavailable";
-    return eventName;
-  }
-
-  function getCacheForID(id) {
-    return cache[id] = cache[id] || { };
-  }
-
-  function getWrappersForEventName(id, eventName) {
-    var c = getCacheForID(id);
-    return c[eventName] = c[eventName] || [];
-  }
-
-  function createWrapper(element, eventName, handler) {
-    var id = getEventID(element);
-    var c = getWrappersForEventName(id, eventName);
-    if (c.pluck("handler").include(handler)) return false;
-
-    var wrapper = function(event) {
-      if (!Event || !Event.extend ||
-        (event.eventName && event.eventName != eventName))
-          return false;
-
-      Event.extend(event);
-      handler.call(element, event)
-    };
-
-    wrapper.handler = handler;
-    c.push(wrapper);
-    return wrapper;
-  }
-
-  function findWrapper(id, eventName, handler) {
-    var c = getWrappersForEventName(id, eventName);
-    return c.find(function(wrapper) { return wrapper.handler == handler });
-  }
-
-  function destroyWrapper(id, eventName, handler) {
-    var c = getCacheForID(id);
-    if (!c[eventName]) return false;
-    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
-  }
-
-  function destroyCache() {
-    for (var id in cache)
-      for (var eventName in cache[id])
-        cache[id][eventName] = null;
-  }
-
-  if (window.attachEvent) {
-    window.attachEvent("onunload", destroyCache);
-  }
-
-  return {
-    observe: function(element, eventName, handler) {
-      element = $(element);
-      var name = getDOMEventName(eventName);
-
-      var wrapper = createWrapper(element, eventName, handler);
-      if (!wrapper) return element;
-
-      if (element.addEventListener) {
-        element.addEventListener(name, wrapper, false);
-      } else {
-        element.attachEvent("on" + name, wrapper);
-      }
-
-      return element;
-    },
-
-    stopObserving: function(element, eventName, handler) {
-      element = $(element);
-      var id = getEventID(element), name = getDOMEventName(eventName);
-
-      if (!handler && eventName) {
-        getWrappersForEventName(id, eventName).each(function(wrapper) {
-          element.stopObserving(eventName, wrapper.handler);
-        });
-        return element;
-
-      } else if (!eventName) {
-        Object.keys(getCacheForID(id)).each(function(eventName) {
-          element.stopObserving(eventName);
-        });
-        return element;
-      }
-
-      var wrapper = findWrapper(id, eventName, handler);
-      if (!wrapper) return element;
-
-      if (element.removeEventListener) {
-        element.removeEventListener(name, wrapper, false);
-      } else {
-        element.detachEvent("on" + name, wrapper);
-      }
-
-      destroyWrapper(id, eventName, handler);
-
-      return element;
-    },
-
-    fire: function(element, eventName, memo) {
-      element = $(element);
-      if (element == document && document.createEvent && !element.dispatchEvent)
-        element = document.documentElement;
-
-      if (document.createEvent) {
-        var event = document.createEvent("HTMLEvents");
-        event.initEvent("dataavailable", true, true);
-      } else {
-        var event = document.createEventObject();
-        event.eventType = "ondataavailable";
-      }
-
-      event.eventName = eventName;
-      event.memo = memo || { };
-
-      if (document.createEvent) {
-        element.dispatchEvent(event);
-      } else {
-        element.fireEvent(event.eventType, event);
-      }
-
-      return event;
-    }
-  };
-})());
-
-Object.extend(Event, Event.Methods);
-
-Element.addMethods({
-  fire:          Event.fire,
-  observe:       Event.observe,
-  stopObserving: Event.stopObserving
-});
-
-Object.extend(document, {
-  fire:          Element.Methods.fire.methodize(),
-  observe:       Element.Methods.observe.methodize(),
-  stopObserving: Element.Methods.stopObserving.methodize()
-});
-
-(function() {
-  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
-     Matthias Miller, Dean Edwards and John Resig. */
-
-  var timer, fired = false;
-
-  function fireContentLoadedEvent() {
-    if (fired) return;
-    if (timer) window.clearInterval(timer);
-    document.fire("dom:loaded");
-    fired = true;
-  }
-
-  if (document.addEventListener) {
-    if (Prototype.Browser.WebKit) {
-      timer = window.setInterval(function() {
-        if (/loaded|complete/.test(document.readyState))
-          fireContentLoadedEvent();
-      }, 0);
-
-      Event.observe(window, "load", fireContentLoadedEvent);
-
-    } else {
-      document.addEventListener("DOMContentLoaded",
-        fireContentLoadedEvent, false);
-    }
-
-  } else {
-    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
-    $("__onDOMContentLoaded").onreadystatechange = function() {
-      if (this.readyState == "complete") {
-        this.onreadystatechange = null;
-        fireContentLoadedEvent();
-      }
-    };
-  }
-})();
-/*------------------------------- DEPRECATED -------------------------------*/
-
-Hash.toQueryString = Object.toQueryString;
-
-var Toggle = { display: Element.toggle };
-
-Element.Methods.childOf = Element.Methods.descendantOf;
-
-var Insertion = {
-  Before: function(element, content) {
-    return Element.insert(element, {before:content});
-  },
-
-  Top: function(element, content) {
-    return Element.insert(element, {top:content});
-  },
-
-  Bottom: function(element, content) {
-    return Element.insert(element, {bottom:content});
-  },
-
-  After: function(element, content) {
-    return Element.insert(element, {after:content});
-  }
-};
-
-var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
-
-// This should be moved to script.aculo.us; notice the deprecated methods
-// further below, that map to the newer Element methods.
-var Position = {
-  // set to true if needed, warning: firefox performance problems
-  // NOT neeeded for page scrolling, only if draggable contained in
-  // scrollable elements
-  includeScrollOffsets: false,
-
-  // must be called before calling withinIncludingScrolloffset, every time the
-  // page is scrolled
-  prepare: function() {
-    this.deltaX =  window.pageXOffset
-                || document.documentElement.scrollLeft
-                || document.body.scrollLeft
-                || 0;
-    this.deltaY =  window.pageYOffset
-                || document.documentElement.scrollTop
-                || document.body.scrollTop
-                || 0;
-  },
-
-  // caches x/y coordinate pair to use with overlap
-  within: function(element, x, y) {
-    if (this.includeScrollOffsets)
-      return this.withinIncludingScrolloffsets(element, x, y);
-    this.xcomp = x;
-    this.ycomp = y;
-    this.offset = Element.cumulativeOffset(element);
-
-    return (y >= this.offset[1] &&
-            y <  this.offset[1] + element.offsetHeight &&
-            x >= this.offset[0] &&
-            x <  this.offset[0] + element.offsetWidth);
-  },
-
-  withinIncludingScrolloffsets: function(element, x, y) {
-    var offsetcache = Element.cumulativeScrollOffset(element);
-
-    this.xcomp = x + offsetcache[0] - this.deltaX;
-    this.ycomp = y + offsetcache[1] - this.deltaY;
-    this.offset = Element.cumulativeOffset(element);
-
-    return (this.ycomp >= this.offset[1] &&
-            this.ycomp <  this.offset[1] + element.offsetHeight &&
-            this.xcomp >= this.offset[0] &&
-            this.xcomp <  this.offset[0] + element.offsetWidth);
-  },
-
-  // within must be called directly before
-  overlap: function(mode, element) {
-    if (!mode) return 0;
-    if (mode == 'vertical')
-      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
-        element.offsetHeight;
-    if (mode == 'horizontal')
-      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
-        element.offsetWidth;
-  },
-
-  // Deprecation layer -- use newer Element methods now (1.5.2).
-
-  cumulativeOffset: Element.Methods.cumulativeOffset,
-
-  positionedOffset: Element.Methods.positionedOffset,
-
-  absolutize: function(element) {
-    Position.prepare();
-    return Element.absolutize(element);
-  },
-
-  relativize: function(element) {
-    Position.prepare();
-    return Element.relativize(element);
-  },
-
-  realOffset: Element.Methods.cumulativeScrollOffset,
-
-  offsetParent: Element.Methods.getOffsetParent,
-
-  page: Element.Methods.viewportOffset,
-
-  clone: function(source, target, options) {
-    options = options || { };
-    return Element.clonePosition(target, source, options);
-  }
-};
-
-/*--------------------------------------------------------------------------*/
-
-if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
-  function iter(name) {
-    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
-  }
-
-  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
-  function(element, className) {
-    className = className.toString().strip();
-    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
-    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
-  } : function(element, className) {
-    className = className.toString().strip();
-    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
-    if (!classNames && !className) return elements;
-
-    var nodes = $(element).getElementsByTagName('*');
-    className = ' ' + className + ' ';
-
-    for (var i = 0, child, cn; child = nodes[i]; i++) {
-      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
-          (classNames && classNames.all(function(name) {
-            return !name.toString().blank() && cn.include(' ' + name + ' ');
-          }))))
-        elements.push(Element.extend(child));
-    }
-    return elements;
-  };
-
-  return function(className, parentElement) {
-    return $(parentElement || document.body).getElementsByClassName(className);
-  };
-}(Element.Methods);
-
-/*--------------------------------------------------------------------------*/
-
-Element.ClassNames = Class.create();
-Element.ClassNames.prototype = {
-  initialize: function(element) {
-    this.element = $(element);
-  },
-
-  _each: function(iterator) {
-    this.element.className.split(/\s+/).select(function(name) {
-      return name.length > 0;
-    })._each(iterator);
-  },
-
-  set: function(className) {
-    this.element.className = className;
-  },
-
-  add: function(classNameToAdd) {
-    if (this.include(classNameToAdd)) return;
-    this.set($A(this).concat(classNameToAdd).join(' '));
-  },
-
-  remove: function(classNameToRemove) {
-    if (!this.include(classNameToRemove)) return;
-    this.set($A(this).without(classNameToRemove).join(' '));
-  },
-
-  toString: function() {
-    return $A(this).join(' ');
-  }
-};
-
-Object.extend(Element.ClassNames.prototype, Enumerable);
-
-/*--------------------------------------------------------------------------*/
-
-Element.addMethods();
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/ext/json/ext/fbuffer/fbuffer.h b/vendor/json_pure-1.7.7/ext/json/ext/fbuffer/fbuffer.h
deleted file mode 100644
index af74187..0000000
--- a/vendor/json_pure-1.7.7/ext/json/ext/fbuffer/fbuffer.h
+++ /dev/null
@@ -1,181 +0,0 @@
-
-#ifndef _FBUFFER_H_
-#define _FBUFFER_H_
-
-#include "ruby.h"
-
-#ifndef RHASH_SIZE
-#define RHASH_SIZE(hsh) (RHASH(hsh)->tbl->num_entries)
-#endif
-
-#ifndef RFLOAT_VALUE
-#define RFLOAT_VALUE(val) (RFLOAT(val)->value)
-#endif
-
-#ifndef RARRAY_PTR
-#define RARRAY_PTR(ARRAY) RARRAY(ARRAY)->ptr
-#endif
-#ifndef RARRAY_LEN
-#define RARRAY_LEN(ARRAY) RARRAY(ARRAY)->len
-#endif
-#ifndef RSTRING_PTR
-#define RSTRING_PTR(string) RSTRING(string)->ptr
-#endif
-#ifndef RSTRING_LEN
-#define RSTRING_LEN(string) RSTRING(string)->len
-#endif
-
-#ifdef HAVE_RUBY_ENCODING_H
-#include "ruby/encoding.h"
-#define FORCE_UTF8(obj) rb_enc_associate((obj), rb_utf8_encoding())
-#else
-#define FORCE_UTF8(obj)
-#endif
-
-/* We don't need to guard objects for rbx, so let's do nothing at all. */
-#ifndef RB_GC_GUARD
-#define RB_GC_GUARD(object)
-#endif
-
-typedef struct FBufferStruct {
-    unsigned long initial_length;
-    char *ptr;
-    unsigned long len;
-    unsigned long capa;
-} FBuffer;
-
-#define FBUFFER_INITIAL_LENGTH_DEFAULT 1024
-
-#define FBUFFER_PTR(fb) (fb->ptr)
-#define FBUFFER_LEN(fb) (fb->len)
-#define FBUFFER_CAPA(fb) (fb->capa)
-#define FBUFFER_PAIR(fb) FBUFFER_PTR(fb), FBUFFER_LEN(fb)
-
-static FBuffer *fbuffer_alloc(unsigned long initial_length);
-static void fbuffer_free(FBuffer *fb);
-static void fbuffer_clear(FBuffer *fb);
-static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned long len);
-#ifdef JSON_GENERATOR
-static void fbuffer_append_long(FBuffer *fb, long number);
-#endif
-static void fbuffer_append_char(FBuffer *fb, char newchr);
-#ifdef JSON_GENERATOR
-static FBuffer *fbuffer_dup(FBuffer *fb);
-static VALUE fbuffer_to_s(FBuffer *fb);
-#endif
-
-static FBuffer *fbuffer_alloc(unsigned long initial_length)
-{
-    FBuffer *fb;
-    if (initial_length <= 0) initial_length = FBUFFER_INITIAL_LENGTH_DEFAULT;
-    fb = ALLOC(FBuffer);
-    memset((void *) fb, 0, sizeof(FBuffer));
-    fb->initial_length = initial_length;
-    return fb;
-}
-
-static void fbuffer_free(FBuffer *fb)
-{
-    if (fb->ptr) ruby_xfree(fb->ptr);
-    ruby_xfree(fb);
-}
-
-static void fbuffer_clear(FBuffer *fb)
-{
-    fb->len = 0;
-}
-
-static void fbuffer_inc_capa(FBuffer *fb, unsigned long requested)
-{
-    unsigned long required;
-
-    if (!fb->ptr) {
-        fb->ptr = ALLOC_N(char, fb->initial_length);
-        fb->capa = fb->initial_length;
-    }
-
-    for (required = fb->capa; requested > required - fb->len; required <<= 1);
-
-    if (required > fb->capa) {
-        REALLOC_N(fb->ptr, char, required);
-        fb->capa = required;
-    }
-}
-
-static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned long len)
-{
-    if (len > 0) {
-        fbuffer_inc_capa(fb, len);
-        MEMCPY(fb->ptr + fb->len, newstr, char, len);
-        fb->len += len;
-    }
-}
-
-#ifdef JSON_GENERATOR
-static void fbuffer_append_str(FBuffer *fb, VALUE str)
-{
-    const char *newstr = StringValuePtr(str);
-    unsigned long len = RSTRING_LEN(str);
-
-    RB_GC_GUARD(str);
-
-    fbuffer_append(fb, newstr, len);
-}
-#endif
-
-static void fbuffer_append_char(FBuffer *fb, char newchr)
-{
-    fbuffer_inc_capa(fb, 1);
-    *(fb->ptr + fb->len) = newchr;
-    fb->len++;
-}
-
-#ifdef JSON_GENERATOR
-static void freverse(char *start, char *end)
-{
-    char c;
-
-    while (end > start) {
-        c = *end, *end-- = *start, *start++ = c;
-    }
-}
-
-static long fltoa(long number, char *buf)
-{
-    static char digits[] = "0123456789";
-    long sign = number;
-    char* tmp = buf;
-
-    if (sign < 0) number = -number;
-    do *tmp++ = digits[number % 10]; while (number /= 10);
-    if (sign < 0) *tmp++ = '-';
-    freverse(buf, tmp - 1);
-    return tmp - buf;
-}
-
-static void fbuffer_append_long(FBuffer *fb, long number)
-{
-    char buf[20];
-    unsigned long len = fltoa(number, buf);
-    fbuffer_append(fb, buf, len);
-}
-
-static FBuffer *fbuffer_dup(FBuffer *fb)
-{
-    unsigned long len = fb->len;
-    FBuffer *result;
-
-    result = fbuffer_alloc(len);
-    fbuffer_append(result, FBUFFER_PAIR(fb));
-    return result;
-}
-
-static VALUE fbuffer_to_s(FBuffer *fb)
-{
-    VALUE result = rb_str_new(FBUFFER_PAIR(fb));
-    fbuffer_free(fb);
-    FORCE_UTF8(result);
-    return result;
-}
-#endif
-#endif
diff --git a/vendor/json_pure-1.7.7/ext/json/ext/generator/depend b/vendor/json_pure-1.7.7/ext/json/ext/generator/depend
deleted file mode 100644
index 1a042a2..0000000
--- a/vendor/json_pure-1.7.7/ext/json/ext/generator/depend
+++ /dev/null
@@ -1 +0,0 @@
-generator.o: generator.c generator.h $(srcdir)/../fbuffer/fbuffer.h
diff --git a/vendor/json_pure-1.7.7/ext/json/ext/generator/extconf.rb b/vendor/json_pure-1.7.7/ext/json/ext/generator/extconf.rb
deleted file mode 100644
index c947501..0000000
--- a/vendor/json_pure-1.7.7/ext/json/ext/generator/extconf.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-require 'mkmf'
-
-unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O3')
-  $CFLAGS << ' -O3'
-end
-if CONFIG['CC'] =~ /gcc/
-  $CFLAGS << ' -Wall'
-  unless $DEBUG && !$CFLAGS.gsub!(/ -O[\dsz]?/, ' -O0 -ggdb')
-    $CFLAGS << ' -O0 -ggdb'
-  end
-end
-
-$defs << "-DJSON_GENERATOR"
-create_makefile 'json/ext/generator'
diff --git a/vendor/json_pure-1.7.7/ext/json/ext/generator/generator.c b/vendor/json_pure-1.7.7/ext/json/ext/generator/generator.c
deleted file mode 100644
index ae4593c..0000000
--- a/vendor/json_pure-1.7.7/ext/json/ext/generator/generator.c
+++ /dev/null
@@ -1,1427 +0,0 @@
-#include "../fbuffer/fbuffer.h"
-#include "generator.h"
-
-#ifdef HAVE_RUBY_ENCODING_H
-static VALUE CEncoding_UTF_8;
-static ID i_encoding, i_encode;
-#endif
-
-static VALUE mJSON, mExt, mGenerator, cState, mGeneratorMethods, mObject,
-             mHash, mArray, mFixnum, mBignum, mFloat, mString, mString_Extend,
-             mTrueClass, mFalseClass, mNilClass, eGeneratorError,
-             eNestingError, CRegexp_MULTILINE, CJSON_SAFE_STATE_PROTOTYPE,
-             i_SAFE_STATE_PROTOTYPE;
-
-static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before,
-          i_object_nl, i_array_nl, i_max_nesting, i_allow_nan, i_ascii_only,
-          i_quirks_mode, i_pack, i_unpack, i_create_id, i_extend, i_key_p,
-          i_aref, i_send, i_respond_to_p, i_match, i_keys, i_depth,
-          i_buffer_initial_length, i_dup;
-
-/*
- * Copyright 2001-2004 Unicode, Inc.
- *
- * Disclaimer
- *
- * This source code is provided as is by Unicode, Inc. No claims are
- * made as to fitness for any particular purpose. No warranties of any
- * kind are expressed or implied. The recipient agrees to determine
- * applicability of information provided. If this file has been
- * purchased on magnetic or optical media from Unicode, Inc., the
- * sole remedy for any claim will be exchange of defective media
- * within 90 days of receipt.
- *
- * Limitations on Rights to Redistribute This Code
- *
- * Unicode, Inc. hereby grants the right to freely use the information
- * supplied in this file in the creation of products supporting the
- * Unicode Standard, and to make copies of this file in any form
- * for internal or external distribution as long as this notice
- * remains attached.
- */
-
-/*
- * Index into the table below with the first byte of a UTF-8 sequence to
- * get the number of trailing bytes that are supposed to follow it.
- * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is
- * left as-is for anyone who may want to do such conversion, which was
- * allowed in earlier algorithms.
- */
-static const char trailingBytesForUTF8[256] = {
-    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5
-};
-
-/*
- * Magic values subtracted from a buffer value during UTF8 conversion.
- * This table contains as many values as there might be trailing bytes
- * in a UTF-8 sequence.
- */
-static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL,
-    0x03C82080UL, 0xFA082080UL, 0x82082080UL };
-
-/*
- * Utility routine to tell whether a sequence of bytes is legal UTF-8.
- * This must be called with the length pre-determined by the first byte.
- * If not calling this from ConvertUTF8to*, then the length can be set by:
- *  length = trailingBytesForUTF8[*source]+1;
- * and the sequence is illegal right away if there aren't that many bytes
- * available.
- * If presented with a length > 4, this returns 0.  The Unicode
- * definition of UTF-8 goes up to 4-byte sequences.
- */
-static unsigned char isLegalUTF8(const UTF8 *source, unsigned long length)
-{
-    UTF8 a;
-    const UTF8 *srcptr = source+length;
-    switch (length) {
-        default: return 0;
-                 /* Everything else falls through when "1"... */
-        case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
-        case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return 0;
-        case 2: if ((a = (*--srcptr)) > 0xBF) return 0;
-
-                    switch (*source) {
-                        /* no fall-through in this inner switch */
-                        case 0xE0: if (a < 0xA0) return 0; break;
-                        case 0xED: if (a > 0x9F) return 0; break;
-                        case 0xF0: if (a < 0x90) return 0; break;
-                        case 0xF4: if (a > 0x8F) return 0; break;
-                        default:   if (a < 0x80) return 0;
-                    }
-
-        case 1: if (*source >= 0x80 && *source < 0xC2) return 0;
-    }
-    if (*source > 0xF4) return 0;
-    return 1;
-}
-
-/* Escapes the UTF16 character and stores the result in the buffer buf. */
-static void unicode_escape(char *buf, UTF16 character)
-{
-    const char *digits = "0123456789abcdef";
-
-    buf[2] = digits[character >> 12];
-    buf[3] = digits[(character >> 8) & 0xf];
-    buf[4] = digits[(character >> 4) & 0xf];
-    buf[5] = digits[character & 0xf];
-}
-
-/* Escapes the UTF16 character and stores the result in the buffer buf, then
- * the buffer buf is appended to the FBuffer buffer. */
-static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16
-        character)
-{
-    unicode_escape(buf, character);
-    fbuffer_append(buffer, buf, 6);
-}
-
-/* Converts string to a JSON string in FBuffer buffer, where all but the ASCII
- * and control characters are JSON escaped. */
-static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string)
-{
-    const UTF8 *source = (UTF8 *) RSTRING_PTR(string);
-    const UTF8 *sourceEnd = source + RSTRING_LEN(string);
-    char buf[6] = { '\\', 'u' };
-
-    while (source < sourceEnd) {
-        UTF32 ch = 0;
-        unsigned short extraBytesToRead = trailingBytesForUTF8[*source];
-        if (source + extraBytesToRead >= sourceEnd) {
-            rb_raise(rb_path2class("JSON::GeneratorError"),
-                    "partial character in source, but hit end");
-        }
-        if (!isLegalUTF8(source, extraBytesToRead+1)) {
-            rb_raise(rb_path2class("JSON::GeneratorError"),
-                    "source sequence is illegal/malformed utf-8");
-        }
-        /*
-         * The cases all fall through. See "Note A" below.
-         */
-        switch (extraBytesToRead) {
-            case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
-            case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */
-            case 3: ch += *source++; ch <<= 6;
-            case 2: ch += *source++; ch <<= 6;
-            case 1: ch += *source++; ch <<= 6;
-            case 0: ch += *source++;
-        }
-        ch -= offsetsFromUTF8[extraBytesToRead];
-
-        if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */
-            /* UTF-16 surrogate values are illegal in UTF-32 */
-            if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {
-#if UNI_STRICT_CONVERSION
-                source -= (extraBytesToRead+1); /* return to the illegal value itself */
-                rb_raise(rb_path2class("JSON::GeneratorError"),
-                        "source sequence is illegal/malformed utf-8");
-#else
-                unicode_escape_to_buffer(buffer, buf, UNI_REPLACEMENT_CHAR);
-#endif
-            } else {
-                /* normal case */
-                if (ch >= 0x20 && ch <= 0x7f) {
-                    switch (ch) {
-                        case '\\':
-                            fbuffer_append(buffer, "\\\\", 2);
-                            break;
-                        case '"':
-                            fbuffer_append(buffer, "\\\"", 2);
-                            break;
-                        default:
-                            fbuffer_append_char(buffer, (char)ch);
-                            break;
-                    }
-                } else {
-                    switch (ch) {
-                        case '\n':
-                            fbuffer_append(buffer, "\\n", 2);
-                            break;
-                        case '\r':
-                            fbuffer_append(buffer, "\\r", 2);
-                            break;
-                        case '\t':
-                            fbuffer_append(buffer, "\\t", 2);
-                            break;
-                        case '\f':
-                            fbuffer_append(buffer, "\\f", 2);
-                            break;
-                        case '\b':
-                            fbuffer_append(buffer, "\\b", 2);
-                            break;
-                        default:
-                            unicode_escape_to_buffer(buffer, buf, (UTF16) ch);
-                            break;
-                    }
-                }
-            }
-        } else if (ch > UNI_MAX_UTF16) {
-#if UNI_STRICT_CONVERSION
-            source -= (extraBytesToRead+1); /* return to the start */
-            rb_raise(rb_path2class("JSON::GeneratorError"),
-                    "source sequence is illegal/malformed utf8");
-#else
-            unicode_escape_to_buffer(buffer, buf, UNI_REPLACEMENT_CHAR);
-#endif
-        } else {
-            /* target is a character in range 0xFFFF - 0x10FFFF. */
-            ch -= halfBase;
-            unicode_escape_to_buffer(buffer, buf, (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START));
-            unicode_escape_to_buffer(buffer, buf, (UTF16)((ch & halfMask) + UNI_SUR_LOW_START));
-        }
-    }
-}
-
-/* Converts string to a JSON string in FBuffer buffer, where only the
- * characters required by the JSON standard are JSON escaped. The remaining
- * characters (should be UTF8) are just passed through and appended to the
- * result. */
-static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string)
-{
-    const char *ptr = RSTRING_PTR(string), *p;
-    unsigned long len = RSTRING_LEN(string), start = 0, end = 0;
-    const char *escape = NULL;
-    int escape_len;
-    unsigned char c;
-    char buf[6] = { '\\', 'u' };
-
-    for (start = 0, end = 0; end < len;) {
-        p = ptr + end;
-        c = (unsigned char) *p;
-        if (c < 0x20) {
-            switch (c) {
-                case '\n':
-                    escape = "\\n";
-                    escape_len = 2;
-                    break;
-                case '\r':
-                    escape = "\\r";
-                    escape_len = 2;
-                    break;
-                case '\t':
-                    escape = "\\t";
-                    escape_len = 2;
-                    break;
-                case '\f':
-                    escape = "\\f";
-                    escape_len = 2;
-                    break;
-                case '\b':
-                    escape = "\\b";
-                    escape_len = 2;
-                    break;
-                default:
-                    unicode_escape(buf, (UTF16) *p);
-                    escape = buf;
-                    escape_len = 6;
-                    break;
-            }
-        } else {
-            switch (c) {
-                case '\\':
-                    escape = "\\\\";
-                    escape_len = 2;
-                    break;
-                case '"':
-                    escape =  "\\\"";
-                    escape_len = 2;
-                    break;
-                default:
-                    end++;
-                    continue;
-                    break;
-            }
-        }
-        fbuffer_append(buffer, ptr + start, end - start);
-        fbuffer_append(buffer, escape, escape_len);
-        start = ++end;
-        escape = NULL;
-    }
-    fbuffer_append(buffer, ptr + start, end - start);
-}
-
-static char *fstrndup(const char *ptr, unsigned long len) {
-  char *result;
-  if (len <= 0) return NULL;
-  result = ALLOC_N(char, len);
-  memccpy(result, ptr, 0, len);
-  return result;
-}
-
-/*
- * Document-module: JSON::Ext::Generator
- *
- * This is the JSON generator implemented as a C extension. It can be
- * configured to be used by setting
- *
- *  JSON.generator = JSON::Ext::Generator
- *
- * with the method generator= in JSON.
- *
- */
-
-/*
- * call-seq: to_json(state = nil)
- *
- * Returns a JSON string containing a JSON object, that is generated from
- * this Hash instance.
- * _state_ is a JSON::State object, that can also be used to configure the
- * produced JSON string output further.
- */
-static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self)
-{
-    GENERATE_JSON(object);
-}
-
-/*
- * call-seq: to_json(state = nil)
- *
- * Returns a JSON string containing a JSON array, that is generated from
- * this Array instance.
- * _state_ is a JSON::State object, that can also be used to configure the
- * produced JSON string output further.
- */
-static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self) {
-    GENERATE_JSON(array);
-}
-
-/*
- * call-seq: to_json(*)
- *
- * Returns a JSON string representation for this Integer number.
- */
-static VALUE mFixnum_to_json(int argc, VALUE *argv, VALUE self)
-{
-    GENERATE_JSON(fixnum);
-}
-
-/*
- * call-seq: to_json(*)
- *
- * Returns a JSON string representation for this Integer number.
- */
-static VALUE mBignum_to_json(int argc, VALUE *argv, VALUE self)
-{
-    GENERATE_JSON(bignum);
-}
-
-/*
- * call-seq: to_json(*)
- *
- * Returns a JSON string representation for this Float number.
- */
-static VALUE mFloat_to_json(int argc, VALUE *argv, VALUE self)
-{
-    GENERATE_JSON(float);
-}
-
-/*
- * call-seq: String.included(modul)
- *
- * Extends _modul_ with the String::Extend module.
- */
-static VALUE mString_included_s(VALUE self, VALUE modul) {
-    VALUE result = rb_funcall(modul, i_extend, 1, mString_Extend);
-    return result;
-}
-
-/*
- * call-seq: to_json(*)
- *
- * This string should be encoded with UTF-8 A call to this method
- * returns a JSON string encoded with UTF16 big endian characters as
- * \u????.
- */
-static VALUE mString_to_json(int argc, VALUE *argv, VALUE self)
-{
-    GENERATE_JSON(string);
-}
-
-/*
- * call-seq: to_json_raw_object()
- *
- * This method creates a raw object hash, that can be nested into
- * other data structures and will be generated as a raw string. This
- * method should be used, if you want to convert raw strings to JSON
- * instead of UTF-8 strings, e. g. binary data.
- */
-static VALUE mString_to_json_raw_object(VALUE self)
-{
-    VALUE ary;
-    VALUE result = rb_hash_new();
-    rb_hash_aset(result, rb_funcall(mJSON, i_create_id, 0), rb_class_name(rb_obj_class(self)));
-    ary = rb_funcall(self, i_unpack, 1, rb_str_new2("C*"));
-    rb_hash_aset(result, rb_str_new2("raw"), ary);
-    return result;
-}
-
-/*
- * call-seq: to_json_raw(*args)
- *
- * This method creates a JSON text from the result of a call to
- * to_json_raw_object of this String.
- */
-static VALUE mString_to_json_raw(int argc, VALUE *argv, VALUE self)
-{
-    VALUE obj = mString_to_json_raw_object(self);
-    Check_Type(obj, T_HASH);
-    return mHash_to_json(argc, argv, obj);
-}
-
-/*
- * call-seq: json_create(o)
- *
- * Raw Strings are JSON Objects (the raw bytes are stored in an array for the
- * key "raw"). The Ruby String can be created by this module method.
- */
-static VALUE mString_Extend_json_create(VALUE self, VALUE o)
-{
-    VALUE ary;
-    Check_Type(o, T_HASH);
-    ary = rb_hash_aref(o, rb_str_new2("raw"));
-    return rb_funcall(ary, i_pack, 1, rb_str_new2("C*"));
-}
-
-/*
- * call-seq: to_json(*)
- *
- * Returns a JSON string for true: 'true'.
- */
-static VALUE mTrueClass_to_json(int argc, VALUE *argv, VALUE self)
-{
-    GENERATE_JSON(true);
-}
-
-/*
- * call-seq: to_json(*)
- *
- * Returns a JSON string for false: 'false'.
- */
-static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self)
-{
-    GENERATE_JSON(false);
-}
-
-/*
- * call-seq: to_json(*)
- *
- * Returns a JSON string for nil: 'null'.
- */
-static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self)
-{
-    GENERATE_JSON(null);
-}
-
-/*
- * call-seq: to_json(*)
- *
- * Converts this object to a string (calling #to_s), converts
- * it to a JSON string, and returns the result. This is a fallback, if no
- * special method #to_json was defined for some object.
- */
-static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self)
-{
-    VALUE state;
-    VALUE string = rb_funcall(self, i_to_s, 0);
-    rb_scan_args(argc, argv, "01", &state);
-    Check_Type(string, T_STRING);
-    state = cState_from_state_s(cState, state);
-    return cState_partial_generate(state, string);
-}
-
-static void State_free(JSON_Generator_State *state)
-{
-    if (state->indent) ruby_xfree(state->indent);
-    if (state->space) ruby_xfree(state->space);
-    if (state->space_before) ruby_xfree(state->space_before);
-    if (state->object_nl) ruby_xfree(state->object_nl);
-    if (state->array_nl) ruby_xfree(state->array_nl);
-    if (state->array_delim) fbuffer_free(state->array_delim);
-    if (state->object_delim) fbuffer_free(state->object_delim);
-    if (state->object_delim2) fbuffer_free(state->object_delim2);
-    ruby_xfree(state);
-}
-
-static JSON_Generator_State *State_allocate()
-{
-    JSON_Generator_State *state = ALLOC(JSON_Generator_State);
-    MEMZERO(state, JSON_Generator_State, 1);
-    return state;
-}
-
-static VALUE cState_s_allocate(VALUE klass)
-{
-    JSON_Generator_State *state = State_allocate();
-    return Data_Wrap_Struct(klass, NULL, State_free, state);
-}
-
-/*
- * call-seq: configure(opts)
- *
- * Configure this State instance with the Hash _opts_, and return
- * itself.
- */
-static VALUE cState_configure(VALUE self, VALUE opts)
-{
-    VALUE tmp;
-    GET_STATE(self);
-    tmp = rb_convert_type(opts, T_HASH, "Hash", "to_hash");
-    if (NIL_P(tmp)) tmp = rb_convert_type(opts, T_HASH, "Hash", "to_h");
-    if (NIL_P(tmp)) {
-        rb_raise(rb_eArgError, "opts has to be hash like or convertable into a hash");
-    }
-    opts = tmp;
-    tmp = rb_hash_aref(opts, ID2SYM(i_indent));
-    if (RTEST(tmp)) {
-        unsigned long len;
-        Check_Type(tmp, T_STRING);
-        len = RSTRING_LEN(tmp);
-        state->indent = fstrndup(RSTRING_PTR(tmp), len + 1);
-        state->indent_len = len;
-    }
-    tmp = rb_hash_aref(opts, ID2SYM(i_space));
-    if (RTEST(tmp)) {
-        unsigned long len;
-        Check_Type(tmp, T_STRING);
-        len = RSTRING_LEN(tmp);
-        state->space = fstrndup(RSTRING_PTR(tmp), len + 1);
-        state->space_len = len;
-    }
-    tmp = rb_hash_aref(opts, ID2SYM(i_space_before));
-    if (RTEST(tmp)) {
-        unsigned long len;
-        Check_Type(tmp, T_STRING);
-        len = RSTRING_LEN(tmp);
-        state->space_before = fstrndup(RSTRING_PTR(tmp), len + 1);
-        state->space_before_len = len;
-    }
-    tmp = rb_hash_aref(opts, ID2SYM(i_array_nl));
-    if (RTEST(tmp)) {
-        unsigned long len;
-        Check_Type(tmp, T_STRING);
-        len = RSTRING_LEN(tmp);
-        state->array_nl = fstrndup(RSTRING_PTR(tmp), len + 1);
-        state->array_nl_len = len;
-    }
-    tmp = rb_hash_aref(opts, ID2SYM(i_object_nl));
-    if (RTEST(tmp)) {
-        unsigned long len;
-        Check_Type(tmp, T_STRING);
-        len = RSTRING_LEN(tmp);
-        state->object_nl = fstrndup(RSTRING_PTR(tmp), len + 1);
-        state->object_nl_len = len;
-    }
-    tmp = ID2SYM(i_max_nesting);
-    state->max_nesting = 100;
-    if (option_given_p(opts, tmp)) {
-        VALUE max_nesting = rb_hash_aref(opts, tmp);
-        if (RTEST(max_nesting)) {
-            Check_Type(max_nesting, T_FIXNUM);
-            state->max_nesting = FIX2LONG(max_nesting);
-        } else {
-            state->max_nesting = 0;
-        }
-    }
-    tmp = ID2SYM(i_depth);
-    state->depth = 0;
-    if (option_given_p(opts, tmp)) {
-        VALUE depth = rb_hash_aref(opts, tmp);
-        if (RTEST(depth)) {
-            Check_Type(depth, T_FIXNUM);
-            state->depth = FIX2LONG(depth);
-        } else {
-            state->depth = 0;
-        }
-    }
-    tmp = ID2SYM(i_buffer_initial_length);
-    if (option_given_p(opts, tmp)) {
-        VALUE buffer_initial_length = rb_hash_aref(opts, tmp);
-        if (RTEST(buffer_initial_length)) {
-            long initial_length;
-            Check_Type(buffer_initial_length, T_FIXNUM);
-            initial_length = FIX2LONG(buffer_initial_length);
-            if (initial_length > 0) state->buffer_initial_length = initial_length;
-        }
-    }
-    tmp = rb_hash_aref(opts, ID2SYM(i_allow_nan));
-    state->allow_nan = RTEST(tmp);
-    tmp = rb_hash_aref(opts, ID2SYM(i_ascii_only));
-    state->ascii_only = RTEST(tmp);
-    tmp = rb_hash_aref(opts, ID2SYM(i_quirks_mode));
-    state->quirks_mode = RTEST(tmp);
-    return self;
-}
-
-static void set_state_ivars(VALUE hash, VALUE state)
-{
-    VALUE ivars = rb_obj_instance_variables(state);
-    int i = 0;
-    for (i = 0; i < RARRAY_LEN(ivars); i++) {
-        VALUE key = rb_funcall(rb_ary_entry(ivars, i), i_to_s, 0);
-        long key_len = RSTRING_LEN(key);
-        VALUE value = rb_iv_get(state, StringValueCStr(key));
-        rb_hash_aset(hash, rb_str_intern(rb_str_substr(key, 1, key_len - 1)), value);
-    }
-}
-
-/*
- * call-seq: to_h
- *
- * Returns the configuration instance variables as a hash, that can be
- * passed to the configure method.
- */
-static VALUE cState_to_h(VALUE self)
-{
-    VALUE result = rb_hash_new();
-    GET_STATE(self);
-    set_state_ivars(result, self);
-    rb_hash_aset(result, ID2SYM(i_indent), rb_str_new(state->indent, state->indent_len));
-    rb_hash_aset(result, ID2SYM(i_space), rb_str_new(state->space, state->space_len));
-    rb_hash_aset(result, ID2SYM(i_space_before), rb_str_new(state->space_before, state->space_before_len));
-    rb_hash_aset(result, ID2SYM(i_object_nl), rb_str_new(state->object_nl, state->object_nl_len));
-    rb_hash_aset(result, ID2SYM(i_array_nl), rb_str_new(state->array_nl, state->array_nl_len));
-    rb_hash_aset(result, ID2SYM(i_allow_nan), state->allow_nan ? Qtrue : Qfalse);
-    rb_hash_aset(result, ID2SYM(i_ascii_only), state->ascii_only ? Qtrue : Qfalse);
-    rb_hash_aset(result, ID2SYM(i_quirks_mode), state->quirks_mode ? Qtrue : Qfalse);
-    rb_hash_aset(result, ID2SYM(i_max_nesting), LONG2FIX(state->max_nesting));
-    rb_hash_aset(result, ID2SYM(i_depth), LONG2FIX(state->depth));
-    rb_hash_aset(result, ID2SYM(i_buffer_initial_length), LONG2FIX(state->buffer_initial_length));
-    return result;
-}
-
-/*
-* call-seq: [](name)
-*
-* Return the value returned by method +name+.
-*/
-static VALUE cState_aref(VALUE self, VALUE name)
-{
-    name = rb_funcall(name, i_to_s, 0);
-    if (RTEST(rb_funcall(self, i_respond_to_p, 1, name))) {
-        return rb_funcall(self, i_send, 1, name);
-    } else {
-        return rb_ivar_get(self, rb_intern_str(rb_str_concat(rb_str_new2("@"), name)));
-    }
-}
-
-/*
-* call-seq: []=(name, value)
-*
-* Set the attribute name to value.
-*/
-static VALUE cState_aset(VALUE self, VALUE name, VALUE value)
-{
-    VALUE name_writer;
-
-    name = rb_funcall(name, i_to_s, 0);
-    name_writer = rb_str_cat2(rb_str_dup(name), "=");
-    if (RTEST(rb_funcall(self, i_respond_to_p, 1, name_writer))) {
-        return rb_funcall(self, i_send, 2, name_writer, value);
-    } else {
-        rb_ivar_set(self, rb_intern_str(rb_str_concat(rb_str_new2("@"), name)), value);
-    }
-    return Qnil;
-}
-
-static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
-{
-    char *object_nl = state->object_nl;
-    long object_nl_len = state->object_nl_len;
-    char *indent = state->indent;
-    long indent_len = state->indent_len;
-    long max_nesting = state->max_nesting;
-    char *delim = FBUFFER_PTR(state->object_delim);
-    long delim_len = FBUFFER_LEN(state->object_delim);
-    char *delim2 = FBUFFER_PTR(state->object_delim2);
-    long delim2_len = FBUFFER_LEN(state->object_delim2);
-    long depth = ++state->depth;
-    int i, j;
-    VALUE key, key_to_s, keys;
-    if (max_nesting != 0 && depth > max_nesting) {
-        fbuffer_free(buffer);
-        rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
-    }
-    fbuffer_append_char(buffer, '{');
-    keys = rb_funcall(obj, i_keys, 0);
-    for(i = 0; i < RARRAY_LEN(keys); i++) {
-        if (i > 0) fbuffer_append(buffer, delim, delim_len);
-        if (object_nl) {
-            fbuffer_append(buffer, object_nl, object_nl_len);
-        }
-        if (indent) {
-            for (j = 0; j < depth; j++) {
-                fbuffer_append(buffer, indent, indent_len);
-            }
-        }
-        key = rb_ary_entry(keys, i);
-        key_to_s = rb_funcall(key, i_to_s, 0);
-        Check_Type(key_to_s, T_STRING);
-        generate_json(buffer, Vstate, state, key_to_s);
-        fbuffer_append(buffer, delim2, delim2_len);
-        generate_json(buffer, Vstate, state, rb_hash_aref(obj, key));
-    }
-    depth = --state->depth;
-    if (object_nl) {
-        fbuffer_append(buffer, object_nl, object_nl_len);
-        if (indent) {
-            for (j = 0; j < depth; j++) {
-                fbuffer_append(buffer, indent, indent_len);
-            }
-        }
-    }
-    fbuffer_append_char(buffer, '}');
-}
-
-static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
-{
-    char *array_nl = state->array_nl;
-    long array_nl_len = state->array_nl_len;
-    char *indent = state->indent;
-    long indent_len = state->indent_len;
-    long max_nesting = state->max_nesting;
-    char *delim = FBUFFER_PTR(state->array_delim);
-    long delim_len = FBUFFER_LEN(state->array_delim);
-    long depth = ++state->depth;
-    int i, j;
-    if (max_nesting != 0 && depth > max_nesting) {
-        fbuffer_free(buffer);
-        rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
-    }
-    fbuffer_append_char(buffer, '[');
-    if (array_nl) fbuffer_append(buffer, array_nl, array_nl_len);
-    for(i = 0; i < RARRAY_LEN(obj); i++) {
-        if (i > 0) fbuffer_append(buffer, delim, delim_len);
-        if (indent) {
-            for (j = 0; j < depth; j++) {
-                fbuffer_append(buffer, indent, indent_len);
-            }
-        }
-        generate_json(buffer, Vstate, state, rb_ary_entry(obj, i));
-    }
-    state->depth = --depth;
-    if (array_nl) {
-        fbuffer_append(buffer, array_nl, array_nl_len);
-        if (indent) {
-            for (j = 0; j < depth; j++) {
-                fbuffer_append(buffer, indent, indent_len);
-            }
-        }
-    }
-    fbuffer_append_char(buffer, ']');
-}
-
-static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
-{
-    fbuffer_append_char(buffer, '"');
-#ifdef HAVE_RUBY_ENCODING_H
-    obj = rb_funcall(obj, i_encode, 1, CEncoding_UTF_8);
-#endif
-    if (state->ascii_only) {
-        convert_UTF8_to_JSON_ASCII(buffer, obj);
-    } else {
-        convert_UTF8_to_JSON(buffer, obj);
-    }
-    fbuffer_append_char(buffer, '"');
-}
-
-static void generate_json_null(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
-{
-    fbuffer_append(buffer, "null", 4);
-}
-
-static void generate_json_false(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
-{
-    fbuffer_append(buffer, "false", 5);
-}
-
-static void generate_json_true(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
-{
-    fbuffer_append(buffer, "true", 4);
-}
-
-static void generate_json_fixnum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
-{
-    fbuffer_append_long(buffer, FIX2LONG(obj));
-}
-
-static void generate_json_bignum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
-{
-    VALUE tmp = rb_funcall(obj, i_to_s, 0);
-    fbuffer_append_str(buffer, tmp);
-}
-
-static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
-{
-    double value = RFLOAT_VALUE(obj);
-    char allow_nan = state->allow_nan;
-    VALUE tmp = rb_funcall(obj, i_to_s, 0);
-    if (!allow_nan) {
-        if (isinf(value)) {
-            fbuffer_free(buffer);
-            rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
-        } else if (isnan(value)) {
-            fbuffer_free(buffer);
-            rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
-        }
-    }
-    fbuffer_append_str(buffer, tmp);
-}
-
-static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
-{
-    VALUE tmp;
-    VALUE klass = CLASS_OF(obj);
-    if (klass == rb_cHash) {
-        generate_json_object(buffer, Vstate, state, obj);
-    } else if (klass == rb_cArray) {
-        generate_json_array(buffer, Vstate, state, obj);
-    } else if (klass == rb_cString) {
-        generate_json_string(buffer, Vstate, state, obj);
-    } else if (obj == Qnil) {
-        generate_json_null(buffer, Vstate, state, obj);
-    } else if (obj == Qfalse) {
-        generate_json_false(buffer, Vstate, state, obj);
-    } else if (obj == Qtrue) {
-        generate_json_true(buffer, Vstate, state, obj);
-    } else if (klass == rb_cFixnum) {
-        generate_json_fixnum(buffer, Vstate, state, obj);
-    } else if (klass == rb_cBignum) {
-        generate_json_bignum(buffer, Vstate, state, obj);
-    } else if (klass == rb_cFloat) {
-        generate_json_float(buffer, Vstate, state, obj);
-    } else if (rb_respond_to(obj, i_to_json)) {
-        tmp = rb_funcall(obj, i_to_json, 1, Vstate);
-        Check_Type(tmp, T_STRING);
-        fbuffer_append_str(buffer, tmp);
-    } else {
-        tmp = rb_funcall(obj, i_to_s, 0);
-        Check_Type(tmp, T_STRING);
-        generate_json(buffer, Vstate, state, tmp);
-    }
-}
-
-static FBuffer *cState_prepare_buffer(VALUE self)
-{
-    FBuffer *buffer;
-    GET_STATE(self);
-    buffer = fbuffer_alloc(state->buffer_initial_length);
-
-    if (state->object_delim) {
-        fbuffer_clear(state->object_delim);
-    } else {
-        state->object_delim = fbuffer_alloc(16);
-    }
-    fbuffer_append_char(state->object_delim, ',');
-    if (state->object_delim2) {
-        fbuffer_clear(state->object_delim2);
-    } else {
-        state->object_delim2 = fbuffer_alloc(16);
-    }
-    fbuffer_append_char(state->object_delim2, ':');
-    if (state->space) fbuffer_append(state->object_delim2, state->space, state->space_len);
-
-    if (state->array_delim) {
-        fbuffer_clear(state->array_delim);
-    } else {
-        state->array_delim = fbuffer_alloc(16);
-    }
-    fbuffer_append_char(state->array_delim, ',');
-    if (state->array_nl) fbuffer_append(state->array_delim, state->array_nl, state->array_nl_len);
-    return buffer;
-}
-
-static VALUE cState_partial_generate(VALUE self, VALUE obj)
-{
-    FBuffer *buffer = cState_prepare_buffer(self);
-    GET_STATE(self);
-    generate_json(buffer, self, state, obj);
-    return fbuffer_to_s(buffer);
-}
-
-/*
- * This function returns true if string is either a JSON array or JSON object.
- * It might suffer from false positives, e. g. syntactically incorrect JSON in
- * the string or certain UTF-8 characters on the right hand side.
- */
-static int isArrayOrObject(VALUE string)
-{
-    long string_len = RSTRING_LEN(string);
-    char *p = RSTRING_PTR(string), *q = p + string_len - 1;
-    if (string_len < 2) return 0;
-    for (; p < q && isspace(*p); p++);
-    for (; q > p && isspace(*q); q--);
-    return (*p == '[' && *q == ']') || (*p == '{' && *q == '}');
-}
-
-/*
- * call-seq: generate(obj)
- *
- * Generates a valid JSON document from object +obj+ and returns the
- * result. If no valid JSON document can be created this method raises a
- * GeneratorError exception.
- */
-static VALUE cState_generate(VALUE self, VALUE obj)
-{
-    VALUE result = cState_partial_generate(self, obj);
-    GET_STATE(self);
-    if (!state->quirks_mode && !isArrayOrObject(result)) {
-        rb_raise(eGeneratorError, "only generation of JSON objects or arrays allowed");
-    }
-    return result;
-}
-
-/*
- * call-seq: new(opts = {})
- *
- * Instantiates a new State object, configured by _opts_.
- *
- * _opts_ can have the following keys:
- *
- * * *indent*: a string used to indent levels (default: ''),
- * * *space*: a string that is put after, a : or , delimiter (default: ''),
- * * *space_before*: a string that is put before a : pair delimiter (default: ''),
- * * *object_nl*: a string that is put at the end of a JSON object (default: ''),
- * * *array_nl*: a string that is put at the end of a JSON array (default: ''),
- * * *allow_nan*: true if NaN, Infinity, and -Infinity should be
- *   generated, otherwise an exception is thrown, if these values are
- *   encountered. This options defaults to false.
- * * *quirks_mode*: Enables quirks_mode for parser, that is for example
- *   generating single JSON values instead of documents is possible.
- * * *buffer_initial_length*: sets the initial length of the generator's
- *   internal buffer.
- */
-static VALUE cState_initialize(int argc, VALUE *argv, VALUE self)
-{
-    VALUE opts;
-    GET_STATE(self);
-    state->max_nesting = 100;
-    state->buffer_initial_length = FBUFFER_INITIAL_LENGTH_DEFAULT;
-    rb_scan_args(argc, argv, "01", &opts);
-    if (!NIL_P(opts)) cState_configure(self, opts);
-    return self;
-}
-
-/*
- * call-seq: initialize_copy(orig)
- *
- * Initializes this object from orig if it to be duplicated/cloned and returns
- * it.
-*/
-static VALUE cState_init_copy(VALUE obj, VALUE orig)
-{
-    JSON_Generator_State *objState, *origState;
-
-    Data_Get_Struct(obj, JSON_Generator_State, objState);
-    Data_Get_Struct(orig, JSON_Generator_State, origState);
-    if (!objState) rb_raise(rb_eArgError, "unallocated JSON::State");
-
-    MEMCPY(objState, origState, JSON_Generator_State, 1);
-    objState->indent = fstrndup(origState->indent, origState->indent_len);
-    objState->space = fstrndup(origState->space, origState->space_len);
-    objState->space_before = fstrndup(origState->space_before, origState->space_before_len);
-    objState->object_nl = fstrndup(origState->object_nl, origState->object_nl_len);
-    objState->array_nl = fstrndup(origState->array_nl, origState->array_nl_len);
-    if (origState->array_delim) objState->array_delim = fbuffer_dup(origState->array_delim);
-    if (origState->object_delim) objState->object_delim = fbuffer_dup(origState->object_delim);
-    if (origState->object_delim2) objState->object_delim2 = fbuffer_dup(origState->object_delim2);
-    return obj;
-}
-
-/*
- * call-seq: from_state(opts)
- *
- * Creates a State object from _opts_, which ought to be Hash to create a
- * new State instance configured by _opts_, something else to create an
- * unconfigured instance. If _opts_ is a State object, it is just returned.
- */
-static VALUE cState_from_state_s(VALUE self, VALUE opts)
-{
-    if (rb_obj_is_kind_of(opts, self)) {
-        return opts;
-    } else if (rb_obj_is_kind_of(opts, rb_cHash)) {
-        return rb_funcall(self, i_new, 1, opts);
-    } else {
-        if (NIL_P(CJSON_SAFE_STATE_PROTOTYPE)) {
-            CJSON_SAFE_STATE_PROTOTYPE = rb_const_get(mJSON, i_SAFE_STATE_PROTOTYPE);
-        }
-        return rb_funcall(CJSON_SAFE_STATE_PROTOTYPE, i_dup, 0);
-    }
-}
-
-/*
- * call-seq: indent()
- *
- * This string is used to indent levels in the JSON text.
- */
-static VALUE cState_indent(VALUE self)
-{
-    GET_STATE(self);
-    return state->indent ? rb_str_new(state->indent, state->indent_len) : rb_str_new2("");
-}
-
-/*
- * call-seq: indent=(indent)
- *
- * This string is used to indent levels in the JSON text.
- */
-static VALUE cState_indent_set(VALUE self, VALUE indent)
-{
-    unsigned long len;
-    GET_STATE(self);
-    Check_Type(indent, T_STRING);
-    len = RSTRING_LEN(indent);
-    if (len == 0) {
-        if (state->indent) {
-            ruby_xfree(state->indent);
-            state->indent = NULL;
-            state->indent_len = 0;
-        }
-    } else {
-        if (state->indent) ruby_xfree(state->indent);
-        state->indent = strdup(RSTRING_PTR(indent));
-        state->indent_len = len;
-    }
-    return Qnil;
-}
-
-/*
- * call-seq: space()
- *
- * This string is used to insert a space between the tokens in a JSON
- * string.
- */
-static VALUE cState_space(VALUE self)
-{
-    GET_STATE(self);
-    return state->space ? rb_str_new(state->space, state->space_len) : rb_str_new2("");
-}
-
-/*
- * call-seq: space=(space)
- *
- * This string is used to insert a space between the tokens in a JSON
- * string.
- */
-static VALUE cState_space_set(VALUE self, VALUE space)
-{
-    unsigned long len;
-    GET_STATE(self);
-    Check_Type(space, T_STRING);
-    len = RSTRING_LEN(space);
-    if (len == 0) {
-        if (state->space) {
-            ruby_xfree(state->space);
-            state->space = NULL;
-            state->space_len = 0;
-        }
-    } else {
-        if (state->space) ruby_xfree(state->space);
-        state->space = strdup(RSTRING_PTR(space));
-        state->space_len = len;
-    }
-    return Qnil;
-}
-
-/*
- * call-seq: space_before()
- *
- * This string is used to insert a space before the ':' in JSON objects.
- */
-static VALUE cState_space_before(VALUE self)
-{
-    GET_STATE(self);
-    return state->space_before ? rb_str_new(state->space_before, state->space_before_len) : rb_str_new2("");
-}
-
-/*
- * call-seq: space_before=(space_before)
- *
- * This string is used to insert a space before the ':' in JSON objects.
- */
-static VALUE cState_space_before_set(VALUE self, VALUE space_before)
-{
-    unsigned long len;
-    GET_STATE(self);
-    Check_Type(space_before, T_STRING);
-    len = RSTRING_LEN(space_before);
-    if (len == 0) {
-        if (state->space_before) {
-            ruby_xfree(state->space_before);
-            state->space_before = NULL;
-            state->space_before_len = 0;
-        }
-    } else {
-        if (state->space_before) ruby_xfree(state->space_before);
-        state->space_before = strdup(RSTRING_PTR(space_before));
-        state->space_before_len = len;
-    }
-    return Qnil;
-}
-
-/*
- * call-seq: object_nl()
- *
- * This string is put at the end of a line that holds a JSON object (or
- * Hash).
- */
-static VALUE cState_object_nl(VALUE self)
-{
-    GET_STATE(self);
-    return state->object_nl ? rb_str_new(state->object_nl, state->object_nl_len) : rb_str_new2("");
-}
-
-/*
- * call-seq: object_nl=(object_nl)
- *
- * This string is put at the end of a line that holds a JSON object (or
- * Hash).
- */
-static VALUE cState_object_nl_set(VALUE self, VALUE object_nl)
-{
-    unsigned long len;
-    GET_STATE(self);
-    Check_Type(object_nl, T_STRING);
-    len = RSTRING_LEN(object_nl);
-    if (len == 0) {
-        if (state->object_nl) {
-            ruby_xfree(state->object_nl);
-            state->object_nl = NULL;
-        }
-    } else {
-        if (state->object_nl) ruby_xfree(state->object_nl);
-        state->object_nl = strdup(RSTRING_PTR(object_nl));
-        state->object_nl_len = len;
-    }
-    return Qnil;
-}
-
-/*
- * call-seq: array_nl()
- *
- * This string is put at the end of a line that holds a JSON array.
- */
-static VALUE cState_array_nl(VALUE self)
-{
-    GET_STATE(self);
-    return state->array_nl ? rb_str_new(state->array_nl, state->array_nl_len) : rb_str_new2("");
-}
-
-/*
- * call-seq: array_nl=(array_nl)
- *
- * This string is put at the end of a line that holds a JSON array.
- */
-static VALUE cState_array_nl_set(VALUE self, VALUE array_nl)
-{
-    unsigned long len;
-    GET_STATE(self);
-    Check_Type(array_nl, T_STRING);
-    len = RSTRING_LEN(array_nl);
-    if (len == 0) {
-        if (state->array_nl) {
-            ruby_xfree(state->array_nl);
-            state->array_nl = NULL;
-        }
-    } else {
-        if (state->array_nl) ruby_xfree(state->array_nl);
-        state->array_nl = strdup(RSTRING_PTR(array_nl));
-        state->array_nl_len = len;
-    }
-    return Qnil;
-}
-
-
-/*
-* call-seq: check_circular?
-*
-* Returns true, if circular data structures should be checked,
-* otherwise returns false.
-*/
-static VALUE cState_check_circular_p(VALUE self)
-{
-    GET_STATE(self);
-    return state->max_nesting ? Qtrue : Qfalse;
-}
-
-/*
- * call-seq: max_nesting
- *
- * This integer returns the maximum level of data structure nesting in
- * the generated JSON, max_nesting = 0 if no maximum is checked.
- */
-static VALUE cState_max_nesting(VALUE self)
-{
-    GET_STATE(self);
-    return LONG2FIX(state->max_nesting);
-}
-
-/*
- * call-seq: max_nesting=(depth)
- *
- * This sets the maximum level of data structure nesting in the generated JSON
- * to the integer depth, max_nesting = 0 if no maximum should be checked.
- */
-static VALUE cState_max_nesting_set(VALUE self, VALUE depth)
-{
-    GET_STATE(self);
-    Check_Type(depth, T_FIXNUM);
-    return state->max_nesting = FIX2LONG(depth);
-}
-
-/*
- * call-seq: allow_nan?
- *
- * Returns true, if NaN, Infinity, and -Infinity should be generated, otherwise
- * returns false.
- */
-static VALUE cState_allow_nan_p(VALUE self)
-{
-    GET_STATE(self);
-    return state->allow_nan ? Qtrue : Qfalse;
-}
-
-/*
- * call-seq: ascii_only?
- *
- * Returns true, if NaN, Infinity, and -Infinity should be generated, otherwise
- * returns false.
- */
-static VALUE cState_ascii_only_p(VALUE self)
-{
-    GET_STATE(self);
-    return state->ascii_only ? Qtrue : Qfalse;
-}
-
-/*
- * call-seq: quirks_mode?
- *
- * Returns true, if quirks mode is enabled. Otherwise returns false.
- */
-static VALUE cState_quirks_mode_p(VALUE self)
-{
-    GET_STATE(self);
-    return state->quirks_mode ? Qtrue : Qfalse;
-}
-
-/*
- * call-seq: quirks_mode=(enable)
- *
- * If set to true, enables the quirks_mode mode.
- */
-static VALUE cState_quirks_mode_set(VALUE self, VALUE enable)
-{
-    GET_STATE(self);
-    state->quirks_mode = RTEST(enable);
-    return Qnil;
-}
-
-/*
- * call-seq: depth
- *
- * This integer returns the current depth of data structure nesting.
- */
-static VALUE cState_depth(VALUE self)
-{
-    GET_STATE(self);
-    return LONG2FIX(state->depth);
-}
-
-/*
- * call-seq: depth=(depth)
- *
- * This sets the maximum level of data structure nesting in the generated JSON
- * to the integer depth, max_nesting = 0 if no maximum should be checked.
- */
-static VALUE cState_depth_set(VALUE self, VALUE depth)
-{
-    GET_STATE(self);
-    Check_Type(depth, T_FIXNUM);
-    state->depth = FIX2LONG(depth);
-    return Qnil;
-}
-
-/*
- * call-seq: buffer_initial_length
- *
- * This integer returns the current inital length of the buffer.
- */
-static VALUE cState_buffer_initial_length(VALUE self)
-{
-    GET_STATE(self);
-    return LONG2FIX(state->buffer_initial_length);
-}
-
-/*
- * call-seq: buffer_initial_length=(length)
- *
- * This sets the initial length of the buffer to +length+, if +length+ > 0,
- * otherwise its value isn't changed.
- */
-static VALUE cState_buffer_initial_length_set(VALUE self, VALUE buffer_initial_length)
-{
-    long initial_length;
-    GET_STATE(self);
-    Check_Type(buffer_initial_length, T_FIXNUM);
-    initial_length = FIX2LONG(buffer_initial_length);
-    if (initial_length > 0) {
-        state->buffer_initial_length = initial_length;
-    }
-    return Qnil;
-}
-
-/*
- *
- */
-void Init_generator()
-{
-    rb_require("json/common");
-
-    mJSON = rb_define_module("JSON");
-    mExt = rb_define_module_under(mJSON, "Ext");
-    mGenerator = rb_define_module_under(mExt, "Generator");
-
-    eGeneratorError = rb_path2class("JSON::GeneratorError");
-    eNestingError = rb_path2class("JSON::NestingError");
-
-    cState = rb_define_class_under(mGenerator, "State", rb_cObject);
-    rb_define_alloc_func(cState, cState_s_allocate);
-    rb_define_singleton_method(cState, "from_state", cState_from_state_s, 1);
-    rb_define_method(cState, "initialize", cState_initialize, -1);
-    rb_define_method(cState, "initialize_copy", cState_init_copy, 1);
-    rb_define_method(cState, "indent", cState_indent, 0);
-    rb_define_method(cState, "indent=", cState_indent_set, 1);
-    rb_define_method(cState, "space", cState_space, 0);
-    rb_define_method(cState, "space=", cState_space_set, 1);
-    rb_define_method(cState, "space_before", cState_space_before, 0);
-    rb_define_method(cState, "space_before=", cState_space_before_set, 1);
-    rb_define_method(cState, "object_nl", cState_object_nl, 0);
-    rb_define_method(cState, "object_nl=", cState_object_nl_set, 1);
-    rb_define_method(cState, "array_nl", cState_array_nl, 0);
-    rb_define_method(cState, "array_nl=", cState_array_nl_set, 1);
-    rb_define_method(cState, "max_nesting", cState_max_nesting, 0);
-    rb_define_method(cState, "max_nesting=", cState_max_nesting_set, 1);
-    rb_define_method(cState, "check_circular?", cState_check_circular_p, 0);
-    rb_define_method(cState, "allow_nan?", cState_allow_nan_p, 0);
-    rb_define_method(cState, "ascii_only?", cState_ascii_only_p, 0);
-    rb_define_method(cState, "quirks_mode?", cState_quirks_mode_p, 0);
-    rb_define_method(cState, "quirks_mode", cState_quirks_mode_p, 0);
-    rb_define_method(cState, "quirks_mode=", cState_quirks_mode_set, 1);
-    rb_define_method(cState, "depth", cState_depth, 0);
-    rb_define_method(cState, "depth=", cState_depth_set, 1);
-    rb_define_method(cState, "buffer_initial_length", cState_buffer_initial_length, 0);
-    rb_define_method(cState, "buffer_initial_length=", cState_buffer_initial_length_set, 1);
-    rb_define_method(cState, "configure", cState_configure, 1);
-    rb_define_alias(cState, "merge", "configure");
-    rb_define_method(cState, "to_h", cState_to_h, 0);
-    rb_define_alias(cState, "to_hash", "to_h");
-    rb_define_method(cState, "[]", cState_aref, 1);
-    rb_define_method(cState, "[]=", cState_aset, 2);
-    rb_define_method(cState, "generate", cState_generate, 1);
-
-    mGeneratorMethods = rb_define_module_under(mGenerator, "GeneratorMethods");
-    mObject = rb_define_module_under(mGeneratorMethods, "Object");
-    rb_define_method(mObject, "to_json", mObject_to_json, -1);
-    mHash = rb_define_module_under(mGeneratorMethods, "Hash");
-    rb_define_method(mHash, "to_json", mHash_to_json, -1);
-    mArray = rb_define_module_under(mGeneratorMethods, "Array");
-    rb_define_method(mArray, "to_json", mArray_to_json, -1);
-    mFixnum = rb_define_module_under(mGeneratorMethods, "Fixnum");
-    rb_define_method(mFixnum, "to_json", mFixnum_to_json, -1);
-    mBignum = rb_define_module_under(mGeneratorMethods, "Bignum");
-    rb_define_method(mBignum, "to_json", mBignum_to_json, -1);
-    mFloat = rb_define_module_under(mGeneratorMethods, "Float");
-    rb_define_method(mFloat, "to_json", mFloat_to_json, -1);
-    mString = rb_define_module_under(mGeneratorMethods, "String");
-    rb_define_singleton_method(mString, "included", mString_included_s, 1);
-    rb_define_method(mString, "to_json", mString_to_json, -1);
-    rb_define_method(mString, "to_json_raw", mString_to_json_raw, -1);
-    rb_define_method(mString, "to_json_raw_object", mString_to_json_raw_object, 0);
-    mString_Extend = rb_define_module_under(mString, "Extend");
-    rb_define_method(mString_Extend, "json_create", mString_Extend_json_create, 1);
-    mTrueClass = rb_define_module_under(mGeneratorMethods, "TrueClass");
-    rb_define_method(mTrueClass, "to_json", mTrueClass_to_json, -1);
-    mFalseClass = rb_define_module_under(mGeneratorMethods, "FalseClass");
-    rb_define_method(mFalseClass, "to_json", mFalseClass_to_json, -1);
-    mNilClass = rb_define_module_under(mGeneratorMethods, "NilClass");
-    rb_define_method(mNilClass, "to_json", mNilClass_to_json, -1);
-
-    CRegexp_MULTILINE = rb_const_get(rb_cRegexp, rb_intern("MULTILINE"));
-    i_to_s = rb_intern("to_s");
-    i_to_json = rb_intern("to_json");
-    i_new = rb_intern("new");
-    i_indent = rb_intern("indent");
-    i_space = rb_intern("space");
-    i_space_before = rb_intern("space_before");
-    i_object_nl = rb_intern("object_nl");
-    i_array_nl = rb_intern("array_nl");
-    i_max_nesting = rb_intern("max_nesting");
-    i_allow_nan = rb_intern("allow_nan");
-    i_ascii_only = rb_intern("ascii_only");
-    i_quirks_mode = rb_intern("quirks_mode");
-    i_depth = rb_intern("depth");
-    i_buffer_initial_length = rb_intern("buffer_initial_length");
-    i_pack = rb_intern("pack");
-    i_unpack = rb_intern("unpack");
-    i_create_id = rb_intern("create_id");
-    i_extend = rb_intern("extend");
-    i_key_p = rb_intern("key?");
-    i_aref = rb_intern("[]");
-    i_send = rb_intern("__send__");
-    i_respond_to_p = rb_intern("respond_to?");
-    i_match = rb_intern("match");
-    i_keys = rb_intern("keys");
-    i_dup = rb_intern("dup");
-#ifdef HAVE_RUBY_ENCODING_H
-    CEncoding_UTF_8 = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-8"));
-    i_encoding = rb_intern("encoding");
-    i_encode = rb_intern("encode");
-#endif
-    i_SAFE_STATE_PROTOTYPE = rb_intern("SAFE_STATE_PROTOTYPE");
-    CJSON_SAFE_STATE_PROTOTYPE = Qnil;
-}
diff --git a/vendor/json_pure-1.7.7/ext/json/ext/generator/generator.h b/vendor/json_pure-1.7.7/ext/json/ext/generator/generator.h
deleted file mode 100644
index b58cc4b..0000000
--- a/vendor/json_pure-1.7.7/ext/json/ext/generator/generator.h
+++ /dev/null
@@ -1,148 +0,0 @@
-#ifndef _GENERATOR_H_
-#define _GENERATOR_H_
-
-#include <string.h>
-#include <math.h>
-#include <ctype.h>
-
-#include "ruby.h"
-
-#ifdef HAVE_RUBY_RE_H
-#include "ruby/re.h"
-#else
-#include "re.h"
-#endif
-
-#ifndef rb_intern_str
-#define rb_intern_str(string) SYM2ID(rb_str_intern(string))
-#endif
-
-#ifndef rb_obj_instance_variables
-#define rb_obj_instance_variables(object) rb_funcall(object, rb_intern("instance_variables"), 0)
-#endif
-
-#define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key))
-
-/* unicode defintions */
-
-#define UNI_STRICT_CONVERSION 1
-
-typedef unsigned long  UTF32; /* at least 32 bits */
-typedef unsigned short UTF16; /* at least 16 bits */
-typedef unsigned char  UTF8;  /* typically 8 bits */
-
-#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
-#define UNI_MAX_BMP (UTF32)0x0000FFFF
-#define UNI_MAX_UTF16 (UTF32)0x0010FFFF
-#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF
-#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF
-
-#define UNI_SUR_HIGH_START  (UTF32)0xD800
-#define UNI_SUR_HIGH_END    (UTF32)0xDBFF
-#define UNI_SUR_LOW_START   (UTF32)0xDC00
-#define UNI_SUR_LOW_END     (UTF32)0xDFFF
-
-static const int halfShift  = 10; /* used for shifting by 10 bits */
-
-static const UTF32 halfBase = 0x0010000UL;
-static const UTF32 halfMask = 0x3FFUL;
-
-static unsigned char isLegalUTF8(const UTF8 *source, unsigned long length);
-static void unicode_escape(char *buf, UTF16 character);
-static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16 character);
-static void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string);
-static void convert_UTF8_to_JSON(FBuffer *buffer, VALUE string);
-static char *fstrndup(const char *ptr, unsigned long len);
-
-/* ruby api and some helpers */
-
-typedef struct JSON_Generator_StateStruct {
-    char *indent;
-    long indent_len;
-    char *space;
-    long space_len;
-    char *space_before;
-    long space_before_len;
-    char *object_nl;
-    long object_nl_len;
-    char *array_nl;
-    long array_nl_len;
-    FBuffer *array_delim;
-    FBuffer *object_delim;
-    FBuffer *object_delim2;
-    long max_nesting;
-    char allow_nan;
-    char ascii_only;
-    char quirks_mode;
-    long depth;
-    long buffer_initial_length;
-} JSON_Generator_State;
-
-#define GET_STATE(self)                       \
-    JSON_Generator_State *state;              \
-    Data_Get_Struct(self, JSON_Generator_State, state)
-
-#define GENERATE_JSON(type)                                                                     \
-    FBuffer *buffer;                                                                            \
-    VALUE Vstate;                                                                               \
-    JSON_Generator_State *state;                                                                \
-                                                                                                \
-    rb_scan_args(argc, argv, "01", &Vstate);                                                    \
-    Vstate = cState_from_state_s(cState, Vstate);                                               \
-    Data_Get_Struct(Vstate, JSON_Generator_State, state);                                       \
-    buffer = cState_prepare_buffer(Vstate);                                                     \
-    generate_json_##type(buffer, Vstate, state, self);                                          \
-    return fbuffer_to_s(buffer)
-
-static VALUE mHash_to_json(int argc, VALUE *argv, VALUE self);
-static VALUE mArray_to_json(int argc, VALUE *argv, VALUE self);
-static VALUE mFixnum_to_json(int argc, VALUE *argv, VALUE self);
-static VALUE mBignum_to_json(int argc, VALUE *argv, VALUE self);
-static VALUE mFloat_to_json(int argc, VALUE *argv, VALUE self);
-static VALUE mString_included_s(VALUE self, VALUE modul);
-static VALUE mString_to_json(int argc, VALUE *argv, VALUE self);
-static VALUE mString_to_json_raw_object(VALUE self);
-static VALUE mString_to_json_raw(int argc, VALUE *argv, VALUE self);
-static VALUE mString_Extend_json_create(VALUE self, VALUE o);
-static VALUE mTrueClass_to_json(int argc, VALUE *argv, VALUE self);
-static VALUE mFalseClass_to_json(int argc, VALUE *argv, VALUE self);
-static VALUE mNilClass_to_json(int argc, VALUE *argv, VALUE self);
-static VALUE mObject_to_json(int argc, VALUE *argv, VALUE self);
-static void State_free(JSON_Generator_State *state);
-static JSON_Generator_State *State_allocate();
-static VALUE cState_s_allocate(VALUE klass);
-static VALUE cState_configure(VALUE self, VALUE opts);
-static VALUE cState_to_h(VALUE self);
-static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
-static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
-static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
-static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
-static void generate_json_null(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
-static void generate_json_false(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
-static void generate_json_true(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
-static void generate_json_fixnum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
-static void generate_json_bignum(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
-static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj);
-static VALUE cState_partial_generate(VALUE self, VALUE obj);
-static VALUE cState_generate(VALUE self, VALUE obj);
-static VALUE cState_initialize(int argc, VALUE *argv, VALUE self);
-static VALUE cState_from_state_s(VALUE self, VALUE opts);
-static VALUE cState_indent(VALUE self);
-static VALUE cState_indent_set(VALUE self, VALUE indent);
-static VALUE cState_space(VALUE self);
-static VALUE cState_space_set(VALUE self, VALUE space);
-static VALUE cState_space_before(VALUE self);
-static VALUE cState_space_before_set(VALUE self, VALUE space_before);
-static VALUE cState_object_nl(VALUE self);
-static VALUE cState_object_nl_set(VALUE self, VALUE object_nl);
-static VALUE cState_array_nl(VALUE self);
-static VALUE cState_array_nl_set(VALUE self, VALUE array_nl);
-static VALUE cState_max_nesting(VALUE self);
-static VALUE cState_max_nesting_set(VALUE self, VALUE depth);
-static VALUE cState_allow_nan_p(VALUE self);
-static VALUE cState_ascii_only_p(VALUE self);
-static VALUE cState_depth(VALUE self);
-static VALUE cState_depth_set(VALUE self, VALUE depth);
-static FBuffer *cState_prepare_buffer(VALUE self);
-
-#endif
diff --git a/vendor/json_pure-1.7.7/ext/json/ext/parser/depend b/vendor/json_pure-1.7.7/ext/json/ext/parser/depend
deleted file mode 100644
index 498ffa9..0000000
--- a/vendor/json_pure-1.7.7/ext/json/ext/parser/depend
+++ /dev/null
@@ -1 +0,0 @@
-parser.o: parser.c parser.h $(srcdir)/../fbuffer/fbuffer.h
diff --git a/vendor/json_pure-1.7.7/ext/json/ext/parser/extconf.rb b/vendor/json_pure-1.7.7/ext/json/ext/parser/extconf.rb
deleted file mode 100644
index 4791829..0000000
--- a/vendor/json_pure-1.7.7/ext/json/ext/parser/extconf.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-require 'mkmf'
-
-unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O3')
-  $CFLAGS << ' -O3'
-end
-if CONFIG['CC'] =~ /gcc/
-  $CFLAGS << ' -Wall'
-  if $DEBUG && !$CFLAGS.gsub!(/ -O[\dsz]?/, ' -O0 -ggdb')
-    $CFLAGS << ' -O0 -ggdb'
-  end
-end
-
-create_makefile 'json/ext/parser'
diff --git a/vendor/json_pure-1.7.7/ext/json/ext/parser/parser.c b/vendor/json_pure-1.7.7/ext/json/ext/parser/parser.c
deleted file mode 100644
index df89f2c..0000000
--- a/vendor/json_pure-1.7.7/ext/json/ext/parser/parser.c
+++ /dev/null
@@ -1,2204 +0,0 @@
-
-#line 1 "parser.rl"
-#include "../fbuffer/fbuffer.h"
-#include "parser.h"
-
-/* unicode */
-
-static const char digit_values[256] = {
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1,
-    -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1
-};
-
-static UTF32 unescape_unicode(const unsigned char *p)
-{
-    char b;
-    UTF32 result = 0;
-    b = digit_values[p[0]];
-    if (b < 0) return UNI_REPLACEMENT_CHAR;
-    result = (result << 4) | b;
-    b = digit_values[p[1]];
-    result = (result << 4) | b;
-    if (b < 0) return UNI_REPLACEMENT_CHAR;
-    b = digit_values[p[2]];
-    result = (result << 4) | b;
-    if (b < 0) return UNI_REPLACEMENT_CHAR;
-    b = digit_values[p[3]];
-    result = (result << 4) | b;
-    if (b < 0) return UNI_REPLACEMENT_CHAR;
-    return result;
-}
-
-static int convert_UTF32_to_UTF8(char *buf, UTF32 ch)
-{
-    int len = 1;
-    if (ch <= 0x7F) {
-        buf[0] = (char) ch;
-    } else if (ch <= 0x07FF) {
-        buf[0] = (char) ((ch >> 6) | 0xC0);
-        buf[1] = (char) ((ch & 0x3F) | 0x80);
-        len++;
-    } else if (ch <= 0xFFFF) {
-        buf[0] = (char) ((ch >> 12) | 0xE0);
-        buf[1] = (char) (((ch >> 6) & 0x3F) | 0x80);
-        buf[2] = (char) ((ch & 0x3F) | 0x80);
-        len += 2;
-    } else if (ch <= 0x1fffff) {
-        buf[0] =(char) ((ch >> 18) | 0xF0);
-        buf[1] =(char) (((ch >> 12) & 0x3F) | 0x80);
-        buf[2] =(char) (((ch >> 6) & 0x3F) | 0x80);
-        buf[3] =(char) ((ch & 0x3F) | 0x80);
-        len += 3;
-    } else {
-        buf[0] = '?';
-    }
-    return len;
-}
-
-#ifdef HAVE_RUBY_ENCODING_H
-static VALUE CEncoding_ASCII_8BIT, CEncoding_UTF_8, CEncoding_UTF_16BE,
-    CEncoding_UTF_16LE, CEncoding_UTF_32BE, CEncoding_UTF_32LE;
-static ID i_encoding, i_encode;
-#else
-static ID i_iconv;
-#endif
-
-static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
-static VALUE CNaN, CInfinity, CMinusInfinity;
-
-static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
-          i_chr, i_max_nesting, i_allow_nan, i_symbolize_names, i_quirks_mode,
-          i_object_class, i_array_class, i_key_p, i_deep_const_get, i_match,
-          i_match_string, i_aset, i_aref, i_leftshift;
-
-
-#line 110 "parser.rl"
-
-
-
-#line 92 "parser.c"
-static const int JSON_object_start = 1;
-static const int JSON_object_first_final = 27;
-static const int JSON_object_error = 0;
-
-static const int JSON_object_en_main = 1;
-
-
-#line 151 "parser.rl"
-
-
-static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result)
-{
-    int cs = EVIL;
-    VALUE last_name = Qnil;
-    VALUE object_class = json->object_class;
-
-    if (json->max_nesting && json->current_nesting > json->max_nesting) {
-        rb_raise(eNestingError, "nesting of %d is too deep", json->current_nesting);
-    }
-
-    *result = NIL_P(object_class) ? rb_hash_new() : rb_class_new_instance(0, 0, object_class);
-
-
-#line 116 "parser.c"
-	{
-	cs = JSON_object_start;
-	}
-
-#line 166 "parser.rl"
-
-#line 123 "parser.c"
-	{
-	if ( p == pe )
-		goto _test_eof;
-	switch ( cs )
-	{
-case 1:
-	if ( (*p) == 123 )
-		goto st2;
-	goto st0;
-st0:
-cs = 0;
-	goto _out;
-st2:
-	if ( ++p == pe )
-		goto _test_eof2;
-case 2:
-	switch( (*p) ) {
-		case 13: goto st2;
-		case 32: goto st2;
-		case 34: goto tr2;
-		case 47: goto st23;
-		case 125: goto tr4;
-	}
-	if ( 9 <= (*p) && (*p) <= 10 )
-		goto st2;
-	goto st0;
-tr2:
-#line 133 "parser.rl"
-	{
-        char *np;
-        json->parsing_name = 1;
-        np = JSON_parse_string(json, p, pe, &last_name);
-        json->parsing_name = 0;
-        if (np == NULL) { p--; {p++; cs = 3; goto _out;} } else {p = (( np))-1;}
-    }
-	goto st3;
-st3:
-	if ( ++p == pe )
-		goto _test_eof3;
-case 3:
-#line 164 "parser.c"
-	switch( (*p) ) {
-		case 13: goto st3;
-		case 32: goto st3;
-		case 47: goto st4;
-		case 58: goto st8;
-	}
-	if ( 9 <= (*p) && (*p) <= 10 )
-		goto st3;
-	goto st0;
-st4:
-	if ( ++p == pe )
-		goto _test_eof4;
-case 4:
-	switch( (*p) ) {
-		case 42: goto st5;
-		case 47: goto st7;
-	}
-	goto st0;
-st5:
-	if ( ++p == pe )
-		goto _test_eof5;
-case 5:
-	if ( (*p) == 42 )
-		goto st6;
-	goto st5;
-st6:
-	if ( ++p == pe )
-		goto _test_eof6;
-case 6:
-	switch( (*p) ) {
-		case 42: goto st6;
-		case 47: goto st3;
-	}
-	goto st5;
-st7:
-	if ( ++p == pe )
-		goto _test_eof7;
-case 7:
-	if ( (*p) == 10 )
-		goto st3;
-	goto st7;
-st8:
-	if ( ++p == pe )
-		goto _test_eof8;
-case 8:
-	switch( (*p) ) {
-		case 13: goto st8;
-		case 32: goto st8;
-		case 34: goto tr11;
-		case 45: goto tr11;
-		case 47: goto st19;
-		case 73: goto tr11;
-		case 78: goto tr11;
-		case 91: goto tr11;
-		case 102: goto tr11;
-		case 110: goto tr11;
-		case 116: goto tr11;
-		case 123: goto tr11;
-	}
-	if ( (*p) > 10 ) {
-		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr11;
-	} else if ( (*p) >= 9 )
-		goto st8;
-	goto st0;
-tr11:
-#line 118 "parser.rl"
-	{
-        VALUE v = Qnil;
-        char *np = JSON_parse_value(json, p, pe, &v);
-        if (np == NULL) {
-            p--; {p++; cs = 9; goto _out;}
-        } else {
-            if (NIL_P(json->object_class)) {
-                rb_hash_aset(*result, last_name, v);
-            } else {
-                rb_funcall(*result, i_aset, 2, last_name, v);
-            }
-            {p = (( np))-1;}
-        }
-    }
-	goto st9;
-st9:
-	if ( ++p == pe )
-		goto _test_eof9;
-case 9:
-#line 251 "parser.c"
-	switch( (*p) ) {
-		case 13: goto st9;
-		case 32: goto st9;
-		case 44: goto st10;
-		case 47: goto st15;
-		case 125: goto tr4;
-	}
-	if ( 9 <= (*p) && (*p) <= 10 )
-		goto st9;
-	goto st0;
-st10:
-	if ( ++p == pe )
-		goto _test_eof10;
-case 10:
-	switch( (*p) ) {
-		case 13: goto st10;
-		case 32: goto st10;
-		case 34: goto tr2;
-		case 47: goto st11;
-	}
-	if ( 9 <= (*p) && (*p) <= 10 )
-		goto st10;
-	goto st0;
-st11:
-	if ( ++p == pe )
-		goto _test_eof11;
-case 11:
-	switch( (*p) ) {
-		case 42: goto st12;
-		case 47: goto st14;
-	}
-	goto st0;
-st12:
-	if ( ++p == pe )
-		goto _test_eof12;
-case 12:
-	if ( (*p) == 42 )
-		goto st13;
-	goto st12;
-st13:
-	if ( ++p == pe )
-		goto _test_eof13;
-case 13:
-	switch( (*p) ) {
-		case 42: goto st13;
-		case 47: goto st10;
-	}
-	goto st12;
-st14:
-	if ( ++p == pe )
-		goto _test_eof14;
-case 14:
-	if ( (*p) == 10 )
-		goto st10;
-	goto st14;
-st15:
-	if ( ++p == pe )
-		goto _test_eof15;
-case 15:
-	switch( (*p) ) {
-		case 42: goto st16;
-		case 47: goto st18;
-	}
-	goto st0;
-st16:
-	if ( ++p == pe )
-		goto _test_eof16;
-case 16:
-	if ( (*p) == 42 )
-		goto st17;
-	goto st16;
-st17:
-	if ( ++p == pe )
-		goto _test_eof17;
-case 17:
-	switch( (*p) ) {
-		case 42: goto st17;
-		case 47: goto st9;
-	}
-	goto st16;
-st18:
-	if ( ++p == pe )
-		goto _test_eof18;
-case 18:
-	if ( (*p) == 10 )
-		goto st9;
-	goto st18;
-tr4:
-#line 141 "parser.rl"
-	{ p--; {p++; cs = 27; goto _out;} }
-	goto st27;
-st27:
-	if ( ++p == pe )
-		goto _test_eof27;
-case 27:
-#line 347 "parser.c"
-	goto st0;
-st19:
-	if ( ++p == pe )
-		goto _test_eof19;
-case 19:
-	switch( (*p) ) {
-		case 42: goto st20;
-		case 47: goto st22;
-	}
-	goto st0;
-st20:
-	if ( ++p == pe )
-		goto _test_eof20;
-case 20:
-	if ( (*p) == 42 )
-		goto st21;
-	goto st20;
-st21:
-	if ( ++p == pe )
-		goto _test_eof21;
-case 21:
-	switch( (*p) ) {
-		case 42: goto st21;
-		case 47: goto st8;
-	}
-	goto st20;
-st22:
-	if ( ++p == pe )
-		goto _test_eof22;
-case 22:
-	if ( (*p) == 10 )
-		goto st8;
-	goto st22;
-st23:
-	if ( ++p == pe )
-		goto _test_eof23;
-case 23:
-	switch( (*p) ) {
-		case 42: goto st24;
-		case 47: goto st26;
-	}
-	goto st0;
-st24:
-	if ( ++p == pe )
-		goto _test_eof24;
-case 24:
-	if ( (*p) == 42 )
-		goto st25;
-	goto st24;
-st25:
-	if ( ++p == pe )
-		goto _test_eof25;
-case 25:
-	switch( (*p) ) {
-		case 42: goto st25;
-		case 47: goto st2;
-	}
-	goto st24;
-st26:
-	if ( ++p == pe )
-		goto _test_eof26;
-case 26:
-	if ( (*p) == 10 )
-		goto st2;
-	goto st26;
-	}
-	_test_eof2: cs = 2; goto _test_eof;
-	_test_eof3: cs = 3; goto _test_eof;
-	_test_eof4: cs = 4; goto _test_eof;
-	_test_eof5: cs = 5; goto _test_eof;
-	_test_eof6: cs = 6; goto _test_eof;
-	_test_eof7: cs = 7; goto _test_eof;
-	_test_eof8: cs = 8; goto _test_eof;
-	_test_eof9: cs = 9; goto _test_eof;
-	_test_eof10: cs = 10; goto _test_eof;
-	_test_eof11: cs = 11; goto _test_eof;
-	_test_eof12: cs = 12; goto _test_eof;
-	_test_eof13: cs = 13; goto _test_eof;
-	_test_eof14: cs = 14; goto _test_eof;
-	_test_eof15: cs = 15; goto _test_eof;
-	_test_eof16: cs = 16; goto _test_eof;
-	_test_eof17: cs = 17; goto _test_eof;
-	_test_eof18: cs = 18; goto _test_eof;
-	_test_eof27: cs = 27; goto _test_eof;
-	_test_eof19: cs = 19; goto _test_eof;
-	_test_eof20: cs = 20; goto _test_eof;
-	_test_eof21: cs = 21; goto _test_eof;
-	_test_eof22: cs = 22; goto _test_eof;
-	_test_eof23: cs = 23; goto _test_eof;
-	_test_eof24: cs = 24; goto _test_eof;
-	_test_eof25: cs = 25; goto _test_eof;
-	_test_eof26: cs = 26; goto _test_eof;
-
-	_test_eof: {}
-	_out: {}
-	}
-
-#line 167 "parser.rl"
-
-    if (cs >= JSON_object_first_final) {
-        if (json->create_additions) {
-            VALUE klassname;
-            if (NIL_P(json->object_class)) {
-              klassname = rb_hash_aref(*result, json->create_id);
-            } else {
-              klassname = rb_funcall(*result, i_aref, 1, json->create_id);
-            }
-            if (!NIL_P(klassname)) {
-                VALUE klass = rb_funcall(mJSON, i_deep_const_get, 1, klassname);
-                if (RTEST(rb_funcall(klass, i_json_creatable_p, 0))) {
-                    *result = rb_funcall(klass, i_json_create, 1, *result);
-                }
-            }
-        }
-        return p + 1;
-    } else {
-        return NULL;
-    }
-}
-
-
-
-#line 470 "parser.c"
-static const int JSON_value_start = 1;
-static const int JSON_value_first_final = 21;
-static const int JSON_value_error = 0;
-
-static const int JSON_value_en_main = 1;
-
-
-#line 271 "parser.rl"
-
-
-static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result)
-{
-    int cs = EVIL;
-
-
-#line 486 "parser.c"
-	{
-	cs = JSON_value_start;
-	}
-
-#line 278 "parser.rl"
-
-#line 493 "parser.c"
-	{
-	if ( p == pe )
-		goto _test_eof;
-	switch ( cs )
-	{
-case 1:
-	switch( (*p) ) {
-		case 34: goto tr0;
-		case 45: goto tr2;
-		case 73: goto st2;
-		case 78: goto st9;
-		case 91: goto tr5;
-		case 102: goto st11;
-		case 110: goto st15;
-		case 116: goto st18;
-		case 123: goto tr9;
-	}
-	if ( 48 <= (*p) && (*p) <= 57 )
-		goto tr2;
-	goto st0;
-st0:
-cs = 0;
-	goto _out;
-tr0:
-#line 219 "parser.rl"
-	{
-        char *np = JSON_parse_string(json, p, pe, result);
-        if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
-    }
-	goto st21;
-tr2:
-#line 224 "parser.rl"
-	{
-        char *np;
-        if(pe > p + 9 - json->quirks_mode && !strncmp(MinusInfinity, p, 9)) {
-            if (json->allow_nan) {
-                *result = CMinusInfinity;
-                {p = (( p + 10))-1;}
-                p--; {p++; cs = 21; goto _out;}
-            } else {
-                rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
-            }
-        }
-        np = JSON_parse_float(json, p, pe, result);
-        if (np != NULL) {p = (( np))-1;}
-        np = JSON_parse_integer(json, p, pe, result);
-        if (np != NULL) {p = (( np))-1;}
-        p--; {p++; cs = 21; goto _out;}
-    }
-	goto st21;
-tr5:
-#line 242 "parser.rl"
-	{
-        char *np;
-        json->current_nesting++;
-        np = JSON_parse_array(json, p, pe, result);
-        json->current_nesting--;
-        if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
-    }
-	goto st21;
-tr9:
-#line 250 "parser.rl"
-	{
-        char *np;
-        json->current_nesting++;
-        np =  JSON_parse_object(json, p, pe, result);
-        json->current_nesting--;
-        if (np == NULL) { p--; {p++; cs = 21; goto _out;} } else {p = (( np))-1;}
-    }
-	goto st21;
-tr16:
-#line 212 "parser.rl"
-	{
-        if (json->allow_nan) {
-            *result = CInfinity;
-        } else {
-            rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p - 8);
-        }
-    }
-	goto st21;
-tr18:
-#line 205 "parser.rl"
-	{
-        if (json->allow_nan) {
-            *result = CNaN;
-        } else {
-            rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p - 2);
-        }
-    }
-	goto st21;
-tr22:
-#line 199 "parser.rl"
-	{
-        *result = Qfalse;
-    }
-	goto st21;
-tr25:
-#line 196 "parser.rl"
-	{
-        *result = Qnil;
-    }
-	goto st21;
-tr28:
-#line 202 "parser.rl"
-	{
-        *result = Qtrue;
-    }
-	goto st21;
-st21:
-	if ( ++p == pe )
-		goto _test_eof21;
-case 21:
-#line 258 "parser.rl"
-	{ p--; {p++; cs = 21; goto _out;} }
-#line 608 "parser.c"
-	goto st0;
-st2:
-	if ( ++p == pe )
-		goto _test_eof2;
-case 2:
-	if ( (*p) == 110 )
-		goto st3;
-	goto st0;
-st3:
-	if ( ++p == pe )
-		goto _test_eof3;
-case 3:
-	if ( (*p) == 102 )
-		goto st4;
-	goto st0;
-st4:
-	if ( ++p == pe )
-		goto _test_eof4;
-case 4:
-	if ( (*p) == 105 )
-		goto st5;
-	goto st0;
-st5:
-	if ( ++p == pe )
-		goto _test_eof5;
-case 5:
-	if ( (*p) == 110 )
-		goto st6;
-	goto st0;
-st6:
-	if ( ++p == pe )
-		goto _test_eof6;
-case 6:
-	if ( (*p) == 105 )
-		goto st7;
-	goto st0;
-st7:
-	if ( ++p == pe )
-		goto _test_eof7;
-case 7:
-	if ( (*p) == 116 )
-		goto st8;
-	goto st0;
-st8:
-	if ( ++p == pe )
-		goto _test_eof8;
-case 8:
-	if ( (*p) == 121 )
-		goto tr16;
-	goto st0;
-st9:
-	if ( ++p == pe )
-		goto _test_eof9;
-case 9:
-	if ( (*p) == 97 )
-		goto st10;
-	goto st0;
-st10:
-	if ( ++p == pe )
-		goto _test_eof10;
-case 10:
-	if ( (*p) == 78 )
-		goto tr18;
-	goto st0;
-st11:
-	if ( ++p == pe )
-		goto _test_eof11;
-case 11:
-	if ( (*p) == 97 )
-		goto st12;
-	goto st0;
-st12:
-	if ( ++p == pe )
-		goto _test_eof12;
-case 12:
-	if ( (*p) == 108 )
-		goto st13;
-	goto st0;
-st13:
-	if ( ++p == pe )
-		goto _test_eof13;
-case 13:
-	if ( (*p) == 115 )
-		goto st14;
-	goto st0;
-st14:
-	if ( ++p == pe )
-		goto _test_eof14;
-case 14:
-	if ( (*p) == 101 )
-		goto tr22;
-	goto st0;
-st15:
-	if ( ++p == pe )
-		goto _test_eof15;
-case 15:
-	if ( (*p) == 117 )
-		goto st16;
-	goto st0;
-st16:
-	if ( ++p == pe )
-		goto _test_eof16;
-case 16:
-	if ( (*p) == 108 )
-		goto st17;
-	goto st0;
-st17:
-	if ( ++p == pe )
-		goto _test_eof17;
-case 17:
-	if ( (*p) == 108 )
-		goto tr25;
-	goto st0;
-st18:
-	if ( ++p == pe )
-		goto _test_eof18;
-case 18:
-	if ( (*p) == 114 )
-		goto st19;
-	goto st0;
-st19:
-	if ( ++p == pe )
-		goto _test_eof19;
-case 19:
-	if ( (*p) == 117 )
-		goto st20;
-	goto st0;
-st20:
-	if ( ++p == pe )
-		goto _test_eof20;
-case 20:
-	if ( (*p) == 101 )
-		goto tr28;
-	goto st0;
-	}
-	_test_eof21: cs = 21; goto _test_eof;
-	_test_eof2: cs = 2; goto _test_eof;
-	_test_eof3: cs = 3; goto _test_eof;
-	_test_eof4: cs = 4; goto _test_eof;
-	_test_eof5: cs = 5; goto _test_eof;
-	_test_eof6: cs = 6; goto _test_eof;
-	_test_eof7: cs = 7; goto _test_eof;
-	_test_eof8: cs = 8; goto _test_eof;
-	_test_eof9: cs = 9; goto _test_eof;
-	_test_eof10: cs = 10; goto _test_eof;
-	_test_eof11: cs = 11; goto _test_eof;
-	_test_eof12: cs = 12; goto _test_eof;
-	_test_eof13: cs = 13; goto _test_eof;
-	_test_eof14: cs = 14; goto _test_eof;
-	_test_eof15: cs = 15; goto _test_eof;
-	_test_eof16: cs = 16; goto _test_eof;
-	_test_eof17: cs = 17; goto _test_eof;
-	_test_eof18: cs = 18; goto _test_eof;
-	_test_eof19: cs = 19; goto _test_eof;
-	_test_eof20: cs = 20; goto _test_eof;
-
-	_test_eof: {}
-	_out: {}
-	}
-
-#line 279 "parser.rl"
-
-    if (cs >= JSON_value_first_final) {
-        return p;
-    } else {
-        return NULL;
-    }
-}
-
-
-#line 779 "parser.c"
-static const int JSON_integer_start = 1;
-static const int JSON_integer_first_final = 3;
-static const int JSON_integer_error = 0;
-
-static const int JSON_integer_en_main = 1;
-
-
-#line 295 "parser.rl"
-
-
-static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
-{
-    int cs = EVIL;
-
-
-#line 795 "parser.c"
-	{
-	cs = JSON_integer_start;
-	}
-
-#line 302 "parser.rl"
-    json->memo = p;
-
-#line 803 "parser.c"
-	{
-	if ( p == pe )
-		goto _test_eof;
-	switch ( cs )
-	{
-case 1:
-	switch( (*p) ) {
-		case 45: goto st2;
-		case 48: goto st3;
-	}
-	if ( 49 <= (*p) && (*p) <= 57 )
-		goto st5;
-	goto st0;
-st0:
-cs = 0;
-	goto _out;
-st2:
-	if ( ++p == pe )
-		goto _test_eof2;
-case 2:
-	if ( (*p) == 48 )
-		goto st3;
-	if ( 49 <= (*p) && (*p) <= 57 )
-		goto st5;
-	goto st0;
-st3:
-	if ( ++p == pe )
-		goto _test_eof3;
-case 3:
-	if ( 48 <= (*p) && (*p) <= 57 )
-		goto st0;
-	goto tr4;
-tr4:
-#line 292 "parser.rl"
-	{ p--; {p++; cs = 4; goto _out;} }
-	goto st4;
-st4:
-	if ( ++p == pe )
-		goto _test_eof4;
-case 4:
-#line 844 "parser.c"
-	goto st0;
-st5:
-	if ( ++p == pe )
-		goto _test_eof5;
-case 5:
-	if ( 48 <= (*p) && (*p) <= 57 )
-		goto st5;
-	goto tr4;
-	}
-	_test_eof2: cs = 2; goto _test_eof;
-	_test_eof3: cs = 3; goto _test_eof;
-	_test_eof4: cs = 4; goto _test_eof;
-	_test_eof5: cs = 5; goto _test_eof;
-
-	_test_eof: {}
-	_out: {}
-	}
-
-#line 304 "parser.rl"
-
-    if (cs >= JSON_integer_first_final) {
-        long len = p - json->memo;
-        fbuffer_clear(json->fbuffer);
-        fbuffer_append(json->fbuffer, json->memo, len);
-        fbuffer_append_char(json->fbuffer, '\0');
-        *result = rb_cstr2inum(FBUFFER_PTR(json->fbuffer), 10);
-        return p + 1;
-    } else {
-        return NULL;
-    }
-}
-
-
-#line 878 "parser.c"
-static const int JSON_float_start = 1;
-static const int JSON_float_first_final = 8;
-static const int JSON_float_error = 0;
-
-static const int JSON_float_en_main = 1;
-
-
-#line 329 "parser.rl"
-
-
-static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
-{
-    int cs = EVIL;
-
-
-#line 894 "parser.c"
-	{
-	cs = JSON_float_start;
-	}
-
-#line 336 "parser.rl"
-    json->memo = p;
-
-#line 902 "parser.c"
-	{
-	if ( p == pe )
-		goto _test_eof;
-	switch ( cs )
-	{
-case 1:
-	switch( (*p) ) {
-		case 45: goto st2;
-		case 48: goto st3;
-	}
-	if ( 49 <= (*p) && (*p) <= 57 )
-		goto st7;
-	goto st0;
-st0:
-cs = 0;
-	goto _out;
-st2:
-	if ( ++p == pe )
-		goto _test_eof2;
-case 2:
-	if ( (*p) == 48 )
-		goto st3;
-	if ( 49 <= (*p) && (*p) <= 57 )
-		goto st7;
-	goto st0;
-st3:
-	if ( ++p == pe )
-		goto _test_eof3;
-case 3:
-	switch( (*p) ) {
-		case 46: goto st4;
-		case 69: goto st5;
-		case 101: goto st5;
-	}
-	goto st0;
-st4:
-	if ( ++p == pe )
-		goto _test_eof4;
-case 4:
-	if ( 48 <= (*p) && (*p) <= 57 )
-		goto st8;
-	goto st0;
-st8:
-	if ( ++p == pe )
-		goto _test_eof8;
-case 8:
-	switch( (*p) ) {
-		case 69: goto st5;
-		case 101: goto st5;
-	}
-	if ( (*p) > 46 ) {
-		if ( 48 <= (*p) && (*p) <= 57 )
-			goto st8;
-	} else if ( (*p) >= 45 )
-		goto st0;
-	goto tr9;
-tr9:
-#line 323 "parser.rl"
-	{ p--; {p++; cs = 9; goto _out;} }
-	goto st9;
-st9:
-	if ( ++p == pe )
-		goto _test_eof9;
-case 9:
-#line 967 "parser.c"
-	goto st0;
-st5:
-	if ( ++p == pe )
-		goto _test_eof5;
-case 5:
-	switch( (*p) ) {
-		case 43: goto st6;
-		case 45: goto st6;
-	}
-	if ( 48 <= (*p) && (*p) <= 57 )
-		goto st10;
-	goto st0;
-st6:
-	if ( ++p == pe )
-		goto _test_eof6;
-case 6:
-	if ( 48 <= (*p) && (*p) <= 57 )
-		goto st10;
-	goto st0;
-st10:
-	if ( ++p == pe )
-		goto _test_eof10;
-case 10:
-	switch( (*p) ) {
-		case 69: goto st0;
-		case 101: goto st0;
-	}
-	if ( (*p) > 46 ) {
-		if ( 48 <= (*p) && (*p) <= 57 )
-			goto st10;
-	} else if ( (*p) >= 45 )
-		goto st0;
-	goto tr9;
-st7:
-	if ( ++p == pe )
-		goto _test_eof7;
-case 7:
-	switch( (*p) ) {
-		case 46: goto st4;
-		case 69: goto st5;
-		case 101: goto st5;
-	}
-	if ( 48 <= (*p) && (*p) <= 57 )
-		goto st7;
-	goto st0;
-	}
-	_test_eof2: cs = 2; goto _test_eof;
-	_test_eof3: cs = 3; goto _test_eof;
-	_test_eof4: cs = 4; goto _test_eof;
-	_test_eof8: cs = 8; goto _test_eof;
-	_test_eof9: cs = 9; goto _test_eof;
-	_test_eof5: cs = 5; goto _test_eof;
-	_test_eof6: cs = 6; goto _test_eof;
-	_test_eof10: cs = 10; goto _test_eof;
-	_test_eof7: cs = 7; goto _test_eof;
-
-	_test_eof: {}
-	_out: {}
-	}
-
-#line 338 "parser.rl"
-
-    if (cs >= JSON_float_first_final) {
-        long len = p - json->memo;
-        fbuffer_clear(json->fbuffer);
-        fbuffer_append(json->fbuffer, json->memo, len);
-        fbuffer_append_char(json->fbuffer, '\0');
-        *result = rb_float_new(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
-        return p + 1;
-    } else {
-        return NULL;
-    }
-}
-
-
-
-#line 1044 "parser.c"
-static const int JSON_array_start = 1;
-static const int JSON_array_first_final = 17;
-static const int JSON_array_error = 0;
-
-static const int JSON_array_en_main = 1;
-
-
-#line 381 "parser.rl"
-
-
-static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result)
-{
-    int cs = EVIL;
-    VALUE array_class = json->array_class;
-
-    if (json->max_nesting && json->current_nesting > json->max_nesting) {
-        rb_raise(eNestingError, "nesting of %d is too deep", json->current_nesting);
-    }
-    *result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class);
-
-
-#line 1066 "parser.c"
-	{
-	cs = JSON_array_start;
-	}
-
-#line 394 "parser.rl"
-
-#line 1073 "parser.c"
-	{
-	if ( p == pe )
-		goto _test_eof;
-	switch ( cs )
-	{
-case 1:
-	if ( (*p) == 91 )
-		goto st2;
-	goto st0;
-st0:
-cs = 0;
-	goto _out;
-st2:
-	if ( ++p == pe )
-		goto _test_eof2;
-case 2:
-	switch( (*p) ) {
-		case 13: goto st2;
-		case 32: goto st2;
-		case 34: goto tr2;
-		case 45: goto tr2;
-		case 47: goto st13;
-		case 73: goto tr2;
-		case 78: goto tr2;
-		case 91: goto tr2;
-		case 93: goto tr4;
-		case 102: goto tr2;
-		case 110: goto tr2;
-		case 116: goto tr2;
-		case 123: goto tr2;
-	}
-	if ( (*p) > 10 ) {
-		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr2;
-	} else if ( (*p) >= 9 )
-		goto st2;
-	goto st0;
-tr2:
-#line 358 "parser.rl"
-	{
-        VALUE v = Qnil;
-        char *np = JSON_parse_value(json, p, pe, &v);
-        if (np == NULL) {
-            p--; {p++; cs = 3; goto _out;}
-        } else {
-            if (NIL_P(json->array_class)) {
-                rb_ary_push(*result, v);
-            } else {
-                rb_funcall(*result, i_leftshift, 1, v);
-            }
-            {p = (( np))-1;}
-        }
-    }
-	goto st3;
-st3:
-	if ( ++p == pe )
-		goto _test_eof3;
-case 3:
-#line 1132 "parser.c"
-	switch( (*p) ) {
-		case 13: goto st3;
-		case 32: goto st3;
-		case 44: goto st4;
-		case 47: goto st9;
-		case 93: goto tr4;
-	}
-	if ( 9 <= (*p) && (*p) <= 10 )
-		goto st3;
-	goto st0;
-st4:
-	if ( ++p == pe )
-		goto _test_eof4;
-case 4:
-	switch( (*p) ) {
-		case 13: goto st4;
-		case 32: goto st4;
-		case 34: goto tr2;
-		case 45: goto tr2;
-		case 47: goto st5;
-		case 73: goto tr2;
-		case 78: goto tr2;
-		case 91: goto tr2;
-		case 102: goto tr2;
-		case 110: goto tr2;
-		case 116: goto tr2;
-		case 123: goto tr2;
-	}
-	if ( (*p) > 10 ) {
-		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr2;
-	} else if ( (*p) >= 9 )
-		goto st4;
-	goto st0;
-st5:
-	if ( ++p == pe )
-		goto _test_eof5;
-case 5:
-	switch( (*p) ) {
-		case 42: goto st6;
-		case 47: goto st8;
-	}
-	goto st0;
-st6:
-	if ( ++p == pe )
-		goto _test_eof6;
-case 6:
-	if ( (*p) == 42 )
-		goto st7;
-	goto st6;
-st7:
-	if ( ++p == pe )
-		goto _test_eof7;
-case 7:
-	switch( (*p) ) {
-		case 42: goto st7;
-		case 47: goto st4;
-	}
-	goto st6;
-st8:
-	if ( ++p == pe )
-		goto _test_eof8;
-case 8:
-	if ( (*p) == 10 )
-		goto st4;
-	goto st8;
-st9:
-	if ( ++p == pe )
-		goto _test_eof9;
-case 9:
-	switch( (*p) ) {
-		case 42: goto st10;
-		case 47: goto st12;
-	}
-	goto st0;
-st10:
-	if ( ++p == pe )
-		goto _test_eof10;
-case 10:
-	if ( (*p) == 42 )
-		goto st11;
-	goto st10;
-st11:
-	if ( ++p == pe )
-		goto _test_eof11;
-case 11:
-	switch( (*p) ) {
-		case 42: goto st11;
-		case 47: goto st3;
-	}
-	goto st10;
-st12:
-	if ( ++p == pe )
-		goto _test_eof12;
-case 12:
-	if ( (*p) == 10 )
-		goto st3;
-	goto st12;
-tr4:
-#line 373 "parser.rl"
-	{ p--; {p++; cs = 17; goto _out;} }
-	goto st17;
-st17:
-	if ( ++p == pe )
-		goto _test_eof17;
-case 17:
-#line 1239 "parser.c"
-	goto st0;
-st13:
-	if ( ++p == pe )
-		goto _test_eof13;
-case 13:
-	switch( (*p) ) {
-		case 42: goto st14;
-		case 47: goto st16;
-	}
-	goto st0;
-st14:
-	if ( ++p == pe )
-		goto _test_eof14;
-case 14:
-	if ( (*p) == 42 )
-		goto st15;
-	goto st14;
-st15:
-	if ( ++p == pe )
-		goto _test_eof15;
-case 15:
-	switch( (*p) ) {
-		case 42: goto st15;
-		case 47: goto st2;
-	}
-	goto st14;
-st16:
-	if ( ++p == pe )
-		goto _test_eof16;
-case 16:
-	if ( (*p) == 10 )
-		goto st2;
-	goto st16;
-	}
-	_test_eof2: cs = 2; goto _test_eof;
-	_test_eof3: cs = 3; goto _test_eof;
-	_test_eof4: cs = 4; goto _test_eof;
-	_test_eof5: cs = 5; goto _test_eof;
-	_test_eof6: cs = 6; goto _test_eof;
-	_test_eof7: cs = 7; goto _test_eof;
-	_test_eof8: cs = 8; goto _test_eof;
-	_test_eof9: cs = 9; goto _test_eof;
-	_test_eof10: cs = 10; goto _test_eof;
-	_test_eof11: cs = 11; goto _test_eof;
-	_test_eof12: cs = 12; goto _test_eof;
-	_test_eof17: cs = 17; goto _test_eof;
-	_test_eof13: cs = 13; goto _test_eof;
-	_test_eof14: cs = 14; goto _test_eof;
-	_test_eof15: cs = 15; goto _test_eof;
-	_test_eof16: cs = 16; goto _test_eof;
-
-	_test_eof: {}
-	_out: {}
-	}
-
-#line 395 "parser.rl"
-
-    if(cs >= JSON_array_first_final) {
-        return p + 1;
-    } else {
-        rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
-        return NULL;
-    }
-}
-
-static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
-{
-    char *p = string, *pe = string, *unescape;
-    int unescape_len;
-    char buf[4];
-
-    while (pe < stringEnd) {
-        if (*pe == '\\') {
-            unescape = (char *) "?";
-            unescape_len = 1;
-            if (pe > p) rb_str_buf_cat(result, p, pe - p);
-            switch (*++pe) {
-                case 'n':
-                    unescape = (char *) "\n";
-                    break;
-                case 'r':
-                    unescape = (char *) "\r";
-                    break;
-                case 't':
-                    unescape = (char *) "\t";
-                    break;
-                case '"':
-                    unescape = (char *) "\"";
-                    break;
-                case '\\':
-                    unescape = (char *) "\\";
-                    break;
-                case 'b':
-                    unescape = (char *) "\b";
-                    break;
-                case 'f':
-                    unescape = (char *) "\f";
-                    break;
-                case 'u':
-                    if (pe > stringEnd - 4) {
-                        return Qnil;
-                    } else {
-                        UTF32 ch = unescape_unicode((unsigned char *) ++pe);
-                        pe += 3;
-                        if (UNI_SUR_HIGH_START == (ch & 0xFC00)) {
-                            pe++;
-                            if (pe > stringEnd - 6) return Qnil;
-                            if (pe[0] == '\\' && pe[1] == 'u') {
-                                UTF32 sur = unescape_unicode((unsigned char *) pe + 2);
-                                ch = (((ch & 0x3F) << 10) | ((((ch >> 6) & 0xF) + 1) << 16)
-                                        | (sur & 0x3FF));
-                                pe += 5;
-                            } else {
-                                unescape = (char *) "?";
-                                break;
-                            }
-                        }
-                        unescape_len = convert_UTF32_to_UTF8(buf, ch);
-                        unescape = buf;
-                    }
-                    break;
-                default:
-                    p = pe;
-                    continue;
-            }
-            rb_str_buf_cat(result, unescape, unescape_len);
-            p = ++pe;
-        } else {
-            pe++;
-        }
-    }
-    rb_str_buf_cat(result, p, pe - p);
-    return result;
-}
-
-
-#line 1376 "parser.c"
-static const int JSON_string_start = 1;
-static const int JSON_string_first_final = 8;
-static const int JSON_string_error = 0;
-
-static const int JSON_string_en_main = 1;
-
-
-#line 494 "parser.rl"
-
-
-static int
-match_i(VALUE regexp, VALUE klass, VALUE memo)
-{
-    if (regexp == Qundef) return ST_STOP;
-    if (RTEST(rb_funcall(klass, i_json_creatable_p, 0)) &&
-      RTEST(rb_funcall(regexp, i_match, 1, rb_ary_entry(memo, 0)))) {
-        rb_ary_push(memo, klass);
-        return ST_STOP;
-    }
-    return ST_CONTINUE;
-}
-
-static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result)
-{
-    int cs = EVIL;
-    VALUE match_string;
-
-    *result = rb_str_buf_new(0);
-
-#line 1406 "parser.c"
-	{
-	cs = JSON_string_start;
-	}
-
-#line 515 "parser.rl"
-    json->memo = p;
-
-#line 1414 "parser.c"
-	{
-	if ( p == pe )
-		goto _test_eof;
-	switch ( cs )
-	{
-case 1:
-	if ( (*p) == 34 )
-		goto st2;
-	goto st0;
-st0:
-cs = 0;
-	goto _out;
-st2:
-	if ( ++p == pe )
-		goto _test_eof2;
-case 2:
-	switch( (*p) ) {
-		case 34: goto tr2;
-		case 92: goto st3;
-	}
-	if ( 0 <= (*p) && (*p) <= 31 )
-		goto st0;
-	goto st2;
-tr2:
-#line 480 "parser.rl"
-	{
-        *result = json_string_unescape(*result, json->memo + 1, p);
-        if (NIL_P(*result)) {
-            p--;
-            {p++; cs = 8; goto _out;}
-        } else {
-            FORCE_UTF8(*result);
-            {p = (( p + 1))-1;}
-        }
-    }
-#line 491 "parser.rl"
-	{ p--; {p++; cs = 8; goto _out;} }
-	goto st8;
-st8:
-	if ( ++p == pe )
-		goto _test_eof8;
-case 8:
-#line 1457 "parser.c"
-	goto st0;
-st3:
-	if ( ++p == pe )
-		goto _test_eof3;
-case 3:
-	if ( (*p) == 117 )
-		goto st4;
-	if ( 0 <= (*p) && (*p) <= 31 )
-		goto st0;
-	goto st2;
-st4:
-	if ( ++p == pe )
-		goto _test_eof4;
-case 4:
-	if ( (*p) < 65 ) {
-		if ( 48 <= (*p) && (*p) <= 57 )
-			goto st5;
-	} else if ( (*p) > 70 ) {
-		if ( 97 <= (*p) && (*p) <= 102 )
-			goto st5;
-	} else
-		goto st5;
-	goto st0;
-st5:
-	if ( ++p == pe )
-		goto _test_eof5;
-case 5:
-	if ( (*p) < 65 ) {
-		if ( 48 <= (*p) && (*p) <= 57 )
-			goto st6;
-	} else if ( (*p) > 70 ) {
-		if ( 97 <= (*p) && (*p) <= 102 )
-			goto st6;
-	} else
-		goto st6;
-	goto st0;
-st6:
-	if ( ++p == pe )
-		goto _test_eof6;
-case 6:
-	if ( (*p) < 65 ) {
-		if ( 48 <= (*p) && (*p) <= 57 )
-			goto st7;
-	} else if ( (*p) > 70 ) {
-		if ( 97 <= (*p) && (*p) <= 102 )
-			goto st7;
-	} else
-		goto st7;
-	goto st0;
-st7:
-	if ( ++p == pe )
-		goto _test_eof7;
-case 7:
-	if ( (*p) < 65 ) {
-		if ( 48 <= (*p) && (*p) <= 57 )
-			goto st2;
-	} else if ( (*p) > 70 ) {
-		if ( 97 <= (*p) && (*p) <= 102 )
-			goto st2;
-	} else
-		goto st2;
-	goto st0;
-	}
-	_test_eof2: cs = 2; goto _test_eof;
-	_test_eof8: cs = 8; goto _test_eof;
-	_test_eof3: cs = 3; goto _test_eof;
-	_test_eof4: cs = 4; goto _test_eof;
-	_test_eof5: cs = 5; goto _test_eof;
-	_test_eof6: cs = 6; goto _test_eof;
-	_test_eof7: cs = 7; goto _test_eof;
-
-	_test_eof: {}
-	_out: {}
-	}
-
-#line 517 "parser.rl"
-
-    if (json->create_additions && RTEST(match_string = json->match_string)) {
-          VALUE klass;
-          VALUE memo = rb_ary_new2(2);
-          rb_ary_push(memo, *result);
-          rb_hash_foreach(match_string, match_i, memo);
-          klass = rb_ary_entry(memo, 1);
-          if (RTEST(klass)) {
-              *result = rb_funcall(klass, i_json_create, 1, *result);
-          }
-    }
-
-    if (json->symbolize_names && json->parsing_name) {
-      *result = rb_str_intern(*result);
-    }
-    if (cs >= JSON_string_first_final) {
-        return p + 1;
-    } else {
-        return NULL;
-    }
-}
-
-/*
- * Document-class: JSON::Ext::Parser
- *
- * This is the JSON parser implemented as a C extension. It can be configured
- * to be used by setting
- *
- *  JSON.parser = JSON::Ext::Parser
- *
- * with the method parser= in JSON.
- *
- */
-
-static VALUE convert_encoding(VALUE source)
-{
-    char *ptr = RSTRING_PTR(source);
-    long len = RSTRING_LEN(source);
-    if (len < 2) {
-        rb_raise(eParserError, "A JSON text must at least contain two octets!");
-    }
-#ifdef HAVE_RUBY_ENCODING_H
-    {
-        VALUE encoding = rb_funcall(source, i_encoding, 0);
-        if (encoding == CEncoding_ASCII_8BIT) {
-            if (len >= 4 &&  ptr[0] == 0 && ptr[1] == 0 && ptr[2] == 0) {
-                source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_32BE);
-            } else if (len >= 4 && ptr[0] == 0 && ptr[2] == 0) {
-                source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_16BE);
-            } else if (len >= 4 && ptr[1] == 0 && ptr[2] == 0 && ptr[3] == 0) {
-                source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_32LE);
-            } else if (len >= 4 && ptr[1] == 0 && ptr[3] == 0) {
-                source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_16LE);
-            } else {
-                source = rb_str_dup(source);
-                FORCE_UTF8(source);
-            }
-        } else {
-            source = rb_funcall(source, i_encode, 1, CEncoding_UTF_8);
-        }
-    }
-#else
-    if (len >= 4 &&  ptr[0] == 0 && ptr[1] == 0 && ptr[2] == 0) {
-      source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-32be"), source);
-    } else if (len >= 4 && ptr[0] == 0 && ptr[2] == 0) {
-      source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-16be"), source);
-    } else if (len >= 4 && ptr[1] == 0 && ptr[2] == 0 && ptr[3] == 0) {
-      source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-32le"), source);
-    } else if (len >= 4 && ptr[1] == 0 && ptr[3] == 0) {
-      source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-16le"), source);
-    }
-#endif
-    return source;
-}
-
-/*
- * call-seq: new(source, opts => {})
- *
- * Creates a new JSON::Ext::Parser instance for the string _source_.
- *
- * Creates a new JSON::Ext::Parser instance for the string _source_.
- *
- * It will be configured by the _opts_ hash. _opts_ can have the following
- * keys:
- *
- * _opts_ can have the following keys:
- * * *max_nesting*: The maximum depth of nesting allowed in the parsed data
- *   structures. Disable depth checking with :max_nesting => false|nil|0, it
- *   defaults to 100.
- * * *allow_nan*: If set to true, allow NaN, Infinity and -Infinity in
- *   defiance of RFC 4627 to be parsed by the Parser. This option defaults to
- *   false.
- * * *symbolize_names*: If set to true, returns symbols for the names
- *   (keys) in a JSON object. Otherwise strings are returned, which is also
- *   the default.
- * * *create_additions*: If set to false, the Parser doesn't create
- *   additions even if a matchin class and create_id was found. This option
- *   defaults to true.
- * * *object_class*: Defaults to Hash
- * * *array_class*: Defaults to Array
- */
-static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
-{
-    VALUE source, opts;
-    GET_PARSER_INIT;
-
-    if (json->Vsource) {
-        rb_raise(rb_eTypeError, "already initialized instance");
-    }
-    rb_scan_args(argc, argv, "11", &source, &opts);
-    if (!NIL_P(opts)) {
-        opts = rb_convert_type(opts, T_HASH, "Hash", "to_hash");
-        if (NIL_P(opts)) {
-            rb_raise(rb_eArgError, "opts needs to be like a hash");
-        } else {
-            VALUE tmp = ID2SYM(i_max_nesting);
-            if (option_given_p(opts, tmp)) {
-                VALUE max_nesting = rb_hash_aref(opts, tmp);
-                if (RTEST(max_nesting)) {
-                    Check_Type(max_nesting, T_FIXNUM);
-                    json->max_nesting = FIX2INT(max_nesting);
-                } else {
-                    json->max_nesting = 0;
-                }
-            } else {
-                json->max_nesting = 100;
-            }
-            tmp = ID2SYM(i_allow_nan);
-            if (option_given_p(opts, tmp)) {
-                json->allow_nan = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
-            } else {
-                json->allow_nan = 0;
-            }
-            tmp = ID2SYM(i_symbolize_names);
-            if (option_given_p(opts, tmp)) {
-                json->symbolize_names = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
-            } else {
-                json->symbolize_names = 0;
-            }
-            tmp = ID2SYM(i_quirks_mode);
-            if (option_given_p(opts, tmp)) {
-                VALUE quirks_mode = rb_hash_aref(opts, tmp);
-                json->quirks_mode = RTEST(quirks_mode) ? 1 : 0;
-            } else {
-                json->quirks_mode = 0;
-            }
-            tmp = ID2SYM(i_create_additions);
-            if (option_given_p(opts, tmp)) {
-                json->create_additions = RTEST(rb_hash_aref(opts, tmp));
-            } else {
-                json->create_additions = 0;
-            }
-            tmp = ID2SYM(i_create_id);
-            if (option_given_p(opts, tmp)) {
-                json->create_id = rb_hash_aref(opts, tmp);
-            } else {
-                json->create_id = rb_funcall(mJSON, i_create_id, 0);
-            }
-            tmp = ID2SYM(i_object_class);
-            if (option_given_p(opts, tmp)) {
-                json->object_class = rb_hash_aref(opts, tmp);
-            } else {
-                json->object_class = Qnil;
-            }
-            tmp = ID2SYM(i_array_class);
-            if (option_given_p(opts, tmp)) {
-                json->array_class = rb_hash_aref(opts, tmp);
-            } else {
-                json->array_class = Qnil;
-            }
-            tmp = ID2SYM(i_match_string);
-            if (option_given_p(opts, tmp)) {
-                VALUE match_string = rb_hash_aref(opts, tmp);
-                json->match_string = RTEST(match_string) ? match_string : Qnil;
-            } else {
-                json->match_string = Qnil;
-            }
-        }
-    } else {
-        json->max_nesting = 100;
-        json->allow_nan = 0;
-        json->create_additions = 1;
-        json->create_id = rb_funcall(mJSON, i_create_id, 0);
-        json->object_class = Qnil;
-        json->array_class = Qnil;
-    }
-    source = rb_convert_type(source, T_STRING, "String", "to_str");
-    if (!json->quirks_mode) {
-      source = convert_encoding(StringValue(source));
-    }
-    json->current_nesting = 0;
-    StringValue(source);
-    json->len = RSTRING_LEN(source);
-    json->source = RSTRING_PTR(source);;
-    json->Vsource = source;
-    return self;
-}
-
-
-#line 1733 "parser.c"
-static const int JSON_start = 1;
-static const int JSON_first_final = 10;
-static const int JSON_error = 0;
-
-static const int JSON_en_main = 1;
-
-
-#line 740 "parser.rl"
-
-
-static VALUE cParser_parse_strict(VALUE self)
-{
-    char *p, *pe;
-    int cs = EVIL;
-    VALUE result = Qnil;
-    GET_PARSER;
-
-
-#line 1752 "parser.c"
-	{
-	cs = JSON_start;
-	}
-
-#line 750 "parser.rl"
-    p = json->source;
-    pe = p + json->len;
-
-#line 1761 "parser.c"
-	{
-	if ( p == pe )
-		goto _test_eof;
-	switch ( cs )
-	{
-st1:
-	if ( ++p == pe )
-		goto _test_eof1;
-case 1:
-	switch( (*p) ) {
-		case 13: goto st1;
-		case 32: goto st1;
-		case 47: goto st2;
-		case 91: goto tr3;
-		case 123: goto tr4;
-	}
-	if ( 9 <= (*p) && (*p) <= 10 )
-		goto st1;
-	goto st0;
-st0:
-cs = 0;
-	goto _out;
-st2:
-	if ( ++p == pe )
-		goto _test_eof2;
-case 2:
-	switch( (*p) ) {
-		case 42: goto st3;
-		case 47: goto st5;
-	}
-	goto st0;
-st3:
-	if ( ++p == pe )
-		goto _test_eof3;
-case 3:
-	if ( (*p) == 42 )
-		goto st4;
-	goto st3;
-st4:
-	if ( ++p == pe )
-		goto _test_eof4;
-case 4:
-	switch( (*p) ) {
-		case 42: goto st4;
-		case 47: goto st1;
-	}
-	goto st3;
-st5:
-	if ( ++p == pe )
-		goto _test_eof5;
-case 5:
-	if ( (*p) == 10 )
-		goto st1;
-	goto st5;
-tr3:
-#line 729 "parser.rl"
-	{
-        char *np;
-        json->current_nesting = 1;
-        np = JSON_parse_array(json, p, pe, &result);
-        if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
-    }
-	goto st10;
-tr4:
-#line 722 "parser.rl"
-	{
-        char *np;
-        json->current_nesting = 1;
-        np = JSON_parse_object(json, p, pe, &result);
-        if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
-    }
-	goto st10;
-st10:
-	if ( ++p == pe )
-		goto _test_eof10;
-case 10:
-#line 1838 "parser.c"
-	switch( (*p) ) {
-		case 13: goto st10;
-		case 32: goto st10;
-		case 47: goto st6;
-	}
-	if ( 9 <= (*p) && (*p) <= 10 )
-		goto st10;
-	goto st0;
-st6:
-	if ( ++p == pe )
-		goto _test_eof6;
-case 6:
-	switch( (*p) ) {
-		case 42: goto st7;
-		case 47: goto st9;
-	}
-	goto st0;
-st7:
-	if ( ++p == pe )
-		goto _test_eof7;
-case 7:
-	if ( (*p) == 42 )
-		goto st8;
-	goto st7;
-st8:
-	if ( ++p == pe )
-		goto _test_eof8;
-case 8:
-	switch( (*p) ) {
-		case 42: goto st8;
-		case 47: goto st10;
-	}
-	goto st7;
-st9:
-	if ( ++p == pe )
-		goto _test_eof9;
-case 9:
-	if ( (*p) == 10 )
-		goto st10;
-	goto st9;
-	}
-	_test_eof1: cs = 1; goto _test_eof;
-	_test_eof2: cs = 2; goto _test_eof;
-	_test_eof3: cs = 3; goto _test_eof;
-	_test_eof4: cs = 4; goto _test_eof;
-	_test_eof5: cs = 5; goto _test_eof;
-	_test_eof10: cs = 10; goto _test_eof;
-	_test_eof6: cs = 6; goto _test_eof;
-	_test_eof7: cs = 7; goto _test_eof;
-	_test_eof8: cs = 8; goto _test_eof;
-	_test_eof9: cs = 9; goto _test_eof;
-
-	_test_eof: {}
-	_out: {}
-	}
-
-#line 753 "parser.rl"
-
-    if (cs >= JSON_first_final && p == pe) {
-        return result;
-    } else {
-        rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
-        return Qnil;
-    }
-}
-
-
-
-#line 1907 "parser.c"
-static const int JSON_quirks_mode_start = 1;
-static const int JSON_quirks_mode_first_final = 10;
-static const int JSON_quirks_mode_error = 0;
-
-static const int JSON_quirks_mode_en_main = 1;
-
-
-#line 778 "parser.rl"
-
-
-static VALUE cParser_parse_quirks_mode(VALUE self)
-{
-    char *p, *pe;
-    int cs = EVIL;
-    VALUE result = Qnil;
-    GET_PARSER;
-
-
-#line 1926 "parser.c"
-	{
-	cs = JSON_quirks_mode_start;
-	}
-
-#line 788 "parser.rl"
-    p = json->source;
-    pe = p + json->len;
-
-#line 1935 "parser.c"
-	{
-	if ( p == pe )
-		goto _test_eof;
-	switch ( cs )
-	{
-st1:
-	if ( ++p == pe )
-		goto _test_eof1;
-case 1:
-	switch( (*p) ) {
-		case 13: goto st1;
-		case 32: goto st1;
-		case 34: goto tr2;
-		case 45: goto tr2;
-		case 47: goto st6;
-		case 73: goto tr2;
-		case 78: goto tr2;
-		case 91: goto tr2;
-		case 102: goto tr2;
-		case 110: goto tr2;
-		case 116: goto tr2;
-		case 123: goto tr2;
-	}
-	if ( (*p) > 10 ) {
-		if ( 48 <= (*p) && (*p) <= 57 )
-			goto tr2;
-	} else if ( (*p) >= 9 )
-		goto st1;
-	goto st0;
-st0:
-cs = 0;
-	goto _out;
-tr2:
-#line 770 "parser.rl"
-	{
-        char *np = JSON_parse_value(json, p, pe, &result);
-        if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
-    }
-	goto st10;
-st10:
-	if ( ++p == pe )
-		goto _test_eof10;
-case 10:
-#line 1979 "parser.c"
-	switch( (*p) ) {
-		case 13: goto st10;
-		case 32: goto st10;
-		case 47: goto st2;
-	}
-	if ( 9 <= (*p) && (*p) <= 10 )
-		goto st10;
-	goto st0;
-st2:
-	if ( ++p == pe )
-		goto _test_eof2;
-case 2:
-	switch( (*p) ) {
-		case 42: goto st3;
-		case 47: goto st5;
-	}
-	goto st0;
-st3:
-	if ( ++p == pe )
-		goto _test_eof3;
-case 3:
-	if ( (*p) == 42 )
-		goto st4;
-	goto st3;
-st4:
-	if ( ++p == pe )
-		goto _test_eof4;
-case 4:
-	switch( (*p) ) {
-		case 42: goto st4;
-		case 47: goto st10;
-	}
-	goto st3;
-st5:
-	if ( ++p == pe )
-		goto _test_eof5;
-case 5:
-	if ( (*p) == 10 )
-		goto st10;
-	goto st5;
-st6:
-	if ( ++p == pe )
-		goto _test_eof6;
-case 6:
-	switch( (*p) ) {
-		case 42: goto st7;
-		case 47: goto st9;
-	}
-	goto st0;
-st7:
-	if ( ++p == pe )
-		goto _test_eof7;
-case 7:
-	if ( (*p) == 42 )
-		goto st8;
-	goto st7;
-st8:
-	if ( ++p == pe )
-		goto _test_eof8;
-case 8:
-	switch( (*p) ) {
-		case 42: goto st8;
-		case 47: goto st1;
-	}
-	goto st7;
-st9:
-	if ( ++p == pe )
-		goto _test_eof9;
-case 9:
-	if ( (*p) == 10 )
-		goto st1;
-	goto st9;
-	}
-	_test_eof1: cs = 1; goto _test_eof;
-	_test_eof10: cs = 10; goto _test_eof;
-	_test_eof2: cs = 2; goto _test_eof;
-	_test_eof3: cs = 3; goto _test_eof;
-	_test_eof4: cs = 4; goto _test_eof;
-	_test_eof5: cs = 5; goto _test_eof;
-	_test_eof6: cs = 6; goto _test_eof;
-	_test_eof7: cs = 7; goto _test_eof;
-	_test_eof8: cs = 8; goto _test_eof;
-	_test_eof9: cs = 9; goto _test_eof;
-
-	_test_eof: {}
-	_out: {}
-	}
-
-#line 791 "parser.rl"
-
-    if (cs >= JSON_quirks_mode_first_final && p == pe) {
-        return result;
-    } else {
-        rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
-        return Qnil;
-    }
-}
-
-/*
- * call-seq: parse()
- *
- *  Parses the current JSON text _source_ and returns the complete data
- *  structure as a result.
- */
-static VALUE cParser_parse(VALUE self)
-{
-  GET_PARSER;
-
-  if (json->quirks_mode) {
-    return cParser_parse_quirks_mode(self);
-  } else {
-    return cParser_parse_strict(self);
-  }
-}
-
-
-static JSON_Parser *JSON_allocate()
-{
-    JSON_Parser *json = ALLOC(JSON_Parser);
-    MEMZERO(json, JSON_Parser, 1);
-    json->fbuffer = fbuffer_alloc(0);
-    return json;
-}
-
-static void JSON_mark(JSON_Parser *json)
-{
-    rb_gc_mark_maybe(json->Vsource);
-    rb_gc_mark_maybe(json->create_id);
-    rb_gc_mark_maybe(json->object_class);
-    rb_gc_mark_maybe(json->array_class);
-    rb_gc_mark_maybe(json->match_string);
-}
-
-static void JSON_free(JSON_Parser *json)
-{
-    fbuffer_free(json->fbuffer);
-    ruby_xfree(json);
-}
-
-static VALUE cJSON_parser_s_allocate(VALUE klass)
-{
-    JSON_Parser *json = JSON_allocate();
-    return Data_Wrap_Struct(klass, JSON_mark, JSON_free, json);
-}
-
-/*
- * call-seq: source()
- *
- * Returns a copy of the current _source_ string, that was used to construct
- * this Parser.
- */
-static VALUE cParser_source(VALUE self)
-{
-    GET_PARSER;
-    return rb_str_dup(json->Vsource);
-}
-
-/*
- * call-seq: quirks_mode?()
- *
- * Returns a true, if this parser is in quirks_mode, false otherwise.
- */
-static VALUE cParser_quirks_mode_p(VALUE self)
-{
-    GET_PARSER;
-    return json->quirks_mode ? Qtrue : Qfalse;
-}
-
-
-void Init_parser()
-{
-    rb_require("json/common");
-    mJSON = rb_define_module("JSON");
-    mExt = rb_define_module_under(mJSON, "Ext");
-    cParser = rb_define_class_under(mExt, "Parser", rb_cObject);
-    eParserError = rb_path2class("JSON::ParserError");
-    eNestingError = rb_path2class("JSON::NestingError");
-    rb_define_alloc_func(cParser, cJSON_parser_s_allocate);
-    rb_define_method(cParser, "initialize", cParser_initialize, -1);
-    rb_define_method(cParser, "parse", cParser_parse, 0);
-    rb_define_method(cParser, "source", cParser_source, 0);
-    rb_define_method(cParser, "quirks_mode?", cParser_quirks_mode_p, 0);
-
-    CNaN = rb_const_get(mJSON, rb_intern("NaN"));
-    CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
-    CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity"));
-
-    i_json_creatable_p = rb_intern("json_creatable?");
-    i_json_create = rb_intern("json_create");
-    i_create_id = rb_intern("create_id");
-    i_create_additions = rb_intern("create_additions");
-    i_chr = rb_intern("chr");
-    i_max_nesting = rb_intern("max_nesting");
-    i_allow_nan = rb_intern("allow_nan");
-    i_symbolize_names = rb_intern("symbolize_names");
-    i_quirks_mode = rb_intern("quirks_mode");
-    i_object_class = rb_intern("object_class");
-    i_array_class = rb_intern("array_class");
-    i_match = rb_intern("match");
-    i_match_string = rb_intern("match_string");
-    i_key_p = rb_intern("key?");
-    i_deep_const_get = rb_intern("deep_const_get");
-    i_aset = rb_intern("[]=");
-    i_aref = rb_intern("[]");
-    i_leftshift = rb_intern("<<");
-#ifdef HAVE_RUBY_ENCODING_H
-    CEncoding_UTF_8 = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-8"));
-    CEncoding_UTF_16BE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-16be"));
-    CEncoding_UTF_16LE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-16le"));
-    CEncoding_UTF_32BE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-32be"));
-    CEncoding_UTF_32LE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-32le"));
-    CEncoding_ASCII_8BIT = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("ascii-8bit"));
-    i_encoding = rb_intern("encoding");
-    i_encode = rb_intern("encode");
-#else
-    i_iconv = rb_intern("iconv");
-#endif
-}
-
-/*
- * Local variables:
- * mode: c
- * c-file-style: ruby
- * indent-tabs-mode: nil
- * End:
- */
diff --git a/vendor/json_pure-1.7.7/ext/json/ext/parser/parser.h b/vendor/json_pure-1.7.7/ext/json/ext/parser/parser.h
deleted file mode 100644
index b192064..0000000
--- a/vendor/json_pure-1.7.7/ext/json/ext/parser/parser.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef _PARSER_H_
-#define _PARSER_H_
-
-#include "ruby.h"
-
-#ifndef HAVE_RUBY_RE_H
-#include "re.h"
-#endif
-
-#ifdef HAVE_RUBY_ST_H
-#include "ruby/st.h"
-#else
-#include "st.h"
-#endif
-
-#define option_given_p(opts, key) RTEST(rb_funcall(opts, i_key_p, 1, key))
-
-/* unicode */
-
-typedef unsigned long UTF32;  /* at least 32 bits */
-typedef unsigned short UTF16; /* at least 16 bits */
-typedef unsigned char UTF8;   /* typically 8 bits */
-
-#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
-#define UNI_SUR_HIGH_START  (UTF32)0xD800
-#define UNI_SUR_HIGH_END    (UTF32)0xDBFF
-#define UNI_SUR_LOW_START   (UTF32)0xDC00
-#define UNI_SUR_LOW_END     (UTF32)0xDFFF
-
-typedef struct JSON_ParserStruct {
-    VALUE Vsource;
-    char *source;
-    long len;
-    char *memo;
-    VALUE create_id;
-    int max_nesting;
-    int current_nesting;
-    int allow_nan;
-    int parsing_name;
-    int symbolize_names;
-    int quirks_mode;
-    VALUE object_class;
-    VALUE array_class;
-    int create_additions;
-    VALUE match_string;
-    FBuffer *fbuffer;
-} JSON_Parser;
-
-#define GET_PARSER                          \
-    GET_PARSER_INIT;                        \
-    if (!json->Vsource) rb_raise(rb_eTypeError, "uninitialized instance")
-#define GET_PARSER_INIT                     \
-    JSON_Parser *json;                      \
-    Data_Get_Struct(self, JSON_Parser, json)
-
-#define MinusInfinity "-Infinity"
-#define EVIL 0x666
-
-static UTF32 unescape_unicode(const unsigned char *p);
-static int convert_UTF32_to_UTF8(char *buf, UTF32 ch);
-static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result);
-static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result);
-static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result);
-static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result);
-static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result);
-static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd);
-static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result);
-static VALUE convert_encoding(VALUE source);
-static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self);
-static VALUE cParser_parse(VALUE self);
-static JSON_Parser *JSON_allocate();
-static void JSON_mark(JSON_Parser *json);
-static void JSON_free(JSON_Parser *json);
-static VALUE cJSON_parser_s_allocate(VALUE klass);
-static VALUE cParser_source(VALUE self);
-
-#endif
diff --git a/vendor/json_pure-1.7.7/ext/json/ext/parser/parser.rl b/vendor/json_pure-1.7.7/ext/json/ext/parser/parser.rl
deleted file mode 100644
index ab8d318..0000000
--- a/vendor/json_pure-1.7.7/ext/json/ext/parser/parser.rl
+++ /dev/null
@@ -1,927 +0,0 @@
-#include "../fbuffer/fbuffer.h"
-#include "parser.h"
-
-/* unicode */
-
-static const char digit_values[256] = {
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1,
-    -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1
-};
-
-static UTF32 unescape_unicode(const unsigned char *p)
-{
-    char b;
-    UTF32 result = 0;
-    b = digit_values[p[0]];
-    if (b < 0) return UNI_REPLACEMENT_CHAR;
-    result = (result << 4) | b;
-    b = digit_values[p[1]];
-    result = (result << 4) | b;
-    if (b < 0) return UNI_REPLACEMENT_CHAR;
-    b = digit_values[p[2]];
-    result = (result << 4) | b;
-    if (b < 0) return UNI_REPLACEMENT_CHAR;
-    b = digit_values[p[3]];
-    result = (result << 4) | b;
-    if (b < 0) return UNI_REPLACEMENT_CHAR;
-    return result;
-}
-
-static int convert_UTF32_to_UTF8(char *buf, UTF32 ch)
-{
-    int len = 1;
-    if (ch <= 0x7F) {
-        buf[0] = (char) ch;
-    } else if (ch <= 0x07FF) {
-        buf[0] = (char) ((ch >> 6) | 0xC0);
-        buf[1] = (char) ((ch & 0x3F) | 0x80);
-        len++;
-    } else if (ch <= 0xFFFF) {
-        buf[0] = (char) ((ch >> 12) | 0xE0);
-        buf[1] = (char) (((ch >> 6) & 0x3F) | 0x80);
-        buf[2] = (char) ((ch & 0x3F) | 0x80);
-        len += 2;
-    } else if (ch <= 0x1fffff) {
-        buf[0] =(char) ((ch >> 18) | 0xF0);
-        buf[1] =(char) (((ch >> 12) & 0x3F) | 0x80);
-        buf[2] =(char) (((ch >> 6) & 0x3F) | 0x80);
-        buf[3] =(char) ((ch & 0x3F) | 0x80);
-        len += 3;
-    } else {
-        buf[0] = '?';
-    }
-    return len;
-}
-
-#ifdef HAVE_RUBY_ENCODING_H
-static VALUE CEncoding_ASCII_8BIT, CEncoding_UTF_8, CEncoding_UTF_16BE,
-    CEncoding_UTF_16LE, CEncoding_UTF_32BE, CEncoding_UTF_32LE;
-static ID i_encoding, i_encode;
-#else
-static ID i_iconv;
-#endif
-
-static VALUE mJSON, mExt, cParser, eParserError, eNestingError;
-static VALUE CNaN, CInfinity, CMinusInfinity;
-
-static ID i_json_creatable_p, i_json_create, i_create_id, i_create_additions,
-          i_chr, i_max_nesting, i_allow_nan, i_symbolize_names, i_quirks_mode,
-          i_object_class, i_array_class, i_key_p, i_deep_const_get, i_match,
-          i_match_string, i_aset, i_aref, i_leftshift;
-
-%%{
-    machine JSON_common;
-
-    cr                  = '\n';
-    cr_neg              = [^\n];
-    ws                  = [ \t\r\n];
-    c_comment           = '/*' ( any* - (any* '*/' any* ) ) '*/';
-    cpp_comment         = '//' cr_neg* cr;
-    comment             = c_comment | cpp_comment;
-    ignore              = ws | comment;
-    name_separator      = ':';
-    value_separator     = ',';
-    Vnull               = 'null';
-    Vfalse              = 'false';
-    Vtrue               = 'true';
-    VNaN                = 'NaN';
-    VInfinity           = 'Infinity';
-    VMinusInfinity      = '-Infinity';
-    begin_value         = [nft\"\-\[\{NI] | digit;
-    begin_object        = '{';
-    end_object          = '}';
-    begin_array         = '[';
-    end_array           = ']';
-    begin_string        = '"';
-    begin_name          = begin_string;
-    begin_number        = digit | '-';
-}%%
-
-%%{
-    machine JSON_object;
-    include JSON_common;
-
-    write data;
-
-    action parse_value {
-        VALUE v = Qnil;
-        char *np = JSON_parse_value(json, fpc, pe, &v);
-        if (np == NULL) {
-            fhold; fbreak;
-        } else {
-            if (NIL_P(json->object_class)) {
-                rb_hash_aset(*result, last_name, v);
-            } else {
-                rb_funcall(*result, i_aset, 2, last_name, v);
-            }
-            fexec np;
-        }
-    }
-
-    action parse_name {
-        char *np;
-        json->parsing_name = 1;
-        np = JSON_parse_string(json, fpc, pe, &last_name);
-        json->parsing_name = 0;
-        if (np == NULL) { fhold; fbreak; } else fexec np;
-    }
-
-    action exit { fhold; fbreak; }
-
-    pair  = ignore* begin_name >parse_name ignore* name_separator ignore* begin_value >parse_value;
-    next_pair   = ignore* value_separator pair;
-
-    main := (
-      begin_object
-      (pair (next_pair)*)? ignore*
-      end_object
-    ) @exit;
-}%%
-
-static char *JSON_parse_object(JSON_Parser *json, char *p, char *pe, VALUE *result)
-{
-    int cs = EVIL;
-    VALUE last_name = Qnil;
-    VALUE object_class = json->object_class;
-
-    if (json->max_nesting && json->current_nesting > json->max_nesting) {
-        rb_raise(eNestingError, "nesting of %d is too deep", json->current_nesting);
-    }
-
-    *result = NIL_P(object_class) ? rb_hash_new() : rb_class_new_instance(0, 0, object_class);
-
-    %% write init;
-    %% write exec;
-
-    if (cs >= JSON_object_first_final) {
-        if (json->create_additions) {
-            VALUE klassname;
-            if (NIL_P(json->object_class)) {
-              klassname = rb_hash_aref(*result, json->create_id);
-            } else {
-              klassname = rb_funcall(*result, i_aref, 1, json->create_id);
-            }
-            if (!NIL_P(klassname)) {
-                VALUE klass = rb_funcall(mJSON, i_deep_const_get, 1, klassname);
-                if (RTEST(rb_funcall(klass, i_json_creatable_p, 0))) {
-                    *result = rb_funcall(klass, i_json_create, 1, *result);
-                }
-            }
-        }
-        return p + 1;
-    } else {
-        return NULL;
-    }
-}
-
-
-%%{
-    machine JSON_value;
-    include JSON_common;
-
-    write data;
-
-    action parse_null {
-        *result = Qnil;
-    }
-    action parse_false {
-        *result = Qfalse;
-    }
-    action parse_true {
-        *result = Qtrue;
-    }
-    action parse_nan {
-        if (json->allow_nan) {
-            *result = CNaN;
-        } else {
-            rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p - 2);
-        }
-    }
-    action parse_infinity {
-        if (json->allow_nan) {
-            *result = CInfinity;
-        } else {
-            rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p - 8);
-        }
-    }
-    action parse_string {
-        char *np = JSON_parse_string(json, fpc, pe, result);
-        if (np == NULL) { fhold; fbreak; } else fexec np;
-    }
-
-    action parse_number {
-        char *np;
-        if(pe > fpc + 9 - json->quirks_mode && !strncmp(MinusInfinity, fpc, 9)) {
-            if (json->allow_nan) {
-                *result = CMinusInfinity;
-                fexec p + 10;
-                fhold; fbreak;
-            } else {
-                rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
-            }
-        }
-        np = JSON_parse_float(json, fpc, pe, result);
-        if (np != NULL) fexec np;
-        np = JSON_parse_integer(json, fpc, pe, result);
-        if (np != NULL) fexec np;
-        fhold; fbreak;
-    }
-
-    action parse_array {
-        char *np;
-        json->current_nesting++;
-        np = JSON_parse_array(json, fpc, pe, result);
-        json->current_nesting--;
-        if (np == NULL) { fhold; fbreak; } else fexec np;
-    }
-
-    action parse_object {
-        char *np;
-        json->current_nesting++;
-        np =  JSON_parse_object(json, fpc, pe, result);
-        json->current_nesting--;
-        if (np == NULL) { fhold; fbreak; } else fexec np;
-    }
-
-    action exit { fhold; fbreak; }
-
-main := (
-              Vnull @parse_null |
-              Vfalse @parse_false |
-              Vtrue @parse_true |
-              VNaN @parse_nan |
-              VInfinity @parse_infinity |
-              begin_number >parse_number |
-              begin_string >parse_string |
-              begin_array >parse_array |
-              begin_object >parse_object
-        ) %*exit;
-}%%
-
-static char *JSON_parse_value(JSON_Parser *json, char *p, char *pe, VALUE *result)
-{
-    int cs = EVIL;
-
-    %% write init;
-    %% write exec;
-
-    if (cs >= JSON_value_first_final) {
-        return p;
-    } else {
-        return NULL;
-    }
-}
-
-%%{
-    machine JSON_integer;
-
-    write data;
-
-    action exit { fhold; fbreak; }
-
-    main := '-'? ('0' | [1-9][0-9]*) (^[0-9]? @exit);
-}%%
-
-static char *JSON_parse_integer(JSON_Parser *json, char *p, char *pe, VALUE *result)
-{
-    int cs = EVIL;
-
-    %% write init;
-    json->memo = p;
-    %% write exec;
-
-    if (cs >= JSON_integer_first_final) {
-        long len = p - json->memo;
-        fbuffer_clear(json->fbuffer);
-        fbuffer_append(json->fbuffer, json->memo, len);
-        fbuffer_append_char(json->fbuffer, '\0');
-        *result = rb_cstr2inum(FBUFFER_PTR(json->fbuffer), 10);
-        return p + 1;
-    } else {
-        return NULL;
-    }
-}
-
-%%{
-    machine JSON_float;
-    include JSON_common;
-
-    write data;
-
-    action exit { fhold; fbreak; }
-
-    main := '-'? (
-              (('0' | [1-9][0-9]*) '.' [0-9]+ ([Ee] [+\-]?[0-9]+)?)
-              | (('0' | [1-9][0-9]*) ([Ee] [+\-]?[0-9]+))
-             )  (^[0-9Ee.\-]? @exit );
-}%%
-
-static char *JSON_parse_float(JSON_Parser *json, char *p, char *pe, VALUE *result)
-{
-    int cs = EVIL;
-
-    %% write init;
-    json->memo = p;
-    %% write exec;
-
-    if (cs >= JSON_float_first_final) {
-        long len = p - json->memo;
-        fbuffer_clear(json->fbuffer);
-        fbuffer_append(json->fbuffer, json->memo, len);
-        fbuffer_append_char(json->fbuffer, '\0');
-        *result = rb_float_new(rb_cstr_to_dbl(FBUFFER_PTR(json->fbuffer), 1));
-        return p + 1;
-    } else {
-        return NULL;
-    }
-}
-
-
-%%{
-    machine JSON_array;
-    include JSON_common;
-
-    write data;
-
-    action parse_value {
-        VALUE v = Qnil;
-        char *np = JSON_parse_value(json, fpc, pe, &v);
-        if (np == NULL) {
-            fhold; fbreak;
-        } else {
-            if (NIL_P(json->array_class)) {
-                rb_ary_push(*result, v);
-            } else {
-                rb_funcall(*result, i_leftshift, 1, v);
-            }
-            fexec np;
-        }
-    }
-
-    action exit { fhold; fbreak; }
-
-    next_element  = value_separator ignore* begin_value >parse_value;
-
-    main := begin_array ignore*
-          ((begin_value >parse_value ignore*)
-           (ignore* next_element ignore*)*)?
-          end_array @exit;
-}%%
-
-static char *JSON_parse_array(JSON_Parser *json, char *p, char *pe, VALUE *result)
-{
-    int cs = EVIL;
-    VALUE array_class = json->array_class;
-
-    if (json->max_nesting && json->current_nesting > json->max_nesting) {
-        rb_raise(eNestingError, "nesting of %d is too deep", json->current_nesting);
-    }
-    *result = NIL_P(array_class) ? rb_ary_new() : rb_class_new_instance(0, 0, array_class);
-
-    %% write init;
-    %% write exec;
-
-    if(cs >= JSON_array_first_final) {
-        return p + 1;
-    } else {
-        rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
-        return NULL;
-    }
-}
-
-static VALUE json_string_unescape(VALUE result, char *string, char *stringEnd)
-{
-    char *p = string, *pe = string, *unescape;
-    int unescape_len;
-    char buf[4];
-
-    while (pe < stringEnd) {
-        if (*pe == '\\') {
-            unescape = (char *) "?";
-            unescape_len = 1;
-            if (pe > p) rb_str_buf_cat(result, p, pe - p);
-            switch (*++pe) {
-                case 'n':
-                    unescape = (char *) "\n";
-                    break;
-                case 'r':
-                    unescape = (char *) "\r";
-                    break;
-                case 't':
-                    unescape = (char *) "\t";
-                    break;
-                case '"':
-                    unescape = (char *) "\"";
-                    break;
-                case '\\':
-                    unescape = (char *) "\\";
-                    break;
-                case 'b':
-                    unescape = (char *) "\b";
-                    break;
-                case 'f':
-                    unescape = (char *) "\f";
-                    break;
-                case 'u':
-                    if (pe > stringEnd - 4) {
-                        return Qnil;
-                    } else {
-                        UTF32 ch = unescape_unicode((unsigned char *) ++pe);
-                        pe += 3;
-                        if (UNI_SUR_HIGH_START == (ch & 0xFC00)) {
-                            pe++;
-                            if (pe > stringEnd - 6) return Qnil;
-                            if (pe[0] == '\\' && pe[1] == 'u') {
-                                UTF32 sur = unescape_unicode((unsigned char *) pe + 2);
-                                ch = (((ch & 0x3F) << 10) | ((((ch >> 6) & 0xF) + 1) << 16)
-                                        | (sur & 0x3FF));
-                                pe += 5;
-                            } else {
-                                unescape = (char *) "?";
-                                break;
-                            }
-                        }
-                        unescape_len = convert_UTF32_to_UTF8(buf, ch);
-                        unescape = buf;
-                    }
-                    break;
-                default:
-                    p = pe;
-                    continue;
-            }
-            rb_str_buf_cat(result, unescape, unescape_len);
-            p = ++pe;
-        } else {
-            pe++;
-        }
-    }
-    rb_str_buf_cat(result, p, pe - p);
-    return result;
-}
-
-%%{
-    machine JSON_string;
-    include JSON_common;
-
-    write data;
-
-    action parse_string {
-        *result = json_string_unescape(*result, json->memo + 1, p);
-        if (NIL_P(*result)) {
-            fhold;
-            fbreak;
-        } else {
-            FORCE_UTF8(*result);
-            fexec p + 1;
-        }
-    }
-
-    action exit { fhold; fbreak; }
-
-    main := '"' ((^([\"\\] | 0..0x1f) | '\\'[\"\\/bfnrt] | '\\u'[0-9a-fA-F]{4} | '\\'^([\"\\/bfnrtu]|0..0x1f))* %parse_string) '"' @exit;
-}%%
-
-static int
-match_i(VALUE regexp, VALUE klass, VALUE memo)
-{
-    if (regexp == Qundef) return ST_STOP;
-    if (RTEST(rb_funcall(klass, i_json_creatable_p, 0)) &&
-      RTEST(rb_funcall(regexp, i_match, 1, rb_ary_entry(memo, 0)))) {
-        rb_ary_push(memo, klass);
-        return ST_STOP;
-    }
-    return ST_CONTINUE;
-}
-
-static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *result)
-{
-    int cs = EVIL;
-    VALUE match_string;
-
-    *result = rb_str_buf_new(0);
-    %% write init;
-    json->memo = p;
-    %% write exec;
-
-    if (json->create_additions && RTEST(match_string = json->match_string)) {
-          VALUE klass;
-          VALUE memo = rb_ary_new2(2);
-          rb_ary_push(memo, *result);
-          rb_hash_foreach(match_string, match_i, memo);
-          klass = rb_ary_entry(memo, 1);
-          if (RTEST(klass)) {
-              *result = rb_funcall(klass, i_json_create, 1, *result);
-          }
-    }
-
-    if (json->symbolize_names && json->parsing_name) {
-      *result = rb_str_intern(*result);
-    }
-    if (cs >= JSON_string_first_final) {
-        return p + 1;
-    } else {
-        return NULL;
-    }
-}
-
-/*
- * Document-class: JSON::Ext::Parser
- *
- * This is the JSON parser implemented as a C extension. It can be configured
- * to be used by setting
- *
- *  JSON.parser = JSON::Ext::Parser
- *
- * with the method parser= in JSON.
- *
- */
-
-static VALUE convert_encoding(VALUE source)
-{
-    char *ptr = RSTRING_PTR(source);
-    long len = RSTRING_LEN(source);
-    if (len < 2) {
-        rb_raise(eParserError, "A JSON text must at least contain two octets!");
-    }
-#ifdef HAVE_RUBY_ENCODING_H
-    {
-        VALUE encoding = rb_funcall(source, i_encoding, 0);
-        if (encoding == CEncoding_ASCII_8BIT) {
-            if (len >= 4 &&  ptr[0] == 0 && ptr[1] == 0 && ptr[2] == 0) {
-                source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_32BE);
-            } else if (len >= 4 && ptr[0] == 0 && ptr[2] == 0) {
-                source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_16BE);
-            } else if (len >= 4 && ptr[1] == 0 && ptr[2] == 0 && ptr[3] == 0) {
-                source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_32LE);
-            } else if (len >= 4 && ptr[1] == 0 && ptr[3] == 0) {
-                source = rb_funcall(source, i_encode, 2, CEncoding_UTF_8, CEncoding_UTF_16LE);
-            } else {
-                source = rb_str_dup(source);
-                FORCE_UTF8(source);
-            }
-        } else {
-            source = rb_funcall(source, i_encode, 1, CEncoding_UTF_8);
-        }
-    }
-#else
-    if (len >= 4 &&  ptr[0] == 0 && ptr[1] == 0 && ptr[2] == 0) {
-      source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-32be"), source);
-    } else if (len >= 4 && ptr[0] == 0 && ptr[2] == 0) {
-      source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-16be"), source);
-    } else if (len >= 4 && ptr[1] == 0 && ptr[2] == 0 && ptr[3] == 0) {
-      source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-32le"), source);
-    } else if (len >= 4 && ptr[1] == 0 && ptr[3] == 0) {
-      source = rb_funcall(mJSON, i_iconv, 3, rb_str_new2("utf-8"), rb_str_new2("utf-16le"), source);
-    }
-#endif
-    return source;
-}
-
-/*
- * call-seq: new(source, opts => {})
- *
- * Creates a new JSON::Ext::Parser instance for the string _source_.
- *
- * Creates a new JSON::Ext::Parser instance for the string _source_.
- *
- * It will be configured by the _opts_ hash. _opts_ can have the following
- * keys:
- *
- * _opts_ can have the following keys:
- * * *max_nesting*: The maximum depth of nesting allowed in the parsed data
- *   structures. Disable depth checking with :max_nesting => false|nil|0, it
- *   defaults to 100.
- * * *allow_nan*: If set to true, allow NaN, Infinity and -Infinity in
- *   defiance of RFC 4627 to be parsed by the Parser. This option defaults to
- *   false.
- * * *symbolize_names*: If set to true, returns symbols for the names
- *   (keys) in a JSON object. Otherwise strings are returned, which is also
- *   the default.
- * * *create_additions*: If set to false, the Parser doesn't create
- *   additions even if a matchin class and create_id was found. This option
- *   defaults to true.
- * * *object_class*: Defaults to Hash
- * * *array_class*: Defaults to Array
- */
-static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
-{
-    VALUE source, opts;
-    GET_PARSER_INIT;
-
-    if (json->Vsource) {
-        rb_raise(rb_eTypeError, "already initialized instance");
-    }
-    rb_scan_args(argc, argv, "11", &source, &opts);
-    if (!NIL_P(opts)) {
-        opts = rb_convert_type(opts, T_HASH, "Hash", "to_hash");
-        if (NIL_P(opts)) {
-            rb_raise(rb_eArgError, "opts needs to be like a hash");
-        } else {
-            VALUE tmp = ID2SYM(i_max_nesting);
-            if (option_given_p(opts, tmp)) {
-                VALUE max_nesting = rb_hash_aref(opts, tmp);
-                if (RTEST(max_nesting)) {
-                    Check_Type(max_nesting, T_FIXNUM);
-                    json->max_nesting = FIX2INT(max_nesting);
-                } else {
-                    json->max_nesting = 0;
-                }
-            } else {
-                json->max_nesting = 100;
-            }
-            tmp = ID2SYM(i_allow_nan);
-            if (option_given_p(opts, tmp)) {
-                json->allow_nan = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
-            } else {
-                json->allow_nan = 0;
-            }
-            tmp = ID2SYM(i_symbolize_names);
-            if (option_given_p(opts, tmp)) {
-                json->symbolize_names = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
-            } else {
-                json->symbolize_names = 0;
-            }
-            tmp = ID2SYM(i_quirks_mode);
-            if (option_given_p(opts, tmp)) {
-                VALUE quirks_mode = rb_hash_aref(opts, tmp);
-                json->quirks_mode = RTEST(quirks_mode) ? 1 : 0;
-            } else {
-                json->quirks_mode = 0;
-            }
-            tmp = ID2SYM(i_create_additions);
-            if (option_given_p(opts, tmp)) {
-                json->create_additions = RTEST(rb_hash_aref(opts, tmp));
-            } else {
-                json->create_additions = 0;
-            }
-            tmp = ID2SYM(i_create_id);
-            if (option_given_p(opts, tmp)) {
-                json->create_id = rb_hash_aref(opts, tmp);
-            } else {
-                json->create_id = rb_funcall(mJSON, i_create_id, 0);
-            }
-            tmp = ID2SYM(i_object_class);
-            if (option_given_p(opts, tmp)) {
-                json->object_class = rb_hash_aref(opts, tmp);
-            } else {
-                json->object_class = Qnil;
-            }
-            tmp = ID2SYM(i_array_class);
-            if (option_given_p(opts, tmp)) {
-                json->array_class = rb_hash_aref(opts, tmp);
-            } else {
-                json->array_class = Qnil;
-            }
-            tmp = ID2SYM(i_match_string);
-            if (option_given_p(opts, tmp)) {
-                VALUE match_string = rb_hash_aref(opts, tmp);
-                json->match_string = RTEST(match_string) ? match_string : Qnil;
-            } else {
-                json->match_string = Qnil;
-            }
-        }
-    } else {
-        json->max_nesting = 100;
-        json->allow_nan = 0;
-        json->create_additions = 1;
-        json->create_id = rb_funcall(mJSON, i_create_id, 0);
-        json->object_class = Qnil;
-        json->array_class = Qnil;
-    }
-    source = rb_convert_type(source, T_STRING, "String", "to_str");
-    if (!json->quirks_mode) {
-      source = convert_encoding(StringValue(source));
-    }
-    json->current_nesting = 0;
-    StringValue(source);
-    json->len = RSTRING_LEN(source);
-    json->source = RSTRING_PTR(source);;
-    json->Vsource = source;
-    return self;
-}
-
-%%{
-    machine JSON;
-
-    write data;
-
-    include JSON_common;
-
-    action parse_object {
-        char *np;
-        json->current_nesting = 1;
-        np = JSON_parse_object(json, fpc, pe, &result);
-        if (np == NULL) { fhold; fbreak; } else fexec np;
-    }
-
-    action parse_array {
-        char *np;
-        json->current_nesting = 1;
-        np = JSON_parse_array(json, fpc, pe, &result);
-        if (np == NULL) { fhold; fbreak; } else fexec np;
-    }
-
-    main := ignore* (
-            begin_object >parse_object |
-            begin_array >parse_array
-            ) ignore*;
-}%%
-
-static VALUE cParser_parse_strict(VALUE self)
-{
-    char *p, *pe;
-    int cs = EVIL;
-    VALUE result = Qnil;
-    GET_PARSER;
-
-    %% write init;
-    p = json->source;
-    pe = p + json->len;
-    %% write exec;
-
-    if (cs >= JSON_first_final && p == pe) {
-        return result;
-    } else {
-        rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
-        return Qnil;
-    }
-}
-
-
-%%{
-    machine JSON_quirks_mode;
-
-    write data;
-
-    include JSON_common;
-
-    action parse_value {
-        char *np = JSON_parse_value(json, fpc, pe, &result);
-        if (np == NULL) { fhold; fbreak; } else fexec np;
-    }
-
-    main := ignore* (
-            begin_value >parse_value
-            ) ignore*;
-}%%
-
-static VALUE cParser_parse_quirks_mode(VALUE self)
-{
-    char *p, *pe;
-    int cs = EVIL;
-    VALUE result = Qnil;
-    GET_PARSER;
-
-    %% write init;
-    p = json->source;
-    pe = p + json->len;
-    %% write exec;
-
-    if (cs >= JSON_quirks_mode_first_final && p == pe) {
-        return result;
-    } else {
-        rb_raise(eParserError, "%u: unexpected token at '%s'", __LINE__, p);
-        return Qnil;
-    }
-}
-
-/*
- * call-seq: parse()
- *
- *  Parses the current JSON text _source_ and returns the complete data
- *  structure as a result.
- */
-static VALUE cParser_parse(VALUE self)
-{
-  GET_PARSER;
-
-  if (json->quirks_mode) {
-    return cParser_parse_quirks_mode(self);
-  } else {
-    return cParser_parse_strict(self);
-  }
-}
-
-
-static JSON_Parser *JSON_allocate()
-{
-    JSON_Parser *json = ALLOC(JSON_Parser);
-    MEMZERO(json, JSON_Parser, 1);
-    json->fbuffer = fbuffer_alloc(0);
-    return json;
-}
-
-static void JSON_mark(JSON_Parser *json)
-{
-    rb_gc_mark_maybe(json->Vsource);
-    rb_gc_mark_maybe(json->create_id);
-    rb_gc_mark_maybe(json->object_class);
-    rb_gc_mark_maybe(json->array_class);
-    rb_gc_mark_maybe(json->match_string);
-}
-
-static void JSON_free(JSON_Parser *json)
-{
-    fbuffer_free(json->fbuffer);
-    ruby_xfree(json);
-}
-
-static VALUE cJSON_parser_s_allocate(VALUE klass)
-{
-    JSON_Parser *json = JSON_allocate();
-    return Data_Wrap_Struct(klass, JSON_mark, JSON_free, json);
-}
-
-/*
- * call-seq: source()
- *
- * Returns a copy of the current _source_ string, that was used to construct
- * this Parser.
- */
-static VALUE cParser_source(VALUE self)
-{
-    GET_PARSER;
-    return rb_str_dup(json->Vsource);
-}
-
-/*
- * call-seq: quirks_mode?()
- *
- * Returns a true, if this parser is in quirks_mode, false otherwise.
- */
-static VALUE cParser_quirks_mode_p(VALUE self)
-{
-    GET_PARSER;
-    return json->quirks_mode ? Qtrue : Qfalse;
-}
-
-
-void Init_parser()
-{
-    rb_require("json/common");
-    mJSON = rb_define_module("JSON");
-    mExt = rb_define_module_under(mJSON, "Ext");
-    cParser = rb_define_class_under(mExt, "Parser", rb_cObject);
-    eParserError = rb_path2class("JSON::ParserError");
-    eNestingError = rb_path2class("JSON::NestingError");
-    rb_define_alloc_func(cParser, cJSON_parser_s_allocate);
-    rb_define_method(cParser, "initialize", cParser_initialize, -1);
-    rb_define_method(cParser, "parse", cParser_parse, 0);
-    rb_define_method(cParser, "source", cParser_source, 0);
-    rb_define_method(cParser, "quirks_mode?", cParser_quirks_mode_p, 0);
-
-    CNaN = rb_const_get(mJSON, rb_intern("NaN"));
-    CInfinity = rb_const_get(mJSON, rb_intern("Infinity"));
-    CMinusInfinity = rb_const_get(mJSON, rb_intern("MinusInfinity"));
-
-    i_json_creatable_p = rb_intern("json_creatable?");
-    i_json_create = rb_intern("json_create");
-    i_create_id = rb_intern("create_id");
-    i_create_additions = rb_intern("create_additions");
-    i_chr = rb_intern("chr");
-    i_max_nesting = rb_intern("max_nesting");
-    i_allow_nan = rb_intern("allow_nan");
-    i_symbolize_names = rb_intern("symbolize_names");
-    i_quirks_mode = rb_intern("quirks_mode");
-    i_object_class = rb_intern("object_class");
-    i_array_class = rb_intern("array_class");
-    i_match = rb_intern("match");
-    i_match_string = rb_intern("match_string");
-    i_key_p = rb_intern("key?");
-    i_deep_const_get = rb_intern("deep_const_get");
-    i_aset = rb_intern("[]=");
-    i_aref = rb_intern("[]");
-    i_leftshift = rb_intern("<<");
-#ifdef HAVE_RUBY_ENCODING_H
-    CEncoding_UTF_8 = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-8"));
-    CEncoding_UTF_16BE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-16be"));
-    CEncoding_UTF_16LE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-16le"));
-    CEncoding_UTF_32BE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-32be"));
-    CEncoding_UTF_32LE = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-32le"));
-    CEncoding_ASCII_8BIT = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("ascii-8bit"));
-    i_encoding = rb_intern("encoding");
-    i_encode = rb_intern("encode");
-#else
-    i_iconv = rb_intern("iconv");
-#endif
-}
-
-/*
- * Local variables:
- * mode: c
- * c-file-style: ruby
- * indent-tabs-mode: nil
- * End:
- */
diff --git a/vendor/json_pure-1.7.7/install.rb b/vendor/json_pure-1.7.7/install.rb
deleted file mode 100644
index 9d3ae12..0000000
--- a/vendor/json_pure-1.7.7/install.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env ruby
-
-require 'fileutils'
-include FileUtils::Verbose
-require 'rbconfig'
-include\
-  begin
-    RbConfig
-  rescue NameError
-    Config
-  end
-
-sitelibdir = CONFIG["sitelibdir"]
-cd 'lib' do
-  install('json.rb', sitelibdir)
-  mkdir_p File.join(sitelibdir, 'json')
-  for file in Dir['json/**/*}']
-    d = File.join(sitelibdir, file)
-    mkdir_p File.dirname(d)
-    install(file, d)
-  end
-end
-warn " *** Installed PURE ruby library."
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/ByteListTranscoder.java b/vendor/json_pure-1.7.7/java/src/json/ext/ByteListTranscoder.java
deleted file mode 100644
index ed9e54b..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/ByteListTranscoder.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import org.jruby.exceptions.RaiseException;
-import org.jruby.runtime.ThreadContext;
-import org.jruby.util.ByteList;
-
-/**
- * A class specialized in transcoding a certain String format into another,
- * using UTF-8 ByteLists as both input and output.
- */
-abstract class ByteListTranscoder {
-    protected final ThreadContext context;
-
-    protected ByteList src;
-    protected int srcEnd;
-    /** Position where the last read character started */
-    protected int charStart;
-    /** Position of the next character to read */
-    protected int pos;
-
-    private ByteList out;
-    /**
-     * When a character that can be copied straight into the output is found,
-     * its index is stored on this variable, and copying is delayed until
-     * the sequence of characters that can be copied ends.
-     *
-     * <p>The variable stores -1 when not in a plain sequence.
-     */
-    private int quoteStart = -1;
-
-    protected ByteListTranscoder(ThreadContext context) {
-        this.context = context;
-    }
-
-    protected void init(ByteList src, ByteList out) {
-        this.init(src, 0, src.length(), out);
-    }
-
-    protected void init(ByteList src, int start, int end, ByteList out) {
-        this.src = src;
-        this.pos = start;
-        this.charStart = start;
-        this.srcEnd = end;
-        this.out = out;
-    }
-
-    /**
-     * Returns whether there are any characters left to be read.
-     */
-    protected boolean hasNext() {
-        return pos < srcEnd;
-    }
-
-    /**
-     * Returns the next character in the buffer.
-     */
-    private char next() {
-        return src.charAt(pos++);
-    }
-
-    /**
-     * Reads an UTF-8 character from the input and returns its code point,
-     * while advancing the input position.
-     *
-     * <p>Raises an {@link #invalidUtf8()} exception if an invalid byte
-     * is found.
-     */
-    protected int readUtf8Char() {
-        charStart = pos;
-        char head = next();
-        if (head <= 0x7f) { // 0b0xxxxxxx (ASCII)
-            return head;
-        }
-        if (head <= 0xbf) { // 0b10xxxxxx
-            throw invalidUtf8(); // tail byte with no head
-        }
-        if (head <= 0xdf) { // 0b110xxxxx
-            ensureMin(1);
-            int cp = ((head  & 0x1f) << 6)
-                     | nextPart();
-            if (cp < 0x0080) throw invalidUtf8();
-            return cp;
-        }
-        if (head <= 0xef) { // 0b1110xxxx
-            ensureMin(2);
-            int cp = ((head & 0x0f) << 12)
-                     | (nextPart()  << 6)
-                     | nextPart();
-            if (cp < 0x0800) throw invalidUtf8();
-            return cp;
-        }
-        if (head <= 0xf7) { // 0b11110xxx
-            ensureMin(3);
-            int cp = ((head & 0x07) << 18)
-                     | (nextPart()  << 12)
-                     | (nextPart()  << 6)
-                     | nextPart();
-            if (!Character.isValidCodePoint(cp)) throw invalidUtf8();
-            return cp;
-        }
-        // 0b11111xxx?
-        throw invalidUtf8();
-    }
-
-    /**
-     * Throws a GeneratorError if the input list doesn't have at least this
-     * many bytes left.
-     */
-    protected void ensureMin(int n) {
-        if (pos + n > srcEnd) throw incompleteUtf8();
-    }
-
-    /**
-     * Reads the next byte of a multi-byte UTF-8 character and returns its
-     * contents (lower 6 bits).
-     *
-     * <p>Throws a GeneratorError if the byte is not a valid tail.
-     */
-    private int nextPart() {
-        char c = next();
-        // tail bytes must be 0b10xxxxxx
-        if ((c & 0xc0) != 0x80) throw invalidUtf8();
-        return c & 0x3f;
-    }
-
-
-    protected void quoteStart() {
-        if (quoteStart == -1) quoteStart = charStart;
-    }
-
-    /**
-     * When in a sequence of characters that can be copied directly,
-     * interrupts the sequence and copies it to the output buffer.
-     *
-     * @param endPos The offset until which the direct character quoting should
-     *               occur. You may pass {@link #pos} to quote until the most
-     *               recently read character, or {@link #charStart} to quote
-     *               until the character before it.
-     */
-    protected void quoteStop(int endPos) {
-        if (quoteStart != -1) {
-            out.append(src, quoteStart, endPos - quoteStart);
-            quoteStart = -1;
-        }
-    }
-
-    protected void append(int b) {
-        out.append(b);
-    }
-
-    protected void append(byte[] origin, int start, int length) {
-        out.append(origin, start, length);
-    }
-
-
-    protected abstract RaiseException invalidUtf8();
-
-    protected RaiseException incompleteUtf8() {
-        return invalidUtf8();
-    }
-}
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/Generator.java b/vendor/json_pure-1.7.7/java/src/json/ext/Generator.java
deleted file mode 100644
index ecceb27..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/Generator.java
+++ /dev/null
@@ -1,444 +0,0 @@
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import org.jruby.Ruby;
-import org.jruby.RubyArray;
-import org.jruby.RubyBignum;
-import org.jruby.RubyBoolean;
-import org.jruby.RubyClass;
-import org.jruby.RubyFixnum;
-import org.jruby.RubyFloat;
-import org.jruby.RubyHash;
-import org.jruby.RubyNumeric;
-import org.jruby.RubyString;
-import org.jruby.runtime.ThreadContext;
-import org.jruby.runtime.builtin.IRubyObject;
-import org.jruby.util.ByteList;
-
-public final class Generator {
-    private Generator() {
-        throw new RuntimeException();
-    }
-
-    /**
-     * Encodes the given object as a JSON string, using the given handler.
-     */
-    static <T extends IRubyObject> RubyString
-            generateJson(ThreadContext context, T object,
-                         Handler<? super T> handler, IRubyObject[] args) {
-        Session session = new Session(context, args.length > 0 ? args[0]
-                                                               : null);
-        return session.infect(handler.generateNew(session, object));
-    }
-
-    /**
-     * Encodes the given object as a JSON string, detecting the appropriate handler
-     * for the given object.
-     */
-    static <T extends IRubyObject> RubyString
-            generateJson(ThreadContext context, T object, IRubyObject[] args) {
-        Handler<? super T> handler = getHandlerFor(context.getRuntime(), object);
-        return generateJson(context, object, handler, args);
-    }
-
-    /**
-     * Encodes the given object as a JSON string, using the appropriate
-     * handler if one is found or calling #to_json if not.
-     */
-    public static <T extends IRubyObject> RubyString
-            generateJson(ThreadContext context, T object,
-                         GeneratorState config) {
-        Session session = new Session(context, config);
-        Handler<? super T> handler = getHandlerFor(context.getRuntime(), object);
-        return handler.generateNew(session, object);
-    }
-
-    /**
-     * Returns the best serialization handler for the given object.
-     */
-    // Java's generics can't handle this satisfactorily, so I'll just leave
-    // the best I could get and ignore the warnings
-    @SuppressWarnings("unchecked")
-    private static <T extends IRubyObject>
-            Handler<? super T> getHandlerFor(Ruby runtime, T object) {
-        RubyClass metaClass = object.getMetaClass();
-        if (metaClass == runtime.getString()) return (Handler)STRING_HANDLER;
-        if (metaClass == runtime.getFixnum()) return (Handler)FIXNUM_HANDLER;
-        if (metaClass == runtime.getHash())   return (Handler)HASH_HANDLER;
-        if (metaClass == runtime.getArray())  return (Handler)ARRAY_HANDLER;
-        if (object.isNil())                   return (Handler)NIL_HANDLER;
-        if (object == runtime.getTrue())      return (Handler)TRUE_HANDLER;
-        if (object == runtime.getFalse())     return (Handler)FALSE_HANDLER;
-        if (metaClass == runtime.getFloat())  return (Handler)FLOAT_HANDLER;
-        if (metaClass == runtime.getBignum()) return (Handler)BIGNUM_HANDLER;
-        return GENERIC_HANDLER;
-    }
-
-
-    /* Generator context */
-
-    /**
-     * A class that concentrates all the information that is shared by
-     * generators working on a single session.
-     *
-     * <p>A session is defined as the process of serializing a single root
-     * object; any handler directly called by container handlers (arrays and
-     * hashes/objects) shares this object with its caller.
-     *
-     * <p>Note that anything called indirectly (via {@link GENERIC_HANDLER})
-     * won't be part of the session.
-     */
-    static class Session {
-        private final ThreadContext context;
-        private GeneratorState state;
-        private IRubyObject possibleState;
-        private RuntimeInfo info;
-        private StringEncoder stringEncoder;
-
-        private boolean tainted = false;
-        private boolean untrusted = false;
-
-        Session(ThreadContext context, GeneratorState state) {
-            this.context = context;
-            this.state = state;
-        }
-
-        Session(ThreadContext context, IRubyObject possibleState) {
-            this.context = context;
-            this.possibleState = possibleState == null || possibleState.isNil()
-                    ? null : possibleState;
-        }
-
-        public ThreadContext getContext() {
-            return context;
-        }
-
-        public Ruby getRuntime() {
-            return context.getRuntime();
-        }
-
-        public GeneratorState getState() {
-            if (state == null) {
-                state = GeneratorState.fromState(context, getInfo(), possibleState);
-            }
-            return state;
-        }
-
-        public RuntimeInfo getInfo() {
-            if (info == null) info = RuntimeInfo.forRuntime(getRuntime());
-            return info;
-        }
-
-        public StringEncoder getStringEncoder() {
-            if (stringEncoder == null) {
-                stringEncoder = new StringEncoder(context, getState().asciiOnly());
-            }
-            return stringEncoder;
-        }
-
-        public void infectBy(IRubyObject object) {
-            if (object.isTaint()) tainted = true;
-            if (object.isUntrusted()) untrusted = true;
-        }
-
-        public <T extends IRubyObject> T infect(T object) {
-            if (tainted) object.setTaint(true);
-            if (untrusted) object.setUntrusted(true);
-            return object;
-        }
-    }
-
-
-    /* Handler base classes */
-
-    private static abstract class Handler<T extends IRubyObject> {
-        /**
-         * Returns an estimative of how much space the serialization of the
-         * given object will take. Used for allocating enough buffer space
-         * before invoking other methods.
-         */
-        int guessSize(Session session, T object) {
-            return 4;
-        }
-
-        RubyString generateNew(Session session, T object) {
-            RubyString result;
-            ByteList buffer = new ByteList(guessSize(session, object));
-            generate(session, object, buffer);
-            result = RubyString.newString(session.getRuntime(), buffer);
-            ThreadContext context = session.getContext();
-            RuntimeInfo info = session.getInfo();
-            if (info.encodingsSupported()) {
-                result.force_encoding(context, info.utf8.get());
-            }
-            return result;
-        }
-
-        abstract void generate(Session session, T object, ByteList buffer);
-    }
-
-    /**
-     * A handler that returns a fixed keyword regardless of the passed object.
-     */
-    private static class KeywordHandler<T extends IRubyObject>
-            extends Handler<T> {
-        private final ByteList keyword;
-
-        private KeywordHandler(String keyword) {
-            this.keyword = new ByteList(ByteList.plain(keyword), false);
-        }
-
-        @Override
-        int guessSize(Session session, T object) {
-            return keyword.length();
-        }
-
-        @Override
-        RubyString generateNew(Session session, T object) {
-            return RubyString.newStringShared(session.getRuntime(), keyword);
-        }
-
-        @Override
-        void generate(Session session, T object, ByteList buffer) {
-            buffer.append(keyword);
-        }
-    }
-
-
-    /* Handlers */
-
-    static final Handler<RubyBignum> BIGNUM_HANDLER =
-        new Handler<RubyBignum>() {
-            @Override
-            void generate(Session session, RubyBignum object, ByteList buffer) {
-                // JRUBY-4751: RubyBignum.to_s() returns generic object
-                // representation (fixed in 1.5, but we maintain backwards
-                // compatibility; call to_s(IRubyObject[]) then
-                buffer.append(((RubyString)object.to_s(IRubyObject.NULL_ARRAY)).getByteList());
-            }
-        };
-
-    static final Handler<RubyFixnum> FIXNUM_HANDLER =
-        new Handler<RubyFixnum>() {
-            @Override
-            void generate(Session session, RubyFixnum object, ByteList buffer) {
-                buffer.append(object.to_s().getByteList());
-            }
-        };
-
-    static final Handler<RubyFloat> FLOAT_HANDLER =
-        new Handler<RubyFloat>() {
-            @Override
-            void generate(Session session, RubyFloat object, ByteList buffer) {
-                double value = RubyFloat.num2dbl(object);
-
-                if (Double.isInfinite(value) || Double.isNaN(value)) {
-                    if (!session.getState().allowNaN()) {
-                        throw Utils.newException(session.getContext(),
-                                Utils.M_GENERATOR_ERROR,
-                                object + " not allowed in JSON");
-                    }
-                }
-                buffer.append(((RubyString)object.to_s()).getByteList());
-            }
-        };
-
-    static final Handler<RubyArray> ARRAY_HANDLER =
-        new Handler<RubyArray>() {
-            @Override
-            int guessSize(Session session, RubyArray object) {
-                GeneratorState state = session.getState();
-                int depth = state.getDepth();
-                int perItem =
-                    4                                           // prealloc
-                    + (depth + 1) * state.getIndent().length()  // indent
-                    + 1 + state.getArrayNl().length();          // ',' arrayNl
-                return 2 + object.size() * perItem;
-            }
-
-            @Override
-            void generate(Session session, RubyArray object, ByteList buffer) {
-                ThreadContext context = session.getContext();
-                Ruby runtime = context.getRuntime();
-                GeneratorState state = session.getState();
-                int depth = state.increaseDepth();
-
-                ByteList indentUnit = state.getIndent();
-                byte[] shift = Utils.repeat(indentUnit, depth);
-
-                ByteList arrayNl = state.getArrayNl();
-                byte[] delim = new byte[1 + arrayNl.length()];
-                delim[0] = ',';
-                System.arraycopy(arrayNl.unsafeBytes(), arrayNl.begin(), delim, 1,
-                        arrayNl.length());
-
-                session.infectBy(object);
-
-                buffer.append((byte)'[');
-                buffer.append(arrayNl);
-                boolean firstItem = true;
-                for (int i = 0, t = object.getLength(); i < t; i++) {
-                    IRubyObject element = object.eltInternal(i);
-                    session.infectBy(element);
-                    if (firstItem) {
-                        firstItem = false;
-                    } else {
-                        buffer.append(delim);
-                    }
-                    buffer.append(shift);
-                    Handler<IRubyObject> handler = getHandlerFor(runtime, element);
-                    handler.generate(session, element, buffer);
-                }
-
-                state.decreaseDepth();
-                if (arrayNl.length() != 0) {
-                    buffer.append(arrayNl);
-                    buffer.append(shift, 0, state.getDepth() * indentUnit.length());
-                }
-
-                buffer.append((byte)']');
-            }
-        };
-
-    static final Handler<RubyHash> HASH_HANDLER =
-        new Handler<RubyHash>() {
-            @Override
-            int guessSize(Session session, RubyHash object) {
-                GeneratorState state = session.getState();
-                int perItem =
-                    12    // key, colon, comma
-                    + (state.getDepth() + 1) * state.getIndent().length()
-                    + state.getSpaceBefore().length()
-                    + state.getSpace().length();
-                return 2 + object.size() * perItem;
-            }
-
-            @Override
-            void generate(final Session session, RubyHash object,
-                          final ByteList buffer) {
-                ThreadContext context = session.getContext();
-                final Ruby runtime = context.getRuntime();
-                final GeneratorState state = session.getState();
-                final int depth = state.increaseDepth();
-
-                final ByteList objectNl = state.getObjectNl();
-                final byte[] indent = Utils.repeat(state.getIndent(), depth);
-                final ByteList spaceBefore = state.getSpaceBefore();
-                final ByteList space = state.getSpace();
-
-                buffer.append((byte)'{');
-                buffer.append(objectNl);
-                object.visitAll(new RubyHash.Visitor() {
-                    private boolean firstPair = true;
-
-                    @Override
-                    public void visit(IRubyObject key, IRubyObject value) {
-                        if (firstPair) {
-                            firstPair = false;
-                        } else {
-                            buffer.append((byte)',');
-                            buffer.append(objectNl);
-                        }
-                        if (objectNl.length() != 0) buffer.append(indent);
-
-                        STRING_HANDLER.generate(session, key.asString(), buffer);
-                        session.infectBy(key);
-
-                        buffer.append(spaceBefore);
-                        buffer.append((byte)':');
-                        buffer.append(space);
-
-                        Handler<IRubyObject> valueHandler = getHandlerFor(runtime, value);
-                        valueHandler.generate(session, value, buffer);
-                        session.infectBy(value);
-                    }
-                });
-                state.decreaseDepth();
-                if (objectNl.length() != 0) {
-                    buffer.append(objectNl);
-                    buffer.append(Utils.repeat(state.getIndent(), state.getDepth()));
-                }
-                buffer.append((byte)'}');
-            }
-        };
-
-    static final Handler<RubyString> STRING_HANDLER =
-        new Handler<RubyString>() {
-            @Override
-            int guessSize(Session session, RubyString object) {
-                // for most applications, most strings will be just a set of
-                // printable ASCII characters without any escaping, so let's
-                // just allocate enough space for that + the quotes
-                return 2 + object.getByteList().length();
-            }
-
-            @Override
-            void generate(Session session, RubyString object, ByteList buffer) {
-                RuntimeInfo info = session.getInfo();
-                RubyString src;
-
-                if (info.encodingsSupported() &&
-                        object.encoding(session.getContext()) != info.utf8.get()) {
-                    src = (RubyString)object.encode(session.getContext(),
-                                                    info.utf8.get());
-                } else {
-                    src = object;
-                }
-
-                session.getStringEncoder().encode(src.getByteList(), buffer);
-            }
-        };
-
-    static final Handler<RubyBoolean> TRUE_HANDLER =
-        new KeywordHandler<RubyBoolean>("true");
-    static final Handler<RubyBoolean> FALSE_HANDLER =
-        new KeywordHandler<RubyBoolean>("false");
-    static final Handler<IRubyObject> NIL_HANDLER =
-        new KeywordHandler<IRubyObject>("null");
-
-    /**
-     * The default handler (<code>Object#to_json</code>): coerces the object
-     * to string using <code>#to_s</code>, and serializes that string.
-     */
-    static final Handler<IRubyObject> OBJECT_HANDLER =
-        new Handler<IRubyObject>() {
-            @Override
-            RubyString generateNew(Session session, IRubyObject object) {
-                RubyString str = object.asString();
-                return STRING_HANDLER.generateNew(session, str);
-            }
-
-            @Override
-            void generate(Session session, IRubyObject object, ByteList buffer) {
-                RubyString str = object.asString();
-                STRING_HANDLER.generate(session, str, buffer);
-            }
-        };
-
-    /**
-     * A handler that simply calls <code>#to_json(state)</code> on the
-     * given object.
-     */
-    static final Handler<IRubyObject> GENERIC_HANDLER =
-        new Handler<IRubyObject>() {
-            @Override
-            RubyString generateNew(Session session, IRubyObject object) {
-                IRubyObject result =
-                    object.callMethod(session.getContext(), "to_json",
-                          new IRubyObject[] {session.getState()});
-                if (result instanceof RubyString) return (RubyString)result;
-                throw session.getRuntime().newTypeError("to_json must return a String");
-            }
-
-            @Override
-            void generate(Session session, IRubyObject object, ByteList buffer) {
-                RubyString result = generateNew(session, object);
-                buffer.append(result.getByteList());
-            }
-        };
-}
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/GeneratorMethods.java b/vendor/json_pure-1.7.7/java/src/json/ext/GeneratorMethods.java
deleted file mode 100644
index 637b579..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/GeneratorMethods.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import java.lang.ref.WeakReference;
-import org.jruby.Ruby;
-import org.jruby.RubyArray;
-import org.jruby.RubyBoolean;
-import org.jruby.RubyFixnum;
-import org.jruby.RubyFloat;
-import org.jruby.RubyHash;
-import org.jruby.RubyInteger;
-import org.jruby.RubyModule;
-import org.jruby.RubyNumeric;
-import org.jruby.RubyString;
-import org.jruby.anno.JRubyMethod;
-import org.jruby.runtime.ThreadContext;
-import org.jruby.runtime.builtin.IRubyObject;
-import org.jruby.util.ByteList;
-
-/**
- * A class that populates the
- * <code>Json::Ext::Generator::GeneratorMethods</code> module.
- *
- * @author mernen
- */
-class GeneratorMethods {
-    /**
-     * Populates the given module with all modules and their methods
-     * @param info
-     * @param generatorMethodsModule The module to populate
-     * (normally <code>JSON::Generator::GeneratorMethods</code>)
-     */
-    static void populate(RuntimeInfo info, RubyModule module) {
-        defineMethods(module, "Array",      RbArray.class);
-        defineMethods(module, "FalseClass", RbFalse.class);
-        defineMethods(module, "Float",      RbFloat.class);
-        defineMethods(module, "Hash",       RbHash.class);
-        defineMethods(module, "Integer",    RbInteger.class);
-        defineMethods(module, "NilClass",   RbNil.class);
-        defineMethods(module, "Object",     RbObject.class);
-        defineMethods(module, "String",     RbString.class);
-        defineMethods(module, "TrueClass",  RbTrue.class);
-
-        info.stringExtendModule = new WeakReference<RubyModule>(module.defineModuleUnder("String")
-                                            .defineModuleUnder("Extend"));
-        info.stringExtendModule.get().defineAnnotatedMethods(StringExtend.class);
-    }
-
-    /**
-     * Convenience method for defining methods on a submodule.
-     * @param parentModule
-     * @param submoduleName
-     * @param klass
-     */
-    private static void defineMethods(RubyModule parentModule,
-            String submoduleName, Class klass) {
-        RubyModule submodule = parentModule.defineModuleUnder(submoduleName);
-        submodule.defineAnnotatedMethods(klass);
-    }
-
-
-    public static class RbHash {
-        @JRubyMethod(rest=true)
-        public static IRubyObject to_json(ThreadContext context,
-                IRubyObject vSelf, IRubyObject[] args) {
-            return Generator.generateJson(context, (RubyHash)vSelf,
-                    Generator.HASH_HANDLER, args);
-        }
-    }
-
-    public static class RbArray {
-        @JRubyMethod(rest=true)
-        public static IRubyObject to_json(ThreadContext context,
-                IRubyObject vSelf, IRubyObject[] args) {
-            return Generator.generateJson(context, (RubyArray)vSelf,
-                    Generator.ARRAY_HANDLER, args);
-        }
-    }
-
-    public static class RbInteger {
-        @JRubyMethod(rest=true)
-        public static IRubyObject to_json(ThreadContext context,
-                IRubyObject vSelf, IRubyObject[] args) {
-            return Generator.generateJson(context, vSelf, args);
-        }
-    }
-
-    public static class RbFloat {
-        @JRubyMethod(rest=true)
-        public static IRubyObject to_json(ThreadContext context,
-                IRubyObject vSelf, IRubyObject[] args) {
-            return Generator.generateJson(context, (RubyFloat)vSelf,
-                    Generator.FLOAT_HANDLER, args);
-        }
-    }
-
-    public static class RbString {
-        @JRubyMethod(rest=true)
-        public static IRubyObject to_json(ThreadContext context,
-                IRubyObject vSelf, IRubyObject[] args) {
-            return Generator.generateJson(context, (RubyString)vSelf,
-                    Generator.STRING_HANDLER, args);
-        }
-
-        /**
-         * <code>{@link RubyString String}#to_json_raw(*)</code>
-         *
-         * <p>This method creates a JSON text from the result of a call to
-         * {@link #to_json_raw_object} of this String.
-         */
-        @JRubyMethod(rest=true)
-        public static IRubyObject to_json_raw(ThreadContext context,
-                IRubyObject vSelf, IRubyObject[] args) {
-            RubyHash obj = toJsonRawObject(context, Utils.ensureString(vSelf));
-            return Generator.generateJson(context, obj,
-                    Generator.HASH_HANDLER, args);
-        }
-
-        /**
-         * <code>{@link RubyString String}#to_json_raw_object(*)</code>
-         *
-         * <p>This method creates a raw object Hash, that can be nested into
-         * other data structures and will be unparsed as a raw string. This
-         * method should be used if you want to convert raw strings to JSON
-         * instead of UTF-8 strings, e.g. binary data.
-         */
-        @JRubyMethod(rest=true)
-        public static IRubyObject to_json_raw_object(ThreadContext context,
-                IRubyObject vSelf, IRubyObject[] args) {
-            return toJsonRawObject(context, Utils.ensureString(vSelf));
-        }
-
-        private static RubyHash toJsonRawObject(ThreadContext context,
-                                                RubyString self) {
-            Ruby runtime = context.getRuntime();
-            RubyHash result = RubyHash.newHash(runtime);
-
-            IRubyObject createId = RuntimeInfo.forRuntime(runtime)
-                    .jsonModule.get().callMethod(context, "create_id");
-            result.op_aset(context, createId, self.getMetaClass().to_s());
-
-            ByteList bl = self.getByteList();
-            byte[] uBytes = bl.unsafeBytes();
-            RubyArray array = runtime.newArray(bl.length());
-            for (int i = bl.begin(), t = bl.begin() + bl.length(); i < t; i++) {
-                array.store(i, runtime.newFixnum(uBytes[i] & 0xff));
-            }
-
-            result.op_aset(context, runtime.newString("raw"), array);
-            return result;
-        }
-
-        @JRubyMethod(required=1, module=true)
-        public static IRubyObject included(ThreadContext context,
-                IRubyObject vSelf, IRubyObject module) {
-            RuntimeInfo info = RuntimeInfo.forRuntime(context.getRuntime());
-            return module.callMethod(context, "extend", info.stringExtendModule.get());
-        }
-    }
-
-    public static class StringExtend {
-        /**
-         * <code>{@link RubyString String}#json_create(o)</code>
-         *
-         * <p>Raw Strings are JSON Objects (the raw bytes are stored in an
-         * array for the key "raw"). The Ruby String can be created by this
-         * module method.
-         */
-        @JRubyMethod(required=1)
-        public static IRubyObject json_create(ThreadContext context,
-                IRubyObject vSelf, IRubyObject vHash) {
-            Ruby runtime = context.getRuntime();
-            RubyHash o = vHash.convertToHash();
-            IRubyObject rawData = o.fastARef(runtime.newString("raw"));
-            if (rawData == null) {
-                throw runtime.newArgumentError("\"raw\" value not defined "
-                                               + "for encoded String");
-            }
-            RubyArray ary = Utils.ensureArray(rawData);
-            byte[] bytes = new byte[ary.getLength()];
-            for (int i = 0, t = ary.getLength(); i < t; i++) {
-                IRubyObject element = ary.eltInternal(i);
-                if (element instanceof RubyFixnum) {
-                    bytes[i] = (byte)RubyNumeric.fix2long(element);
-                } else {
-                    throw runtime.newTypeError(element, runtime.getFixnum());
-                }
-            }
-            return runtime.newString(new ByteList(bytes, false));
-        }
-    }
-
-    public static class RbTrue {
-        @JRubyMethod(rest=true)
-        public static IRubyObject to_json(ThreadContext context,
-                IRubyObject vSelf, IRubyObject[] args) {
-            return Generator.generateJson(context, (RubyBoolean)vSelf,
-                    Generator.TRUE_HANDLER, args);
-        }
-    }
-
-    public static class RbFalse {
-        @JRubyMethod(rest=true)
-        public static IRubyObject to_json(ThreadContext context,
-                IRubyObject vSelf, IRubyObject[] args) {
-            return Generator.generateJson(context, (RubyBoolean)vSelf,
-                    Generator.FALSE_HANDLER, args);
-        }
-    }
-
-    public static class RbNil {
-        @JRubyMethod(rest=true)
-        public static IRubyObject to_json(ThreadContext context,
-                IRubyObject vSelf, IRubyObject[] args) {
-            return Generator.generateJson(context, vSelf,
-                    Generator.NIL_HANDLER, args);
-        }
-    }
-
-    public static class RbObject {
-        @JRubyMethod(rest=true)
-        public static IRubyObject to_json(ThreadContext context,
-                IRubyObject self, IRubyObject[] args) {
-            return RbString.to_json(context, self.asString(), args);
-        }
-    }
-}
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/GeneratorService.java b/vendor/json_pure-1.7.7/java/src/json/ext/GeneratorService.java
deleted file mode 100644
index ed33639..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/GeneratorService.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import java.io.IOException;
-import java.lang.ref.WeakReference;
-
-import org.jruby.Ruby;
-import org.jruby.RubyClass;
-import org.jruby.RubyModule;
-import org.jruby.runtime.load.BasicLibraryService;
-
-/**
- * The service invoked by JRuby's {@link org.jruby.runtime.load.LoadService LoadService}.
- * Defines the <code>JSON::Ext::Generator</code> module.
- * @author mernen
- */
-public class GeneratorService implements BasicLibraryService {
-    public boolean basicLoad(Ruby runtime) throws IOException {
-        runtime.getLoadService().require("json/common");
-        RuntimeInfo info = RuntimeInfo.initRuntime(runtime);
-
-        info.jsonModule = new WeakReference<RubyModule>(runtime.defineModule("JSON"));
-        RubyModule jsonExtModule = info.jsonModule.get().defineModuleUnder("Ext");
-        RubyModule generatorModule = jsonExtModule.defineModuleUnder("Generator");
-
-        RubyClass stateClass =
-            generatorModule.defineClassUnder("State", runtime.getObject(),
-                                             GeneratorState.ALLOCATOR);
-        stateClass.defineAnnotatedMethods(GeneratorState.class);
-        info.generatorStateClass = new WeakReference<RubyClass>(stateClass);
-
-        RubyModule generatorMethods =
-            generatorModule.defineModuleUnder("GeneratorMethods");
-        GeneratorMethods.populate(info, generatorMethods);
-
-        return true;
-    }
-}
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/GeneratorState.java b/vendor/json_pure-1.7.7/java/src/json/ext/GeneratorState.java
deleted file mode 100644
index 3065307..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/GeneratorState.java
+++ /dev/null
@@ -1,543 +0,0 @@
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import org.jruby.Ruby;
-import org.jruby.RubyBoolean;
-import org.jruby.RubyClass;
-import org.jruby.RubyHash;
-import org.jruby.RubyInteger;
-import org.jruby.RubyNumeric;
-import org.jruby.RubyObject;
-import org.jruby.RubyString;
-import org.jruby.anno.JRubyMethod;
-import org.jruby.runtime.Block;
-import org.jruby.runtime.ObjectAllocator;
-import org.jruby.runtime.ThreadContext;
-import org.jruby.runtime.Visibility;
-import org.jruby.runtime.builtin.IRubyObject;
-import org.jruby.util.ByteList;
-
-/**
- * The <code>JSON::Ext::Generator::State</code> class.
- *
- * <p>This class is used to create State instances, that are use to hold data
- * while generating a JSON text from a a Ruby data structure.
- *
- * @author mernen
- */
-public class GeneratorState extends RubyObject {
-    /**
-     * The indenting unit string. Will be repeated several times for larger
-     * indenting levels.
-     */
-    private ByteList indent = ByteList.EMPTY_BYTELIST;
-    /**
-     * The spacing to be added after a semicolon on a JSON object.
-     * @see #spaceBefore
-     */
-    private ByteList space = ByteList.EMPTY_BYTELIST;
-    /**
-     * The spacing to be added before a semicolon on a JSON object.
-     * @see #space
-     */
-    private ByteList spaceBefore = ByteList.EMPTY_BYTELIST;
-    /**
-     * Any suffix to be added after the comma for each element on a JSON object.
-     * It is assumed to be a newline, if set.
-     */
-    private ByteList objectNl = ByteList.EMPTY_BYTELIST;
-    /**
-     * Any suffix to be added after the comma for each element on a JSON Array.
-     * It is assumed to be a newline, if set.
-     */
-    private ByteList arrayNl = ByteList.EMPTY_BYTELIST;
-
-    /**
-     * The maximum level of nesting of structures allowed.
-     * <code>0</code> means disabled.
-     */
-    private int maxNesting = DEFAULT_MAX_NESTING;
-    static final int DEFAULT_MAX_NESTING = 100;
-    /**
-     * Whether special float values (<code>NaN</code>, <code>Infinity</code>,
-     * <code>-Infinity</code>) are accepted.
-     * If set to <code>false</code>, an exception will be thrown upon
-     * encountering one.
-     */
-    private boolean allowNaN = DEFAULT_ALLOW_NAN;
-    static final boolean DEFAULT_ALLOW_NAN = false;
-    /**
-     * If set to <code>true</code> all JSON documents generated do not contain
-     * any other characters than ASCII characters.
-     */
-    private boolean asciiOnly = DEFAULT_ASCII_ONLY;
-    static final boolean DEFAULT_ASCII_ONLY = false;
-    /**
-     * If set to <code>true</code> all JSON values generated might not be
-     * RFC-conform JSON documents.
-     */
-    private boolean quirksMode = DEFAULT_QUIRKS_MODE;
-    static final boolean DEFAULT_QUIRKS_MODE = false;
-    /**
-     * The initial buffer length of this state. (This isn't really used on all
-     * non-C implementations.)
-     */
-    private int bufferInitialLength = DEFAULT_BUFFER_INITIAL_LENGTH;
-    static final int DEFAULT_BUFFER_INITIAL_LENGTH = 1024;
-
-    /**
-     * The current depth (inside a #to_json call)
-     */
-    private int depth = 0;
-
-    static final ObjectAllocator ALLOCATOR = new ObjectAllocator() {
-        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
-            return new GeneratorState(runtime, klazz);
-        }
-    };
-
-    public GeneratorState(Ruby runtime, RubyClass metaClass) {
-        super(runtime, metaClass);
-    }
-
-    /**
-     * <code>State.from_state(opts)</code>
-     *
-     * <p>Creates a State object from <code>opts</code>, which ought to be
-     * {@link RubyHash Hash} to create a new <code>State</code> instance
-     * configured by <codes>opts</code>, something else to create an
-     * unconfigured instance. If <code>opts</code> is a <code>State</code>
-     * object, it is just returned.
-     * @param clazzParam The receiver of the method call
-     *                   ({@link RubyClass} <code>State</code>)
-     * @param opts The object to use as a base for the new <code>State</code>
-     * @param block The block passed to the method
-     * @return A <code>GeneratorState</code> as determined above
-     */
-    @JRubyMethod(meta=true)
-    public static IRubyObject from_state(ThreadContext context,
-            IRubyObject klass, IRubyObject opts) {
-        return fromState(context, opts);
-    }
-
-    static GeneratorState fromState(ThreadContext context, IRubyObject opts) {
-        return fromState(context, RuntimeInfo.forRuntime(context.getRuntime()), opts);
-    }
-
-    static GeneratorState fromState(ThreadContext context, RuntimeInfo info,
-                                    IRubyObject opts) {
-        RubyClass klass = info.generatorStateClass.get();
-        if (opts != null) {
-            // if the given parameter is a Generator::State, return itself
-            if (klass.isInstance(opts)) return (GeneratorState)opts;
-
-            // if the given parameter is a Hash, pass it to the instantiator
-            if (context.getRuntime().getHash().isInstance(opts)) {
-                return (GeneratorState)klass.newInstance(context,
-                        new IRubyObject[] {opts}, Block.NULL_BLOCK);
-            }
-        }
-
-        // for other values, return the safe prototype
-        return (GeneratorState)info.getSafeStatePrototype(context).dup();
-    }
-
-    /**
-     * <code>State#initialize(opts = {})</code>
-     *
-     * Instantiates a new <code>State</code> object, configured by <code>opts</code>.
-     *
-     * <code>opts</code> can have the following keys:
-     *
-     * <dl>
-     * <dt><code>:indent</code>
-     * <dd>a {@link RubyString String} used to indent levels (default: <code>""</code>)
-     * <dt><code>:space</code>
-     * <dd>a String that is put after a <code>':'</code> or <code>','</code>
-     * delimiter (default: <code>""</code>)
-     * <dt><code>:space_before</code>
-     * <dd>a String that is put before a <code>":"</code> pair delimiter
-     * (default: <code>""</code>)
-     * <dt><code>:object_nl</code>
-     * <dd>a String that is put at the end of a JSON object (default: <code>""</code>)
-     * <dt><code>:array_nl</code>
-     * <dd>a String that is put at the end of a JSON array (default: <code>""</code>)
-     * <dt><code>:allow_nan</code>
-     * <dd><code>true</code> if <code>NaN</code>, <code>Infinity</code>, and
-     * <code>-Infinity</code> should be generated, otherwise an exception is
-     * thrown if these values are encountered.
-     * This options defaults to <code>false</code>.
-     */
-    @JRubyMethod(optional=1, visibility=Visibility.PRIVATE)
-    public IRubyObject initialize(ThreadContext context, IRubyObject[] args) {
-        configure(context, args.length > 0 ? args[0] : null);
-        return this;
-    }
-
-    @JRubyMethod
-    public IRubyObject initialize_copy(ThreadContext context, IRubyObject vOrig) {
-        Ruby runtime = context.getRuntime();
-        if (!(vOrig instanceof GeneratorState)) {
-            throw runtime.newTypeError(vOrig, getType());
-        }
-        GeneratorState orig = (GeneratorState)vOrig;
-        this.indent = orig.indent;
-        this.space = orig.space;
-        this.spaceBefore = orig.spaceBefore;
-        this.objectNl = orig.objectNl;
-        this.arrayNl = orig.arrayNl;
-        this.maxNesting = orig.maxNesting;
-        this.allowNaN = orig.allowNaN;
-        this.asciiOnly = orig.asciiOnly;
-        this.quirksMode = orig.quirksMode;
-        this.bufferInitialLength = orig.bufferInitialLength;
-        this.depth = orig.depth;
-        return this;
-    }
-
-    /**
-     * Generates a valid JSON document from object <code>obj</code> and returns
-     * the result. If no valid JSON document can be created this method raises
-     * a GeneratorError exception.
-     */
-    @JRubyMethod
-    public IRubyObject generate(ThreadContext context, IRubyObject obj) {
-        RubyString result = Generator.generateJson(context, obj, this);
-        if (!quirksMode && !objectOrArrayLiteral(result)) {
-            throw Utils.newException(context, Utils.M_GENERATOR_ERROR,
-                    "only generation of JSON objects or arrays allowed");
-        }
-        RuntimeInfo info = RuntimeInfo.forRuntime(context.getRuntime());
-        if (info.encodingsSupported()) {
-            result.force_encoding(context, info.utf8.get());
-        }
-        return result;
-    }
-
-    /**
-     * Ensures the given string is in the form "[...]" or "{...}", being
-     * possibly surrounded by white space.
-     * The string's encoding must be ASCII-compatible.
-     * @param value
-     * @return
-     */
-    private static boolean objectOrArrayLiteral(RubyString value) {
-        ByteList bl = value.getByteList();
-        int len = bl.length();
-
-        for (int pos = 0; pos < len - 1; pos++) {
-            int b = bl.get(pos);
-            if (Character.isWhitespace(b)) continue;
-
-            // match the opening brace
-            switch (b) {
-            case '[':
-                return matchClosingBrace(bl, pos, len, ']');
-            case '{':
-                return matchClosingBrace(bl, pos, len, '}');
-            default:
-                return false;
-            }
-        }
-        return false;
-    }
-
-    private static boolean matchClosingBrace(ByteList bl, int pos, int len,
-                                             int brace) {
-        for (int endPos = len - 1; endPos > pos; endPos--) {
-            int b = bl.get(endPos);
-            if (Character.isWhitespace(b)) continue;
-            return b == brace;
-        }
-        return false;
-    }
-
-    @JRubyMethod(name="[]", required=1)
-    public IRubyObject op_aref(ThreadContext context, IRubyObject vName) {
-        String name = vName.asJavaString();
-        if (getMetaClass().isMethodBound(name, true)) {
-            return send(context, vName, Block.NULL_BLOCK);
-        } else {
-            IRubyObject value = getInstanceVariables().getInstanceVariable("@" + name);
-            return value == null ? context.nil : value;
-        }
-    }
-
-    @JRubyMethod(name="[]=", required=2)
-    public IRubyObject op_aset(ThreadContext context, IRubyObject vName, IRubyObject value) {
-        String name = vName.asJavaString();
-        String nameWriter = name + "=";
-        if (getMetaClass().isMethodBound(nameWriter, true)) {
-            return send(context, context.getRuntime().newString(nameWriter), value, Block.NULL_BLOCK);
-        } else {
-            getInstanceVariables().setInstanceVariable("@" + name, value);
-        }
-        return context.getRuntime().getNil();
-    }
-
-    public ByteList getIndent() {
-        return indent;
-    }
-
-    @JRubyMethod(name="indent")
-    public RubyString indent_get(ThreadContext context) {
-        return context.getRuntime().newString(indent);
-    }
-
-    @JRubyMethod(name="indent=")
-    public IRubyObject indent_set(ThreadContext context, IRubyObject indent) {
-        this.indent = prepareByteList(context, indent);
-        return indent;
-    }
-
-    public ByteList getSpace() {
-        return space;
-    }
-
-    @JRubyMethod(name="space")
-    public RubyString space_get(ThreadContext context) {
-        return context.getRuntime().newString(space);
-    }
-
-    @JRubyMethod(name="space=")
-    public IRubyObject space_set(ThreadContext context, IRubyObject space) {
-        this.space = prepareByteList(context, space);
-        return space;
-    }
-
-    public ByteList getSpaceBefore() {
-        return spaceBefore;
-    }
-
-    @JRubyMethod(name="space_before")
-    public RubyString space_before_get(ThreadContext context) {
-        return context.getRuntime().newString(spaceBefore);
-    }
-
-    @JRubyMethod(name="space_before=")
-    public IRubyObject space_before_set(ThreadContext context,
-                                        IRubyObject spaceBefore) {
-        this.spaceBefore = prepareByteList(context, spaceBefore);
-        return spaceBefore;
-    }
-
-    public ByteList getObjectNl() {
-        return objectNl;
-    }
-
-    @JRubyMethod(name="object_nl")
-    public RubyString object_nl_get(ThreadContext context) {
-        return context.getRuntime().newString(objectNl);
-    }
-
-    @JRubyMethod(name="object_nl=")
-    public IRubyObject object_nl_set(ThreadContext context,
-                                     IRubyObject objectNl) {
-        this.objectNl = prepareByteList(context, objectNl);
-        return objectNl;
-    }
-
-    public ByteList getArrayNl() {
-        return arrayNl;
-    }
-
-    @JRubyMethod(name="array_nl")
-    public RubyString array_nl_get(ThreadContext context) {
-        return context.getRuntime().newString(arrayNl);
-    }
-
-    @JRubyMethod(name="array_nl=")
-    public IRubyObject array_nl_set(ThreadContext context,
-                                    IRubyObject arrayNl) {
-        this.arrayNl = prepareByteList(context, arrayNl);
-        return arrayNl;
-    }
-
-    @JRubyMethod(name="check_circular?")
-    public RubyBoolean check_circular_p(ThreadContext context) {
-        return context.getRuntime().newBoolean(maxNesting != 0);
-    }
-
-    /**
-     * Returns the maximum level of nesting configured for this state.
-     */
-    public int getMaxNesting() {
-        return maxNesting;
-    }
-
-    @JRubyMethod(name="max_nesting")
-    public RubyInteger max_nesting_get(ThreadContext context) {
-        return context.getRuntime().newFixnum(maxNesting);
-    }
-
-    @JRubyMethod(name="max_nesting=")
-    public IRubyObject max_nesting_set(IRubyObject max_nesting) {
-        maxNesting = RubyNumeric.fix2int(max_nesting);
-        return max_nesting;
-    }
-
-    public boolean allowNaN() {
-        return allowNaN;
-    }
-
-    @JRubyMethod(name="allow_nan?")
-    public RubyBoolean allow_nan_p(ThreadContext context) {
-        return context.getRuntime().newBoolean(allowNaN);
-    }
-
-    public boolean asciiOnly() {
-        return asciiOnly;
-    }
-
-    @JRubyMethod(name="ascii_only?")
-    public RubyBoolean ascii_only_p(ThreadContext context) {
-        return context.getRuntime().newBoolean(asciiOnly);
-    }
-
-    @JRubyMethod(name="quirks_mode")
-    public RubyBoolean quirks_mode_get(ThreadContext context) {
-        return context.getRuntime().newBoolean(quirksMode);
-    }
-
-    @JRubyMethod(name="quirks_mode=")
-    public IRubyObject quirks_mode_set(IRubyObject quirks_mode) {
-        quirksMode = quirks_mode.isTrue();
-        return quirks_mode.getRuntime().newBoolean(quirksMode);
-    }
-
-    @JRubyMethod(name="buffer_initial_length")
-    public RubyInteger buffer_initial_length_get(ThreadContext context) {
-        return context.getRuntime().newFixnum(bufferInitialLength);
-    }
-
-    @JRubyMethod(name="buffer_initial_length=")
-    public IRubyObject buffer_initial_length_set(IRubyObject buffer_initial_length) {
-        int newLength = RubyNumeric.fix2int(buffer_initial_length);
-        if (newLength > 0) bufferInitialLength = newLength;
-        return buffer_initial_length;
-    }
-
-    @JRubyMethod(name="quirks_mode?")
-    public RubyBoolean quirks_mode_p(ThreadContext context) {
-        return context.getRuntime().newBoolean(quirksMode);
-    }
-
-    public int getDepth() {
-        return depth;
-    }
-
-    @JRubyMethod(name="depth")
-    public RubyInteger depth_get(ThreadContext context) {
-        return context.getRuntime().newFixnum(depth);
-    }
-
-    @JRubyMethod(name="depth=")
-    public IRubyObject depth_set(IRubyObject vDepth) {
-        depth = RubyNumeric.fix2int(vDepth);
-        return vDepth;
-    }
-
-    private ByteList prepareByteList(ThreadContext context, IRubyObject value) {
-        RubyString str = value.convertToString();
-        RuntimeInfo info = RuntimeInfo.forRuntime(context.getRuntime());
-        if (info.encodingsSupported() && str.encoding(context) != info.utf8.get()) {
-            str = (RubyString)str.encode(context, info.utf8.get());
-        }
-        return str.getByteList().dup();
-    }
-
-    /**
-     * <code>State#configure(opts)</code>
-     *
-     * <p>Configures this State instance with the {@link RubyHash Hash}
-     * <code>opts</code>, and returns itself.
-     * @param vOpts The options hash
-     * @return The receiver
-     */
-  @JRubyMethod(alias = "merge")
-    public IRubyObject configure(ThreadContext context, IRubyObject vOpts) {
-        OptionsReader opts = new OptionsReader(context, vOpts);
-
-        ByteList indent = opts.getString("indent");
-        if (indent != null) this.indent = indent;
-
-        ByteList space = opts.getString("space");
-        if (space != null) this.space = space;
-
-        ByteList spaceBefore = opts.getString("space_before");
-        if (spaceBefore != null) this.spaceBefore = spaceBefore;
-
-        ByteList arrayNl = opts.getString("array_nl");
-        if (arrayNl != null) this.arrayNl = arrayNl;
-
-        ByteList objectNl = opts.getString("object_nl");
-        if (objectNl != null) this.objectNl = objectNl;
-
-        maxNesting = opts.getInt("max_nesting", DEFAULT_MAX_NESTING);
-        allowNaN   = opts.getBool("allow_nan",  DEFAULT_ALLOW_NAN);
-        asciiOnly  = opts.getBool("ascii_only", DEFAULT_ASCII_ONLY);
-        quirksMode = opts.getBool("quirks_mode", DEFAULT_QUIRKS_MODE);
-        bufferInitialLength = opts.getInt("buffer_initial_length", DEFAULT_BUFFER_INITIAL_LENGTH);
-
-        depth = opts.getInt("depth", 0);
-
-        return this;
-    }
-
-    /**
-     * <code>State#to_h()</code>
-     *
-     * <p>Returns the configuration instance variables as a hash, that can be
-     * passed to the configure method.
-     * @return the hash
-     */
-    @JRubyMethod(alias = "to_hash")
-    public RubyHash to_h(ThreadContext context) {
-        Ruby runtime = context.getRuntime();
-        RubyHash result = RubyHash.newHash(runtime);
-
-        result.op_aset(context, runtime.newSymbol("indent"), indent_get(context));
-        result.op_aset(context, runtime.newSymbol("space"), space_get(context));
-        result.op_aset(context, runtime.newSymbol("space_before"), space_before_get(context));
-        result.op_aset(context, runtime.newSymbol("object_nl"), object_nl_get(context));
-        result.op_aset(context, runtime.newSymbol("array_nl"), array_nl_get(context));
-        result.op_aset(context, runtime.newSymbol("allow_nan"), allow_nan_p(context));
-        result.op_aset(context, runtime.newSymbol("ascii_only"), ascii_only_p(context));
-        result.op_aset(context, runtime.newSymbol("quirks_mode"), quirks_mode_p(context));
-        result.op_aset(context, runtime.newSymbol("max_nesting"), max_nesting_get(context));
-        result.op_aset(context, runtime.newSymbol("depth"), depth_get(context));
-        result.op_aset(context, runtime.newSymbol("buffer_initial_length"), buffer_initial_length_get(context));
-        for (String name: getInstanceVariableNameList()) {
-            result.op_aset(context, runtime.newSymbol(name.substring(1)), getInstanceVariables().getInstanceVariable(name));
-        }
-        return result;
-    }
-
-    public int increaseDepth() {
-        depth++;
-        checkMaxNesting();
-        return depth;
-    }
-
-    public int decreaseDepth() {
-        return --depth;
-    }
-
-    /**
-     * Checks if the current depth is allowed as per this state's options.
-     * @param context
-     * @param depth The corrent depth
-     */
-    private void checkMaxNesting() {
-        if (maxNesting != 0 && depth > maxNesting) {
-            depth--;
-            throw Utils.newException(getRuntime().getCurrentContext(),
-                    Utils.M_NESTING_ERROR, "nesting of " + depth + " is too deep");
-        }
-    }
-}
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/OptionsReader.java b/vendor/json_pure-1.7.7/java/src/json/ext/OptionsReader.java
deleted file mode 100644
index 6835735..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/OptionsReader.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import org.jruby.Ruby;
-import org.jruby.RubyClass;
-import org.jruby.RubyHash;
-import org.jruby.RubyNumeric;
-import org.jruby.RubyString;
-import org.jruby.runtime.ThreadContext;
-import org.jruby.runtime.builtin.IRubyObject;
-import org.jruby.util.ByteList;
-
-final class OptionsReader {
-    private final ThreadContext context;
-    private final Ruby runtime;
-    private final RubyHash opts;
-    private RuntimeInfo info;
-
-    OptionsReader(ThreadContext context, IRubyObject vOpts) {
-        this.context = context;
-        this.runtime = context.getRuntime();
-
-        if (vOpts == null || vOpts.isNil()) {
-            opts = null;
-        } else if (vOpts.respondsTo("to_hash")) {
-            opts = vOpts.convertToHash();
-        } else {
-            opts = vOpts.callMethod(context, "to_h").convertToHash();
-        }
-    }
-
-    private RuntimeInfo getRuntimeInfo() {
-        if (info != null) return info;
-        info = RuntimeInfo.forRuntime(runtime);
-        return info;
-    }
-
-    /**
-     * Efficiently looks up items with a {@link RubySymbol Symbol} key
-     * @param key The Symbol name to look up for
-     * @return The item in the {@link RubyHash Hash}, or <code>null</code>
-     *         if not found
-     */
-    IRubyObject get(String key) {
-        return opts == null ? null : opts.fastARef(runtime.newSymbol(key));
-    }
-
-    boolean getBool(String key, boolean defaultValue) {
-        IRubyObject value = get(key);
-        return value == null ? defaultValue : value.isTrue();
-    }
-
-    int getInt(String key, int defaultValue) {
-        IRubyObject value = get(key);
-        if (value == null) return defaultValue;
-        if (!value.isTrue()) return 0;
-        return RubyNumeric.fix2int(value);
-    }
-
-    /**
-     * Reads the setting from the options hash. If no entry is set for this
-     * key or if it evaluates to <code>false</code>, returns null; attempts to
-     * coerce the value to {@link RubyString String} otherwise.
-     * @param key The Symbol name to look up for
-     * @return <code>null</code> if the key is not in the Hash or if
-     *         its value evaluates to <code>false</code>
-     * @throws RaiseException <code>TypeError</code> if the value does not
-     *                        evaluate to <code>false</code> and can't be
-     *                        converted to string
-     */
-    ByteList getString(String key) {
-        RubyString str = getString(key, null);
-        return str == null ? null : str.getByteList().dup();
-    }
-
-    RubyString getString(String key, RubyString defaultValue) {
-        IRubyObject value = get(key);
-        if (value == null || !value.isTrue()) return defaultValue;
-
-        RubyString str = value.convertToString();
-        RuntimeInfo info = getRuntimeInfo();
-        if (info.encodingsSupported() && str.encoding(context) != info.utf8.get()) {
-            str = (RubyString)str.encode(context, info.utf8.get());
-        }
-        return str;
-    }
-
-    /**
-     * Reads the setting from the options hash. If it is <code>nil</code> or
-     * undefined, returns the default value given.
-     * If not, ensures it is a RubyClass instance and shares the same
-     * allocator as the default value (i.e. for the basic types which have
-     * their specific allocators, this ensures the passed value is
-     * a subclass of them).
-     */
-    RubyClass getClass(String key, RubyClass defaultValue) {
-        IRubyObject value = get(key);
-
-        if (value == null || value.isNil()) return defaultValue;
-        return (RubyClass)value;
-    }
-
-    public RubyHash getHash(String key) {
-        IRubyObject value = get(key);
-        if (value == null || value.isNil()) return new RubyHash(runtime);
-        return (RubyHash) value;
-    }
-}
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/Parser.java b/vendor/json_pure-1.7.7/java/src/json/ext/Parser.java
deleted file mode 100644
index 6cb5886..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/Parser.java
+++ /dev/null
@@ -1,2644 +0,0 @@
-
-// line 1 "Parser.rl"
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import org.jruby.Ruby;
-import org.jruby.RubyArray;
-import org.jruby.RubyClass;
-import org.jruby.RubyEncoding;
-import org.jruby.RubyFloat;
-import org.jruby.RubyHash;
-import org.jruby.RubyInteger;
-import org.jruby.RubyModule;
-import org.jruby.RubyNumeric;
-import org.jruby.RubyObject;
-import org.jruby.RubyString;
-import org.jruby.anno.JRubyMethod;
-import org.jruby.exceptions.JumpException;
-import org.jruby.exceptions.RaiseException;
-import org.jruby.runtime.Block;
-import org.jruby.runtime.ObjectAllocator;
-import org.jruby.runtime.ThreadContext;
-import org.jruby.runtime.Visibility;
-import org.jruby.runtime.builtin.IRubyObject;
-import org.jruby.util.ByteList;
-import org.jruby.util.ConvertBytes;
-import static org.jruby.util.ConvertDouble.DoubleConverter;
-
-/**
- * The <code>JSON::Ext::Parser</code> class.
- *
- * <p>This is the JSON parser implemented as a Java class. To use it as the
- * standard parser, set
- *   <pre>JSON.parser = JSON::Ext::Parser</pre>
- * This is performed for you when you <code>include "json/ext"</code>.
- *
- * <p>This class does not perform the actual parsing, just acts as an interface
- * to Ruby code. When the {@link #parse()} method is invoked, a
- * Parser.ParserSession object is instantiated, which handles the process.
- *
- * @author mernen
- */
-public class Parser extends RubyObject {
-    private final RuntimeInfo info;
-    private RubyString vSource;
-    private RubyString createId;
-    private boolean createAdditions;
-    private int maxNesting;
-    private boolean allowNaN;
-    private boolean symbolizeNames;
-    private boolean quirksMode;
-    private RubyClass objectClass;
-    private RubyClass arrayClass;
-    private RubyHash match_string;
-
-    private static final int DEFAULT_MAX_NESTING = 100;
-
-    private static final ByteList JSON_MINUS_INFINITY = new ByteList(ByteList.plain("-Infinity"));
-    // constant names in the JSON module containing those values
-    private static final String CONST_NAN = "NaN";
-    private static final String CONST_INFINITY = "Infinity";
-    private static final String CONST_MINUS_INFINITY = "MinusInfinity";
-
-    static final ObjectAllocator ALLOCATOR = new ObjectAllocator() {
-        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
-            return new Parser(runtime, klazz);
-        }
-    };
-
-    /**
-     * Multiple-value return for internal parser methods.
-     *
-     * <p>All the <code>parse<var>Stuff</var></code> methods return instances of
-     * <code>ParserResult</code> when successful, or <code>null</code> when
-     * there's a problem with the input data.
-     */
-    static final class ParserResult {
-        /**
-         * The result of the successful parsing. Should never be
-         * <code>null</code>.
-         */
-        IRubyObject result;
-        /**
-         * The point where the parser returned.
-         */
-        int p;
-
-        void update(IRubyObject result, int p) {
-            this.result = result;
-            this.p = p;
-        }
-    }
-
-    public Parser(Ruby runtime, RubyClass metaClass) {
-        super(runtime, metaClass);
-        info = RuntimeInfo.forRuntime(runtime);
-    }
-
-    /**
-     * <code>Parser.new(source, opts = {})</code>
-     *
-     * <p>Creates a new <code>JSON::Ext::Parser</code> instance for the string
-     * <code>source</code>.
-     * It will be configured by the <code>opts</code> Hash.
-     * <code>opts</code> can have the following keys:
-     *
-     * <dl>
-     * <dt><code>:max_nesting</code>
-     * <dd>The maximum depth of nesting allowed in the parsed data
-     * structures. Disable depth checking with <code>:max_nesting => false|nil|0</code>,
-     * it defaults to 100.
-     *
-     * <dt><code>:allow_nan</code>
-     * <dd>If set to <code>true</code>, allow <code>NaN</code>,
-     * <code>Infinity</code> and <code>-Infinity</code> in defiance of RFC 4627
-     * to be parsed by the Parser. This option defaults to <code>false</code>.
-     *
-     * <dt><code>:symbolize_names</code>
-     * <dd>If set to <code>true</code>, returns symbols for the names (keys) in
-     * a JSON object. Otherwise strings are returned, which is also the default.
-     *
-     * <dt><code>:quirks_mode?</code>
-     * <dd>If set to <code>true</code>, if the parse is in quirks_mode, false
-     * otherwise.
-     * 
-     * <dt><code>:create_additions</code>
-     * <dd>If set to <code>false</code>, the Parser doesn't create additions
-     * even if a matchin class and <code>create_id</code> was found. This option
-     * defaults to <code>true</code>.
-     *
-     * <dt><code>:object_class</code>
-     * <dd>Defaults to Hash.
-     *
-     * <dt><code>:array_class</code>
-     * <dd>Defaults to Array.
-     *
-     * <dt><code>:quirks_mode</code>
-     * <dd>Enables quirks_mode for parser, that is for example parsing single
-     * JSON values instead of documents is possible.
-     * </dl>
-     */
-    @JRubyMethod(name = "new", required = 1, optional = 1, meta = true)
-    public static IRubyObject newInstance(IRubyObject clazz, IRubyObject[] args, Block block) {
-        Parser parser = (Parser)((RubyClass)clazz).allocate();
-
-        parser.callInit(args, block);
-
-        return parser;
-    }
-
-    @JRubyMethod(required = 1, optional = 1, visibility = Visibility.PRIVATE)
-    public IRubyObject initialize(ThreadContext context, IRubyObject[] args) {
-        Ruby runtime = context.getRuntime();
-        if (this.vSource != null) {
-            throw runtime.newTypeError("already initialized instance");
-         }
-
-        OptionsReader opts   = new OptionsReader(context, args.length > 1 ? args[1] : null);
-        this.maxNesting      = opts.getInt("max_nesting", DEFAULT_MAX_NESTING);
-        this.allowNaN        = opts.getBool("allow_nan", false);
-        this.symbolizeNames  = opts.getBool("symbolize_names", false);
-        this.quirksMode      = opts.getBool("quirks_mode", false);
-        this.createId        = opts.getString("create_id", getCreateId(context));
-        this.createAdditions = opts.getBool("create_additions", false);
-        this.objectClass     = opts.getClass("object_class", runtime.getHash());
-        this.arrayClass      = opts.getClass("array_class", runtime.getArray());
-        this.match_string    = opts.getHash("match_string");
-
-        this.vSource = args[0].convertToString();
-        if (!quirksMode) this.vSource = convertEncoding(context, vSource);
-
-        return this;
-    }
-
-    /**
-     * Checks the given string's encoding. If a non-UTF-8 encoding is detected,
-     * a converted copy is returned.
-     * Returns the source string if no conversion is needed.
-     */
-    private RubyString convertEncoding(ThreadContext context, RubyString source) {
-        ByteList bl = source.getByteList();
-        int len = bl.length();
-        if (len < 2) {
-            throw Utils.newException(context, Utils.M_PARSER_ERROR,
-                "A JSON text must at least contain two octets!");
-        }
-
-        if (info.encodingsSupported()) {
-            RubyEncoding encoding = (RubyEncoding)source.encoding(context);
-            if (encoding != info.ascii8bit.get()) {
-                return (RubyString)source.encode(context, info.utf8.get());
-            }
-
-            String sniffedEncoding = sniffByteList(bl);
-            if (sniffedEncoding == null) return source; // assume UTF-8
-            return reinterpretEncoding(context, source, sniffedEncoding);
-        }
-
-        String sniffedEncoding = sniffByteList(bl);
-        if (sniffedEncoding == null) return source; // assume UTF-8
-        Ruby runtime = context.getRuntime();
-        return (RubyString)info.jsonModule.get().
-            callMethod(context, "iconv",
-                new IRubyObject[] {
-                    runtime.newString("utf-8"),
-                    runtime.newString(sniffedEncoding),
-                    source});
-    }
-
-    /**
-     * Checks the first four bytes of the given ByteList to infer its encoding,
-     * using the principle demonstrated on section 3 of RFC 4627 (JSON).
-     */
-    private static String sniffByteList(ByteList bl) {
-        if (bl.length() < 4) return null;
-        if (bl.get(0) == 0 && bl.get(2) == 0) {
-            return bl.get(1) == 0 ? "utf-32be" : "utf-16be";
-        }
-        if (bl.get(1) == 0 && bl.get(3) == 0) {
-            return bl.get(2) == 0 ? "utf-32le" : "utf-16le";
-        }
-        return null;
-    }
-
-    /**
-     * Assumes the given (binary) RubyString to be in the given encoding, then
-     * converts it to UTF-8.
-     */
-    private RubyString reinterpretEncoding(ThreadContext context,
-            RubyString str, String sniffedEncoding) {
-        RubyEncoding actualEncoding = info.getEncoding(context, sniffedEncoding);
-        RubyEncoding targetEncoding = info.utf8.get();
-        RubyString dup = (RubyString)str.dup();
-        dup.force_encoding(context, actualEncoding);
-        return (RubyString)dup.encode_bang(context, targetEncoding);
-    }
-
-    /**
-     * <code>Parser#parse()</code>
-     *
-     * <p>Parses the current JSON text <code>source</code> and returns the
-     * complete data structure as a result.
-     */
-    @JRubyMethod
-    public IRubyObject parse(ThreadContext context) {
-        return new ParserSession(this, context).parse();
-    }
-
-    /**
-     * <code>Parser#source()</code>
-     *
-     * <p>Returns a copy of the current <code>source</code> string, that was
-     * used to construct this Parser.
-     */
-    @JRubyMethod(name = "source")
-    public IRubyObject source_get() {
-        return checkAndGetSource().dup();
-    }
-
-    /**
-     * <code>Parser#quirks_mode?()</code>
-     * 
-     * <p>If set to <code>true</code>, if the parse is in quirks_mode, false
-     * otherwise.
-     */
-    @JRubyMethod(name = "quirks_mode?")
-    public IRubyObject quirks_mode_p(ThreadContext context) {
-        return context.getRuntime().newBoolean(quirksMode);
-    }
-
-    public RubyString checkAndGetSource() {
-      if (vSource != null) {
-        return vSource;
-      } else {
-        throw getRuntime().newTypeError("uninitialized instance");
-      }
-    }
-
-    /**
-     * Queries <code>JSON.create_id</code>. Returns <code>null</code> if it is
-     * set to <code>nil</code> or <code>false</code>, and a String if not.
-     */
-    private RubyString getCreateId(ThreadContext context) {
-        IRubyObject v = info.jsonModule.get().callMethod(context, "create_id");
-        return v.isTrue() ? v.convertToString() : null;
-    }
-
-    /**
-     * A string parsing session.
-     *
-     * <p>Once a ParserSession is instantiated, the source string should not
-     * change until the parsing is complete. The ParserSession object assumes
-     * the source {@link RubyString} is still associated to its original
-     * {@link ByteList}, which in turn must still be bound to the same
-     * <code>byte[]</code> value (and on the same offset).
-     */
-    // Ragel uses lots of fall-through
-    @SuppressWarnings("fallthrough")
-    private static class ParserSession {
-        private final Parser parser;
-        private final ThreadContext context;
-        private final ByteList byteList;
-        private final ByteList view;
-        private final byte[] data;
-        private final StringDecoder decoder;
-        private int currentNesting = 0;
-        private final DoubleConverter dc;
-
-        // initialization value for all state variables.
-        // no idea about the origins of this value, ask Flori ;)
-        private static final int EVIL = 0x666;
-
-        private ParserSession(Parser parser, ThreadContext context) {
-            this.parser = parser;
-            this.context = context;
-            this.byteList = parser.checkAndGetSource().getByteList();
-            this.data = byteList.unsafeBytes();
-            this.view = new ByteList(data, false);
-            this.decoder = new StringDecoder(context);
-            this.dc = new DoubleConverter();
-        }
-
-        private RaiseException unexpectedToken(int absStart, int absEnd) {
-            RubyString msg = getRuntime().newString("unexpected token at '")
-                    .cat(data, absStart, absEnd - absStart)
-                    .cat((byte)'\'');
-            return newException(Utils.M_PARSER_ERROR, msg);
-        }
-
-        private Ruby getRuntime() {
-            return context.getRuntime();
-        }
-
-        
-// line 363 "Parser.rl"
-
-
-        
-// line 345 "Parser.java"
-private static byte[] init__JSON_value_actions_0()
-{
-	return new byte [] {
-	    0,    1,    0,    1,    1,    1,    2,    1,    3,    1,    4,    1,
-	    5,    1,    6,    1,    7,    1,    8,    1,    9
-	};
-}
-
-private static final byte _JSON_value_actions[] = init__JSON_value_actions_0();
-
-
-private static byte[] init__JSON_value_key_offsets_0()
-{
-	return new byte [] {
-	    0,    0,   11,   12,   13,   14,   15,   16,   17,   18,   19,   20,
-	   21,   22,   23,   24,   25,   26,   27,   28,   29,   30
-	};
-}
-
-private static final byte _JSON_value_key_offsets[] = init__JSON_value_key_offsets_0();
-
-
-private static char[] init__JSON_value_trans_keys_0()
-{
-	return new char [] {
-	   34,   45,   73,   78,   91,  102,  110,  116,  123,   48,   57,  110,
-	  102,  105,  110,  105,  116,  121,   97,   78,   97,  108,  115,  101,
-	  117,  108,  108,  114,  117,  101,    0
-	};
-}
-
-private static final char _JSON_value_trans_keys[] = init__JSON_value_trans_keys_0();
-
-
-private static byte[] init__JSON_value_single_lengths_0()
-{
-	return new byte [] {
-	    0,    9,    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-	    1,    1,    1,    1,    1,    1,    1,    1,    1,    0
-	};
-}
-
-private static final byte _JSON_value_single_lengths[] = init__JSON_value_single_lengths_0();
-
-
-private static byte[] init__JSON_value_range_lengths_0()
-{
-	return new byte [] {
-	    0,    1,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	    0,    0,    0,    0,    0,    0,    0,    0,    0,    0
-	};
-}
-
-private static final byte _JSON_value_range_lengths[] = init__JSON_value_range_lengths_0();
-
-
-private static byte[] init__JSON_value_index_offsets_0()
-{
-	return new byte [] {
-	    0,    0,   11,   13,   15,   17,   19,   21,   23,   25,   27,   29,
-	   31,   33,   35,   37,   39,   41,   43,   45,   47,   49
-	};
-}
-
-private static final byte _JSON_value_index_offsets[] = init__JSON_value_index_offsets_0();
-
-
-private static byte[] init__JSON_value_trans_targs_0()
-{
-	return new byte [] {
-	   21,   21,    2,    9,   21,   11,   15,   18,   21,   21,    0,    3,
-	    0,    4,    0,    5,    0,    6,    0,    7,    0,    8,    0,   21,
-	    0,   10,    0,   21,    0,   12,    0,   13,    0,   14,    0,   21,
-	    0,   16,    0,   17,    0,   21,    0,   19,    0,   20,    0,   21,
-	    0,    0,    0
-	};
-}
-
-private static final byte _JSON_value_trans_targs[] = init__JSON_value_trans_targs_0();
-
-
-private static byte[] init__JSON_value_trans_actions_0()
-{
-	return new byte [] {
-	   13,   11,    0,    0,   15,    0,    0,    0,   17,   11,    0,    0,
-	    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    9,
-	    0,    0,    0,    7,    0,    0,    0,    0,    0,    0,    0,    3,
-	    0,    0,    0,    0,    0,    1,    0,    0,    0,    0,    0,    5,
-	    0,    0,    0
-	};
-}
-
-private static final byte _JSON_value_trans_actions[] = init__JSON_value_trans_actions_0();
-
-
-private static byte[] init__JSON_value_from_state_actions_0()
-{
-	return new byte [] {
-	    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	    0,    0,    0,    0,    0,    0,    0,    0,    0,   19
-	};
-}
-
-private static final byte _JSON_value_from_state_actions[] = init__JSON_value_from_state_actions_0();
-
-
-static final int JSON_value_start = 1;
-static final int JSON_value_first_final = 21;
-static final int JSON_value_error = 0;
-
-static final int JSON_value_en_main = 1;
-
-
-// line 469 "Parser.rl"
-
-
-        void parseValue(ParserResult res, int p, int pe) {
-            int cs = EVIL;
-            IRubyObject result = null;
-
-            
-// line 467 "Parser.java"
-	{
-	cs = JSON_value_start;
-	}
-
-// line 476 "Parser.rl"
-            
-// line 474 "Parser.java"
-	{
-	int _klen;
-	int _trans = 0;
-	int _acts;
-	int _nacts;
-	int _keys;
-	int _goto_targ = 0;
-
-	_goto: while (true) {
-	switch ( _goto_targ ) {
-	case 0:
-	if ( p == pe ) {
-		_goto_targ = 4;
-		continue _goto;
-	}
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-case 1:
-	_acts = _JSON_value_from_state_actions[cs];
-	_nacts = (int) _JSON_value_actions[_acts++];
-	while ( _nacts-- > 0 ) {
-		switch ( _JSON_value_actions[_acts++] ) {
-	case 9:
-// line 454 "Parser.rl"
-	{
-                p--;
-                { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-            }
-	break;
-// line 506 "Parser.java"
-		}
-	}
-
-	_match: do {
-	_keys = _JSON_value_key_offsets[cs];
-	_trans = _JSON_value_index_offsets[cs];
-	_klen = _JSON_value_single_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + _klen - 1;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + ((_upper-_lower) >> 1);
-			if ( data[p] < _JSON_value_trans_keys[_mid] )
-				_upper = _mid - 1;
-			else if ( data[p] > _JSON_value_trans_keys[_mid] )
-				_lower = _mid + 1;
-			else {
-				_trans += (_mid - _keys);
-				break _match;
-			}
-		}
-		_keys += _klen;
-		_trans += _klen;
-	}
-
-	_klen = _JSON_value_range_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + (_klen<<1) - 2;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + (((_upper-_lower) >> 1) & ~1);
-			if ( data[p] < _JSON_value_trans_keys[_mid] )
-				_upper = _mid - 2;
-			else if ( data[p] > _JSON_value_trans_keys[_mid+1] )
-				_lower = _mid + 2;
-			else {
-				_trans += ((_mid - _keys)>>1);
-				break _match;
-			}
-		}
-		_trans += _klen;
-	}
-	} while (false);
-
-	cs = _JSON_value_trans_targs[_trans];
-
-	if ( _JSON_value_trans_actions[_trans] != 0 ) {
-		_acts = _JSON_value_trans_actions[_trans];
-		_nacts = (int) _JSON_value_actions[_acts++];
-		while ( _nacts-- > 0 )
-	{
-			switch ( _JSON_value_actions[_acts++] )
-			{
-	case 0:
-// line 371 "Parser.rl"
-	{
-                result = getRuntime().getNil();
-            }
-	break;
-	case 1:
-// line 374 "Parser.rl"
-	{
-                result = getRuntime().getFalse();
-            }
-	break;
-	case 2:
-// line 377 "Parser.rl"
-	{
-                result = getRuntime().getTrue();
-            }
-	break;
-	case 3:
-// line 380 "Parser.rl"
-	{
-                if (parser.allowNaN) {
-                    result = getConstant(CONST_NAN);
-                } else {
-                    throw unexpectedToken(p - 2, pe);
-                }
-            }
-	break;
-	case 4:
-// line 387 "Parser.rl"
-	{
-                if (parser.allowNaN) {
-                    result = getConstant(CONST_INFINITY);
-                } else {
-                    throw unexpectedToken(p - 7, pe);
-                }
-            }
-	break;
-	case 5:
-// line 394 "Parser.rl"
-	{
-                if (pe > p + 9 - (parser.quirksMode ? 1 : 0) &&
-                    absSubSequence(p, p + 9).equals(JSON_MINUS_INFINITY)) {
-
-                    if (parser.allowNaN) {
-                        result = getConstant(CONST_MINUS_INFINITY);
-                        {p = (( p + 10))-1;}
-                        p--;
-                        { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-                    } else {
-                        throw unexpectedToken(p, pe);
-                    }
-                }
-                parseFloat(res, p, pe);
-                if (res.result != null) {
-                    result = res.result;
-                    {p = (( res.p))-1;}
-                }
-                parseInteger(res, p, pe);
-                if (res.result != null) {
-                    result = res.result;
-                    {p = (( res.p))-1;}
-                }
-                p--;
-                { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-            }
-	break;
-	case 6:
-// line 420 "Parser.rl"
-	{
-                parseString(res, p, pe);
-                if (res.result == null) {
-                    p--;
-                    { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-                } else {
-                    result = res.result;
-                    {p = (( res.p))-1;}
-                }
-            }
-	break;
-	case 7:
-// line 430 "Parser.rl"
-	{
-                currentNesting++;
-                parseArray(res, p, pe);
-                currentNesting--;
-                if (res.result == null) {
-                    p--;
-                    { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-                } else {
-                    result = res.result;
-                    {p = (( res.p))-1;}
-                }
-            }
-	break;
-	case 8:
-// line 442 "Parser.rl"
-	{
-                currentNesting++;
-                parseObject(res, p, pe);
-                currentNesting--;
-                if (res.result == null) {
-                    p--;
-                    { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-                } else {
-                    result = res.result;
-                    {p = (( res.p))-1;}
-                }
-            }
-	break;
-// line 678 "Parser.java"
-			}
-		}
-	}
-
-case 2:
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-	if ( ++p != pe ) {
-		_goto_targ = 1;
-		continue _goto;
-	}
-case 4:
-case 5:
-	}
-	break; }
-	}
-
-// line 477 "Parser.rl"
-
-            if (cs >= JSON_value_first_final && result != null) {
-                res.update(result, p);
-            } else {
-                res.update(null, p);
-            }
-        }
-
-        
-// line 708 "Parser.java"
-private static byte[] init__JSON_integer_actions_0()
-{
-	return new byte [] {
-	    0,    1,    0
-	};
-}
-
-private static final byte _JSON_integer_actions[] = init__JSON_integer_actions_0();
-
-
-private static byte[] init__JSON_integer_key_offsets_0()
-{
-	return new byte [] {
-	    0,    0,    4,    7,    9,    9
-	};
-}
-
-private static final byte _JSON_integer_key_offsets[] = init__JSON_integer_key_offsets_0();
-
-
-private static char[] init__JSON_integer_trans_keys_0()
-{
-	return new char [] {
-	   45,   48,   49,   57,   48,   49,   57,   48,   57,   48,   57,    0
-	};
-}
-
-private static final char _JSON_integer_trans_keys[] = init__JSON_integer_trans_keys_0();
-
-
-private static byte[] init__JSON_integer_single_lengths_0()
-{
-	return new byte [] {
-	    0,    2,    1,    0,    0,    0
-	};
-}
-
-private static final byte _JSON_integer_single_lengths[] = init__JSON_integer_single_lengths_0();
-
-
-private static byte[] init__JSON_integer_range_lengths_0()
-{
-	return new byte [] {
-	    0,    1,    1,    1,    0,    1
-	};
-}
-
-private static final byte _JSON_integer_range_lengths[] = init__JSON_integer_range_lengths_0();
-
-
-private static byte[] init__JSON_integer_index_offsets_0()
-{
-	return new byte [] {
-	    0,    0,    4,    7,    9,   10
-	};
-}
-
-private static final byte _JSON_integer_index_offsets[] = init__JSON_integer_index_offsets_0();
-
-
-private static byte[] init__JSON_integer_indicies_0()
-{
-	return new byte [] {
-	    0,    2,    3,    1,    2,    3,    1,    1,    4,    1,    3,    4,
-	    0
-	};
-}
-
-private static final byte _JSON_integer_indicies[] = init__JSON_integer_indicies_0();
-
-
-private static byte[] init__JSON_integer_trans_targs_0()
-{
-	return new byte [] {
-	    2,    0,    3,    5,    4
-	};
-}
-
-private static final byte _JSON_integer_trans_targs[] = init__JSON_integer_trans_targs_0();
-
-
-private static byte[] init__JSON_integer_trans_actions_0()
-{
-	return new byte [] {
-	    0,    0,    0,    0,    1
-	};
-}
-
-private static final byte _JSON_integer_trans_actions[] = init__JSON_integer_trans_actions_0();
-
-
-static final int JSON_integer_start = 1;
-static final int JSON_integer_first_final = 3;
-static final int JSON_integer_error = 0;
-
-static final int JSON_integer_en_main = 1;
-
-
-// line 496 "Parser.rl"
-
-
-        void parseInteger(ParserResult res, int p, int pe) {
-            int new_p = parseIntegerInternal(p, pe);
-            if (new_p == -1) {
-                res.update(null, p);
-                return;
-            }
-            RubyInteger number = createInteger(p, new_p);
-            res.update(number, new_p + 1);
-            return;
-        }
-
-        int parseIntegerInternal(int p, int pe) {
-            int cs = EVIL;
-
-            
-// line 825 "Parser.java"
-	{
-	cs = JSON_integer_start;
-	}
-
-// line 513 "Parser.rl"
-            int memo = p;
-            
-// line 833 "Parser.java"
-	{
-	int _klen;
-	int _trans = 0;
-	int _acts;
-	int _nacts;
-	int _keys;
-	int _goto_targ = 0;
-
-	_goto: while (true) {
-	switch ( _goto_targ ) {
-	case 0:
-	if ( p == pe ) {
-		_goto_targ = 4;
-		continue _goto;
-	}
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-case 1:
-	_match: do {
-	_keys = _JSON_integer_key_offsets[cs];
-	_trans = _JSON_integer_index_offsets[cs];
-	_klen = _JSON_integer_single_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + _klen - 1;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + ((_upper-_lower) >> 1);
-			if ( data[p] < _JSON_integer_trans_keys[_mid] )
-				_upper = _mid - 1;
-			else if ( data[p] > _JSON_integer_trans_keys[_mid] )
-				_lower = _mid + 1;
-			else {
-				_trans += (_mid - _keys);
-				break _match;
-			}
-		}
-		_keys += _klen;
-		_trans += _klen;
-	}
-
-	_klen = _JSON_integer_range_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + (_klen<<1) - 2;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + (((_upper-_lower) >> 1) & ~1);
-			if ( data[p] < _JSON_integer_trans_keys[_mid] )
-				_upper = _mid - 2;
-			else if ( data[p] > _JSON_integer_trans_keys[_mid+1] )
-				_lower = _mid + 2;
-			else {
-				_trans += ((_mid - _keys)>>1);
-				break _match;
-			}
-		}
-		_trans += _klen;
-	}
-	} while (false);
-
-	_trans = _JSON_integer_indicies[_trans];
-	cs = _JSON_integer_trans_targs[_trans];
-
-	if ( _JSON_integer_trans_actions[_trans] != 0 ) {
-		_acts = _JSON_integer_trans_actions[_trans];
-		_nacts = (int) _JSON_integer_actions[_acts++];
-		while ( _nacts-- > 0 )
-	{
-			switch ( _JSON_integer_actions[_acts++] )
-			{
-	case 0:
-// line 490 "Parser.rl"
-	{
-                p--;
-                { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-            }
-	break;
-// line 920 "Parser.java"
-			}
-		}
-	}
-
-case 2:
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-	if ( ++p != pe ) {
-		_goto_targ = 1;
-		continue _goto;
-	}
-case 4:
-case 5:
-	}
-	break; }
-	}
-
-// line 515 "Parser.rl"
-
-            if (cs < JSON_integer_first_final) {
-                return -1;
-            }
-
-            return p;
-        }
-        
-        RubyInteger createInteger(int p, int new_p) {
-            Ruby runtime = getRuntime();
-            ByteList num = absSubSequence(p, new_p);
-            return bytesToInum(runtime, num);
-        }
-        
-        RubyInteger bytesToInum(Ruby runtime, ByteList num) {
-            return runtime.is1_9() ?
-                    ConvertBytes.byteListToInum19(runtime, num, 10, true) :
-                    ConvertBytes.byteListToInum(runtime, num, 10, true);
-        }
-
-        
-// line 962 "Parser.java"
-private static byte[] init__JSON_float_actions_0()
-{
-	return new byte [] {
-	    0,    1,    0
-	};
-}
-
-private static final byte _JSON_float_actions[] = init__JSON_float_actions_0();
-
-
-private static byte[] init__JSON_float_key_offsets_0()
-{
-	return new byte [] {
-	    0,    0,    4,    7,   10,   12,   16,   18,   23,   29,   29
-	};
-}
-
-private static final byte _JSON_float_key_offsets[] = init__JSON_float_key_offsets_0();
-
-
-private static char[] init__JSON_float_trans_keys_0()
-{
-	return new char [] {
-	   45,   48,   49,   57,   48,   49,   57,   46,   69,  101,   48,   57,
-	   43,   45,   48,   57,   48,   57,   46,   69,  101,   48,   57,   69,
-	  101,   45,   46,   48,   57,   69,  101,   45,   46,   48,   57,    0
-	};
-}
-
-private static final char _JSON_float_trans_keys[] = init__JSON_float_trans_keys_0();
-
-
-private static byte[] init__JSON_float_single_lengths_0()
-{
-	return new byte [] {
-	    0,    2,    1,    3,    0,    2,    0,    3,    2,    0,    2
-	};
-}
-
-private static final byte _JSON_float_single_lengths[] = init__JSON_float_single_lengths_0();
-
-
-private static byte[] init__JSON_float_range_lengths_0()
-{
-	return new byte [] {
-	    0,    1,    1,    0,    1,    1,    1,    1,    2,    0,    2
-	};
-}
-
-private static final byte _JSON_float_range_lengths[] = init__JSON_float_range_lengths_0();
-
-
-private static byte[] init__JSON_float_index_offsets_0()
-{
-	return new byte [] {
-	    0,    0,    4,    7,   11,   13,   17,   19,   24,   29,   30
-	};
-}
-
-private static final byte _JSON_float_index_offsets[] = init__JSON_float_index_offsets_0();
-
-
-private static byte[] init__JSON_float_indicies_0()
-{
-	return new byte [] {
-	    0,    2,    3,    1,    2,    3,    1,    4,    5,    5,    1,    6,
-	    1,    7,    7,    8,    1,    8,    1,    4,    5,    5,    3,    1,
-	    5,    5,    1,    6,    9,    1,    1,    1,    1,    8,    9,    0
-	};
-}
-
-private static final byte _JSON_float_indicies[] = init__JSON_float_indicies_0();
-
-
-private static byte[] init__JSON_float_trans_targs_0()
-{
-	return new byte [] {
-	    2,    0,    3,    7,    4,    5,    8,    6,   10,    9
-	};
-}
-
-private static final byte _JSON_float_trans_targs[] = init__JSON_float_trans_targs_0();
-
-
-private static byte[] init__JSON_float_trans_actions_0()
-{
-	return new byte [] {
-	    0,    0,    0,    0,    0,    0,    0,    0,    0,    1
-	};
-}
-
-private static final byte _JSON_float_trans_actions[] = init__JSON_float_trans_actions_0();
-
-
-static final int JSON_float_start = 1;
-static final int JSON_float_first_final = 8;
-static final int JSON_float_error = 0;
-
-static final int JSON_float_en_main = 1;
-
-
-// line 550 "Parser.rl"
-
-
-        void parseFloat(ParserResult res, int p, int pe) {
-            int new_p = parseFloatInternal(p, pe);
-            if (new_p == -1) {
-                res.update(null, p);
-                return;
-            }
-            RubyFloat number = createFloat(p, new_p);
-            res.update(number, new_p + 1);
-            return;
-        }
-
-        int parseFloatInternal(int p, int pe) {
-            int cs = EVIL;
-
-            
-// line 1082 "Parser.java"
-	{
-	cs = JSON_float_start;
-	}
-
-// line 567 "Parser.rl"
-            int memo = p;
-            
-// line 1090 "Parser.java"
-	{
-	int _klen;
-	int _trans = 0;
-	int _acts;
-	int _nacts;
-	int _keys;
-	int _goto_targ = 0;
-
-	_goto: while (true) {
-	switch ( _goto_targ ) {
-	case 0:
-	if ( p == pe ) {
-		_goto_targ = 4;
-		continue _goto;
-	}
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-case 1:
-	_match: do {
-	_keys = _JSON_float_key_offsets[cs];
-	_trans = _JSON_float_index_offsets[cs];
-	_klen = _JSON_float_single_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + _klen - 1;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + ((_upper-_lower) >> 1);
-			if ( data[p] < _JSON_float_trans_keys[_mid] )
-				_upper = _mid - 1;
-			else if ( data[p] > _JSON_float_trans_keys[_mid] )
-				_lower = _mid + 1;
-			else {
-				_trans += (_mid - _keys);
-				break _match;
-			}
-		}
-		_keys += _klen;
-		_trans += _klen;
-	}
-
-	_klen = _JSON_float_range_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + (_klen<<1) - 2;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + (((_upper-_lower) >> 1) & ~1);
-			if ( data[p] < _JSON_float_trans_keys[_mid] )
-				_upper = _mid - 2;
-			else if ( data[p] > _JSON_float_trans_keys[_mid+1] )
-				_lower = _mid + 2;
-			else {
-				_trans += ((_mid - _keys)>>1);
-				break _match;
-			}
-		}
-		_trans += _klen;
-	}
-	} while (false);
-
-	_trans = _JSON_float_indicies[_trans];
-	cs = _JSON_float_trans_targs[_trans];
-
-	if ( _JSON_float_trans_actions[_trans] != 0 ) {
-		_acts = _JSON_float_trans_actions[_trans];
-		_nacts = (int) _JSON_float_actions[_acts++];
-		while ( _nacts-- > 0 )
-	{
-			switch ( _JSON_float_actions[_acts++] )
-			{
-	case 0:
-// line 541 "Parser.rl"
-	{
-                p--;
-                { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-            }
-	break;
-// line 1177 "Parser.java"
-			}
-		}
-	}
-
-case 2:
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-	if ( ++p != pe ) {
-		_goto_targ = 1;
-		continue _goto;
-	}
-case 4:
-case 5:
-	}
-	break; }
-	}
-
-// line 569 "Parser.rl"
-
-            if (cs < JSON_float_first_final) {
-                return -1;
-            }
-            
-            return p;
-        }
-        
-        RubyFloat createFloat(int p, int new_p) {
-            Ruby runtime = getRuntime();
-            ByteList num = absSubSequence(p, new_p);
-            return RubyFloat.newFloat(runtime, dc.parse(num, true, runtime.is1_9()));
-        }
-
-        
-// line 1213 "Parser.java"
-private static byte[] init__JSON_string_actions_0()
-{
-	return new byte [] {
-	    0,    2,    0,    1
-	};
-}
-
-private static final byte _JSON_string_actions[] = init__JSON_string_actions_0();
-
-
-private static byte[] init__JSON_string_key_offsets_0()
-{
-	return new byte [] {
-	    0,    0,    1,    5,    8,   14,   20,   26,   32
-	};
-}
-
-private static final byte _JSON_string_key_offsets[] = init__JSON_string_key_offsets_0();
-
-
-private static char[] init__JSON_string_trans_keys_0()
-{
-	return new char [] {
-	   34,   34,   92,    0,   31,  117,    0,   31,   48,   57,   65,   70,
-	   97,  102,   48,   57,   65,   70,   97,  102,   48,   57,   65,   70,
-	   97,  102,   48,   57,   65,   70,   97,  102,    0
-	};
-}
-
-private static final char _JSON_string_trans_keys[] = init__JSON_string_trans_keys_0();
-
-
-private static byte[] init__JSON_string_single_lengths_0()
-{
-	return new byte [] {
-	    0,    1,    2,    1,    0,    0,    0,    0,    0
-	};
-}
-
-private static final byte _JSON_string_single_lengths[] = init__JSON_string_single_lengths_0();
-
-
-private static byte[] init__JSON_string_range_lengths_0()
-{
-	return new byte [] {
-	    0,    0,    1,    1,    3,    3,    3,    3,    0
-	};
-}
-
-private static final byte _JSON_string_range_lengths[] = init__JSON_string_range_lengths_0();
-
-
-private static byte[] init__JSON_string_index_offsets_0()
-{
-	return new byte [] {
-	    0,    0,    2,    6,    9,   13,   17,   21,   25
-	};
-}
-
-private static final byte _JSON_string_index_offsets[] = init__JSON_string_index_offsets_0();
-
-
-private static byte[] init__JSON_string_indicies_0()
-{
-	return new byte [] {
-	    0,    1,    2,    3,    1,    0,    4,    1,    0,    5,    5,    5,
-	    1,    6,    6,    6,    1,    7,    7,    7,    1,    0,    0,    0,
-	    1,    1,    0
-	};
-}
-
-private static final byte _JSON_string_indicies[] = init__JSON_string_indicies_0();
-
-
-private static byte[] init__JSON_string_trans_targs_0()
-{
-	return new byte [] {
-	    2,    0,    8,    3,    4,    5,    6,    7
-	};
-}
-
-private static final byte _JSON_string_trans_targs[] = init__JSON_string_trans_targs_0();
-
-
-private static byte[] init__JSON_string_trans_actions_0()
-{
-	return new byte [] {
-	    0,    0,    1,    0,    0,    0,    0,    0
-	};
-}
-
-private static final byte _JSON_string_trans_actions[] = init__JSON_string_trans_actions_0();
-
-
-static final int JSON_string_start = 1;
-static final int JSON_string_first_final = 8;
-static final int JSON_string_error = 0;
-
-static final int JSON_string_en_main = 1;
-
-
-// line 614 "Parser.rl"
-
-
-        void parseString(ParserResult res, int p, int pe) {
-            int cs = EVIL;
-            IRubyObject result = null;
-
-            
-// line 1323 "Parser.java"
-	{
-	cs = JSON_string_start;
-	}
-
-// line 621 "Parser.rl"
-            int memo = p;
-            
-// line 1331 "Parser.java"
-	{
-	int _klen;
-	int _trans = 0;
-	int _acts;
-	int _nacts;
-	int _keys;
-	int _goto_targ = 0;
-
-	_goto: while (true) {
-	switch ( _goto_targ ) {
-	case 0:
-	if ( p == pe ) {
-		_goto_targ = 4;
-		continue _goto;
-	}
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-case 1:
-	_match: do {
-	_keys = _JSON_string_key_offsets[cs];
-	_trans = _JSON_string_index_offsets[cs];
-	_klen = _JSON_string_single_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + _klen - 1;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + ((_upper-_lower) >> 1);
-			if ( data[p] < _JSON_string_trans_keys[_mid] )
-				_upper = _mid - 1;
-			else if ( data[p] > _JSON_string_trans_keys[_mid] )
-				_lower = _mid + 1;
-			else {
-				_trans += (_mid - _keys);
-				break _match;
-			}
-		}
-		_keys += _klen;
-		_trans += _klen;
-	}
-
-	_klen = _JSON_string_range_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + (_klen<<1) - 2;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + (((_upper-_lower) >> 1) & ~1);
-			if ( data[p] < _JSON_string_trans_keys[_mid] )
-				_upper = _mid - 2;
-			else if ( data[p] > _JSON_string_trans_keys[_mid+1] )
-				_lower = _mid + 2;
-			else {
-				_trans += ((_mid - _keys)>>1);
-				break _match;
-			}
-		}
-		_trans += _klen;
-	}
-	} while (false);
-
-	_trans = _JSON_string_indicies[_trans];
-	cs = _JSON_string_trans_targs[_trans];
-
-	if ( _JSON_string_trans_actions[_trans] != 0 ) {
-		_acts = _JSON_string_trans_actions[_trans];
-		_nacts = (int) _JSON_string_actions[_acts++];
-		while ( _nacts-- > 0 )
-	{
-			switch ( _JSON_string_actions[_acts++] )
-			{
-	case 0:
-// line 589 "Parser.rl"
-	{
-                int offset = byteList.begin();
-                ByteList decoded = decoder.decode(byteList, memo + 1 - offset,
-                                                  p - offset);
-                result = getRuntime().newString(decoded);
-                if (result == null) {
-                    p--;
-                    { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-                } else {
-                    {p = (( p + 1))-1;}
-                }
-            }
-	break;
-	case 1:
-// line 602 "Parser.rl"
-	{
-                p--;
-                { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-            }
-	break;
-// line 1433 "Parser.java"
-			}
-		}
-	}
-
-case 2:
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-	if ( ++p != pe ) {
-		_goto_targ = 1;
-		continue _goto;
-	}
-case 4:
-case 5:
-	}
-	break; }
-	}
-
-// line 623 "Parser.rl"
-
-            if (parser.createAdditions) {
-                RubyHash match_string = parser.match_string;
-                if (match_string != null) {
-                    final IRubyObject[] memoArray = { result, null };
-                    try {
-                      match_string.visitAll(new RubyHash.Visitor() {
-                          @Override
-                          public void visit(IRubyObject pattern, IRubyObject klass) {
-                              if (pattern.callMethod(context, "===", memoArray[0]).isTrue()) {
-                                  memoArray[1] = klass;
-                                  throw JumpException.SPECIAL_JUMP;
-                              }
-                          }
-                      });
-                    } catch (JumpException e) { }
-                    if (memoArray[1] != null) {
-                        RubyClass klass = (RubyClass) memoArray[1];
-                        if (klass.respondsTo("json_creatable?") &&
-                            klass.callMethod(context, "json_creatable?").isTrue()) {
-                            result = klass.callMethod(context, "json_create", result);
-                        }
-                    }
-                }
-            }
-
-            if (cs >= JSON_string_first_final && result != null) {
-                RuntimeInfo info = RuntimeInfo.forRuntime(context.getRuntime());
-                if (info.encodingsSupported() && result instanceof RubyString) {
-                  ((RubyString)result).force_encoding(context, info.utf8.get());
-                }
-                res.update(result, p + 1);
-            } else {
-                res.update(null, p + 1);
-            }
-        }
-
-        
-// line 1492 "Parser.java"
-private static byte[] init__JSON_array_actions_0()
-{
-	return new byte [] {
-	    0,    1,    0,    1,    1
-	};
-}
-
-private static final byte _JSON_array_actions[] = init__JSON_array_actions_0();
-
-
-private static byte[] init__JSON_array_key_offsets_0()
-{
-	return new byte [] {
-	    0,    0,    1,   18,   25,   41,   43,   44,   46,   47,   49,   50,
-	   52,   53,   55,   56,   58,   59
-	};
-}
-
-private static final byte _JSON_array_key_offsets[] = init__JSON_array_key_offsets_0();
-
-
-private static char[] init__JSON_array_trans_keys_0()
-{
-	return new char [] {
-	   91,   13,   32,   34,   45,   47,   73,   78,   91,   93,  102,  110,
-	  116,  123,    9,   10,   48,   57,   13,   32,   44,   47,   93,    9,
-	   10,   13,   32,   34,   45,   47,   73,   78,   91,  102,  110,  116,
-	  123,    9,   10,   48,   57,   42,   47,   42,   42,   47,   10,   42,
-	   47,   42,   42,   47,   10,   42,   47,   42,   42,   47,   10,    0
-	};
-}
-
-private static final char _JSON_array_trans_keys[] = init__JSON_array_trans_keys_0();
-
-
-private static byte[] init__JSON_array_single_lengths_0()
-{
-	return new byte [] {
-	    0,    1,   13,    5,   12,    2,    1,    2,    1,    2,    1,    2,
-	    1,    2,    1,    2,    1,    0
-	};
-}
-
-private static final byte _JSON_array_single_lengths[] = init__JSON_array_single_lengths_0();
-
-
-private static byte[] init__JSON_array_range_lengths_0()
-{
-	return new byte [] {
-	    0,    0,    2,    1,    2,    0,    0,    0,    0,    0,    0,    0,
-	    0,    0,    0,    0,    0,    0
-	};
-}
-
-private static final byte _JSON_array_range_lengths[] = init__JSON_array_range_lengths_0();
-
-
-private static byte[] init__JSON_array_index_offsets_0()
-{
-	return new byte [] {
-	    0,    0,    2,   18,   25,   40,   43,   45,   48,   50,   53,   55,
-	   58,   60,   63,   65,   68,   70
-	};
-}
-
-private static final byte _JSON_array_index_offsets[] = init__JSON_array_index_offsets_0();
-
-
-private static byte[] init__JSON_array_indicies_0()
-{
-	return new byte [] {
-	    0,    1,    0,    0,    2,    2,    3,    2,    2,    2,    4,    2,
-	    2,    2,    2,    0,    2,    1,    5,    5,    6,    7,    4,    5,
-	    1,    6,    6,    2,    2,    8,    2,    2,    2,    2,    2,    2,
-	    2,    6,    2,    1,    9,   10,    1,   11,    9,   11,    6,    9,
-	    6,   10,   12,   13,    1,   14,   12,   14,    5,   12,    5,   13,
-	   15,   16,    1,   17,   15,   17,    0,   15,    0,   16,    1,    0
-	};
-}
-
-private static final byte _JSON_array_indicies[] = init__JSON_array_indicies_0();
-
-
-private static byte[] init__JSON_array_trans_targs_0()
-{
-	return new byte [] {
-	    2,    0,    3,   13,   17,    3,    4,    9,    5,    6,    8,    7,
-	   10,   12,   11,   14,   16,   15
-	};
-}
-
-private static final byte _JSON_array_trans_targs[] = init__JSON_array_trans_targs_0();
-
-
-private static byte[] init__JSON_array_trans_actions_0()
-{
-	return new byte [] {
-	    0,    0,    1,    0,    3,    0,    0,    0,    0,    0,    0,    0,
-	    0,    0,    0,    0,    0,    0
-	};
-}
-
-private static final byte _JSON_array_trans_actions[] = init__JSON_array_trans_actions_0();
-
-
-static final int JSON_array_start = 1;
-static final int JSON_array_first_final = 17;
-static final int JSON_array_error = 0;
-
-static final int JSON_array_en_main = 1;
-
-
-// line 697 "Parser.rl"
-
-
-        void parseArray(ParserResult res, int p, int pe) {
-            int cs = EVIL;
-
-            if (parser.maxNesting > 0 && currentNesting > parser.maxNesting) {
-                throw newException(Utils.M_NESTING_ERROR,
-                    "nesting of " + currentNesting + " is too deep");
-            }
-
-            IRubyObject result;
-            if (parser.arrayClass == getRuntime().getArray()) {
-                result = RubyArray.newArray(getRuntime());
-            } else {
-                result = parser.arrayClass.newInstance(context,
-                        IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
-            }
-
-            
-// line 1625 "Parser.java"
-	{
-	cs = JSON_array_start;
-	}
-
-// line 716 "Parser.rl"
-            
-// line 1632 "Parser.java"
-	{
-	int _klen;
-	int _trans = 0;
-	int _acts;
-	int _nacts;
-	int _keys;
-	int _goto_targ = 0;
-
-	_goto: while (true) {
-	switch ( _goto_targ ) {
-	case 0:
-	if ( p == pe ) {
-		_goto_targ = 4;
-		continue _goto;
-	}
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-case 1:
-	_match: do {
-	_keys = _JSON_array_key_offsets[cs];
-	_trans = _JSON_array_index_offsets[cs];
-	_klen = _JSON_array_single_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + _klen - 1;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + ((_upper-_lower) >> 1);
-			if ( data[p] < _JSON_array_trans_keys[_mid] )
-				_upper = _mid - 1;
-			else if ( data[p] > _JSON_array_trans_keys[_mid] )
-				_lower = _mid + 1;
-			else {
-				_trans += (_mid - _keys);
-				break _match;
-			}
-		}
-		_keys += _klen;
-		_trans += _klen;
-	}
-
-	_klen = _JSON_array_range_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + (_klen<<1) - 2;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + (((_upper-_lower) >> 1) & ~1);
-			if ( data[p] < _JSON_array_trans_keys[_mid] )
-				_upper = _mid - 2;
-			else if ( data[p] > _JSON_array_trans_keys[_mid+1] )
-				_lower = _mid + 2;
-			else {
-				_trans += ((_mid - _keys)>>1);
-				break _match;
-			}
-		}
-		_trans += _klen;
-	}
-	} while (false);
-
-	_trans = _JSON_array_indicies[_trans];
-	cs = _JSON_array_trans_targs[_trans];
-
-	if ( _JSON_array_trans_actions[_trans] != 0 ) {
-		_acts = _JSON_array_trans_actions[_trans];
-		_nacts = (int) _JSON_array_actions[_acts++];
-		while ( _nacts-- > 0 )
-	{
-			switch ( _JSON_array_actions[_acts++] )
-			{
-	case 0:
-// line 666 "Parser.rl"
-	{
-                parseValue(res, p, pe);
-                if (res.result == null) {
-                    p--;
-                    { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-                } else {
-                    if (parser.arrayClass == getRuntime().getArray()) {
-                        ((RubyArray)result).append(res.result);
-                    } else {
-                        result.callMethod(context, "<<", res.result);
-                    }
-                    {p = (( res.p))-1;}
-                }
-            }
-	break;
-	case 1:
-// line 681 "Parser.rl"
-	{
-                p--;
-                { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-            }
-	break;
-// line 1736 "Parser.java"
-			}
-		}
-	}
-
-case 2:
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-	if ( ++p != pe ) {
-		_goto_targ = 1;
-		continue _goto;
-	}
-case 4:
-case 5:
-	}
-	break; }
-	}
-
-// line 717 "Parser.rl"
-
-            if (cs >= JSON_array_first_final) {
-                res.update(result, p + 1);
-            } else {
-                throw unexpectedToken(p, pe);
-            }
-        }
-
-        
-// line 1766 "Parser.java"
-private static byte[] init__JSON_object_actions_0()
-{
-	return new byte [] {
-	    0,    1,    0,    1,    1,    1,    2
-	};
-}
-
-private static final byte _JSON_object_actions[] = init__JSON_object_actions_0();
-
-
-private static byte[] init__JSON_object_key_offsets_0()
-{
-	return new byte [] {
-	    0,    0,    1,    8,   14,   16,   17,   19,   20,   36,   43,   49,
-	   51,   52,   54,   55,   57,   58,   60,   61,   63,   64,   66,   67,
-	   69,   70,   72,   73
-	};
-}
-
-private static final byte _JSON_object_key_offsets[] = init__JSON_object_key_offsets_0();
-
-
-private static char[] init__JSON_object_trans_keys_0()
-{
-	return new char [] {
-	  123,   13,   32,   34,   47,  125,    9,   10,   13,   32,   47,   58,
-	    9,   10,   42,   47,   42,   42,   47,   10,   13,   32,   34,   45,
-	   47,   73,   78,   91,  102,  110,  116,  123,    9,   10,   48,   57,
-	   13,   32,   44,   47,  125,    9,   10,   13,   32,   34,   47,    9,
-	   10,   42,   47,   42,   42,   47,   10,   42,   47,   42,   42,   47,
-	   10,   42,   47,   42,   42,   47,   10,   42,   47,   42,   42,   47,
-	   10,    0
-	};
-}
-
-private static final char _JSON_object_trans_keys[] = init__JSON_object_trans_keys_0();
-
-
-private static byte[] init__JSON_object_single_lengths_0()
-{
-	return new byte [] {
-	    0,    1,    5,    4,    2,    1,    2,    1,   12,    5,    4,    2,
-	    1,    2,    1,    2,    1,    2,    1,    2,    1,    2,    1,    2,
-	    1,    2,    1,    0
-	};
-}
-
-private static final byte _JSON_object_single_lengths[] = init__JSON_object_single_lengths_0();
-
-
-private static byte[] init__JSON_object_range_lengths_0()
-{
-	return new byte [] {
-	    0,    0,    1,    1,    0,    0,    0,    0,    2,    1,    1,    0,
-	    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	    0,    0,    0,    0
-	};
-}
-
-private static final byte _JSON_object_range_lengths[] = init__JSON_object_range_lengths_0();
-
-
-private static byte[] init__JSON_object_index_offsets_0()
-{
-	return new byte [] {
-	    0,    0,    2,    9,   15,   18,   20,   23,   25,   40,   47,   53,
-	   56,   58,   61,   63,   66,   68,   71,   73,   76,   78,   81,   83,
-	   86,   88,   91,   93
-	};
-}
-
-private static final byte _JSON_object_index_offsets[] = init__JSON_object_index_offsets_0();
-
-
-private static byte[] init__JSON_object_indicies_0()
-{
-	return new byte [] {
-	    0,    1,    0,    0,    2,    3,    4,    0,    1,    5,    5,    6,
-	    7,    5,    1,    8,    9,    1,   10,    8,   10,    5,    8,    5,
-	    9,    7,    7,   11,   11,   12,   11,   11,   11,   11,   11,   11,
-	   11,    7,   11,    1,   13,   13,   14,   15,    4,   13,    1,   14,
-	   14,    2,   16,   14,    1,   17,   18,    1,   19,   17,   19,   14,
-	   17,   14,   18,   20,   21,    1,   22,   20,   22,   13,   20,   13,
-	   21,   23,   24,    1,   25,   23,   25,    7,   23,    7,   24,   26,
-	   27,    1,   28,   26,   28,    0,   26,    0,   27,    1,    0
-	};
-}
-
-private static final byte _JSON_object_indicies[] = init__JSON_object_indicies_0();
-
-
-private static byte[] init__JSON_object_trans_targs_0()
-{
-	return new byte [] {
-	    2,    0,    3,   23,   27,    3,    4,    8,    5,    7,    6,    9,
-	   19,    9,   10,   15,   11,   12,   14,   13,   16,   18,   17,   20,
-	   22,   21,   24,   26,   25
-	};
-}
-
-private static final byte _JSON_object_trans_targs[] = init__JSON_object_trans_targs_0();
-
-
-private static byte[] init__JSON_object_trans_actions_0()
-{
-	return new byte [] {
-	    0,    0,    3,    0,    5,    0,    0,    0,    0,    0,    0,    1,
-	    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-	    0,    0,    0,    0,    0
-	};
-}
-
-private static final byte _JSON_object_trans_actions[] = init__JSON_object_trans_actions_0();
-
-
-static final int JSON_object_start = 1;
-static final int JSON_object_first_final = 27;
-static final int JSON_object_error = 0;
-
-static final int JSON_object_en_main = 1;
-
-
-// line 776 "Parser.rl"
-
-
-        void parseObject(ParserResult res, int p, int pe) {
-            int cs = EVIL;
-            IRubyObject lastName = null;
-            boolean objectDefault = true;
-
-            if (parser.maxNesting > 0 && currentNesting > parser.maxNesting) {
-                throw newException(Utils.M_NESTING_ERROR,
-                    "nesting of " + currentNesting + " is too deep");
-            }
-
-            // this is guaranteed to be a RubyHash due to the earlier
-            // allocator test at OptionsReader#getClass
-            IRubyObject result;
-            if (parser.objectClass == getRuntime().getHash()) {
-                result = RubyHash.newHash(getRuntime());
-            } else {
-                objectDefault = false;
-                result = parser.objectClass.newInstance(context,
-                        IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
-            }
-
-            
-// line 1914 "Parser.java"
-	{
-	cs = JSON_object_start;
-	}
-
-// line 800 "Parser.rl"
-            
-// line 1921 "Parser.java"
-	{
-	int _klen;
-	int _trans = 0;
-	int _acts;
-	int _nacts;
-	int _keys;
-	int _goto_targ = 0;
-
-	_goto: while (true) {
-	switch ( _goto_targ ) {
-	case 0:
-	if ( p == pe ) {
-		_goto_targ = 4;
-		continue _goto;
-	}
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-case 1:
-	_match: do {
-	_keys = _JSON_object_key_offsets[cs];
-	_trans = _JSON_object_index_offsets[cs];
-	_klen = _JSON_object_single_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + _klen - 1;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + ((_upper-_lower) >> 1);
-			if ( data[p] < _JSON_object_trans_keys[_mid] )
-				_upper = _mid - 1;
-			else if ( data[p] > _JSON_object_trans_keys[_mid] )
-				_lower = _mid + 1;
-			else {
-				_trans += (_mid - _keys);
-				break _match;
-			}
-		}
-		_keys += _klen;
-		_trans += _klen;
-	}
-
-	_klen = _JSON_object_range_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + (_klen<<1) - 2;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + (((_upper-_lower) >> 1) & ~1);
-			if ( data[p] < _JSON_object_trans_keys[_mid] )
-				_upper = _mid - 2;
-			else if ( data[p] > _JSON_object_trans_keys[_mid+1] )
-				_lower = _mid + 2;
-			else {
-				_trans += ((_mid - _keys)>>1);
-				break _match;
-			}
-		}
-		_trans += _klen;
-	}
-	} while (false);
-
-	_trans = _JSON_object_indicies[_trans];
-	cs = _JSON_object_trans_targs[_trans];
-
-	if ( _JSON_object_trans_actions[_trans] != 0 ) {
-		_acts = _JSON_object_trans_actions[_trans];
-		_nacts = (int) _JSON_object_actions[_acts++];
-		while ( _nacts-- > 0 )
-	{
-			switch ( _JSON_object_actions[_acts++] )
-			{
-	case 0:
-// line 731 "Parser.rl"
-	{
-                parseValue(res, p, pe);
-                if (res.result == null) {
-                    p--;
-                    { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-                } else {
-                    if (parser.objectClass == getRuntime().getHash()) {
-                        ((RubyHash)result).op_aset(context, lastName, res.result);
-                    } else {
-                        result.callMethod(context, "[]=", new IRubyObject[] { lastName, res.result });
-                    }
-                    {p = (( res.p))-1;}
-                }
-            }
-	break;
-	case 1:
-// line 746 "Parser.rl"
-	{
-                parseString(res, p, pe);
-                if (res.result == null) {
-                    p--;
-                    { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-                } else {
-                    RubyString name = (RubyString)res.result;
-                    if (parser.symbolizeNames) {
-                        lastName = context.getRuntime().is1_9()
-                                       ? name.intern19()
-                                       : name.intern();
-                    } else {
-                        lastName = name;
-                    }
-                    {p = (( res.p))-1;}
-                }
-            }
-	break;
-	case 2:
-// line 764 "Parser.rl"
-	{
-                p--;
-                { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-            }
-	break;
-// line 2045 "Parser.java"
-			}
-		}
-	}
-
-case 2:
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-	if ( ++p != pe ) {
-		_goto_targ = 1;
-		continue _goto;
-	}
-case 4:
-case 5:
-	}
-	break; }
-	}
-
-// line 801 "Parser.rl"
-
-            if (cs < JSON_object_first_final) {
-                res.update(null, p + 1);
-                return;
-            }
-
-            IRubyObject returnedResult = result;
-
-            // attempt to de-serialize object
-            if (parser.createAdditions) {
-                IRubyObject vKlassName;
-                if (objectDefault) {
-                    vKlassName = ((RubyHash)result).op_aref(context, parser.createId);
-                } else {
-                    vKlassName = result.callMethod(context, "[]", parser.createId);
-                }
-
-                if (!vKlassName.isNil()) {
-                    // might throw ArgumentError, we let it propagate
-                    IRubyObject klass = parser.info.jsonModule.get().
-                            callMethod(context, "deep_const_get", vKlassName);
-                    if (klass.respondsTo("json_creatable?") &&
-                        klass.callMethod(context, "json_creatable?").isTrue()) {
-
-                        returnedResult = klass.callMethod(context, "json_create", result);
-                    }
-                }
-            }
-            res.update(returnedResult, p + 1);
-        }
-
-        
-// line 2098 "Parser.java"
-private static byte[] init__JSON_actions_0()
-{
-	return new byte [] {
-	    0,    1,    0,    1,    1
-	};
-}
-
-private static final byte _JSON_actions[] = init__JSON_actions_0();
-
-
-private static byte[] init__JSON_key_offsets_0()
-{
-	return new byte [] {
-	    0,    0,    7,    9,   10,   12,   13,   15,   16,   18,   19
-	};
-}
-
-private static final byte _JSON_key_offsets[] = init__JSON_key_offsets_0();
-
-
-private static char[] init__JSON_trans_keys_0()
-{
-	return new char [] {
-	   13,   32,   47,   91,  123,    9,   10,   42,   47,   42,   42,   47,
-	   10,   42,   47,   42,   42,   47,   10,   13,   32,   47,    9,   10,
-	    0
-	};
-}
-
-private static final char _JSON_trans_keys[] = init__JSON_trans_keys_0();
-
-
-private static byte[] init__JSON_single_lengths_0()
-{
-	return new byte [] {
-	    0,    5,    2,    1,    2,    1,    2,    1,    2,    1,    3
-	};
-}
-
-private static final byte _JSON_single_lengths[] = init__JSON_single_lengths_0();
-
-
-private static byte[] init__JSON_range_lengths_0()
-{
-	return new byte [] {
-	    0,    1,    0,    0,    0,    0,    0,    0,    0,    0,    1
-	};
-}
-
-private static final byte _JSON_range_lengths[] = init__JSON_range_lengths_0();
-
-
-private static byte[] init__JSON_index_offsets_0()
-{
-	return new byte [] {
-	    0,    0,    7,   10,   12,   15,   17,   20,   22,   25,   27
-	};
-}
-
-private static final byte _JSON_index_offsets[] = init__JSON_index_offsets_0();
-
-
-private static byte[] init__JSON_indicies_0()
-{
-	return new byte [] {
-	    0,    0,    2,    3,    4,    0,    1,    5,    6,    1,    7,    5,
-	    7,    0,    5,    0,    6,    8,    9,    1,   10,    8,   10,   11,
-	    8,   11,    9,   11,   11,   12,   11,    1,    0
-	};
-}
-
-private static final byte _JSON_indicies[] = init__JSON_indicies_0();
-
-
-private static byte[] init__JSON_trans_targs_0()
-{
-	return new byte [] {
-	    1,    0,    2,   10,   10,    3,    5,    4,    7,    9,    8,   10,
-	    6
-	};
-}
-
-private static final byte _JSON_trans_targs[] = init__JSON_trans_targs_0();
-
-
-private static byte[] init__JSON_trans_actions_0()
-{
-	return new byte [] {
-	    0,    0,    0,    3,    1,    0,    0,    0,    0,    0,    0,    0,
-	    0
-	};
-}
-
-private static final byte _JSON_trans_actions[] = init__JSON_trans_actions_0();
-
-
-static final int JSON_start = 1;
-static final int JSON_first_final = 10;
-static final int JSON_error = 0;
-
-static final int JSON_en_main = 1;
-
-
-// line 866 "Parser.rl"
-
-
-        public IRubyObject parseStrict() {
-            int cs = EVIL;
-            int p, pe;
-            IRubyObject result = null;
-            ParserResult res = new ParserResult();
-
-            
-// line 2212 "Parser.java"
-	{
-	cs = JSON_start;
-	}
-
-// line 875 "Parser.rl"
-            p = byteList.begin();
-            pe = p + byteList.length();
-            
-// line 2221 "Parser.java"
-	{
-	int _klen;
-	int _trans = 0;
-	int _acts;
-	int _nacts;
-	int _keys;
-	int _goto_targ = 0;
-
-	_goto: while (true) {
-	switch ( _goto_targ ) {
-	case 0:
-	if ( p == pe ) {
-		_goto_targ = 4;
-		continue _goto;
-	}
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-case 1:
-	_match: do {
-	_keys = _JSON_key_offsets[cs];
-	_trans = _JSON_index_offsets[cs];
-	_klen = _JSON_single_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + _klen - 1;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + ((_upper-_lower) >> 1);
-			if ( data[p] < _JSON_trans_keys[_mid] )
-				_upper = _mid - 1;
-			else if ( data[p] > _JSON_trans_keys[_mid] )
-				_lower = _mid + 1;
-			else {
-				_trans += (_mid - _keys);
-				break _match;
-			}
-		}
-		_keys += _klen;
-		_trans += _klen;
-	}
-
-	_klen = _JSON_range_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + (_klen<<1) - 2;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + (((_upper-_lower) >> 1) & ~1);
-			if ( data[p] < _JSON_trans_keys[_mid] )
-				_upper = _mid - 2;
-			else if ( data[p] > _JSON_trans_keys[_mid+1] )
-				_lower = _mid + 2;
-			else {
-				_trans += ((_mid - _keys)>>1);
-				break _match;
-			}
-		}
-		_trans += _klen;
-	}
-	} while (false);
-
-	_trans = _JSON_indicies[_trans];
-	cs = _JSON_trans_targs[_trans];
-
-	if ( _JSON_trans_actions[_trans] != 0 ) {
-		_acts = _JSON_trans_actions[_trans];
-		_nacts = (int) _JSON_actions[_acts++];
-		while ( _nacts-- > 0 )
-	{
-			switch ( _JSON_actions[_acts++] )
-			{
-	case 0:
-// line 838 "Parser.rl"
-	{
-                currentNesting = 1;
-                parseObject(res, p, pe);
-                if (res.result == null) {
-                    p--;
-                    { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-                } else {
-                    result = res.result;
-                    {p = (( res.p))-1;}
-                }
-            }
-	break;
-	case 1:
-// line 850 "Parser.rl"
-	{
-                currentNesting = 1;
-                parseArray(res, p, pe);
-                if (res.result == null) {
-                    p--;
-                    { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-                } else {
-                    result = res.result;
-                    {p = (( res.p))-1;}
-                }
-            }
-	break;
-// line 2329 "Parser.java"
-			}
-		}
-	}
-
-case 2:
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-	if ( ++p != pe ) {
-		_goto_targ = 1;
-		continue _goto;
-	}
-case 4:
-case 5:
-	}
-	break; }
-	}
-
-// line 878 "Parser.rl"
-
-            if (cs >= JSON_first_final && p == pe) {
-                return result;
-            } else {
-                throw unexpectedToken(p, pe);
-            }
-        }
-
-        
-// line 2359 "Parser.java"
-private static byte[] init__JSON_quirks_mode_actions_0()
-{
-	return new byte [] {
-	    0,    1,    0
-	};
-}
-
-private static final byte _JSON_quirks_mode_actions[] = init__JSON_quirks_mode_actions_0();
-
-
-private static byte[] init__JSON_quirks_mode_key_offsets_0()
-{
-	return new byte [] {
-	    0,    0,   16,   18,   19,   21,   22,   24,   25,   27,   28
-	};
-}
-
-private static final byte _JSON_quirks_mode_key_offsets[] = init__JSON_quirks_mode_key_offsets_0();
-
-
-private static char[] init__JSON_quirks_mode_trans_keys_0()
-{
-	return new char [] {
-	   13,   32,   34,   45,   47,   73,   78,   91,  102,  110,  116,  123,
-	    9,   10,   48,   57,   42,   47,   42,   42,   47,   10,   42,   47,
-	   42,   42,   47,   10,   13,   32,   47,    9,   10,    0
-	};
-}
-
-private static final char _JSON_quirks_mode_trans_keys[] = init__JSON_quirks_mode_trans_keys_0();
-
-
-private static byte[] init__JSON_quirks_mode_single_lengths_0()
-{
-	return new byte [] {
-	    0,   12,    2,    1,    2,    1,    2,    1,    2,    1,    3
-	};
-}
-
-private static final byte _JSON_quirks_mode_single_lengths[] = init__JSON_quirks_mode_single_lengths_0();
-
-
-private static byte[] init__JSON_quirks_mode_range_lengths_0()
-{
-	return new byte [] {
-	    0,    2,    0,    0,    0,    0,    0,    0,    0,    0,    1
-	};
-}
-
-private static final byte _JSON_quirks_mode_range_lengths[] = init__JSON_quirks_mode_range_lengths_0();
-
-
-private static byte[] init__JSON_quirks_mode_index_offsets_0()
-{
-	return new byte [] {
-	    0,    0,   15,   18,   20,   23,   25,   28,   30,   33,   35
-	};
-}
-
-private static final byte _JSON_quirks_mode_index_offsets[] = init__JSON_quirks_mode_index_offsets_0();
-
-
-private static byte[] init__JSON_quirks_mode_indicies_0()
-{
-	return new byte [] {
-	    0,    0,    2,    2,    3,    2,    2,    2,    2,    2,    2,    2,
-	    0,    2,    1,    4,    5,    1,    6,    4,    6,    7,    4,    7,
-	    5,    8,    9,    1,   10,    8,   10,    0,    8,    0,    9,    7,
-	    7,   11,    7,    1,    0
-	};
-}
-
-private static final byte _JSON_quirks_mode_indicies[] = init__JSON_quirks_mode_indicies_0();
-
-
-private static byte[] init__JSON_quirks_mode_trans_targs_0()
-{
-	return new byte [] {
-	    1,    0,   10,    6,    3,    5,    4,   10,    7,    9,    8,    2
-	};
-}
-
-private static final byte _JSON_quirks_mode_trans_targs[] = init__JSON_quirks_mode_trans_targs_0();
-
-
-private static byte[] init__JSON_quirks_mode_trans_actions_0()
-{
-	return new byte [] {
-	    0,    0,    1,    0,    0,    0,    0,    0,    0,    0,    0,    0
-	};
-}
-
-private static final byte _JSON_quirks_mode_trans_actions[] = init__JSON_quirks_mode_trans_actions_0();
-
-
-static final int JSON_quirks_mode_start = 1;
-static final int JSON_quirks_mode_first_final = 10;
-static final int JSON_quirks_mode_error = 0;
-
-static final int JSON_quirks_mode_en_main = 1;
-
-
-// line 906 "Parser.rl"
-
-
-        public IRubyObject parseQuirksMode() {
-            int cs = EVIL;
-            int p, pe;
-            IRubyObject result = null;
-            ParserResult res = new ParserResult();
-
-            
-// line 2472 "Parser.java"
-	{
-	cs = JSON_quirks_mode_start;
-	}
-
-// line 915 "Parser.rl"
-            p = byteList.begin();
-            pe = p + byteList.length();
-            
-// line 2481 "Parser.java"
-	{
-	int _klen;
-	int _trans = 0;
-	int _acts;
-	int _nacts;
-	int _keys;
-	int _goto_targ = 0;
-
-	_goto: while (true) {
-	switch ( _goto_targ ) {
-	case 0:
-	if ( p == pe ) {
-		_goto_targ = 4;
-		continue _goto;
-	}
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-case 1:
-	_match: do {
-	_keys = _JSON_quirks_mode_key_offsets[cs];
-	_trans = _JSON_quirks_mode_index_offsets[cs];
-	_klen = _JSON_quirks_mode_single_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + _klen - 1;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + ((_upper-_lower) >> 1);
-			if ( data[p] < _JSON_quirks_mode_trans_keys[_mid] )
-				_upper = _mid - 1;
-			else if ( data[p] > _JSON_quirks_mode_trans_keys[_mid] )
-				_lower = _mid + 1;
-			else {
-				_trans += (_mid - _keys);
-				break _match;
-			}
-		}
-		_keys += _klen;
-		_trans += _klen;
-	}
-
-	_klen = _JSON_quirks_mode_range_lengths[cs];
-	if ( _klen > 0 ) {
-		int _lower = _keys;
-		int _mid;
-		int _upper = _keys + (_klen<<1) - 2;
-		while (true) {
-			if ( _upper < _lower )
-				break;
-
-			_mid = _lower + (((_upper-_lower) >> 1) & ~1);
-			if ( data[p] < _JSON_quirks_mode_trans_keys[_mid] )
-				_upper = _mid - 2;
-			else if ( data[p] > _JSON_quirks_mode_trans_keys[_mid+1] )
-				_lower = _mid + 2;
-			else {
-				_trans += ((_mid - _keys)>>1);
-				break _match;
-			}
-		}
-		_trans += _klen;
-	}
-	} while (false);
-
-	_trans = _JSON_quirks_mode_indicies[_trans];
-	cs = _JSON_quirks_mode_trans_targs[_trans];
-
-	if ( _JSON_quirks_mode_trans_actions[_trans] != 0 ) {
-		_acts = _JSON_quirks_mode_trans_actions[_trans];
-		_nacts = (int) _JSON_quirks_mode_actions[_acts++];
-		while ( _nacts-- > 0 )
-	{
-			switch ( _JSON_quirks_mode_actions[_acts++] )
-			{
-	case 0:
-// line 892 "Parser.rl"
-	{
-                parseValue(res, p, pe);
-                if (res.result == null) {
-                    p--;
-                    { p += 1; _goto_targ = 5; if (true)  continue _goto;}
-                } else {
-                    result = res.result;
-                    {p = (( res.p))-1;}
-                }
-            }
-	break;
-// line 2574 "Parser.java"
-			}
-		}
-	}
-
-case 2:
-	if ( cs == 0 ) {
-		_goto_targ = 5;
-		continue _goto;
-	}
-	if ( ++p != pe ) {
-		_goto_targ = 1;
-		continue _goto;
-	}
-case 4:
-case 5:
-	}
-	break; }
-	}
-
-// line 918 "Parser.rl"
-
-            if (cs >= JSON_quirks_mode_first_final && p == pe) {
-                return result;
-            } else {
-                throw unexpectedToken(p, pe);
-            }
-        }
-
-        public IRubyObject parse() {
-          if (parser.quirksMode) {
-            return parseQuirksMode();
-          } else {
-            return parseStrict();
-          }
-
-        }
-
-        /**
-         * Updates the "view" bytelist with the new offsets and returns it.
-         * @param start
-         * @param end
-         */
-        private ByteList absSubSequence(int absStart, int absEnd) {
-            view.setBegin(absStart);
-            view.setRealSize(absEnd - absStart);
-            return view;
-        }
-
-        /**
-         * Retrieves a constant directly descended from the <code>JSON</code> module.
-         * @param name The constant name
-         */
-        private IRubyObject getConstant(String name) {
-            return parser.info.jsonModule.get().getConstant(name);
-        }
-
-        private RaiseException newException(String className, String message) {
-            return Utils.newException(context, className, message);
-        }
-
-        private RaiseException newException(String className, RubyString message) {
-            return Utils.newException(context, className, message);
-        }
-
-        private RaiseException newException(String className,
-                String messageBegin, ByteList messageEnd) {
-            return newException(className,
-                    getRuntime().newString(messageBegin).cat(messageEnd));
-        }
-    }
-}
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/Parser.rl b/vendor/json_pure-1.7.7/java/src/json/ext/Parser.rl
deleted file mode 100644
index 6dd335a..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/Parser.rl
+++ /dev/null
@@ -1,968 +0,0 @@
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import org.jruby.Ruby;
-import org.jruby.RubyArray;
-import org.jruby.RubyClass;
-import org.jruby.RubyEncoding;
-import org.jruby.RubyFloat;
-import org.jruby.RubyHash;
-import org.jruby.RubyInteger;
-import org.jruby.RubyModule;
-import org.jruby.RubyNumeric;
-import org.jruby.RubyObject;
-import org.jruby.RubyString;
-import org.jruby.anno.JRubyMethod;
-import org.jruby.exceptions.JumpException;
-import org.jruby.exceptions.RaiseException;
-import org.jruby.runtime.Block;
-import org.jruby.runtime.ObjectAllocator;
-import org.jruby.runtime.ThreadContext;
-import org.jruby.runtime.Visibility;
-import org.jruby.runtime.builtin.IRubyObject;
-import org.jruby.util.ByteList;
-import org.jruby.util.ConvertBytes;
-import static org.jruby.util.ConvertDouble.DoubleConverter;
-
-/**
- * The <code>JSON::Ext::Parser</code> class.
- *
- * <p>This is the JSON parser implemented as a Java class. To use it as the
- * standard parser, set
- *   <pre>JSON.parser = JSON::Ext::Parser</pre>
- * This is performed for you when you <code>include "json/ext"</code>.
- *
- * <p>This class does not perform the actual parsing, just acts as an interface
- * to Ruby code. When the {@link #parse()} method is invoked, a
- * Parser.ParserSession object is instantiated, which handles the process.
- *
- * @author mernen
- */
-public class Parser extends RubyObject {
-    private final RuntimeInfo info;
-    private RubyString vSource;
-    private RubyString createId;
-    private boolean createAdditions;
-    private int maxNesting;
-    private boolean allowNaN;
-    private boolean symbolizeNames;
-    private boolean quirksMode;
-    private RubyClass objectClass;
-    private RubyClass arrayClass;
-    private RubyHash match_string;
-
-    private static final int DEFAULT_MAX_NESTING = 100;
-
-    private static final ByteList JSON_MINUS_INFINITY = new ByteList(ByteList.plain("-Infinity"));
-    // constant names in the JSON module containing those values
-    private static final String CONST_NAN = "NaN";
-    private static final String CONST_INFINITY = "Infinity";
-    private static final String CONST_MINUS_INFINITY = "MinusInfinity";
-
-    static final ObjectAllocator ALLOCATOR = new ObjectAllocator() {
-        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
-            return new Parser(runtime, klazz);
-        }
-    };
-
-    /**
-     * Multiple-value return for internal parser methods.
-     *
-     * <p>All the <code>parse<var>Stuff</var></code> methods return instances of
-     * <code>ParserResult</code> when successful, or <code>null</code> when
-     * there's a problem with the input data.
-     */
-    static final class ParserResult {
-        /**
-         * The result of the successful parsing. Should never be
-         * <code>null</code>.
-         */
-        IRubyObject result;
-        /**
-         * The point where the parser returned.
-         */
-        int p;
-
-        void update(IRubyObject result, int p) {
-            this.result = result;
-            this.p = p;
-        }
-    }
-
-    public Parser(Ruby runtime, RubyClass metaClass) {
-        super(runtime, metaClass);
-        info = RuntimeInfo.forRuntime(runtime);
-    }
-
-    /**
-     * <code>Parser.new(source, opts = {})</code>
-     *
-     * <p>Creates a new <code>JSON::Ext::Parser</code> instance for the string
-     * <code>source</code>.
-     * It will be configured by the <code>opts</code> Hash.
-     * <code>opts</code> can have the following keys:
-     *
-     * <dl>
-     * <dt><code>:max_nesting</code>
-     * <dd>The maximum depth of nesting allowed in the parsed data
-     * structures. Disable depth checking with <code>:max_nesting => false|nil|0</code>,
-     * it defaults to 100.
-     *
-     * <dt><code>:allow_nan</code>
-     * <dd>If set to <code>true</code>, allow <code>NaN</code>,
-     * <code>Infinity</code> and <code>-Infinity</code> in defiance of RFC 4627
-     * to be parsed by the Parser. This option defaults to <code>false</code>.
-     *
-     * <dt><code>:symbolize_names</code>
-     * <dd>If set to <code>true</code>, returns symbols for the names (keys) in
-     * a JSON object. Otherwise strings are returned, which is also the default.
-     *
-     * <dt><code>:quirks_mode?</code>
-     * <dd>If set to <code>true</code>, if the parse is in quirks_mode, false
-     * otherwise.
-     * 
-     * <dt><code>:create_additions</code>
-     * <dd>If set to <code>false</code>, the Parser doesn't create additions
-     * even if a matchin class and <code>create_id</code> was found. This option
-     * defaults to <code>true</code>.
-     *
-     * <dt><code>:object_class</code>
-     * <dd>Defaults to Hash.
-     *
-     * <dt><code>:array_class</code>
-     * <dd>Defaults to Array.
-     *
-     * <dt><code>:quirks_mode</code>
-     * <dd>Enables quirks_mode for parser, that is for example parsing single
-     * JSON values instead of documents is possible.
-     * </dl>
-     */
-    @JRubyMethod(name = "new", required = 1, optional = 1, meta = true)
-    public static IRubyObject newInstance(IRubyObject clazz, IRubyObject[] args, Block block) {
-        Parser parser = (Parser)((RubyClass)clazz).allocate();
-
-        parser.callInit(args, block);
-
-        return parser;
-    }
-
-    @JRubyMethod(required = 1, optional = 1, visibility = Visibility.PRIVATE)
-    public IRubyObject initialize(ThreadContext context, IRubyObject[] args) {
-        Ruby runtime = context.getRuntime();
-        if (this.vSource != null) {
-            throw runtime.newTypeError("already initialized instance");
-         }
-
-        OptionsReader opts   = new OptionsReader(context, args.length > 1 ? args[1] : null);
-        this.maxNesting      = opts.getInt("max_nesting", DEFAULT_MAX_NESTING);
-        this.allowNaN        = opts.getBool("allow_nan", false);
-        this.symbolizeNames  = opts.getBool("symbolize_names", false);
-        this.quirksMode      = opts.getBool("quirks_mode", false);
-        this.createId        = opts.getString("create_id", getCreateId(context));
-        this.createAdditions = opts.getBool("create_additions", false);
-        this.objectClass     = opts.getClass("object_class", runtime.getHash());
-        this.arrayClass      = opts.getClass("array_class", runtime.getArray());
-        this.match_string    = opts.getHash("match_string");
-
-        this.vSource = args[0].convertToString();
-        if (!quirksMode) this.vSource = convertEncoding(context, vSource);
-
-        return this;
-    }
-
-    /**
-     * Checks the given string's encoding. If a non-UTF-8 encoding is detected,
-     * a converted copy is returned.
-     * Returns the source string if no conversion is needed.
-     */
-    private RubyString convertEncoding(ThreadContext context, RubyString source) {
-        ByteList bl = source.getByteList();
-        int len = bl.length();
-        if (len < 2) {
-            throw Utils.newException(context, Utils.M_PARSER_ERROR,
-                "A JSON text must at least contain two octets!");
-        }
-
-        if (info.encodingsSupported()) {
-            RubyEncoding encoding = (RubyEncoding)source.encoding(context);
-            if (encoding != info.ascii8bit.get()) {
-                return (RubyString)source.encode(context, info.utf8.get());
-            }
-
-            String sniffedEncoding = sniffByteList(bl);
-            if (sniffedEncoding == null) return source; // assume UTF-8
-            return reinterpretEncoding(context, source, sniffedEncoding);
-        }
-
-        String sniffedEncoding = sniffByteList(bl);
-        if (sniffedEncoding == null) return source; // assume UTF-8
-        Ruby runtime = context.getRuntime();
-        return (RubyString)info.jsonModule.get().
-            callMethod(context, "iconv",
-                new IRubyObject[] {
-                    runtime.newString("utf-8"),
-                    runtime.newString(sniffedEncoding),
-                    source});
-    }
-
-    /**
-     * Checks the first four bytes of the given ByteList to infer its encoding,
-     * using the principle demonstrated on section 3 of RFC 4627 (JSON).
-     */
-    private static String sniffByteList(ByteList bl) {
-        if (bl.length() < 4) return null;
-        if (bl.get(0) == 0 && bl.get(2) == 0) {
-            return bl.get(1) == 0 ? "utf-32be" : "utf-16be";
-        }
-        if (bl.get(1) == 0 && bl.get(3) == 0) {
-            return bl.get(2) == 0 ? "utf-32le" : "utf-16le";
-        }
-        return null;
-    }
-
-    /**
-     * Assumes the given (binary) RubyString to be in the given encoding, then
-     * converts it to UTF-8.
-     */
-    private RubyString reinterpretEncoding(ThreadContext context,
-            RubyString str, String sniffedEncoding) {
-        RubyEncoding actualEncoding = info.getEncoding(context, sniffedEncoding);
-        RubyEncoding targetEncoding = info.utf8.get();
-        RubyString dup = (RubyString)str.dup();
-        dup.force_encoding(context, actualEncoding);
-        return (RubyString)dup.encode_bang(context, targetEncoding);
-    }
-
-    /**
-     * <code>Parser#parse()</code>
-     *
-     * <p>Parses the current JSON text <code>source</code> and returns the
-     * complete data structure as a result.
-     */
-    @JRubyMethod
-    public IRubyObject parse(ThreadContext context) {
-        return new ParserSession(this, context).parse();
-    }
-
-    /**
-     * <code>Parser#source()</code>
-     *
-     * <p>Returns a copy of the current <code>source</code> string, that was
-     * used to construct this Parser.
-     */
-    @JRubyMethod(name = "source")
-    public IRubyObject source_get() {
-        return checkAndGetSource().dup();
-    }
-
-    /**
-     * <code>Parser#quirks_mode?()</code>
-     * 
-     * <p>If set to <code>true</code>, if the parse is in quirks_mode, false
-     * otherwise.
-     */
-    @JRubyMethod(name = "quirks_mode?")
-    public IRubyObject quirks_mode_p(ThreadContext context) {
-        return context.getRuntime().newBoolean(quirksMode);
-    }
-
-    public RubyString checkAndGetSource() {
-      if (vSource != null) {
-        return vSource;
-      } else {
-        throw getRuntime().newTypeError("uninitialized instance");
-      }
-    }
-
-    /**
-     * Queries <code>JSON.create_id</code>. Returns <code>null</code> if it is
-     * set to <code>nil</code> or <code>false</code>, and a String if not.
-     */
-    private RubyString getCreateId(ThreadContext context) {
-        IRubyObject v = info.jsonModule.get().callMethod(context, "create_id");
-        return v.isTrue() ? v.convertToString() : null;
-    }
-
-    /**
-     * A string parsing session.
-     *
-     * <p>Once a ParserSession is instantiated, the source string should not
-     * change until the parsing is complete. The ParserSession object assumes
-     * the source {@link RubyString} is still associated to its original
-     * {@link ByteList}, which in turn must still be bound to the same
-     * <code>byte[]</code> value (and on the same offset).
-     */
-    // Ragel uses lots of fall-through
-    @SuppressWarnings("fallthrough")
-    private static class ParserSession {
-        private final Parser parser;
-        private final ThreadContext context;
-        private final ByteList byteList;
-        private final ByteList view;
-        private final byte[] data;
-        private final StringDecoder decoder;
-        private int currentNesting = 0;
-        private final DoubleConverter dc;
-
-        // initialization value for all state variables.
-        // no idea about the origins of this value, ask Flori ;)
-        private static final int EVIL = 0x666;
-
-        private ParserSession(Parser parser, ThreadContext context) {
-            this.parser = parser;
-            this.context = context;
-            this.byteList = parser.checkAndGetSource().getByteList();
-            this.data = byteList.unsafeBytes();
-            this.view = new ByteList(data, false);
-            this.decoder = new StringDecoder(context);
-            this.dc = new DoubleConverter();
-        }
-
-        private RaiseException unexpectedToken(int absStart, int absEnd) {
-            RubyString msg = getRuntime().newString("unexpected token at '")
-                    .cat(data, absStart, absEnd - absStart)
-                    .cat((byte)'\'');
-            return newException(Utils.M_PARSER_ERROR, msg);
-        }
-
-        private Ruby getRuntime() {
-            return context.getRuntime();
-        }
-
-        %%{
-            machine JSON_common;
-
-            cr                  = '\n';
-            cr_neg              = [^\n];
-            ws                  = [ \t\r\n];
-            c_comment           = '/*' ( any* - (any* '*/' any* ) ) '*/';
-            cpp_comment         = '//' cr_neg* cr;
-            comment             = c_comment | cpp_comment;
-            ignore              = ws | comment;
-            name_separator      = ':';
-            value_separator     = ',';
-            Vnull               = 'null';
-            Vfalse              = 'false';
-            Vtrue               = 'true';
-            VNaN                = 'NaN';
-            VInfinity           = 'Infinity';
-            VMinusInfinity      = '-Infinity';
-            begin_value         = [nft"\-[{NI] | digit;
-            begin_object        = '{';
-            end_object          = '}';
-            begin_array         = '[';
-            end_array           = ']';
-            begin_string        = '"';
-            begin_name          = begin_string;
-            begin_number        = digit | '-';
-        }%%
-
-        %%{
-            machine JSON_value;
-            include JSON_common;
-
-            write data;
-
-            action parse_null {
-                result = getRuntime().getNil();
-            }
-            action parse_false {
-                result = getRuntime().getFalse();
-            }
-            action parse_true {
-                result = getRuntime().getTrue();
-            }
-            action parse_nan {
-                if (parser.allowNaN) {
-                    result = getConstant(CONST_NAN);
-                } else {
-                    throw unexpectedToken(p - 2, pe);
-                }
-            }
-            action parse_infinity {
-                if (parser.allowNaN) {
-                    result = getConstant(CONST_INFINITY);
-                } else {
-                    throw unexpectedToken(p - 7, pe);
-                }
-            }
-            action parse_number {
-                if (pe > fpc + 9 - (parser.quirksMode ? 1 : 0) &&
-                    absSubSequence(fpc, fpc + 9).equals(JSON_MINUS_INFINITY)) {
-
-                    if (parser.allowNaN) {
-                        result = getConstant(CONST_MINUS_INFINITY);
-                        fexec p + 10;
-                        fhold;
-                        fbreak;
-                    } else {
-                        throw unexpectedToken(p, pe);
-                    }
-                }
-                parseFloat(res, fpc, pe);
-                if (res.result != null) {
-                    result = res.result;
-                    fexec res.p;
-                }
-                parseInteger(res, fpc, pe);
-                if (res.result != null) {
-                    result = res.result;
-                    fexec res.p;
-                }
-                fhold;
-                fbreak;
-            }
-            action parse_string {
-                parseString(res, fpc, pe);
-                if (res.result == null) {
-                    fhold;
-                    fbreak;
-                } else {
-                    result = res.result;
-                    fexec res.p;
-                }
-            }
-            action parse_array {
-                currentNesting++;
-                parseArray(res, fpc, pe);
-                currentNesting--;
-                if (res.result == null) {
-                    fhold;
-                    fbreak;
-                } else {
-                    result = res.result;
-                    fexec res.p;
-                }
-            }
-            action parse_object {
-                currentNesting++;
-                parseObject(res, fpc, pe);
-                currentNesting--;
-                if (res.result == null) {
-                    fhold;
-                    fbreak;
-                } else {
-                    result = res.result;
-                    fexec res.p;
-                }
-            }
-            action exit {
-                fhold;
-                fbreak;
-            }
-
-            main := ( Vnull @parse_null |
-                      Vfalse @parse_false |
-                      Vtrue @parse_true |
-                      VNaN @parse_nan |
-                      VInfinity @parse_infinity |
-                      begin_number >parse_number |
-                      begin_string >parse_string |
-                      begin_array >parse_array |
-                      begin_object >parse_object
-                    ) %*exit;
-        }%%
-
-        void parseValue(ParserResult res, int p, int pe) {
-            int cs = EVIL;
-            IRubyObject result = null;
-
-            %% write init;
-            %% write exec;
-
-            if (cs >= JSON_value_first_final && result != null) {
-                res.update(result, p);
-            } else {
-                res.update(null, p);
-            }
-        }
-
-        %%{
-            machine JSON_integer;
-
-            write data;
-
-            action exit {
-                fhold;
-                fbreak;
-            }
-
-            main := '-'? ( '0' | [1-9][0-9]* ) ( ^[0-9]? @exit );
-        }%%
-
-        void parseInteger(ParserResult res, int p, int pe) {
-            int new_p = parseIntegerInternal(p, pe);
-            if (new_p == -1) {
-                res.update(null, p);
-                return;
-            }
-            RubyInteger number = createInteger(p, new_p);
-            res.update(number, new_p + 1);
-            return;
-        }
-
-        int parseIntegerInternal(int p, int pe) {
-            int cs = EVIL;
-
-            %% write init;
-            int memo = p;
-            %% write exec;
-
-            if (cs < JSON_integer_first_final) {
-                return -1;
-            }
-
-            return p;
-        }
-        
-        RubyInteger createInteger(int p, int new_p) {
-            Ruby runtime = getRuntime();
-            ByteList num = absSubSequence(p, new_p);
-            return bytesToInum(runtime, num);
-        }
-        
-        RubyInteger bytesToInum(Ruby runtime, ByteList num) {
-            return runtime.is1_9() ?
-                    ConvertBytes.byteListToInum19(runtime, num, 10, true) :
-                    ConvertBytes.byteListToInum(runtime, num, 10, true);
-        }
-
-        %%{
-            machine JSON_float;
-            include JSON_common;
-
-            write data;
-
-            action exit {
-                fhold;
-                fbreak;
-            }
-
-            main := '-'?
-                    ( ( ( '0' | [1-9][0-9]* ) '.' [0-9]+ ( [Ee] [+\-]?[0-9]+ )? )
-                    | ( ( '0' | [1-9][0-9]* ) ( [Ee] [+\-]? [0-9]+ ) ) )
-                    ( ^[0-9Ee.\-]? @exit );
-        }%%
-
-        void parseFloat(ParserResult res, int p, int pe) {
-            int new_p = parseFloatInternal(p, pe);
-            if (new_p == -1) {
-                res.update(null, p);
-                return;
-            }
-            RubyFloat number = createFloat(p, new_p);
-            res.update(number, new_p + 1);
-            return;
-        }
-
-        int parseFloatInternal(int p, int pe) {
-            int cs = EVIL;
-
-            %% write init;
-            int memo = p;
-            %% write exec;
-
-            if (cs < JSON_float_first_final) {
-                return -1;
-            }
-            
-            return p;
-        }
-        
-        RubyFloat createFloat(int p, int new_p) {
-            Ruby runtime = getRuntime();
-            ByteList num = absSubSequence(p, new_p);
-            return RubyFloat.newFloat(runtime, dc.parse(num, true, runtime.is1_9()));
-        }
-
-        %%{
-            machine JSON_string;
-            include JSON_common;
-
-            write data;
-
-            action parse_string {
-                int offset = byteList.begin();
-                ByteList decoded = decoder.decode(byteList, memo + 1 - offset,
-                                                  p - offset);
-                result = getRuntime().newString(decoded);
-                if (result == null) {
-                    fhold;
-                    fbreak;
-                } else {
-                    fexec p + 1;
-                }
-            }
-
-            action exit {
-                fhold;
-                fbreak;
-            }
-
-            main := '"'
-                    ( ( ^(["\\]|0..0x1f)
-                      | '\\'["\\/bfnrt]
-                      | '\\u'[0-9a-fA-F]{4}
-                      | '\\'^(["\\/bfnrtu]|0..0x1f)
-                      )* %parse_string
-                    ) '"' @exit;
-        }%%
-
-        void parseString(ParserResult res, int p, int pe) {
-            int cs = EVIL;
-            IRubyObject result = null;
-
-            %% write init;
-            int memo = p;
-            %% write exec;
-
-            if (parser.createAdditions) {
-                RubyHash match_string = parser.match_string;
-                if (match_string != null) {
-                    final IRubyObject[] memoArray = { result, null };
-                    try {
-                      match_string.visitAll(new RubyHash.Visitor() {
-                          @Override
-                          public void visit(IRubyObject pattern, IRubyObject klass) {
-                              if (pattern.callMethod(context, "===", memoArray[0]).isTrue()) {
-                                  memoArray[1] = klass;
-                                  throw JumpException.SPECIAL_JUMP;
-                              }
-                          }
-                      });
-                    } catch (JumpException e) { }
-                    if (memoArray[1] != null) {
-                        RubyClass klass = (RubyClass) memoArray[1];
-                        if (klass.respondsTo("json_creatable?") &&
-                            klass.callMethod(context, "json_creatable?").isTrue()) {
-                            result = klass.callMethod(context, "json_create", result);
-                        }
-                    }
-                }
-            }
-
-            if (cs >= JSON_string_first_final && result != null) {
-                RuntimeInfo info = RuntimeInfo.forRuntime(context.getRuntime());
-                if (info.encodingsSupported() && result instanceof RubyString) {
-                  ((RubyString)result).force_encoding(context, info.utf8.get());
-                }
-                res.update(result, p + 1);
-            } else {
-                res.update(null, p + 1);
-            }
-        }
-
-        %%{
-            machine JSON_array;
-            include JSON_common;
-
-            write data;
-
-            action parse_value {
-                parseValue(res, fpc, pe);
-                if (res.result == null) {
-                    fhold;
-                    fbreak;
-                } else {
-                    if (parser.arrayClass == getRuntime().getArray()) {
-                        ((RubyArray)result).append(res.result);
-                    } else {
-                        result.callMethod(context, "<<", res.result);
-                    }
-                    fexec res.p;
-                }
-            }
-
-            action exit {
-                fhold;
-                fbreak;
-            }
-
-            next_element = value_separator ignore* begin_value >parse_value;
-
-            main := begin_array
-                    ignore*
-                    ( ( begin_value >parse_value
-                        ignore* )
-                      ( ignore*
-                        next_element
-                        ignore* )* )?
-                    ignore*
-                    end_array @exit;
-        }%%
-
-        void parseArray(ParserResult res, int p, int pe) {
-            int cs = EVIL;
-
-            if (parser.maxNesting > 0 && currentNesting > parser.maxNesting) {
-                throw newException(Utils.M_NESTING_ERROR,
-                    "nesting of " + currentNesting + " is too deep");
-            }
-
-            IRubyObject result;
-            if (parser.arrayClass == getRuntime().getArray()) {
-                result = RubyArray.newArray(getRuntime());
-            } else {
-                result = parser.arrayClass.newInstance(context,
-                        IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
-            }
-
-            %% write init;
-            %% write exec;
-
-            if (cs >= JSON_array_first_final) {
-                res.update(result, p + 1);
-            } else {
-                throw unexpectedToken(p, pe);
-            }
-        }
-
-        %%{
-            machine JSON_object;
-            include JSON_common;
-
-            write data;
-
-            action parse_value {
-                parseValue(res, fpc, pe);
-                if (res.result == null) {
-                    fhold;
-                    fbreak;
-                } else {
-                    if (parser.objectClass == getRuntime().getHash()) {
-                        ((RubyHash)result).op_aset(context, lastName, res.result);
-                    } else {
-                        result.callMethod(context, "[]=", new IRubyObject[] { lastName, res.result });
-                    }
-                    fexec res.p;
-                }
-            }
-
-            action parse_name {
-                parseString(res, fpc, pe);
-                if (res.result == null) {
-                    fhold;
-                    fbreak;
-                } else {
-                    RubyString name = (RubyString)res.result;
-                    if (parser.symbolizeNames) {
-                        lastName = context.getRuntime().is1_9()
-                                       ? name.intern19()
-                                       : name.intern();
-                    } else {
-                        lastName = name;
-                    }
-                    fexec res.p;
-                }
-            }
-
-            action exit {
-                fhold;
-                fbreak;
-            }
-            
-            pair      = ignore* begin_name >parse_name ignore* name_separator
-              ignore* begin_value >parse_value;
-            next_pair = ignore* value_separator pair;
-
-            main := (
-              begin_object (pair (next_pair)*)? ignore* end_object
-            ) @exit;
-        }%%
-
-        void parseObject(ParserResult res, int p, int pe) {
-            int cs = EVIL;
-            IRubyObject lastName = null;
-            boolean objectDefault = true;
-
-            if (parser.maxNesting > 0 && currentNesting > parser.maxNesting) {
-                throw newException(Utils.M_NESTING_ERROR,
-                    "nesting of " + currentNesting + " is too deep");
-            }
-
-            // this is guaranteed to be a RubyHash due to the earlier
-            // allocator test at OptionsReader#getClass
-            IRubyObject result;
-            if (parser.objectClass == getRuntime().getHash()) {
-                result = RubyHash.newHash(getRuntime());
-            } else {
-                objectDefault = false;
-                result = parser.objectClass.newInstance(context,
-                        IRubyObject.NULL_ARRAY, Block.NULL_BLOCK);
-            }
-
-            %% write init;
-            %% write exec;
-
-            if (cs < JSON_object_first_final) {
-                res.update(null, p + 1);
-                return;
-            }
-
-            IRubyObject returnedResult = result;
-
-            // attempt to de-serialize object
-            if (parser.createAdditions) {
-                IRubyObject vKlassName;
-                if (objectDefault) {
-                    vKlassName = ((RubyHash)result).op_aref(context, parser.createId);
-                } else {
-                    vKlassName = result.callMethod(context, "[]", parser.createId);
-                }
-
-                if (!vKlassName.isNil()) {
-                    // might throw ArgumentError, we let it propagate
-                    IRubyObject klass = parser.info.jsonModule.get().
-                            callMethod(context, "deep_const_get", vKlassName);
-                    if (klass.respondsTo("json_creatable?") &&
-                        klass.callMethod(context, "json_creatable?").isTrue()) {
-
-                        returnedResult = klass.callMethod(context, "json_create", result);
-                    }
-                }
-            }
-            res.update(returnedResult, p + 1);
-        }
-
-        %%{
-            machine JSON;
-            include JSON_common;
-
-            write data;
-
-            action parse_object {
-                currentNesting = 1;
-                parseObject(res, fpc, pe);
-                if (res.result == null) {
-                    fhold;
-                    fbreak;
-                } else {
-                    result = res.result;
-                    fexec res.p;
-                }
-            }
-
-            action parse_array {
-                currentNesting = 1;
-                parseArray(res, fpc, pe);
-                if (res.result == null) {
-                    fhold;
-                    fbreak;
-                } else {
-                    result = res.result;
-                    fexec res.p;
-                }
-            }
-
-            main := ignore*
-                    ( begin_object >parse_object
-                    | begin_array >parse_array )
-                    ignore*;
-        }%%
-
-        public IRubyObject parseStrict() {
-            int cs = EVIL;
-            int p, pe;
-            IRubyObject result = null;
-            ParserResult res = new ParserResult();
-
-            %% write init;
-            p = byteList.begin();
-            pe = p + byteList.length();
-            %% write exec;
-
-            if (cs >= JSON_first_final && p == pe) {
-                return result;
-            } else {
-                throw unexpectedToken(p, pe);
-            }
-        }
-
-        %%{
-            machine JSON_quirks_mode;
-            include JSON_common;
-
-            write data;
-
-            action parse_value {
-                parseValue(res, fpc, pe);
-                if (res.result == null) {
-                    fhold;
-                    fbreak;
-                } else {
-                    result = res.result;
-                    fexec res.p;
-                }
-            }
-
-            main := ignore*
-                    ( begin_value >parse_value)
-                    ignore*;
-        }%%
-
-        public IRubyObject parseQuirksMode() {
-            int cs = EVIL;
-            int p, pe;
-            IRubyObject result = null;
-            ParserResult res = new ParserResult();
-
-            %% write init;
-            p = byteList.begin();
-            pe = p + byteList.length();
-            %% write exec;
-
-            if (cs >= JSON_quirks_mode_first_final && p == pe) {
-                return result;
-            } else {
-                throw unexpectedToken(p, pe);
-            }
-        }
-
-        public IRubyObject parse() {
-          if (parser.quirksMode) {
-            return parseQuirksMode();
-          } else {
-            return parseStrict();
-          }
-
-        }
-
-        /**
-         * Updates the "view" bytelist with the new offsets and returns it.
-         * @param start
-         * @param end
-         */
-        private ByteList absSubSequence(int absStart, int absEnd) {
-            view.setBegin(absStart);
-            view.setRealSize(absEnd - absStart);
-            return view;
-        }
-
-        /**
-         * Retrieves a constant directly descended from the <code>JSON</code> module.
-         * @param name The constant name
-         */
-        private IRubyObject getConstant(String name) {
-            return parser.info.jsonModule.get().getConstant(name);
-        }
-
-        private RaiseException newException(String className, String message) {
-            return Utils.newException(context, className, message);
-        }
-
-        private RaiseException newException(String className, RubyString message) {
-            return Utils.newException(context, className, message);
-        }
-
-        private RaiseException newException(String className,
-                String messageBegin, ByteList messageEnd) {
-            return newException(className,
-                    getRuntime().newString(messageBegin).cat(messageEnd));
-        }
-    }
-}
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/ParserService.java b/vendor/json_pure-1.7.7/java/src/json/ext/ParserService.java
deleted file mode 100644
index dde8834..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/ParserService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import java.io.IOException;
-import java.lang.ref.WeakReference;
-
-import org.jruby.Ruby;
-import org.jruby.RubyClass;
-import org.jruby.RubyModule;
-import org.jruby.runtime.load.BasicLibraryService;
-
-/**
- * The service invoked by JRuby's {@link org.jruby.runtime.load.LoadService LoadService}.
- * Defines the <code>JSON::Ext::Parser</code> class.
- * @author mernen
- */
-public class ParserService implements BasicLibraryService {
-    public boolean basicLoad(Ruby runtime) throws IOException {
-        runtime.getLoadService().require("json/common");
-        RuntimeInfo info = RuntimeInfo.initRuntime(runtime);
-
-        info.jsonModule = new WeakReference<RubyModule>(runtime.defineModule("JSON"));
-        RubyModule jsonExtModule = info.jsonModule.get().defineModuleUnder("Ext");
-        RubyClass parserClass =
-            jsonExtModule.defineClassUnder("Parser", runtime.getObject(),
-                                           Parser.ALLOCATOR);
-        parserClass.defineAnnotatedMethods(Parser.class);
-        return true;
-    }
-}
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/RuntimeInfo.java b/vendor/json_pure-1.7.7/java/src/json/ext/RuntimeInfo.java
deleted file mode 100644
index 5de5740..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/RuntimeInfo.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import java.lang.ref.WeakReference;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.WeakHashMap;
-import org.jruby.Ruby;
-import org.jruby.RubyClass;
-import org.jruby.RubyEncoding;
-import org.jruby.RubyModule;
-import org.jruby.runtime.ThreadContext;
-import org.jruby.runtime.builtin.IRubyObject;
-
-
-final class RuntimeInfo {
-    // since the vast majority of cases runs just one runtime,
-    // we optimize for that
-    private static WeakReference<Ruby> runtime1 = new WeakReference<Ruby>(null);
-    private static RuntimeInfo info1;
-    // store remaining runtimes here (does not include runtime1)
-    private static Map<Ruby, RuntimeInfo> runtimes;
-
-    // these fields are filled by the service loaders
-    // Use WeakReferences so that RuntimeInfo doesn't indirectly hold a hard reference to
-    // the Ruby runtime object, which would cause memory leaks in the runtimes map above.
-    /** JSON */
-    WeakReference<RubyModule> jsonModule;
-    /** JSON::Ext::Generator::GeneratorMethods::String::Extend */
-    WeakReference<RubyModule> stringExtendModule;
-    /** JSON::Ext::Generator::State */
-    WeakReference<RubyClass> generatorStateClass;
-    /** JSON::SAFE_STATE_PROTOTYPE */
-    WeakReference<GeneratorState> safeStatePrototype;
-
-    final WeakReference<RubyEncoding> utf8;
-    final WeakReference<RubyEncoding> ascii8bit;
-    // other encodings
-    private final Map<String, WeakReference<RubyEncoding>> encodings;
-
-    private RuntimeInfo(Ruby runtime) {
-        RubyClass encodingClass = runtime.getEncoding();
-        if (encodingClass == null) { // 1.8 mode
-            utf8 = ascii8bit = null;
-            encodings = null;
-        } else {
-            ThreadContext context = runtime.getCurrentContext();
-
-            utf8 = new WeakReference<RubyEncoding>((RubyEncoding)RubyEncoding.find(context,
-                    encodingClass, runtime.newString("utf-8")));
-            ascii8bit = new WeakReference<RubyEncoding>((RubyEncoding)RubyEncoding.find(context,
-                    encodingClass, runtime.newString("ascii-8bit")));
-            encodings = new HashMap<String, WeakReference<RubyEncoding>>();
-        }
-    }
-
-    static RuntimeInfo initRuntime(Ruby runtime) {
-        synchronized (RuntimeInfo.class) {
-            if (runtime1.get() == runtime) {
-                return info1;
-            } else if (runtime1.get() == null) {
-                runtime1 = new WeakReference<Ruby>(runtime);
-                info1 = new RuntimeInfo(runtime);
-                return info1;
-            } else {
-                if (runtimes == null) {
-                    runtimes = new WeakHashMap<Ruby, RuntimeInfo>(1);
-                }
-                RuntimeInfo cache = runtimes.get(runtime);
-                if (cache == null) {
-                    cache = new RuntimeInfo(runtime);
-                    runtimes.put(runtime, cache);
-                }
-                return cache;
-            }
-        }
-    }
-
-    public static RuntimeInfo forRuntime(Ruby runtime) {
-        synchronized (RuntimeInfo.class) {
-            if (runtime1.get() == runtime) return info1;
-            RuntimeInfo cache = null;
-            if (runtimes != null) cache = runtimes.get(runtime);
-            assert cache != null : "Runtime given has not initialized JSON::Ext";
-            return cache;
-        }
-    }
-
-    public boolean encodingsSupported() {
-        return utf8 != null && utf8.get() != null;
-    }
-
-    public RubyEncoding getEncoding(ThreadContext context, String name) {
-        synchronized (encodings) {
-            WeakReference<RubyEncoding> encoding = encodings.get(name);
-            if (encoding == null) {
-                Ruby runtime = context.getRuntime();
-                encoding = new WeakReference<RubyEncoding>((RubyEncoding)RubyEncoding.find(context,
-                        runtime.getEncoding(), runtime.newString(name)));
-                encodings.put(name, encoding);
-            }
-            return encoding.get();
-        }
-    }
-
-    public GeneratorState getSafeStatePrototype(ThreadContext context) {
-        if (safeStatePrototype == null) {
-            IRubyObject value = jsonModule.get().getConstant("SAFE_STATE_PROTOTYPE");
-            if (!(value instanceof GeneratorState)) {
-                throw context.getRuntime().newTypeError(value, generatorStateClass.get());
-            }
-            safeStatePrototype = new WeakReference<GeneratorState>((GeneratorState)value);
-        }
-        return safeStatePrototype.get();
-    }
-}
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/StringDecoder.java b/vendor/json_pure-1.7.7/java/src/json/ext/StringDecoder.java
deleted file mode 100644
index 6023113..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/StringDecoder.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import org.jruby.exceptions.RaiseException;
-import org.jruby.runtime.ThreadContext;
-import org.jruby.util.ByteList;
-
-/**
- * A decoder that reads a JSON-encoded string from the given sources and
- * returns its decoded form on a new ByteList. Escaped Unicode characters
- * are encoded as UTF-8.
- */
-final class StringDecoder extends ByteListTranscoder {
-    /**
-     * Stores the offset of the high surrogate when reading a surrogate pair,
-     * or -1 when not.
-     */
-    private int surrogatePairStart = -1;
-
-    // Array used for writing multi-byte characters into the buffer at once
-    private final byte[] aux = new byte[4];
-
-    StringDecoder(ThreadContext context) {
-        super(context);
-    }
-
-    ByteList decode(ByteList src, int start, int end) {
-        ByteList out = new ByteList(end - start);
-        out.setEncoding(src.getEncoding());
-        init(src, start, end, out);
-        while (hasNext()) {
-            handleChar(readUtf8Char());
-        }
-        quoteStop(pos);
-        return out;
-    }
-
-    private void handleChar(int c) {
-        if (c == '\\') {
-            quoteStop(charStart);
-            handleEscapeSequence();
-        } else {
-            quoteStart();
-        }
-    }
-
-    private void handleEscapeSequence() {
-        ensureMin(1);
-        switch (readUtf8Char()) {
-        case 'b':
-            append('\b');
-            break;
-        case 'f':
-            append('\f');
-            break;
-        case 'n':
-            append('\n');
-            break;
-        case 'r':
-            append('\r');
-            break;
-        case 't':
-            append('\t');
-            break;
-        case 'u':
-            ensureMin(4);
-            int cp = readHex();
-            if (Character.isHighSurrogate((char)cp)) {
-                handleLowSurrogate((char)cp);
-            } else if (Character.isLowSurrogate((char)cp)) {
-                // low surrogate with no high surrogate
-                throw invalidUtf8();
-            } else {
-                writeUtf8Char(cp);
-            }
-            break;
-        default: // '\\', '"', '/'...
-            quoteStart();
-        }
-    }
-
-    private void handleLowSurrogate(char highSurrogate) {
-        surrogatePairStart = charStart;
-        ensureMin(1);
-        int lowSurrogate = readUtf8Char();
-
-        if (lowSurrogate == '\\') {
-            ensureMin(5);
-            if (readUtf8Char() != 'u') throw invalidUtf8();
-            lowSurrogate = readHex();
-        }
-
-        if (Character.isLowSurrogate((char)lowSurrogate)) {
-            writeUtf8Char(Character.toCodePoint(highSurrogate,
-                                                (char)lowSurrogate));
-            surrogatePairStart = -1;
-        } else {
-            throw invalidUtf8();
-        }
-    }
-
-    private void writeUtf8Char(int codePoint) {
-        if (codePoint < 0x80) {
-            append(codePoint);
-        } else if (codePoint < 0x800) {
-            aux[0] = (byte)(0xc0 | (codePoint >>> 6));
-            aux[1] = tailByte(codePoint & 0x3f);
-            append(aux, 0, 2);
-        } else if (codePoint < 0x10000) {
-            aux[0] = (byte)(0xe0 | (codePoint >>> 12));
-            aux[1] = tailByte(codePoint >>> 6);
-            aux[2] = tailByte(codePoint);
-            append(aux, 0, 3);
-        } else {
-            aux[0] = (byte)(0xf0 | codePoint >>> 18);
-            aux[1] = tailByte(codePoint >>> 12);
-            aux[2] = tailByte(codePoint >>> 6);
-            aux[3] = tailByte(codePoint);
-            append(aux, 0, 4);
-        }
-    }
-
-    private byte tailByte(int value) {
-        return (byte)(0x80 | (value & 0x3f));
-    }
-
-    /**
-     * Reads a 4-digit unsigned hexadecimal number from the source.
-     */
-    private int readHex() {
-        int numberStart = pos;
-        int result = 0;
-        int length = 4;
-        for (int i = 0; i < length; i++) {
-            int digit = readUtf8Char();
-            int digitValue;
-            if (digit >= '0' && digit <= '9') {
-                digitValue = digit - '0';
-            } else if (digit >= 'a' && digit <= 'f') {
-                digitValue = 10 + digit - 'a';
-            } else if (digit >= 'A' && digit <= 'F') {
-                digitValue = 10 + digit - 'A';
-            } else {
-                throw new NumberFormatException("Invalid base 16 number "
-                        + src.subSequence(numberStart, numberStart + length));
-            }
-            result = result * 16 + digitValue;
-        }
-        return result;
-    }
-
-    @Override
-    protected RaiseException invalidUtf8() {
-        ByteList message = new ByteList(
-                ByteList.plain("partial character in source, " +
-                               "but hit end near "));
-        int start = surrogatePairStart != -1 ? surrogatePairStart : charStart;
-        message.append(src, start, srcEnd - start);
-        return Utils.newException(context, Utils.M_PARSER_ERROR,
-                                  context.getRuntime().newString(message));
-    }
-}
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/StringEncoder.java b/vendor/json_pure-1.7.7/java/src/json/ext/StringEncoder.java
deleted file mode 100644
index 57bd19b..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/StringEncoder.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package json.ext;
-
-import org.jruby.exceptions.RaiseException;
-import org.jruby.runtime.ThreadContext;
-import org.jruby.util.ByteList;
-
-/**
- * An encoder that reads from the given source and outputs its representation
- * to another ByteList. The source string is fully checked for UTF-8 validity,
- * and throws a GeneratorError if any problem is found.
- */
-final class StringEncoder extends ByteListTranscoder {
-    private final boolean asciiOnly;
-
-    // Escaped characters will reuse this array, to avoid new allocations
-    // or appending them byte-by-byte
-    private final byte[] aux =
-        new byte[] {/* First unicode character */
-                    '\\', 'u', 0, 0, 0, 0,
-                    /* Second unicode character (for surrogate pairs) */
-                    '\\', 'u', 0, 0, 0, 0,
-                    /* "\X" characters */
-                    '\\', 0};
-    // offsets on the array above
-    private static final int ESCAPE_UNI1_OFFSET = 0;
-    private static final int ESCAPE_UNI2_OFFSET = ESCAPE_UNI1_OFFSET + 6;
-    private static final int ESCAPE_CHAR_OFFSET = ESCAPE_UNI2_OFFSET + 6;
-    /** Array used for code point decomposition in surrogates */
-    private final char[] utf16 = new char[2];
-
-    private static final byte[] HEX =
-            new byte[] {'0', '1', '2', '3', '4', '5', '6', '7',
-                        '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
-
-    StringEncoder(ThreadContext context, boolean asciiOnly) {
-        super(context);
-        this.asciiOnly = asciiOnly;
-    }
-
-    void encode(ByteList src, ByteList out) {
-        init(src, out);
-        append('"');
-        while (hasNext()) {
-            handleChar(readUtf8Char());
-        }
-        quoteStop(pos);
-        append('"');
-    }
-
-    private void handleChar(int c) {
-        switch (c) {
-        case '"':
-        case '\\':
-            escapeChar((char)c);
-            break;
-        case '\n':
-            escapeChar('n');
-            break;
-        case '\r':
-            escapeChar('r');
-            break;
-        case '\t':
-            escapeChar('t');
-            break;
-        case '\f':
-            escapeChar('f');
-            break;
-        case '\b':
-            escapeChar('b');
-            break;
-        default:
-            if (c >= 0x20 && c <= 0x7f ||
-                    (c >= 0x80 && !asciiOnly)) {
-                quoteStart();
-            } else {
-                quoteStop(charStart);
-                escapeUtf8Char(c);
-            }
-        }
-    }
-
-    private void escapeChar(char c) {
-        quoteStop(charStart);
-        aux[ESCAPE_CHAR_OFFSET + 1] = (byte)c;
-        append(aux, ESCAPE_CHAR_OFFSET, 2);
-    }
-
-    private void escapeUtf8Char(int codePoint) {
-        int numChars = Character.toChars(codePoint, utf16, 0);
-        escapeCodeUnit(utf16[0], ESCAPE_UNI1_OFFSET + 2);
-        if (numChars > 1) escapeCodeUnit(utf16[1], ESCAPE_UNI2_OFFSET + 2);
-        append(aux, ESCAPE_UNI1_OFFSET, 6 * numChars);
-    }
-
-    private void escapeCodeUnit(char c, int auxOffset) {
-        for (int i = 0; i < 4; i++) {
-            aux[auxOffset + i] = HEX[(c >>> (12 - 4 * i)) & 0xf];
-        }
-    }
-
-    @Override
-    protected RaiseException invalidUtf8() {
-         return Utils.newException(context, Utils.M_GENERATOR_ERROR,
-                 "source sequence is illegal/malformed utf-8");
-    }
-}
diff --git a/vendor/json_pure-1.7.7/java/src/json/ext/Utils.java b/vendor/json_pure-1.7.7/java/src/json/ext/Utils.java
deleted file mode 100644
index 44d6a55..0000000
--- a/vendor/json_pure-1.7.7/java/src/json/ext/Utils.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * This code is copyrighted work by Daniel Luz <dev at mernen dot com>.
- *
- * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files
- * for details.
- */
-package json.ext;
-
-import org.jruby.Ruby;
-import org.jruby.RubyArray;
-import org.jruby.RubyClass;
-import org.jruby.RubyException;
-import org.jruby.RubyHash;
-import org.jruby.RubyString;
-import org.jruby.exceptions.RaiseException;
-import org.jruby.runtime.Block;
-import org.jruby.runtime.ThreadContext;
-import org.jruby.runtime.builtin.IRubyObject;
-import org.jruby.util.ByteList;
-
-/**
- * Library of miscellaneous utility functions
- */
-final class Utils {
-    public static final String M_GENERATOR_ERROR = "GeneratorError";
-    public static final String M_NESTING_ERROR = "NestingError";
-    public static final String M_PARSER_ERROR = "ParserError";
-
-    private Utils() {
-        throw new RuntimeException();
-    }
-
-    /**
-     * Safe {@link RubyArray} type-checking.
-     * Returns the given object if it is an <code>Array</code>,
-     * or throws an exception if not.
-     * @param object The object to test
-     * @return The given object if it is an <code>Array</code>
-     * @throws RaiseException <code>TypeError</code> if the object is not
-     *                        of the expected type
-     */
-    static RubyArray ensureArray(IRubyObject object) throws RaiseException {
-        if (object instanceof RubyArray) return (RubyArray)object;
-        Ruby runtime = object.getRuntime();
-        throw runtime.newTypeError(object, runtime.getArray());
-    }
-
-    static RubyHash ensureHash(IRubyObject object) throws RaiseException {
-        if (object instanceof RubyHash) return (RubyHash)object;
-        Ruby runtime = object.getRuntime();
-        throw runtime.newTypeError(object, runtime.getHash());
-    }
-
-    static RubyString ensureString(IRubyObject object) throws RaiseException {
-        if (object instanceof RubyString) return (RubyString)object;
-        Ruby runtime = object.getRuntime();
-        throw runtime.newTypeError(object, runtime.getString());
-    }
-
-    static RaiseException newException(ThreadContext context,
-                                       String className, String message) {
-        return newException(context, className,
-                            context.getRuntime().newString(message));
-    }
-
-    static RaiseException newException(ThreadContext context,
-                                       String className, RubyString message) {
-        RuntimeInfo info = RuntimeInfo.forRuntime(context.getRuntime());
-        RubyClass klazz = info.jsonModule.get().getClass(className);
-        RubyException excptn =
-            (RubyException)klazz.newInstance(context,
-                new IRubyObject[] {message}, Block.NULL_BLOCK);
-        return new RaiseException(excptn);
-    }
-
-    static byte[] repeat(ByteList a, int n) {
-        return repeat(a.unsafeBytes(), a.begin(), a.length(), n);
-    }
-
-    static byte[] repeat(byte[] a, int begin, int length, int n) {
-        if (length == 0) return ByteList.NULL_ARRAY;
-        int resultLen = length * n;
-        byte[] result = new byte[resultLen];
-        for (int pos = 0; pos < resultLen; pos += length) {
-            System.arraycopy(a, begin, result, pos, length);
-        }
-        return result;
-    }
-}
diff --git a/vendor/json_pure-1.7.7/json-java.gemspec b/vendor/json_pure-1.7.7/json-java.gemspec
deleted file mode 100644
index 79d8e3a..0000000
--- a/vendor/json_pure-1.7.7/json-java.gemspec
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env jruby
-require "rubygems"
-
-spec = Gem::Specification.new do |s|
-  s.name = "json"
-  s.version = File.read("VERSION").chomp
-  s.summary = "JSON implementation for JRuby"
-  s.description = "A JSON implementation as a JRuby extension."
-  s.author = "Daniel Luz"
-  s.email = "dev+ruby at mernen.com"
-  s.homepage = "http://json-jruby.rubyforge.org/"
-  s.platform = 'java'
-  s.rubyforge_project = "json-jruby"
-  s.license = "Ruby"
-
-  s.files = Dir["{docs,lib,tests}/**/*"]
-end
-
-if $0 == __FILE__
-  Gem::Builder.new(spec).build
-else
-  spec
-end
diff --git a/vendor/json_pure-1.7.7/json.gemspec b/vendor/json_pure-1.7.7/json.gemspec
deleted file mode 100644
index bd83be9..0000000
--- a/vendor/json_pure-1.7.7/json.gemspec
+++ /dev/null
@@ -1,37 +0,0 @@
-# -*- encoding: utf-8 -*-
-
-Gem::Specification.new do |s|
-  s.name = "json"
-  s.version = "1.7.7"
-
-  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
-  s.authors = ["Florian Frank"]
-  s.date = "2013-02-11"
-  s.description = "This is a JSON implementation as a Ruby extension in C."
-  s.email = "flori at ping.de"
-  s.extensions = ["ext/json/ext/generator/extconf.rb", "ext/json/ext/parser/extconf.rb"]
-  s.extra_rdoc_files = ["README.rdoc"]
-  s.files = [".gitignore", ".travis.yml", "CHANGES", "COPYING", "COPYING-json-jruby", "GPL", "Gemfile", "README-json-jruby.markdown", "README.rdoc", "Rakefile", "TODO", "VERSION", "data/example.json", "data/index.html", "data/prototype.js", "diagrams/.keep", "ext/json/ext/fbuffer/fbuffer.h", "ext/json/ext/generator/depend", "ext/json/ext/generator/extconf.rb", "ext/json/ext/generator/generator.c", "ext/json/ext/generator/generator.h", "ext/json/ext/parser/depend", "ext/json/ext/parser/ex [...]
-  s.homepage = "http://flori.github.com/json"
-  s.licenses = ["Ruby"]
-  s.rdoc_options = ["--title", "JSON implemention for Ruby", "--main", "README.rdoc"]
-  s.require_paths = ["lib"]
-  s.rubygems_version = "1.8.25"
-  s.summary = "JSON Implementation for Ruby"
-  s.test_files = ["./tests/test_json.rb", "./tests/test_json_addition.rb", "./tests/test_json_encoding.rb", "./tests/test_json_fixtures.rb", "./tests/test_json_generate.rb", "./tests/test_json_generic_object.rb", "./tests/test_json_string_matching.rb", "./tests/test_json_unicode.rb"]
-
-  if s.respond_to? :specification_version then
-    s.specification_version = 3
-
-    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
-      s.add_development_dependency(%q<permutation>, [">= 0"])
-      s.add_development_dependency(%q<sdoc>, ["~> 0.3.16"]) if RUBY_VERSION > "1.8.6"
-    else
-      s.add_dependency(%q<permutation>, [">= 0"])
-      s.add_dependency(%q<sdoc>, ["~> 0.3.16"]) if RUBY_VERSION > "1.8.6"
-    end
-  else
-    s.add_dependency(%q<permutation>, [">= 0"])
-    s.add_dependency(%q<sdoc>, ["~> 0.3.16"]) if RUBY_VERSION > "1.8.6"
-  end
-end
diff --git a/vendor/json_pure-1.7.7/json_pure.gemspec b/vendor/json_pure-1.7.7/json_pure.gemspec
deleted file mode 100644
index 2d8ccf3..0000000
--- a/vendor/json_pure-1.7.7/json_pure.gemspec
+++ /dev/null
@@ -1,39 +0,0 @@
-# -*- encoding: utf-8 -*-
-
-Gem::Specification.new do |s|
-  s.name = "json_pure"
-  s.version = "1.7.7"
-
-  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
-  s.authors = ["Florian Frank"]
-  s.date = "2013-02-11"
-  s.description = "This is a JSON implementation in pure Ruby."
-  s.email = "flori at ping.de"
-  s.extra_rdoc_files = ["README.rdoc"]
-  s.files = [".gitignore", ".travis.yml", "CHANGES", "COPYING", "COPYING-json-jruby", "GPL", "Gemfile", "README-json-jruby.markdown", "README.rdoc", "Rakefile", "TODO", "VERSION", "data/example.json", "data/index.html", "data/prototype.js", "diagrams/.keep", "ext/json/ext/fbuffer/fbuffer.h", "ext/json/ext/generator/depend", "ext/json/ext/generator/extconf.rb", "ext/json/ext/generator/generator.c", "ext/json/ext/generator/generator.h", "ext/json/ext/parser/depend", "ext/json/ext/parser/ex [...]
-  s.homepage = "http://flori.github.com/json"
-  s.licenses = ["Ruby"]
-  s.rdoc_options = ["--title", "JSON implemention for ruby", "--main", "README.rdoc"]
-  s.require_paths = ["lib"]
-  s.rubygems_version = "1.8.25"
-  s.summary = "JSON Implementation for Ruby"
-  s.test_files = ["./tests/test_json.rb", "./tests/test_json_addition.rb", "./tests/test_json_encoding.rb", "./tests/test_json_fixtures.rb", "./tests/test_json_generate.rb", "./tests/test_json_generic_object.rb", "./tests/test_json_string_matching.rb", "./tests/test_json_unicode.rb"]
-
-  if s.respond_to? :specification_version then
-    s.specification_version = 3
-
-    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
-      s.add_development_dependency(%q<permutation>, [">= 0"])
-      s.add_development_dependency(%q<sdoc>, ["~> 0.3.16"]) if RUBY_VERSION > "1.8.6"
-      s.add_development_dependency(%q<rake>, ["~> 0.9.2"])
-    else
-      s.add_dependency(%q<permutation>, [">= 0"])
-      s.add_dependency(%q<sdoc>, ["~> 0.3.16"]) if RUBY_VERSION > "1.8.6"
-      s.add_dependency(%q<rake>, ["~> 0.9.2"])
-    end
-  else
-    s.add_dependency(%q<permutation>, [">= 0"])
-    s.add_dependency(%q<sdoc>, ["~> 0.3.16"]) if RUBY_VERSION > "1.8.6"
-    s.add_dependency(%q<rake>, ["~> 0.9.2"])
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json.rb b/vendor/json_pure-1.7.7/lib/json.rb
deleted file mode 100644
index 24aa385..0000000
--- a/vendor/json_pure-1.7.7/lib/json.rb
+++ /dev/null
@@ -1,62 +0,0 @@
-require 'json/common'
-
-##
-# = JavaScript Object Notation (JSON)
-#
-# JSON is a lightweight data-interchange format. It is easy for us
-# humans to read and write. Plus, equally simple for machines to generate or parse.
-# JSON is completely language agnostic, making it the ideal interchange format.
-#
-# Built on two universally available structures:
-#   1. A collection of name/value pairs. Often referred to as an _object_, hash table, record, struct, keyed list, or associative array.
-#   2. An ordered list of values. More commonly called an _array_, vector, sequence or list.
-#
-# To read more about JSON visit: http://json.org
-#
-# == Parsing JSON
-#
-# To parse a JSON string received by another application or generated within
-# your existing application:
-#
-#   require 'json'
-#
-#   my_hash = JSON.parse('{"hello": "goodbye"}')
-#   puts my_hash["hello"] => "goodbye"
-#
-# Notice the extra quotes <tt>''</tt> around the hash notation. Ruby expects
-# the argument to be a string and can't convert objects like a hash or array.
-#
-# Ruby converts your string into a hash
-#
-# == Generating JSON
-#
-# Creating a JSON string for communication or serialization is
-# just as simple.
-#
-#   require 'json'
-#
-#   my_hash = {:hello => "goodbye"}
-#   puts JSON.generate(my_hash) => "{\"hello\":\"goodbye\"}"
-#
-# Or an alternative way:
-#
-#   require 'json'
-#   puts {:hello => "goodbye"}.to_json => "{\"hello\":\"goodbye\"}"
-#
-# <tt>JSON.generate</tt> only allows objects or arrays to be converted
-# to JSON syntax. <tt>to_json</tt>, however, accepts many Ruby classes
-# even though it acts only as a method for serialization:
-#
-#   require 'json'
-#
-#   1.to_json => "1"
-#
-module JSON
-  require 'json/version'
-
-  begin
-    require 'json/ext'
-  rescue LoadError
-    require 'json/pure'
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/add/bigdecimal.rb b/vendor/json_pure-1.7.7/lib/json/add/bigdecimal.rb
deleted file mode 100644
index 0ef69f1..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/bigdecimal.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
-  require 'json'
-end
-defined?(::BigDecimal) or require 'bigdecimal'
-
-class BigDecimal
-  # Import a JSON Marshalled object.
-  #
-  # method used for JSON marshalling support.
-  def self.json_create(object)
-    BigDecimal._load object['b']
-  end
-
-  # Marshal the object to JSON.
-  #
-  # method used for JSON marshalling support.
-  def as_json(*)
-    {
-      JSON.create_id => self.class.name,
-      'b'            => _dump,
-    }
-  end
-
-  # return the JSON value
-  def to_json(*)
-    as_json.to_json
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/add/complex.rb b/vendor/json_pure-1.7.7/lib/json/add/complex.rb
deleted file mode 100644
index d7ebebf..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/complex.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
-  require 'json'
-end
-defined?(::Complex) or require 'complex'
-
-class Complex
-  def self.json_create(object)
-    Complex(object['r'], object['i'])
-  end
-
-  def as_json(*)
-    {
-      JSON.create_id => self.class.name,
-      'r'            => real,
-      'i'            => imag,
-    }
-  end
-
-  def to_json(*)
-    as_json.to_json
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/add/core.rb b/vendor/json_pure-1.7.7/lib/json/add/core.rb
deleted file mode 100644
index 77d9dc0..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/core.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# This file requires the implementations of ruby core's custom objects for
-# serialisation/deserialisation.
-
-require 'json/add/date'
-require 'json/add/date_time'
-require 'json/add/exception'
-require 'json/add/range'
-require 'json/add/regexp'
-require 'json/add/struct'
-require 'json/add/symbol'
-require 'json/add/time'
diff --git a/vendor/json_pure-1.7.7/lib/json/add/date.rb b/vendor/json_pure-1.7.7/lib/json/add/date.rb
deleted file mode 100644
index 4288237..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/date.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
-  require 'json'
-end
-require 'date'
-
-# Date serialization/deserialization
-class Date
-
-  # Deserializes JSON string by converting Julian year <tt>y</tt>, month
-  # <tt>m</tt>, day <tt>d</tt> and Day of Calendar Reform <tt>sg</tt> to Date.
-  def self.json_create(object)
-    civil(*object.values_at('y', 'm', 'd', 'sg'))
-  end
-
-  alias start sg unless method_defined?(:start)
-
-  # Returns a hash, that will be turned into a JSON object and represent this
-  # object.
-  def as_json(*)
-    {
-      JSON.create_id => self.class.name,
-      'y' => year,
-      'm' => month,
-      'd' => day,
-      'sg' => start,
-    }
-  end
-
-  # Stores class name (Date) with Julian year <tt>y</tt>, month <tt>m</tt>, day
-  # <tt>d</tt> and Day of Calendar Reform <tt>sg</tt> as JSON string
-  def to_json(*args)
-    as_json.to_json(*args)
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/add/date_time.rb b/vendor/json_pure-1.7.7/lib/json/add/date_time.rb
deleted file mode 100644
index 5ea42ea..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/date_time.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
-  require 'json'
-end
-require 'date'
-
-# DateTime serialization/deserialization
-class DateTime
-
-  # Deserializes JSON string by converting year <tt>y</tt>, month <tt>m</tt>,
-  # day <tt>d</tt>, hour <tt>H</tt>, minute <tt>M</tt>, second <tt>S</tt>,
-  # offset <tt>of</tt> and Day of Calendar Reform <tt>sg</tt> to DateTime.
-  def self.json_create(object)
-    args = object.values_at('y', 'm', 'd', 'H', 'M', 'S')
-    of_a, of_b = object['of'].split('/')
-    if of_b and of_b != '0'
-      args << Rational(of_a.to_i, of_b.to_i)
-    else
-      args << of_a
-    end
-    args << object['sg']
-    civil(*args)
-  end
-
-  alias start sg unless method_defined?(:start)
-
-  # Returns a hash, that will be turned into a JSON object and represent this
-  # object.
-  def as_json(*)
-    {
-      JSON.create_id => self.class.name,
-      'y' => year,
-      'm' => month,
-      'd' => day,
-      'H' => hour,
-      'M' => min,
-      'S' => sec,
-      'of' => offset.to_s,
-      'sg' => start,
-    }
-  end
-
-  # Stores class name (DateTime) with Julian year <tt>y</tt>, month <tt>m</tt>,
-  # day <tt>d</tt>, hour <tt>H</tt>, minute <tt>M</tt>, second <tt>S</tt>,
-  # offset <tt>of</tt> and Day of Calendar Reform <tt>sg</tt> as JSON string
-  def to_json(*args)
-    as_json.to_json(*args)
-  end
-end
-
-
diff --git a/vendor/json_pure-1.7.7/lib/json/add/exception.rb b/vendor/json_pure-1.7.7/lib/json/add/exception.rb
deleted file mode 100644
index e6ad257..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/exception.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
-  require 'json'
-end
-
-# Exception serialization/deserialization
-class Exception
-
-  # Deserializes JSON string by constructing new Exception object with message
-  # <tt>m</tt> and backtrace <tt>b</tt> serialized with <tt>to_json</tt>
-  def self.json_create(object)
-    result = new(object['m'])
-    result.set_backtrace object['b']
-    result
-  end
-
-  # Returns a hash, that will be turned into a JSON object and represent this
-  # object.
-  def as_json(*)
-    {
-      JSON.create_id => self.class.name,
-      'm'            => message,
-      'b'            => backtrace,
-    }
-  end
-
-  # Stores class name (Exception) with message <tt>m</tt> and backtrace array
-  # <tt>b</tt> as JSON string
-  def to_json(*args)
-    as_json.to_json(*args)
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/add/ostruct.rb b/vendor/json_pure-1.7.7/lib/json/add/ostruct.rb
deleted file mode 100644
index da81e10..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/ostruct.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
-  require 'json'
-end
-require 'ostruct'
-
-# OpenStruct serialization/deserialization
-class OpenStruct
-
-  # Deserializes JSON string by constructing new Struct object with values
-  # <tt>v</tt> serialized by <tt>to_json</tt>.
-  def self.json_create(object)
-    new(object['t'] || object[:t])
-  end
-
-  # Returns a hash, that will be turned into a JSON object and represent this
-  # object.
-  def as_json(*)
-    klass = self.class.name
-    klass.to_s.empty? and raise JSON::JSONError, "Only named structs are supported!"
-    {
-      JSON.create_id => klass,
-      't'            => table,
-    }
-  end
-
-  # Stores class name (OpenStruct) with this struct's values <tt>v</tt> as a
-  # JSON string.
-  def to_json(*args)
-    as_json.to_json(*args)
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/add/range.rb b/vendor/json_pure-1.7.7/lib/json/add/range.rb
deleted file mode 100644
index e61e553..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/range.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
-  require 'json'
-end
-
-# Range serialization/deserialization
-class Range
-
-  # Deserializes JSON string by constructing new Range object with arguments
-  # <tt>a</tt> serialized by <tt>to_json</tt>.
-  def self.json_create(object)
-    new(*object['a'])
-  end
-
-  # Returns a hash, that will be turned into a JSON object and represent this
-  # object.
-  def as_json(*)
-    {
-      JSON.create_id  => self.class.name,
-      'a'             => [ first, last, exclude_end? ]
-    }
-  end
-
-  # Stores class name (Range) with JSON array of arguments <tt>a</tt> which
-  # include <tt>first</tt> (integer), <tt>last</tt> (integer), and
-  # <tt>exclude_end?</tt> (boolean) as JSON string.
-  def to_json(*args)
-    as_json.to_json(*args)
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/add/rational.rb b/vendor/json_pure-1.7.7/lib/json/add/rational.rb
deleted file mode 100644
index 867cd92..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/rational.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
-  require 'json'
-end
-defined?(::Rational) or require 'rational'
-
-class Rational
-  def self.json_create(object)
-    Rational(object['n'], object['d'])
-  end
-
-  def as_json(*)
-    {
-      JSON.create_id => self.class.name,
-      'n'            => numerator,
-      'd'            => denominator,
-    }
-  end
-
-  def to_json(*)
-    as_json.to_json
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/add/regexp.rb b/vendor/json_pure-1.7.7/lib/json/add/regexp.rb
deleted file mode 100644
index 2fcbb6f..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/regexp.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
-  require 'json'
-end
-
-# Regexp serialization/deserialization
-class Regexp
-
-  # Deserializes JSON string by constructing new Regexp object with source
-  # <tt>s</tt> (Regexp or String) and options <tt>o</tt> serialized by
-  # <tt>to_json</tt>
-  def self.json_create(object)
-    new(object['s'], object['o'])
-  end
-
-  # Returns a hash, that will be turned into a JSON object and represent this
-  # object.
-  def as_json(*)
-    {
-      JSON.create_id => self.class.name,
-      'o'            => options,
-      's'            => source,
-    }
-  end
-
-  # Stores class name (Regexp) with options <tt>o</tt> and source <tt>s</tt>
-  # (Regexp or String) as JSON string
-  def to_json(*)
-    as_json.to_json
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/add/struct.rb b/vendor/json_pure-1.7.7/lib/json/add/struct.rb
deleted file mode 100644
index 6847cde..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/struct.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
-  require 'json'
-end
-
-# Struct serialization/deserialization
-class Struct
-
-  # Deserializes JSON string by constructing new Struct object with values
-  # <tt>v</tt> serialized by <tt>to_json</tt>.
-  def self.json_create(object)
-    new(*object['v'])
-  end
-
-  # Returns a hash, that will be turned into a JSON object and represent this
-  # object.
-  def as_json(*)
-    klass = self.class.name
-    klass.to_s.empty? and raise JSON::JSONError, "Only named structs are supported!"
-    {
-      JSON.create_id => klass,
-      'v'            => values,
-    }
-  end
-
-  # Stores class name (Struct) with Struct values <tt>v</tt> as a JSON string.
-  # Only named structs are supported.
-  def to_json(*args)
-    as_json.to_json(*args)
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/add/symbol.rb b/vendor/json_pure-1.7.7/lib/json/add/symbol.rb
deleted file mode 100644
index 03dc9a5..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/symbol.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
-  require 'json'
-end
-
-# Symbol serialization/deserialization
-class Symbol
-  # Returns a hash, that will be turned into a JSON object and represent this
-  # object.
-  def as_json(*)
-    {
-      JSON.create_id => self.class.name,
-      's'            => to_s,
-    }
-  end
-
-  # Stores class name (Symbol) with String representation of Symbol as a JSON string.
-  def to_json(*a)
-    as_json.to_json(*a)
-  end
-
-  # Deserializes JSON string by converting the <tt>string</tt> value stored in the object to a Symbol
-  def self.json_create(o)
-    o['s'].to_sym
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/add/time.rb b/vendor/json_pure-1.7.7/lib/json/add/time.rb
deleted file mode 100644
index 338209d..0000000
--- a/vendor/json_pure-1.7.7/lib/json/add/time.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
-  require 'json'
-end
-
-# Time serialization/deserialization
-class Time
-
-  # Deserializes JSON string by converting time since epoch to Time
-  def self.json_create(object)
-    if usec = object.delete('u') # used to be tv_usec -> tv_nsec
-      object['n'] = usec * 1000
-    end
-    if instance_methods.include?(:tv_nsec)
-      at(object['s'], Rational(object['n'], 1000))
-    else
-      at(object['s'], object['n'] / 1000)
-    end
-  end
-
-  # Returns a hash, that will be turned into a JSON object and represent this
-  # object.
-  def as_json(*)
-    nanoseconds = [ tv_usec * 1000 ]
-    respond_to?(:tv_nsec) and nanoseconds << tv_nsec
-    nanoseconds = nanoseconds.max
-    {
-      JSON.create_id => self.class.name,
-      's'            => tv_sec,
-      'n'            => nanoseconds,
-    }
-  end
-
-  # Stores class name (Time) with number of seconds since epoch and number of
-  # microseconds for Time as JSON string
-  def to_json(*args)
-    as_json.to_json(*args)
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/common.rb b/vendor/json_pure-1.7.7/lib/json/common.rb
deleted file mode 100644
index 65a74a1..0000000
--- a/vendor/json_pure-1.7.7/lib/json/common.rb
+++ /dev/null
@@ -1,487 +0,0 @@
-require 'json/version'
-require 'json/generic_object'
-
-module JSON
-  class << self
-    # If _object_ is string-like, parse the string and return the parsed result
-    # as a Ruby data structure. Otherwise generate a JSON text from the Ruby
-    # data structure object and return it.
-    #
-    # The _opts_ argument is passed through to generate/parse respectively. See
-    # generate and parse for their documentation.
-    def [](object, opts = {})
-      if object.respond_to? :to_str
-        JSON.parse(object.to_str, opts)
-      else
-        JSON.generate(object, opts)
-      end
-    end
-
-    # Returns the JSON parser class that is used by JSON. This is either
-    # JSON::Ext::Parser or JSON::Pure::Parser.
-    attr_reader :parser
-
-    # Set the JSON parser class _parser_ to be used by JSON.
-    def parser=(parser) # :nodoc:
-      @parser = parser
-      remove_const :Parser if JSON.const_defined_in?(self, :Parser)
-      const_set :Parser, parser
-    end
-
-    # Return the constant located at _path_. The format of _path_ has to be
-    # either ::A::B::C or A::B::C. In any case, A has to be located at the top
-    # level (absolute namespace path?). If there doesn't exist a constant at
-    # the given path, an ArgumentError is raised.
-    def deep_const_get(path) # :nodoc:
-      path.to_s.split(/::/).inject(Object) do |p, c|
-        case
-        when c.empty?                     then p
-        when JSON.const_defined_in?(p, c) then p.const_get(c)
-        else
-          begin
-            p.const_missing(c)
-          rescue NameError => e
-            raise ArgumentError, "can't get const #{path}: #{e}"
-          end
-        end
-      end
-    end
-
-    # Set the module _generator_ to be used by JSON.
-    def generator=(generator) # :nodoc:
-      old, $VERBOSE = $VERBOSE, nil
-      @generator = generator
-      generator_methods = generator::GeneratorMethods
-      for const in generator_methods.constants
-        klass = deep_const_get(const)
-        modul = generator_methods.const_get(const)
-        klass.class_eval do
-          instance_methods(false).each do |m|
-            m.to_s == 'to_json' and remove_method m
-          end
-          include modul
-        end
-      end
-      self.state = generator::State
-      const_set :State, self.state
-      const_set :SAFE_STATE_PROTOTYPE, State.new
-      const_set :FAST_STATE_PROTOTYPE, State.new(
-        :indent         => '',
-        :space          => '',
-        :object_nl      => "",
-        :array_nl       => "",
-        :max_nesting    => false
-      )
-      const_set :PRETTY_STATE_PROTOTYPE, State.new(
-        :indent         => '  ',
-        :space          => ' ',
-        :object_nl      => "\n",
-        :array_nl       => "\n"
-      )
-    ensure
-      $VERBOSE = old
-    end
-
-    # Returns the JSON generator module that is used by JSON. This is
-    # either JSON::Ext::Generator or JSON::Pure::Generator.
-    attr_reader :generator
-
-    # Returns the JSON generator state class that is used by JSON. This is
-    # either JSON::Ext::Generator::State or JSON::Pure::Generator::State.
-    attr_accessor :state
-
-    # This is create identifier, which is used to decide if the _json_create_
-    # hook of a class should be called. It defaults to 'json_class'.
-    attr_accessor :create_id
-  end
-  self.create_id = 'json_class'
-
-  NaN           = 0.0/0
-
-  Infinity      = 1.0/0
-
-  MinusInfinity = -Infinity
-
-  # The base exception for JSON errors.
-  class JSONError < StandardError
-    def self.wrap(exception)
-      obj = new("Wrapped(#{exception.class}): #{exception.message.inspect}")
-      obj.set_backtrace exception.backtrace
-      obj
-    end
-  end
-
-  # This exception is raised if a parser error occurs.
-  class ParserError < JSONError; end
-
-  # This exception is raised if the nesting of parsed data structures is too
-  # deep.
-  class NestingError < ParserError; end
-
-  # :stopdoc:
-  class CircularDatastructure < NestingError; end
-  # :startdoc:
-
-  # This exception is raised if a generator or unparser error occurs.
-  class GeneratorError < JSONError; end
-  # For backwards compatibility
-  UnparserError = GeneratorError
-
-  # This exception is raised if the required unicode support is missing on the
-  # system. Usually this means that the iconv library is not installed.
-  class MissingUnicodeSupport < JSONError; end
-
-  module_function
-
-  # Parse the JSON document _source_ into a Ruby data structure and return it.
-  #
-  # _opts_ can have the following
-  # keys:
-  # * *max_nesting*: The maximum depth of nesting allowed in the parsed data
-  #   structures. Disable depth checking with :max_nesting => false. It defaults
-  #   to 100.
-  # * *allow_nan*: If set to true, allow NaN, Infinity and -Infinity in
-  #   defiance of RFC 4627 to be parsed by the Parser. This option defaults
-  #   to false.
-  # * *symbolize_names*: If set to true, returns symbols for the names
-  #   (keys) in a JSON object. Otherwise strings are returned. Strings are
-  #   the default.
-  # * *create_additions*: If set to false, the Parser doesn't create
-  #   additions even if a matching class and create_id was found. This option
-  #   defaults to true.
-  # * *object_class*: Defaults to Hash
-  # * *array_class*: Defaults to Array
-  def parse(source, opts = {})
-    Parser.new(source, opts).parse
-  end
-
-  # Parse the JSON document _source_ into a Ruby data structure and return it.
-  # The bang version of the parse method defaults to the more dangerous values
-  # for the _opts_ hash, so be sure only to parse trusted _source_ documents.
-  #
-  # _opts_ can have the following keys:
-  # * *max_nesting*: The maximum depth of nesting allowed in the parsed data
-  #   structures. Enable depth checking with :max_nesting => anInteger. The parse!
-  #   methods defaults to not doing max depth checking: This can be dangerous
-  #   if someone wants to fill up your stack.
-  # * *allow_nan*: If set to true, allow NaN, Infinity, and -Infinity in
-  #   defiance of RFC 4627 to be parsed by the Parser. This option defaults
-  #   to true.
-  # * *create_additions*: If set to false, the Parser doesn't create
-  #   additions even if a matching class and create_id was found. This option
-  #   defaults to true.
-  def parse!(source, opts = {})
-    opts = {
-      :max_nesting  => false,
-      :allow_nan    => true
-    }.update(opts)
-    Parser.new(source, opts).parse
-  end
-
-  # Generate a JSON document from the Ruby data structure _obj_ and return
-  # it. _state_ is * a JSON::State object,
-  # * or a Hash like object (responding to to_hash),
-  # * an object convertible into a hash by a to_h method,
-  # that is used as or to configure a State object.
-  #
-  # It defaults to a state object, that creates the shortest possible JSON text
-  # in one line, checks for circular data structures and doesn't allow NaN,
-  # Infinity, and -Infinity.
-  #
-  # A _state_ hash can have the following keys:
-  # * *indent*: a string used to indent levels (default: ''),
-  # * *space*: a string that is put after, a : or , delimiter (default: ''),
-  # * *space_before*: a string that is put before a : pair delimiter (default: ''),
-  # * *object_nl*: a string that is put at the end of a JSON object (default: ''),
-  # * *array_nl*: a string that is put at the end of a JSON array (default: ''),
-  # * *allow_nan*: true if NaN, Infinity, and -Infinity should be
-  #   generated, otherwise an exception is thrown if these values are
-  #   encountered. This options defaults to false.
-  # * *max_nesting*: The maximum depth of nesting allowed in the data
-  #   structures from which JSON is to be generated. Disable depth checking
-  #   with :max_nesting => false, it defaults to 100.
-  #
-  # See also the fast_generate for the fastest creation method with the least
-  # amount of sanity checks, and the pretty_generate method for some
-  # defaults for pretty output.
-  def generate(obj, opts = nil)
-    if State === opts
-      state, opts = opts, nil
-    else
-      state = SAFE_STATE_PROTOTYPE.dup
-    end
-    if opts
-      if opts.respond_to? :to_hash
-        opts = opts.to_hash
-      elsif opts.respond_to? :to_h
-        opts = opts.to_h
-      else
-        raise TypeError, "can't convert #{opts.class} into Hash"
-      end
-      state = state.configure(opts)
-    end
-    state.generate(obj)
-  end
-
-  # :stopdoc:
-  # I want to deprecate these later, so I'll first be silent about them, and
-  # later delete them.
-  alias unparse generate
-  module_function :unparse
-  # :startdoc:
-
-  # Generate a JSON document from the Ruby data structure _obj_ and return it.
-  # This method disables the checks for circles in Ruby objects.
-  #
-  # *WARNING*: Be careful not to pass any Ruby data structures with circles as
-  # _obj_ argument because this will cause JSON to go into an infinite loop.
-  def fast_generate(obj, opts = nil)
-    if State === opts
-      state, opts = opts, nil
-    else
-      state = FAST_STATE_PROTOTYPE.dup
-    end
-    if opts
-      if opts.respond_to? :to_hash
-        opts = opts.to_hash
-      elsif opts.respond_to? :to_h
-        opts = opts.to_h
-      else
-        raise TypeError, "can't convert #{opts.class} into Hash"
-      end
-      state.configure(opts)
-    end
-    state.generate(obj)
-  end
-
-  # :stopdoc:
-  # I want to deprecate these later, so I'll first be silent about them, and later delete them.
-  alias fast_unparse fast_generate
-  module_function :fast_unparse
-  # :startdoc:
-
-  # Generate a JSON document from the Ruby data structure _obj_ and return it.
-  # The returned document is a prettier form of the document returned by
-  # #unparse.
-  #
-  # The _opts_ argument can be used to configure the generator. See the
-  # generate method for a more detailed explanation.
-  def pretty_generate(obj, opts = nil)
-    if State === opts
-      state, opts = opts, nil
-    else
-      state = PRETTY_STATE_PROTOTYPE.dup
-    end
-    if opts
-      if opts.respond_to? :to_hash
-        opts = opts.to_hash
-      elsif opts.respond_to? :to_h
-        opts = opts.to_h
-      else
-        raise TypeError, "can't convert #{opts.class} into Hash"
-      end
-      state.configure(opts)
-    end
-    state.generate(obj)
-  end
-
-  # :stopdoc:
-  # I want to deprecate these later, so I'll first be silent about them, and later delete them.
-  alias pretty_unparse pretty_generate
-  module_function :pretty_unparse
-  # :startdoc:
-
-  class << self
-    # The global default options for the JSON.load method:
-    #  :max_nesting: false
-    #  :allow_nan:   true
-    #  :quirks_mode: true
-    attr_accessor :load_default_options
-  end
-  self.load_default_options = {
-    :max_nesting      => false,
-    :allow_nan        => true,
-    :quirks_mode      => true,
-    :create_additions => true,
-  }
-
-  # Load a ruby data structure from a JSON _source_ and return it. A source can
-  # either be a string-like object, an IO-like object, or an object responding
-  # to the read method. If _proc_ was given, it will be called with any nested
-  # Ruby object as an argument recursively in depth first order. To modify the
-  # default options pass in the optional _options_ argument as well.
-  #
-  # BEWARE: This method is meant to serialise data from trusted user input,
-  # like from your own database server or clients under your control, it could
-  # be dangerous to allow untrusted users to pass JSON sources into it. The
-  # default options for the parser can be changed via the load_default_options
-  # method.
-  #
-  # This method is part of the implementation of the load/dump interface of
-  # Marshal and YAML.
-  def load(source, proc = nil, options = {})
-    opts = load_default_options.merge options
-    if source.respond_to? :to_str
-      source = source.to_str
-    elsif source.respond_to? :to_io
-      source = source.to_io.read
-    elsif source.respond_to?(:read)
-      source = source.read
-    end
-    if opts[:quirks_mode] && (source.nil? || source.empty?)
-      source = 'null'
-    end
-    result = parse(source, opts)
-    recurse_proc(result, &proc) if proc
-    result
-  end
-
-  # Recursively calls passed _Proc_ if the parsed data structure is an _Array_ or _Hash_
-  def recurse_proc(result, &proc)
-    case result
-    when Array
-      result.each { |x| recurse_proc x, &proc }
-      proc.call result
-    when Hash
-      result.each { |x, y| recurse_proc x, &proc; recurse_proc y, &proc }
-      proc.call result
-    else
-      proc.call result
-    end
-  end
-
-  alias restore load
-  module_function :restore
-
-  class << self
-    # The global default options for the JSON.dump method:
-    #  :max_nesting: false
-    #  :allow_nan:   true
-    #  :quirks_mode: true
-    attr_accessor :dump_default_options
-  end
-  self.dump_default_options = {
-    :max_nesting => false,
-    :allow_nan   => true,
-    :quirks_mode => true,
-  }
-
-  # Dumps _obj_ as a JSON string, i.e. calls generate on the object and returns
-  # the result.
-  #
-  # If anIO (an IO-like object or an object that responds to the write method)
-  # was given, the resulting JSON is written to it.
-  #
-  # If the number of nested arrays or objects exceeds _limit_, an ArgumentError
-  # exception is raised. This argument is similar (but not exactly the
-  # same!) to the _limit_ argument in Marshal.dump.
-  #
-  # The default options for the generator can be changed via the
-  # dump_default_options method.
-  #
-  # This method is part of the implementation of the load/dump interface of
-  # Marshal and YAML.
-  def dump(obj, anIO = nil, limit = nil)
-    if anIO and limit.nil?
-      anIO = anIO.to_io if anIO.respond_to?(:to_io)
-      unless anIO.respond_to?(:write)
-        limit = anIO
-        anIO = nil
-      end
-    end
-    opts = JSON.dump_default_options
-    limit and opts.update(:max_nesting => limit)
-    result = generate(obj, opts)
-    if anIO
-      anIO.write result
-      anIO
-    else
-      result
-    end
-  rescue JSON::NestingError
-    raise ArgumentError, "exceed depth limit"
-  end
-
-  # Swap consecutive bytes of _string_ in place.
-  def self.swap!(string) # :nodoc:
-    0.upto(string.size / 2) do |i|
-      break unless string[2 * i + 1]
-      string[2 * i], string[2 * i + 1] = string[2 * i + 1], string[2 * i]
-    end
-    string
-  end
-
-  # Shortuct for iconv.
-  if ::String.method_defined?(:encode) &&
-    # XXX Rubinius doesn't support ruby 1.9 encoding yet
-    defined?(RUBY_ENGINE) && RUBY_ENGINE != 'rbx'
-  then
-    # Encodes string using Ruby's _String.encode_
-    def self.iconv(to, from, string)
-      string.encode(to, from)
-    end
-  else
-    require 'iconv'
-    # Encodes string using _iconv_ library
-    def self.iconv(to, from, string)
-      Iconv.conv(to, from, string)
-    end
-  end
-
-  if ::Object.method(:const_defined?).arity == 1
-    def self.const_defined_in?(modul, constant)
-      modul.const_defined?(constant)
-    end
-  else
-    def self.const_defined_in?(modul, constant)
-      modul.const_defined?(constant, false)
-    end
-  end
-end
-
-module ::Kernel
-  private
-
-  # Outputs _objs_ to STDOUT as JSON strings in the shortest form, that is in
-  # one line.
-  def j(*objs)
-    objs.each do |obj|
-      puts JSON::generate(obj, :allow_nan => true, :max_nesting => false)
-    end
-    nil
-  end
-
-  # Ouputs _objs_ to STDOUT as JSON strings in a pretty format, with
-  # indentation and over many lines.
-  def jj(*objs)
-    objs.each do |obj|
-      puts JSON::pretty_generate(obj, :allow_nan => true, :max_nesting => false)
-    end
-    nil
-  end
-
-  # If _object_ is string-like, parse the string and return the parsed result as
-  # a Ruby data structure. Otherwise, generate a JSON text from the Ruby data
-  # structure object and return it.
-  #
-  # The _opts_ argument is passed through to generate/parse respectively. See
-  # generate and parse for their documentation.
-  def JSON(object, *args)
-    if object.respond_to? :to_str
-      JSON.parse(object.to_str, args.first)
-    else
-      JSON.generate(object, args.first)
-    end
-  end
-end
-
-# Extends any Class to include _json_creatable?_ method.
-class ::Class
-  # Returns true if this class can be used to create an instance
-  # from a serialised JSON string. The class has to implement a class
-  # method _json_create_ that expects a hash as first parameter. The hash
-  # should include the required data.
-  def json_creatable?
-    respond_to?(:json_create)
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/ext.rb b/vendor/json_pure-1.7.7/lib/json/ext.rb
deleted file mode 100644
index c5f8131..0000000
--- a/vendor/json_pure-1.7.7/lib/json/ext.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-if ENV['SIMPLECOV_COVERAGE'].to_i == 1
-  require 'simplecov'
-  SimpleCov.start do
-    add_filter "/tests/"
-  end
-end
-require 'json/common'
-
-module JSON
-  # This module holds all the modules/classes that implement JSON's
-  # functionality as C extensions.
-  module Ext
-    require 'json/ext/parser'
-    require 'json/ext/generator'
-    $DEBUG and warn "Using Ext extension for JSON."
-    JSON.parser = Parser
-    JSON.generator = Generator
-  end
-
-  JSON_LOADED = true unless defined?(::JSON::JSON_LOADED)
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/generic_object.rb b/vendor/json_pure-1.7.7/lib/json/generic_object.rb
deleted file mode 100644
index 8b1074c..0000000
--- a/vendor/json_pure-1.7.7/lib/json/generic_object.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-require 'ostruct'
-
-module JSON
-  class GenericObject < OpenStruct
-    class << self
-      alias [] new
-
-      def json_creatable?
-        @json_creatable
-      end
-
-      attr_writer :json_creatable
-
-      def json_create(data)
-        data = data.dup
-        data.delete JSON.create_id
-        self[data]
-      end
-
-      def from_hash(object)
-        case
-        when object.respond_to?(:to_hash)
-          result = new
-          object.to_hash.each do |key, value|
-            result[key] = from_hash(value)
-          end
-          result
-        when object.respond_to?(:to_ary)
-          object.to_ary.map { |a| from_hash(a) }
-        else
-          object
-        end
-      end
-    end
-    self.json_creatable = false
-
-    def to_hash
-      table
-    end
-
-    def [](name)
-      table[name.to_sym]
-    end
-
-    def []=(name, value)
-      __send__ "#{name}=", value
-    end
-
-    def |(other)
-      self.class[other.to_hash.merge(to_hash)]
-    end
-
-    def as_json(*)
-      { JSON.create_id => self.class.name }.merge to_hash
-    end
-
-    def to_json(*a)
-      as_json.to_json(*a)
-    end
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/pure.rb b/vendor/json_pure-1.7.7/lib/json/pure.rb
deleted file mode 100644
index b68668b..0000000
--- a/vendor/json_pure-1.7.7/lib/json/pure.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-if ENV['SIMPLECOV_COVERAGE'].to_i == 1
-  require 'simplecov'
-  SimpleCov.start do
-    add_filter "/tests/"
-  end
-end
-require 'json/common'
-require 'json/pure/parser'
-require 'json/pure/generator'
-
-module JSON
-  # This module holds all the modules/classes that implement JSON's
-  # functionality in pure ruby.
-  module Pure
-    $DEBUG and warn "Using Pure library for JSON."
-    JSON.parser = Parser
-    JSON.generator = Generator
-  end
-
-  JSON_LOADED = true unless defined?(::JSON::JSON_LOADED)
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/pure/generator.rb b/vendor/json_pure-1.7.7/lib/json/pure/generator.rb
deleted file mode 100644
index fcbc604..0000000
--- a/vendor/json_pure-1.7.7/lib/json/pure/generator.rb
+++ /dev/null
@@ -1,492 +0,0 @@
-module JSON
-  MAP = {
-    "\x0" => '\u0000',
-    "\x1" => '\u0001',
-    "\x2" => '\u0002',
-    "\x3" => '\u0003',
-    "\x4" => '\u0004',
-    "\x5" => '\u0005',
-    "\x6" => '\u0006',
-    "\x7" => '\u0007',
-    "\b"  =>  '\b',
-    "\t"  =>  '\t',
-    "\n"  =>  '\n',
-    "\xb" => '\u000b',
-    "\f"  =>  '\f',
-    "\r"  =>  '\r',
-    "\xe" => '\u000e',
-    "\xf" => '\u000f',
-    "\x10" => '\u0010',
-    "\x11" => '\u0011',
-    "\x12" => '\u0012',
-    "\x13" => '\u0013',
-    "\x14" => '\u0014',
-    "\x15" => '\u0015',
-    "\x16" => '\u0016',
-    "\x17" => '\u0017',
-    "\x18" => '\u0018',
-    "\x19" => '\u0019',
-    "\x1a" => '\u001a',
-    "\x1b" => '\u001b',
-    "\x1c" => '\u001c',
-    "\x1d" => '\u001d',
-    "\x1e" => '\u001e',
-    "\x1f" => '\u001f',
-    '"'   =>  '\"',
-    '\\'  =>  '\\\\',
-  } # :nodoc:
-
-  # Convert a UTF8 encoded Ruby string _string_ to a JSON string, encoded with
-  # UTF16 big endian characters as \u????, and return it.
-  if defined?(::Encoding)
-    def utf8_to_json(string) # :nodoc:
-      string = string.dup
-      string.force_encoding(::Encoding::ASCII_8BIT)
-      string.gsub!(/["\\\x0-\x1f]/) { MAP[$&] }
-      string.force_encoding(::Encoding::UTF_8)
-      string
-    end
-
-    def utf8_to_json_ascii(string) # :nodoc:
-      string = string.dup
-      string.force_encoding(::Encoding::ASCII_8BIT)
-      string.gsub!(/["\\\x0-\x1f]/n) { MAP[$&] }
-      string.gsub!(/(
-                      (?:
-                        [\xc2-\xdf][\x80-\xbf]    |
-                        [\xe0-\xef][\x80-\xbf]{2} |
-                        [\xf0-\xf4][\x80-\xbf]{3}
-                      )+ |
-                      [\x80-\xc1\xf5-\xff]       # invalid
-                    )/nx) { |c|
-                      c.size == 1 and raise GeneratorError, "invalid utf8 byte: '#{c}'"
-                      s = JSON.iconv('utf-16be', 'utf-8', c).unpack('H*')[0]
-                      s.force_encoding(::Encoding::ASCII_8BIT)
-                      s.gsub!(/.{4}/n, '\\\\u\&')
-                      s.force_encoding(::Encoding::UTF_8)
-                    }
-      string.force_encoding(::Encoding::UTF_8)
-      string
-    rescue => e
-      raise GeneratorError.wrap(e)
-    end
-  else
-    def utf8_to_json(string) # :nodoc:
-      string.gsub(/["\\\x0-\x1f]/n) { MAP[$&] }
-    end
-
-    def utf8_to_json_ascii(string) # :nodoc:
-      string = string.gsub(/["\\\x0-\x1f]/) { MAP[$&] }
-      string.gsub!(/(
-                      (?:
-                        [\xc2-\xdf][\x80-\xbf]    |
-                        [\xe0-\xef][\x80-\xbf]{2} |
-                        [\xf0-\xf4][\x80-\xbf]{3}
-                      )+ |
-                      [\x80-\xc1\xf5-\xff]       # invalid
-                    )/nx) { |c|
-        c.size == 1 and raise GeneratorError, "invalid utf8 byte: '#{c}'"
-        s = JSON.iconv('utf-16be', 'utf-8', c).unpack('H*')[0]
-        s.gsub!(/.{4}/n, '\\\\u\&')
-      }
-      string
-    rescue => e
-      raise GeneratorError.wrap(e)
-    end
-  end
-  module_function :utf8_to_json, :utf8_to_json_ascii
-
-  module Pure
-    module Generator
-      # This class is used to create State instances, that are use to hold data
-      # while generating a JSON text from a Ruby data structure.
-      class State
-        # Creates a State object from _opts_, which ought to be Hash to create
-        # a new State instance configured by _opts_, something else to create
-        # an unconfigured instance. If _opts_ is a State object, it is just
-        # returned.
-        def self.from_state(opts)
-          case
-          when self === opts
-            opts
-          when opts.respond_to?(:to_hash)
-            new(opts.to_hash)
-          when opts.respond_to?(:to_h)
-            new(opts.to_h)
-          else
-            SAFE_STATE_PROTOTYPE.dup
-          end
-        end
-
-        # Instantiates a new State object, configured by _opts_.
-        #
-        # _opts_ can have the following keys:
-        #
-        # * *indent*: a string used to indent levels (default: ''),
-        # * *space*: a string that is put after, a : or , delimiter (default: ''),
-        # * *space_before*: a string that is put before a : pair delimiter (default: ''),
-        # * *object_nl*: a string that is put at the end of a JSON object (default: ''),
-        # * *array_nl*: a string that is put at the end of a JSON array (default: ''),
-        # * *check_circular*: is deprecated now, use the :max_nesting option instead,
-        # * *max_nesting*: sets the maximum level of data structure nesting in
-        #   the generated JSON, max_nesting = 0 if no maximum should be checked.
-        # * *allow_nan*: true if NaN, Infinity, and -Infinity should be
-        #   generated, otherwise an exception is thrown, if these values are
-        #   encountered. This options defaults to false.
-        # * *quirks_mode*: Enables quirks_mode for parser, that is for example
-        #   generating single JSON values instead of documents is possible.
-        def initialize(opts = {})
-          @indent                = ''
-          @space                 = ''
-          @space_before          = ''
-          @object_nl             = ''
-          @array_nl              = ''
-          @allow_nan             = false
-          @ascii_only            = false
-          @quirks_mode           = false
-          @buffer_initial_length = 1024
-          configure opts
-        end
-
-        # This string is used to indent levels in the JSON text.
-        attr_accessor :indent
-
-        # This string is used to insert a space between the tokens in a JSON
-        # string.
-        attr_accessor :space
-
-        # This string is used to insert a space before the ':' in JSON objects.
-        attr_accessor :space_before
-
-        # This string is put at the end of a line that holds a JSON object (or
-        # Hash).
-        attr_accessor :object_nl
-
-        # This string is put at the end of a line that holds a JSON array.
-        attr_accessor :array_nl
-
-        # This integer returns the maximum level of data structure nesting in
-        # the generated JSON, max_nesting = 0 if no maximum is checked.
-        attr_accessor :max_nesting
-
-        # If this attribute is set to true, quirks mode is enabled, otherwise
-        # it's disabled.
-        attr_accessor :quirks_mode
-
-        # :stopdoc:
-        attr_reader :buffer_initial_length
-
-        def buffer_initial_length=(length)
-          if length > 0
-            @buffer_initial_length = length
-          end
-        end
-        # :startdoc:
-
-        # This integer returns the current depth data structure nesting in the
-        # generated JSON.
-        attr_accessor :depth
-
-        def check_max_nesting # :nodoc:
-          return if @max_nesting.zero?
-          current_nesting = depth + 1
-          current_nesting > @max_nesting and
-            raise NestingError, "nesting of #{current_nesting} is too deep"
-        end
-
-        # Returns true, if circular data structures are checked,
-        # otherwise returns false.
-        def check_circular?
-          !@max_nesting.zero?
-        end
-
-        # Returns true if NaN, Infinity, and -Infinity should be considered as
-        # valid JSON and output.
-        def allow_nan?
-          @allow_nan
-        end
-
-        # Returns true, if only ASCII characters should be generated. Otherwise
-        # returns false.
-        def ascii_only?
-          @ascii_only
-        end
-
-        # Returns true, if quirks mode is enabled. Otherwise returns false.
-        def quirks_mode?
-          @quirks_mode
-        end
-
-        # Configure this State instance with the Hash _opts_, and return
-        # itself.
-        def configure(opts)
-          for key, value in opts
-            instance_variable_set "@#{key}", value
-          end
-          @indent                = opts[:indent] if opts.key?(:indent)
-          @space                 = opts[:space] if opts.key?(:space)
-          @space_before          = opts[:space_before] if opts.key?(:space_before)
-          @object_nl             = opts[:object_nl] if opts.key?(:object_nl)
-          @array_nl              = opts[:array_nl] if opts.key?(:array_nl)
-          @allow_nan             = !!opts[:allow_nan] if opts.key?(:allow_nan)
-          @ascii_only            = opts[:ascii_only] if opts.key?(:ascii_only)
-          @depth                 = opts[:depth] || 0
-          @quirks_mode           = opts[:quirks_mode] if opts.key?(:quirks_mode)
-          @buffer_initial_length ||= opts[:buffer_initial_length]
-
-          if !opts.key?(:max_nesting) # defaults to 100
-            @max_nesting = 100
-          elsif opts[:max_nesting]
-            @max_nesting = opts[:max_nesting]
-          else
-            @max_nesting = 0
-          end
-          self
-        end
-        alias merge configure
-
-        # Returns the configuration instance variables as a hash, that can be
-        # passed to the configure method.
-        def to_h
-          result = {}
-          for iv in instance_variables
-            iv = iv.to_s[1..-1]
-            result[iv.to_sym] = self[iv]
-          end
-          result
-        end
-
-        alias to_hash to_h
-
-        # Generates a valid JSON document from object +obj+ and returns the
-        # result. If no valid JSON document can be created this method raises a
-        # GeneratorError exception.
-        def generate(obj)
-          result = obj.to_json(self)
-          unless @quirks_mode
-            unless result =~ /\A\s*\[/ && result =~ /\]\s*\Z/ ||
-              result =~ /\A\s*\{/ && result =~ /\}\s*\Z/
-            then
-              raise GeneratorError, "only generation of JSON objects or arrays allowed"
-            end
-          end
-          result
-        end
-
-        # Return the value returned by method +name+.
-        def [](name)
-          if respond_to?(name)
-            __send__(name)
-          else
-            instance_variable_get("@#{name}")
-          end
-        end
-
-        def []=(name, value)
-          if respond_to?(name_writer = "#{name}=")
-            __send__ name_writer, value
-          else
-            instance_variable_set "@#{name}", value
-          end
-        end
-      end
-
-      module GeneratorMethods
-        module Object
-          # Converts this object to a string (calling #to_s), converts
-          # it to a JSON string, and returns the result. This is a fallback, if no
-          # special method #to_json was defined for some object.
-          def to_json(*) to_s.to_json end
-        end
-
-        module Hash
-          # Returns a JSON string containing a JSON object, that is unparsed from
-          # this Hash instance.
-          # _state_ is a JSON::State object, that can also be used to configure the
-          # produced JSON string output further.
-          # _depth_ is used to find out nesting depth, to indent accordingly.
-          def to_json(state = nil, *)
-            state = State.from_state(state)
-            state.check_max_nesting
-            json_transform(state)
-          end
-
-          private
-
-          def json_shift(state)
-            state.object_nl.empty? or return ''
-            state.indent * state.depth
-          end
-
-          def json_transform(state)
-            delim = ','
-            delim << state.object_nl
-            result = '{'
-            result << state.object_nl
-            depth = state.depth += 1
-            first = true
-            indent = !state.object_nl.empty?
-            each { |key,value|
-              result << delim unless first
-              result << state.indent * depth if indent
-              result << key.to_s.to_json(state)
-              result << state.space_before
-              result << ':'
-              result << state.space
-              result << value.to_json(state)
-              first = false
-            }
-            depth = state.depth -= 1
-            result << state.object_nl
-            result << state.indent * depth if indent if indent
-            result << '}'
-            result
-          end
-        end
-
-        module Array
-          # Returns a JSON string containing a JSON array, that is unparsed from
-          # this Array instance.
-          # _state_ is a JSON::State object, that can also be used to configure the
-          # produced JSON string output further.
-          def to_json(state = nil, *)
-            state = State.from_state(state)
-            state.check_max_nesting
-            json_transform(state)
-          end
-
-          private
-
-          def json_transform(state)
-            delim = ','
-            delim << state.array_nl
-            result = '['
-            result << state.array_nl
-            depth = state.depth += 1
-            first = true
-            indent = !state.array_nl.empty?
-            each { |value|
-              result << delim unless first
-              result << state.indent * depth if indent
-              result << value.to_json(state)
-              first = false
-            }
-            depth = state.depth -= 1
-            result << state.array_nl
-            result << state.indent * depth if indent
-            result << ']'
-          end
-        end
-
-        module Integer
-          # Returns a JSON string representation for this Integer number.
-          def to_json(*) to_s end
-        end
-
-        module Float
-          # Returns a JSON string representation for this Float number.
-          def to_json(state = nil, *)
-            state = State.from_state(state)
-            case
-            when infinite?
-              if state.allow_nan?
-                to_s
-              else
-                raise GeneratorError, "#{self} not allowed in JSON"
-              end
-            when nan?
-              if state.allow_nan?
-                to_s
-              else
-                raise GeneratorError, "#{self} not allowed in JSON"
-              end
-            else
-              to_s
-            end
-          end
-        end
-
-        module String
-          if defined?(::Encoding)
-            # This string should be encoded with UTF-8 A call to this method
-            # returns a JSON string encoded with UTF16 big endian characters as
-            # \u????.
-            def to_json(state = nil, *args)
-              state = State.from_state(state)
-              if encoding == ::Encoding::UTF_8
-                string = self
-              else
-                string = encode(::Encoding::UTF_8)
-              end
-              if state.ascii_only?
-                '"' << JSON.utf8_to_json_ascii(string) << '"'
-              else
-                '"' << JSON.utf8_to_json(string) << '"'
-              end
-            end
-          else
-            # This string should be encoded with UTF-8 A call to this method
-            # returns a JSON string encoded with UTF16 big endian characters as
-            # \u????.
-            def to_json(state = nil, *args)
-              state = State.from_state(state)
-              if state.ascii_only?
-                '"' << JSON.utf8_to_json_ascii(self) << '"'
-              else
-                '"' << JSON.utf8_to_json(self) << '"'
-              end
-            end
-          end
-
-          # Module that holds the extinding methods if, the String module is
-          # included.
-          module Extend
-            # Raw Strings are JSON Objects (the raw bytes are stored in an
-            # array for the key "raw"). The Ruby String can be created by this
-            # module method.
-            def json_create(o)
-              o['raw'].pack('C*')
-            end
-          end
-
-          # Extends _modul_ with the String::Extend module.
-          def self.included(modul)
-            modul.extend Extend
-          end
-
-          # This method creates a raw object hash, that can be nested into
-          # other data structures and will be unparsed as a raw string. This
-          # method should be used, if you want to convert raw strings to JSON
-          # instead of UTF-8 strings, e. g. binary data.
-          def to_json_raw_object
-            {
-              JSON.create_id  => self.class.name,
-              'raw'           => self.unpack('C*'),
-            }
-          end
-
-          # This method creates a JSON text from the result of
-          # a call to to_json_raw_object of this String.
-          def to_json_raw(*args)
-            to_json_raw_object.to_json(*args)
-          end
-        end
-
-        module TrueClass
-          # Returns a JSON string for true: 'true'.
-          def to_json(*) 'true' end
-        end
-
-        module FalseClass
-          # Returns a JSON string for false: 'false'.
-          def to_json(*) 'false' end
-        end
-
-        module NilClass
-          # Returns a JSON string for nil: 'null'.
-          def to_json(*) 'null' end
-        end
-      end
-    end
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/pure/parser.rb b/vendor/json_pure-1.7.7/lib/json/pure/parser.rb
deleted file mode 100644
index a41d1ee..0000000
--- a/vendor/json_pure-1.7.7/lib/json/pure/parser.rb
+++ /dev/null
@@ -1,359 +0,0 @@
-require 'strscan'
-
-module JSON
-  module Pure
-    # This class implements the JSON parser that is used to parse a JSON string
-    # into a Ruby data structure.
-    class Parser < StringScanner
-      STRING                = /" ((?:[^\x0-\x1f"\\] |
-                                   # escaped special characters:
-                                  \\["\\\/bfnrt] |
-                                  \\u[0-9a-fA-F]{4} |
-                                   # match all but escaped special characters:
-                                  \\[\x20-\x21\x23-\x2e\x30-\x5b\x5d-\x61\x63-\x65\x67-\x6d\x6f-\x71\x73\x75-\xff])*)
-                              "/nx
-      INTEGER               = /(-?0|-?[1-9]\d*)/
-      FLOAT                 = /(-?
-                                (?:0|[1-9]\d*)
-                                (?:
-                                  \.\d+(?i:e[+-]?\d+) |
-                                  \.\d+ |
-                                  (?i:e[+-]?\d+)
-                                )
-                                )/x
-      NAN                   = /NaN/
-      INFINITY              = /Infinity/
-      MINUS_INFINITY        = /-Infinity/
-      OBJECT_OPEN           = /\{/
-      OBJECT_CLOSE          = /\}/
-      ARRAY_OPEN            = /\[/
-      ARRAY_CLOSE           = /\]/
-      PAIR_DELIMITER        = /:/
-      COLLECTION_DELIMITER  = /,/
-      TRUE                  = /true/
-      FALSE                 = /false/
-      NULL                  = /null/
-      IGNORE                = %r(
-        (?:
-         //[^\n\r]*[\n\r]| # line comments
-         /\*               # c-style comments
-         (?:
-          [^*/]|        # normal chars
-          /[^*]|        # slashes that do not start a nested comment
-          \*[^/]|       # asterisks that do not end this comment
-          /(?=\*/)      # single slash before this comment's end
-         )*
-           \*/               # the End of this comment
-           |[ \t\r\n]+       # whitespaces: space, horicontal tab, lf, cr
-        )+
-      )mx
-
-      UNPARSED = Object.new
-
-      # Creates a new JSON::Pure::Parser instance for the string _source_.
-      #
-      # It will be configured by the _opts_ hash. _opts_ can have the following
-      # keys:
-      # * *max_nesting*: The maximum depth of nesting allowed in the parsed data
-      #   structures. Disable depth checking with :max_nesting => false|nil|0,
-      #   it defaults to 100.
-      # * *allow_nan*: If set to true, allow NaN, Infinity and -Infinity in
-      #   defiance of RFC 4627 to be parsed by the Parser. This option defaults
-      #   to false.
-      # * *symbolize_names*: If set to true, returns symbols for the names
-      #   (keys) in a JSON object. Otherwise strings are returned, which is also
-      #   the default.
-      # * *create_additions*: If set to true, the Parser creates
-      #   additions when if a matching class and create_id was found. This
-      #   option defaults to false.
-      # * *object_class*: Defaults to Hash
-      # * *array_class*: Defaults to Array
-      # * *quirks_mode*: Enables quirks_mode for parser, that is for example
-      #   parsing single JSON values instead of documents is possible.
-      def initialize(source, opts = {})
-        opts ||= {}
-        unless @quirks_mode = opts[:quirks_mode]
-          source = convert_encoding source
-        end
-        super source
-        if !opts.key?(:max_nesting) # defaults to 100
-          @max_nesting = 100
-        elsif opts[:max_nesting]
-          @max_nesting = opts[:max_nesting]
-        else
-          @max_nesting = 0
-        end
-        @allow_nan = !!opts[:allow_nan]
-        @symbolize_names = !!opts[:symbolize_names]
-        if opts.key?(:create_additions)
-          @create_additions = !!opts[:create_additions]
-        else
-          @create_additions = false
-        end
-        @create_id = @create_additions ? JSON.create_id : nil
-        @object_class = opts[:object_class] || Hash
-        @array_class  = opts[:array_class] || Array
-        @match_string = opts[:match_string]
-      end
-
-      alias source string
-
-      def quirks_mode?
-        !!@quirks_mode
-      end
-
-      def reset
-        super
-        @current_nesting = 0
-      end
-
-      # Parses the current JSON string _source_ and returns the complete data
-      # structure as a result.
-      def parse
-        reset
-        obj = nil
-        if @quirks_mode
-          while !eos? && skip(IGNORE)
-          end
-          if eos?
-            raise ParserError, "source did not contain any JSON!"
-          else
-            obj = parse_value
-            obj == UNPARSED and raise ParserError, "source did not contain any JSON!"
-          end
-        else
-          until eos?
-            case
-            when scan(OBJECT_OPEN)
-              obj and raise ParserError, "source '#{peek(20)}' not in JSON!"
-              @current_nesting = 1
-              obj = parse_object
-            when scan(ARRAY_OPEN)
-              obj and raise ParserError, "source '#{peek(20)}' not in JSON!"
-              @current_nesting = 1
-              obj = parse_array
-            when skip(IGNORE)
-              ;
-            else
-              raise ParserError, "source '#{peek(20)}' not in JSON!"
-            end
-          end
-          obj or raise ParserError, "source did not contain any JSON!"
-        end
-        obj
-      end
-
-      private
-
-      def convert_encoding(source)
-        if source.respond_to?(:to_str)
-          source = source.to_str
-        else
-          raise TypeError, "#{source.inspect} is not like a string"
-        end
-        if defined?(::Encoding)
-          if source.encoding == ::Encoding::ASCII_8BIT
-            b = source[0, 4].bytes.to_a
-            source =
-              case
-              when b.size >= 4 && b[0] == 0 && b[1] == 0 && b[2] == 0
-                source.dup.force_encoding(::Encoding::UTF_32BE).encode!(::Encoding::UTF_8)
-              when b.size >= 4 && b[0] == 0 && b[2] == 0
-                source.dup.force_encoding(::Encoding::UTF_16BE).encode!(::Encoding::UTF_8)
-              when b.size >= 4 && b[1] == 0 && b[2] == 0 && b[3] == 0
-                source.dup.force_encoding(::Encoding::UTF_32LE).encode!(::Encoding::UTF_8)
-              when b.size >= 4 && b[1] == 0 && b[3] == 0
-                source.dup.force_encoding(::Encoding::UTF_16LE).encode!(::Encoding::UTF_8)
-              else
-                source.dup
-              end
-          else
-            source = source.encode(::Encoding::UTF_8)
-          end
-          source.force_encoding(::Encoding::ASCII_8BIT)
-        else
-          b = source
-          source =
-            case
-            when b.size >= 4 && b[0] == 0 && b[1] == 0 && b[2] == 0
-              JSON.iconv('utf-8', 'utf-32be', b)
-            when b.size >= 4 && b[0] == 0 && b[2] == 0
-              JSON.iconv('utf-8', 'utf-16be', b)
-            when b.size >= 4 && b[1] == 0 && b[2] == 0 && b[3] == 0
-              JSON.iconv('utf-8', 'utf-32le', b)
-            when b.size >= 4 && b[1] == 0 && b[3] == 0
-              JSON.iconv('utf-8', 'utf-16le', b)
-            else
-              b
-            end
-        end
-        source
-      end
-
-      # Unescape characters in strings.
-      UNESCAPE_MAP = Hash.new { |h, k| h[k] = k.chr }
-      UNESCAPE_MAP.update({
-        ?"  => '"',
-        ?\\ => '\\',
-        ?/  => '/',
-        ?b  => "\b",
-        ?f  => "\f",
-        ?n  => "\n",
-        ?r  => "\r",
-        ?t  => "\t",
-        ?u  => nil,
-      })
-
-      EMPTY_8BIT_STRING = ''
-      if ::String.method_defined?(:encode)
-        EMPTY_8BIT_STRING.force_encoding Encoding::ASCII_8BIT
-      end
-
-      def parse_string
-        if scan(STRING)
-          return '' if self[1].empty?
-          string = self[1].gsub(%r((?:\\[\\bfnrt"/]|(?:\\u(?:[A-Fa-f\d]{4}))+|\\[\x20-\xff]))n) do |c|
-            if u = UNESCAPE_MAP[$&[1]]
-              u
-            else # \uXXXX
-              bytes = EMPTY_8BIT_STRING.dup
-              i = 0
-              while c[6 * i] == ?\\ && c[6 * i + 1] == ?u
-                bytes << c[6 * i + 2, 2].to_i(16) << c[6 * i + 4, 2].to_i(16)
-                i += 1
-              end
-              JSON.iconv('utf-8', 'utf-16be', bytes)
-            end
-          end
-          if string.respond_to?(:force_encoding)
-            string.force_encoding(::Encoding::UTF_8)
-          end
-          if @create_additions and @match_string
-            for (regexp, klass) in @match_string
-              klass.json_creatable? or next
-              string =~ regexp and return klass.json_create(string)
-            end
-          end
-          string
-        else
-          UNPARSED
-        end
-      rescue => e
-        raise ParserError, "Caught #{e.class} at '#{peek(20)}': #{e}"
-      end
-
-      def parse_value
-        case
-        when scan(FLOAT)
-          Float(self[1])
-        when scan(INTEGER)
-          Integer(self[1])
-        when scan(TRUE)
-          true
-        when scan(FALSE)
-          false
-        when scan(NULL)
-          nil
-        when (string = parse_string) != UNPARSED
-          string
-        when scan(ARRAY_OPEN)
-          @current_nesting += 1
-          ary = parse_array
-          @current_nesting -= 1
-          ary
-        when scan(OBJECT_OPEN)
-          @current_nesting += 1
-          obj = parse_object
-          @current_nesting -= 1
-          obj
-        when @allow_nan && scan(NAN)
-          NaN
-        when @allow_nan && scan(INFINITY)
-          Infinity
-        when @allow_nan && scan(MINUS_INFINITY)
-          MinusInfinity
-        else
-          UNPARSED
-        end
-      end
-
-      def parse_array
-        raise NestingError, "nesting of #@current_nesting is too deep" if
-          @max_nesting.nonzero? && @current_nesting > @max_nesting
-        result = @array_class.new
-        delim = false
-        until eos?
-          case
-          when (value = parse_value) != UNPARSED
-            delim = false
-            result << value
-            skip(IGNORE)
-            if scan(COLLECTION_DELIMITER)
-              delim = true
-            elsif match?(ARRAY_CLOSE)
-              ;
-            else
-              raise ParserError, "expected ',' or ']' in array at '#{peek(20)}'!"
-            end
-          when scan(ARRAY_CLOSE)
-            if delim
-              raise ParserError, "expected next element in array at '#{peek(20)}'!"
-            end
-            break
-          when skip(IGNORE)
-            ;
-          else
-            raise ParserError, "unexpected token in array at '#{peek(20)}'!"
-          end
-        end
-        result
-      end
-
-      def parse_object
-        raise NestingError, "nesting of #@current_nesting is too deep" if
-          @max_nesting.nonzero? && @current_nesting > @max_nesting
-        result = @object_class.new
-        delim = false
-        until eos?
-          case
-          when (string = parse_string) != UNPARSED
-            skip(IGNORE)
-            unless scan(PAIR_DELIMITER)
-              raise ParserError, "expected ':' in object at '#{peek(20)}'!"
-            end
-            skip(IGNORE)
-            unless (value = parse_value).equal? UNPARSED
-              result[@symbolize_names ? string.to_sym : string] = value
-              delim = false
-              skip(IGNORE)
-              if scan(COLLECTION_DELIMITER)
-                delim = true
-              elsif match?(OBJECT_CLOSE)
-                ;
-              else
-                raise ParserError, "expected ',' or '}' in object at '#{peek(20)}'!"
-              end
-            else
-              raise ParserError, "expected value in object at '#{peek(20)}'!"
-            end
-          when scan(OBJECT_CLOSE)
-            if delim
-              raise ParserError, "expected next name, value pair in object at '#{peek(20)}'!"
-            end
-            if @create_additions and klassname = result[@create_id]
-              klass = JSON.deep_const_get klassname
-              break unless klass and klass.json_creatable?
-              result = klass.json_create(result)
-            end
-            break
-          when skip(IGNORE)
-            ;
-          else
-            raise ParserError, "unexpected token in object at '#{peek(20)}'!"
-          end
-        end
-        result
-      end
-    end
-  end
-end
diff --git a/vendor/json_pure-1.7.7/lib/json/version.rb b/vendor/json_pure-1.7.7/lib/json/version.rb
deleted file mode 100644
index 1de3d69..0000000
--- a/vendor/json_pure-1.7.7/lib/json/version.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-module JSON
-  # JSON version
-  VERSION         = '1.7.7'
-  VERSION_ARRAY   = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
-  VERSION_MAJOR   = VERSION_ARRAY[0] # :nodoc:
-  VERSION_MINOR   = VERSION_ARRAY[1] # :nodoc:
-  VERSION_BUILD   = VERSION_ARRAY[2] # :nodoc:
-end
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail1.json b/vendor/json_pure-1.7.7/tests/fixtures/fail1.json
deleted file mode 100644
index 6216b86..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail1.json
+++ /dev/null
@@ -1 +0,0 @@
-"A JSON payload should be an object or array, not a string."
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail10.json b/vendor/json_pure-1.7.7/tests/fixtures/fail10.json
deleted file mode 100644
index 5d8c004..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail10.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Extra value after close": true} "misplaced quoted value"
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail11.json b/vendor/json_pure-1.7.7/tests/fixtures/fail11.json
deleted file mode 100644
index 76eb95b..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail11.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Illegal expression": 1 + 2}
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail12.json b/vendor/json_pure-1.7.7/tests/fixtures/fail12.json
deleted file mode 100644
index 77580a4..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail12.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Illegal invocation": alert()}
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail13.json b/vendor/json_pure-1.7.7/tests/fixtures/fail13.json
deleted file mode 100644
index 379406b..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail13.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Numbers cannot have leading zeroes": 013}
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail14.json b/vendor/json_pure-1.7.7/tests/fixtures/fail14.json
deleted file mode 100644
index 0ed366b..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail14.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Numbers cannot be hex": 0x14}
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail18.json b/vendor/json_pure-1.7.7/tests/fixtures/fail18.json
deleted file mode 100644
index ebc11eb..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail18.json
+++ /dev/null
@@ -1 +0,0 @@
-[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail19.json b/vendor/json_pure-1.7.7/tests/fixtures/fail19.json
deleted file mode 100644
index 3b9c46f..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail19.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Missing colon" null}
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail2.json b/vendor/json_pure-1.7.7/tests/fixtures/fail2.json
deleted file mode 100644
index 6b7c11e..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail2.json
+++ /dev/null
@@ -1 +0,0 @@
-["Unclosed array"
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail20.json b/vendor/json_pure-1.7.7/tests/fixtures/fail20.json
deleted file mode 100644
index 27c1af3..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail20.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Double colon":: null}
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail21.json b/vendor/json_pure-1.7.7/tests/fixtures/fail21.json
deleted file mode 100644
index 6247457..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail21.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Comma instead of colon", null}
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail22.json b/vendor/json_pure-1.7.7/tests/fixtures/fail22.json
deleted file mode 100644
index a775258..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail22.json
+++ /dev/null
@@ -1 +0,0 @@
-["Colon instead of comma": false]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail23.json b/vendor/json_pure-1.7.7/tests/fixtures/fail23.json
deleted file mode 100644
index 494add1..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail23.json
+++ /dev/null
@@ -1 +0,0 @@
-["Bad value", truth]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail24.json b/vendor/json_pure-1.7.7/tests/fixtures/fail24.json
deleted file mode 100644
index caff239..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail24.json
+++ /dev/null
@@ -1 +0,0 @@
-['single quote']
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail25.json b/vendor/json_pure-1.7.7/tests/fixtures/fail25.json
deleted file mode 100644
index 2dfbd25..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail25.json
+++ /dev/null
@@ -1 +0,0 @@
-["tab	character	in	string	"]
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail27.json b/vendor/json_pure-1.7.7/tests/fixtures/fail27.json
deleted file mode 100644
index 6b01a2c..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail27.json
+++ /dev/null
@@ -1,2 +0,0 @@
-["line
-break"]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail28.json b/vendor/json_pure-1.7.7/tests/fixtures/fail28.json
deleted file mode 100644
index 621a010..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail28.json
+++ /dev/null
@@ -1,2 +0,0 @@
-["line\
-break"]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail3.json b/vendor/json_pure-1.7.7/tests/fixtures/fail3.json
deleted file mode 100644
index 168c81e..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail3.json
+++ /dev/null
@@ -1 +0,0 @@
-{unquoted_key: "keys must be quoted"}
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail4.json b/vendor/json_pure-1.7.7/tests/fixtures/fail4.json
deleted file mode 100644
index 9de168b..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail4.json
+++ /dev/null
@@ -1 +0,0 @@
-["extra comma",]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail5.json b/vendor/json_pure-1.7.7/tests/fixtures/fail5.json
deleted file mode 100644
index ddf3ce3..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail5.json
+++ /dev/null
@@ -1 +0,0 @@
-["double extra comma",,]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail6.json b/vendor/json_pure-1.7.7/tests/fixtures/fail6.json
deleted file mode 100644
index ed91580..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail6.json
+++ /dev/null
@@ -1 +0,0 @@
-[   , "<-- missing value"]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail7.json b/vendor/json_pure-1.7.7/tests/fixtures/fail7.json
deleted file mode 100644
index 8a96af3..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail7.json
+++ /dev/null
@@ -1 +0,0 @@
-["Comma after the close"],
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail8.json b/vendor/json_pure-1.7.7/tests/fixtures/fail8.json
deleted file mode 100644
index b28479c..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail8.json
+++ /dev/null
@@ -1 +0,0 @@
-["Extra close"]]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/fail9.json b/vendor/json_pure-1.7.7/tests/fixtures/fail9.json
deleted file mode 100644
index 5815574..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/fail9.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Extra comma": true,}
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/pass1.json b/vendor/json_pure-1.7.7/tests/fixtures/pass1.json
deleted file mode 100644
index 7828fcc..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/pass1.json
+++ /dev/null
@@ -1,56 +0,0 @@
-[
-    "JSON Test Pattern pass1",
-    {"object with 1 member":["array with 1 element"]},
-    {},
-    [],
-    -42,
-    true,
-    false,
-    null,
-    {
-        "integer": 1234567890,
-        "real": -9876.543210,
-        "e": 0.123456789e-12,
-        "E": 1.234567890E+34,
-        "":  23456789012E666,
-        "zero": 0,
-        "one": 1,
-        "space": " ",
-        "quote": "\"",
-        "backslash": "\\",
-        "controls": "\b\f\n\r\t",
-        "slash": "/ & \/",
-        "alpha": "abcdefghijklmnopqrstuvwyz",
-        "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ",
-        "digit": "0123456789",
-        "special": "`1~!@#$%^&*()_+-={':[,]}|;.</>?",
-        "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A",
-        "true": true,
-        "false": false,
-        "null": null,
-        "array":[  ],
-        "object":{  },
-        "address": "50 St. James Street",
-        "url": "http://www.JSON.org/",
-        "comment": "// /* <!-- --",
-        "# -- --> */": " ",
-        " s p a c e d " :[1,2 , 3
-
-,
-
-4 , 5        ,          6           ,7        ],
-        "compact": [1,2,3,4,5,6,7],
-        "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}",
-        "quotes": "" \u0022 %22 0x22 034 &#x22;",
-        "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?"
-: "A key can be any string"
-    },
-    0.5 ,98.6
-,
-99.44
-,
-
-1066
-
-
-,"rosebud"]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/pass15.json b/vendor/json_pure-1.7.7/tests/fixtures/pass15.json
deleted file mode 100644
index fc8376b..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/pass15.json
+++ /dev/null
@@ -1 +0,0 @@
-["Illegal backslash escape: \x15"]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/pass16.json b/vendor/json_pure-1.7.7/tests/fixtures/pass16.json
deleted file mode 100644
index c43ae3c..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/pass16.json
+++ /dev/null
@@ -1 +0,0 @@
-["Illegal backslash escape: \'"]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/pass17.json b/vendor/json_pure-1.7.7/tests/fixtures/pass17.json
deleted file mode 100644
index 62b9214..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/pass17.json
+++ /dev/null
@@ -1 +0,0 @@
-["Illegal backslash escape: \017"]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/pass2.json b/vendor/json_pure-1.7.7/tests/fixtures/pass2.json
deleted file mode 100644
index d3c63c7..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/pass2.json
+++ /dev/null
@@ -1 +0,0 @@
-[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/pass26.json b/vendor/json_pure-1.7.7/tests/fixtures/pass26.json
deleted file mode 100644
index 845d26a..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/pass26.json
+++ /dev/null
@@ -1 +0,0 @@
-["tab\   character\   in\  string\  "]
\ No newline at end of file
diff --git a/vendor/json_pure-1.7.7/tests/fixtures/pass3.json b/vendor/json_pure-1.7.7/tests/fixtures/pass3.json
deleted file mode 100644
index 4528d51..0000000
--- a/vendor/json_pure-1.7.7/tests/fixtures/pass3.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "JSON Test Pattern pass3": {
-        "The outermost value": "must be an object or array.",
-        "In this test": "It is an object."
-    }
-}
diff --git a/vendor/json_pure-1.7.7/tests/setup_variant.rb b/vendor/json_pure-1.7.7/tests/setup_variant.rb
deleted file mode 100644
index 2dab184..0000000
--- a/vendor/json_pure-1.7.7/tests/setup_variant.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-case ENV['JSON']
-when 'pure'
-  $:.unshift 'lib'
-  require 'json/pure'
-when 'ext'
-  $:.unshift 'ext', 'lib'
-  require 'json/ext'
-else
-  $:.unshift 'ext', 'lib'
-  require 'json'
-end
diff --git a/vendor/json_pure-1.7.7/tests/test_json.rb b/vendor/json_pure-1.7.7/tests/test_json.rb
deleted file mode 100644
index 6af6b32..0000000
--- a/vendor/json_pure-1.7.7/tests/test_json.rb
+++ /dev/null
@@ -1,545 +0,0 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
-require 'stringio'
-require 'tempfile'
-require 'ostruct'
-
-unless Array.method_defined?(:permutation)
-  begin
-    require 'enumerator'
-    require 'permutation'
-    class Array
-      def permutation
-        Permutation.for(self).to_enum.map { |x| x.project }
-      end
-    end
-  rescue LoadError
-    warn "Skipping permutation tests."
-  end
-end
-
-class TestJSON < Test::Unit::TestCase
-  include JSON
-
-  def setup
-    @ary = [1, "foo", 3.14, 4711.0, 2.718, nil, [1,-2,3], false, true].map do
-      |x| [x]
-    end
-    @ary_to_parse = ["1", '"foo"', "3.14", "4711.0", "2.718", "null",
-      "[1,-2,3]", "false", "true"].map do
-      |x| "[#{x}]"
-    end
-    @hash = {
-      'a' => 2,
-      'b' => 3.141,
-      'c' => 'c',
-      'd' => [ 1, "b", 3.14 ],
-      'e' => { 'foo' => 'bar' },
-      'g' => "\"\0\037",
-      'h' => 1000.0,
-      'i' => 0.001
-    }
-    @json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},'\
-      '"g":"\\"\\u0000\\u001f","h":1.0E3,"i":1.0E-3}'
-  end
-
-  def test_construction
-    parser = JSON::Parser.new('test')
-    assert_equal 'test', parser.source
-  end
-
-  def assert_equal_float(expected, is)
-    assert_in_delta(expected.first, is.first, 1e-2)
-  end
-
-  def test_parse_simple_arrays
-    assert_equal([], parse('[]'))
-    assert_equal([], parse('  [  ] '))
-    assert_equal([nil], parse('[null]'))
-    assert_equal([false], parse('[false]'))
-    assert_equal([true], parse('[true]'))
-    assert_equal([-23], parse('[-23]'))
-    assert_equal([23], parse('[23]'))
-    assert_equal([0.23], parse('[0.23]'))
-    assert_equal([0.0], parse('[0e0]'))
-    assert_raises(JSON::ParserError) { parse('[+23.2]') }
-    assert_raises(JSON::ParserError) { parse('[+23]') }
-    assert_raises(JSON::ParserError) { parse('[.23]') }
-    assert_raises(JSON::ParserError) { parse('[023]') }
-    assert_equal_float [3.141], parse('[3.141]')
-    assert_equal_float [-3.141], parse('[-3.141]')
-    assert_equal_float [3.141], parse('[3141e-3]')
-    assert_equal_float [3.141], parse('[3141.1e-3]')
-    assert_equal_float [3.141], parse('[3141E-3]')
-    assert_equal_float [3.141], parse('[3141.0E-3]')
-    assert_equal_float [-3.141], parse('[-3141.0e-3]')
-    assert_equal_float [-3.141], parse('[-3141e-3]')
-    assert_raises(ParserError) { parse('[NaN]') }
-    assert parse('[NaN]', :allow_nan => true).first.nan?
-    assert_raises(ParserError) { parse('[Infinity]') }
-    assert_equal [1.0/0], parse('[Infinity]', :allow_nan => true)
-    assert_raises(ParserError) { parse('[-Infinity]') }
-    assert_equal [-1.0/0], parse('[-Infinity]', :allow_nan => true)
-    assert_equal([""], parse('[""]'))
-    assert_equal(["foobar"], parse('["foobar"]'))
-    assert_equal([{}], parse('[{}]'))
-  end
-
-  def test_parse_simple_objects
-    assert_equal({}, parse('{}'))
-    assert_equal({}, parse(' {   }   '))
-    assert_equal({ "a" => nil }, parse('{   "a"   :  null}'))
-    assert_equal({ "a" => nil }, parse('{"a":null}'))
-    assert_equal({ "a" => false }, parse('{   "a"  :  false  }  '))
-    assert_equal({ "a" => false }, parse('{"a":false}'))
-    assert_raises(JSON::ParserError) { parse('{false}') }
-    assert_equal({ "a" => true }, parse('{"a":true}'))
-    assert_equal({ "a" => true }, parse('  { "a" :  true  }   '))
-    assert_equal({ "a" => -23 }, parse('  {  "a"  :  -23  }  '))
-    assert_equal({ "a" => -23 }, parse('  { "a" : -23 } '))
-    assert_equal({ "a" => 23 }, parse('{"a":23  } '))
-    assert_equal({ "a" => 23 }, parse('  { "a"  : 23  } '))
-    assert_equal({ "a" => 0.23 }, parse(' { "a"  :  0.23 }  '))
-    assert_equal({ "a" => 0.23 }, parse('  {  "a"  :  0.23  }  '))
-  end
-
-  def test_parse_json_primitive_values
-    assert_raise(JSON::ParserError) { JSON.parse('') }
-    assert_raise(JSON::ParserError) { JSON.parse('', :quirks_mode => true) }
-    assert_raise(TypeError) { JSON::Parser.new(nil).parse }
-    assert_raise(TypeError) { JSON::Parser.new(nil, :quirks_mode => true).parse }
-    assert_raise(TypeError) { JSON.parse(nil) }
-    assert_raise(TypeError) { JSON.parse(nil, :quirks_mode => true) }
-    assert_raise(JSON::ParserError) { JSON.parse('  /* foo */ ') }
-    assert_raise(JSON::ParserError) { JSON.parse('  /* foo */ ', :quirks_mode => true) }
-    parser = JSON::Parser.new('null')
-    assert_equal false, parser.quirks_mode?
-    assert_raise(JSON::ParserError) { parser.parse }
-    assert_raise(JSON::ParserError) { JSON.parse('null') }
-    assert_equal nil, JSON.parse('null', :quirks_mode => true)
-    parser = JSON::Parser.new('null', :quirks_mode => true)
-    assert_equal true, parser.quirks_mode?
-    assert_equal nil, parser.parse
-    assert_raise(JSON::ParserError) { JSON.parse('false') }
-    assert_equal false, JSON.parse('false', :quirks_mode => true)
-    assert_raise(JSON::ParserError) { JSON.parse('true') }
-    assert_equal true, JSON.parse('true', :quirks_mode => true)
-    assert_raise(JSON::ParserError) { JSON.parse('23') }
-    assert_equal 23, JSON.parse('23', :quirks_mode => true)
-    assert_raise(JSON::ParserError) { JSON.parse('1') }
-    assert_equal 1, JSON.parse('1', :quirks_mode => true)
-    assert_raise(JSON::ParserError) { JSON.parse('3.141') }
-    assert_in_delta 3.141, JSON.parse('3.141', :quirks_mode => true), 1E-3
-    assert_raise(JSON::ParserError) { JSON.parse('18446744073709551616') }
-    assert_equal 2 ** 64, JSON.parse('18446744073709551616', :quirks_mode => true)
-    assert_raise(JSON::ParserError) { JSON.parse('"foo"') }
-    assert_equal 'foo', JSON.parse('"foo"', :quirks_mode => true)
-    assert_raise(JSON::ParserError) { JSON.parse('NaN', :allow_nan => true) }
-    assert JSON.parse('NaN', :quirks_mode => true, :allow_nan => true).nan?
-    assert_raise(JSON::ParserError) { JSON.parse('Infinity', :allow_nan => true) }
-    assert JSON.parse('Infinity', :quirks_mode => true, :allow_nan => true).infinite?
-    assert_raise(JSON::ParserError) { JSON.parse('-Infinity', :allow_nan => true) }
-    assert JSON.parse('-Infinity', :quirks_mode => true, :allow_nan => true).infinite?
-    assert_raise(JSON::ParserError) { JSON.parse('[ 1, ]', :quirks_mode => true) }
-  end
-
-  if Array.method_defined?(:permutation)
-    def test_parse_more_complex_arrays
-      a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
-      a.permutation.each do |perm|
-        json = pretty_generate(perm)
-        assert_equal perm, parse(json)
-      end
-    end
-
-    def test_parse_complex_objects
-      a = [ nil, false, true, "foßbar", [ "n€st€d", true ], { "nested" => true, "n€ßt€ð2" => {} }]
-      a.permutation.each do |perm|
-        s = "a"
-        orig_obj = perm.inject({}) { |h, x| h[s.dup] = x; s = s.succ; h }
-        json = pretty_generate(orig_obj)
-        assert_equal orig_obj, parse(json)
-      end
-    end
-  end
-
-  def test_parse_arrays
-    assert_equal([1,2,3], parse('[1,2,3]'))
-    assert_equal([1.2,2,3], parse('[1.2,2,3]'))
-    assert_equal([[],[[],[]]], parse('[[],[[],[]]]'))
-  end
-
-  def test_parse_values
-    assert_equal([""], parse('[""]'))
-    assert_equal(["\\"], parse('["\\\\"]'))
-    assert_equal(['"'], parse('["\""]'))
-    assert_equal(['\\"\\'], parse('["\\\\\\"\\\\"]'))
-    assert_equal(["\"\b\n\r\t\0\037"],
-      parse('["\"\b\n\r\t\u0000\u001f"]'))
-    for i in 0 ... @ary.size
-      assert_equal(@ary[i], parse(@ary_to_parse[i]))
-    end
-  end
-
-  def test_parse_array
-    assert_equal([], parse('[]'))
-    assert_equal([], parse('  [  ]  '))
-    assert_equal([1], parse('[1]'))
-    assert_equal([1], parse('  [ 1  ]  '))
-    assert_equal(@ary,
-      parse('[[1],["foo"],[3.14],[47.11e+2],[2718.0E-3],[null],[[1,-2,3]]'\
-      ',[false],[true]]'))
-    assert_equal(@ary, parse(%Q{   [   [1] , ["foo"]  ,  [3.14] \t ,  [47.11e+2]\s
-      , [2718.0E-3 ],\r[ null] , [[1, -2, 3 ]], [false ],[ true]\n ]  }))
-  end
-
-  class SubArray < Array
-    def <<(v)
-      @shifted = true
-      super
-    end
-
-    def shifted?
-      @shifted
-    end
-  end
-
-  class SubArray2 < Array
-    def to_json(*a)
-      {
-        JSON.create_id => self.class.name,
-        'ary'          => to_a,
-      }.to_json(*a)
-    end
-
-    def self.json_create(o)
-      o.delete JSON.create_id
-      o['ary']
-    end
-  end
-
-  class SubArrayWrapper
-    def initialize
-      @data = []
-    end
-
-    attr_reader :data
-
-    def [](index)
-      @data[index]
-    end
-
-    def <<(value)
-      @data << value
-      @shifted = true
-    end
-
-    def shifted?
-      @shifted
-    end
-  end
-
-  def test_parse_array_custom_array_derived_class
-    res = parse('[1,2]', :array_class => SubArray)
-    assert_equal([1,2], res)
-    assert_equal(SubArray, res.class)
-    assert res.shifted?
-  end
-
-  def test_parse_array_custom_non_array_derived_class
-    res = parse('[1,2]', :array_class => SubArrayWrapper)
-    assert_equal([1,2], res.data)
-    assert_equal(SubArrayWrapper, res.class)
-    assert res.shifted?
-  end
-
-  def test_parse_object
-    assert_equal({}, parse('{}'))
-    assert_equal({}, parse('  {  }  '))
-    assert_equal({'foo'=>'bar'}, parse('{"foo":"bar"}'))
-    assert_equal({'foo'=>'bar'}, parse('    { "foo"  :   "bar"   }   '))
-  end
-
-  class SubHash < Hash
-    def []=(k, v)
-      @item_set = true
-      super
-    end
-
-    def item_set?
-      @item_set
-    end
-  end
-
-  class SubHash2 < Hash
-    def to_json(*a)
-      {
-        JSON.create_id => self.class.name,
-      }.merge(self).to_json(*a)
-    end
-
-    def self.json_create(o)
-      o.delete JSON.create_id
-      self[o]
-    end
-  end
-
-  class SubOpenStruct < OpenStruct
-    def [](k)
-      __send__(k)
-    end
-
-    def []=(k, v)
-      @item_set = true
-      __send__("#{k}=", v)
-    end
-
-    def item_set?
-      @item_set
-    end
-  end
-
-  def test_parse_object_custom_hash_derived_class
-    res = parse('{"foo":"bar"}', :object_class => SubHash)
-    assert_equal({"foo" => "bar"}, res)
-    assert_equal(SubHash, res.class)
-    assert res.item_set?
-  end
-
-  def test_parse_object_custom_non_hash_derived_class
-    res = parse('{"foo":"bar"}', :object_class => SubOpenStruct)
-    assert_equal "bar", res.foo
-    assert_equal(SubOpenStruct, res.class)
-    assert res.item_set?
-  end
-
-  def test_parse_generic_object
-    res = parse('{"foo":"bar", "baz":{}}', :object_class => JSON::GenericObject)
-    assert_equal(JSON::GenericObject, res.class)
-    assert_equal "bar", res.foo
-    assert_equal "bar", res["foo"]
-    assert_equal "bar", res[:foo]
-    assert_equal "bar", res.to_hash[:foo]
-    assert_equal(JSON::GenericObject, res.baz.class)
-  end
-
-  def test_generate_core_subclasses_with_new_to_json
-    obj = SubHash2["foo" => SubHash2["bar" => true]]
-    obj_json = JSON(obj)
-    obj_again = JSON.parse(obj_json, :create_additions => true)
-    assert_kind_of SubHash2, obj_again
-    assert_kind_of SubHash2, obj_again['foo']
-    assert obj_again['foo']['bar']
-    assert_equal obj, obj_again
-    assert_equal ["foo"], JSON(JSON(SubArray2["foo"]), :create_additions => true)
-  end
-
-  def test_generate_core_subclasses_with_default_to_json
-    assert_equal '{"foo":"bar"}', JSON(SubHash["foo" => "bar"])
-    assert_equal '["foo"]', JSON(SubArray["foo"])
-  end
-
-  def test_generate_of_core_subclasses
-    obj = SubHash["foo" => SubHash["bar" => true]]
-    obj_json = JSON(obj)
-    obj_again = JSON(obj_json)
-    assert_kind_of Hash, obj_again
-    assert_kind_of Hash, obj_again['foo']
-    assert obj_again['foo']['bar']
-    assert_equal obj, obj_again
-  end
-
-  def test_parser_reset
-    parser = Parser.new(@json)
-    assert_equal(@hash, parser.parse)
-    assert_equal(@hash, parser.parse)
-  end
-
-  def test_comments
-    json = <<EOT
-{
-  "key1":"value1", // eol comment
-  "key2":"value2"  /* multi line
-                    *  comment */,
-  "key3":"value3"  /* multi line
-                    // nested eol comment
-                    *  comment */
-}
-EOT
-    assert_equal(
-      { "key1" => "value1", "key2" => "value2", "key3" => "value3" },
-      parse(json))
-    json = <<EOT
-{
-  "key1":"value1"  /* multi line
-                    // nested eol comment
-                    /* illegal nested multi line comment */
-                    *  comment */
-}
-EOT
-    assert_raises(ParserError) { parse(json) }
-    json = <<EOT
-{
-  "key1":"value1"  /* multi line
-                   // nested eol comment
-                   closed multi comment */
-                   and again, throw an Error */
-}
-EOT
-    assert_raises(ParserError) { parse(json) }
-    json = <<EOT
-{
-  "key1":"value1"  /*/*/
-}
-EOT
-    assert_equal({ "key1" => "value1" }, parse(json))
-  end
-
-  def test_backslash
-    data = [ '\\.(?i:gif|jpe?g|png)$' ]
-    json = '["\\\\.(?i:gif|jpe?g|png)$"]'
-    assert_equal json, JSON.generate(data)
-    assert_equal data, JSON.parse(json)
-    #
-    data = [ '\\"' ]
-    json = '["\\\\\""]'
-    assert_equal json, JSON.generate(data)
-    assert_equal data, JSON.parse(json)
-    #
-    json = '["/"]'
-    data = JSON.parse(json)
-    assert_equal ['/'], data
-    assert_equal json, JSON.generate(data)
-    #
-    json = '["\""]'
-    data = JSON.parse(json)
-    assert_equal ['"'], data
-    assert_equal json, JSON.generate(data)
-    json = '["\\\'"]'
-    data = JSON.parse(json)
-    assert_equal ["'"], data
-    assert_equal '["\'"]', JSON.generate(data)
-  end
-
-  def test_wrong_inputs
-    assert_raises(ParserError) { JSON.parse('"foo"') }
-    assert_raises(ParserError) { JSON.parse('123') }
-    assert_raises(ParserError) { JSON.parse('[] bla') }
-    assert_raises(ParserError) { JSON.parse('[] 1') }
-    assert_raises(ParserError) { JSON.parse('[] []') }
-    assert_raises(ParserError) { JSON.parse('[] {}') }
-    assert_raises(ParserError) { JSON.parse('{} []') }
-    assert_raises(ParserError) { JSON.parse('{} {}') }
-    assert_raises(ParserError) { JSON.parse('[NULL]') }
-    assert_raises(ParserError) { JSON.parse('[FALSE]') }
-    assert_raises(ParserError) { JSON.parse('[TRUE]') }
-    assert_raises(ParserError) { JSON.parse('[07]    ') }
-    assert_raises(ParserError) { JSON.parse('[0a]') }
-    assert_raises(ParserError) { JSON.parse('[1.]') }
-    assert_raises(ParserError) { JSON.parse('     ') }
-  end
-
-  def test_nesting
-    assert_raises(JSON::NestingError) { JSON.parse '[[]]', :max_nesting => 1 }
-    assert_raises(JSON::NestingError) { JSON.parser.new('[[]]', :max_nesting => 1).parse }
-    assert_equal [[]], JSON.parse('[[]]', :max_nesting => 2)
-    too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
-    too_deep_ary = eval too_deep
-    assert_raises(JSON::NestingError) { JSON.parse too_deep }
-    assert_raises(JSON::NestingError) { JSON.parser.new(too_deep).parse }
-    assert_raises(JSON::NestingError) { JSON.parse too_deep, :max_nesting => 100 }
-    ok = JSON.parse too_deep, :max_nesting => 101
-    assert_equal too_deep_ary, ok
-    ok = JSON.parse too_deep, :max_nesting => nil
-    assert_equal too_deep_ary, ok
-    ok = JSON.parse too_deep, :max_nesting => false
-    assert_equal too_deep_ary, ok
-    ok = JSON.parse too_deep, :max_nesting => 0
-    assert_equal too_deep_ary, ok
-    assert_raises(JSON::NestingError) { JSON.generate [[]], :max_nesting => 1 }
-    assert_equal '[[]]', JSON.generate([[]], :max_nesting => 2)
-    assert_raises(JSON::NestingError) { JSON.generate too_deep_ary }
-    assert_raises(JSON::NestingError) { JSON.generate too_deep_ary, :max_nesting => 100 }
-    ok = JSON.generate too_deep_ary, :max_nesting => 101
-    assert_equal too_deep, ok
-    ok = JSON.generate too_deep_ary, :max_nesting => nil
-    assert_equal too_deep, ok
-    ok = JSON.generate too_deep_ary, :max_nesting => false
-    assert_equal too_deep, ok
-    ok = JSON.generate too_deep_ary, :max_nesting => 0
-    assert_equal too_deep, ok
-  end
-
-  def test_symbolize_names
-    assert_equal({ "foo" => "bar", "baz" => "quux" },
-      JSON.parse('{"foo":"bar", "baz":"quux"}'))
-    assert_equal({ :foo => "bar", :baz => "quux" },
-      JSON.parse('{"foo":"bar", "baz":"quux"}', :symbolize_names => true))
-  end
-
-  def test_load
-    assert_equal @hash, JSON.load(@json)
-    tempfile = Tempfile.open('json')
-    tempfile.write @json
-    tempfile.rewind
-    assert_equal @hash, JSON.load(tempfile)
-    stringio = StringIO.new(@json)
-    stringio.rewind
-    assert_equal @hash, JSON.load(stringio)
-    assert_equal nil, JSON.load(nil)
-    assert_equal nil, JSON.load('')
-  end
-
-  def test_load_with_options
-    small_hash  = JSON("foo" => 'bar')
-    symbol_hash = { :foo => 'bar' }
-    assert_equal symbol_hash, JSON.load(small_hash, nil, :symbolize_names => true)
-  end
-
-  def test_dump
-    too_deep = '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
-    assert_equal too_deep, JSON.dump(eval(too_deep))
-    assert_kind_of String, Marshal.dump(eval(too_deep))
-    assert_raises(ArgumentError) { JSON.dump(eval(too_deep), 100) }
-    assert_raises(ArgumentError) { Marshal.dump(eval(too_deep), 100) }
-    assert_equal too_deep, JSON.dump(eval(too_deep), 101)
-    assert_kind_of String, Marshal.dump(eval(too_deep), 101)
-    output = StringIO.new
-    JSON.dump(eval(too_deep), output)
-    assert_equal too_deep, output.string
-    output = StringIO.new
-    JSON.dump(eval(too_deep), output, 101)
-    assert_equal too_deep, output.string
-  end
-
-  def test_big_integers
-    json1 = JSON([orig = (1 << 31) - 1])
-    assert_equal orig, JSON[json1][0]
-    json2 = JSON([orig = 1 << 31])
-    assert_equal orig, JSON[json2][0]
-    json3 = JSON([orig = (1 << 62) - 1])
-    assert_equal orig, JSON[json3][0]
-    json4 = JSON([orig = 1 << 62])
-    assert_equal orig, JSON[json4][0]
-    json5 = JSON([orig = 1 << 64])
-    assert_equal orig, JSON[json5][0]
-  end
-
-  if defined?(JSON::Ext::Parser)
-    def test_allocate
-      parser = JSON::Ext::Parser.new("{}")
-      assert_raise(TypeError, '[ruby-core:35079]') {parser.__send__(:initialize, "{}")}
-      parser = JSON::Ext::Parser.allocate
-      assert_raise(TypeError, '[ruby-core:35079]') {parser.source}
-    end
-  end
-
-  def test_argument_encoding
-    source = "{}".force_encoding("ascii-8bit")
-    JSON::Parser.new(source)
-    assert_equal Encoding::ASCII_8BIT, source.encoding
-  end if defined?(Encoding::ASCII_8BIT)
-end
diff --git a/vendor/json_pure-1.7.7/tests/test_json_addition.rb b/vendor/json_pure-1.7.7/tests/test_json_addition.rb
deleted file mode 100644
index a30f06a..0000000
--- a/vendor/json_pure-1.7.7/tests/test_json_addition.rb
+++ /dev/null
@@ -1,196 +0,0 @@
-#!/usr/bin/env ruby
-# -*- coding:utf-8 -*-
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
-require 'json/add/core'
-require 'json/add/complex'
-require 'json/add/rational'
-require 'json/add/bigdecimal'
-require 'json/add/ostruct'
-require 'date'
-
-class TestJSONAddition < Test::Unit::TestCase
-  include JSON
-
-  class A
-    def initialize(a)
-      @a = a
-    end
-
-    attr_reader :a
-
-    def ==(other)
-      a == other.a
-    end
-
-    def self.json_create(object)
-      new(*object['args'])
-    end
-
-    def to_json(*args)
-      {
-        'json_class'  => self.class.name,
-        'args'        => [ @a ],
-      }.to_json(*args)
-    end
-  end
-
-  class A2 < A
-    def to_json(*args)
-      {
-        'json_class'  => self.class.name,
-        'args'        => [ @a ],
-      }.to_json(*args)
-    end
-  end
-
-  class B
-    def self.json_creatable?
-      false
-    end
-
-    def to_json(*args)
-      {
-        'json_class'  => self.class.name,
-      }.to_json(*args)
-    end
-  end
-
-  class C
-    def self.json_creatable?
-      false
-    end
-
-    def to_json(*args)
-      {
-        'json_class'  => 'TestJSONAddition::Nix',
-      }.to_json(*args)
-    end
-  end
-
-  def test_extended_json
-    a = A.new(666)
-    assert A.json_creatable?
-    json = generate(a)
-    a_again = JSON.parse(json, :create_additions => true)
-    assert_kind_of a.class, a_again
-    assert_equal a, a_again
-  end
-
-  def test_extended_json_default
-    a = A.new(666)
-    assert A.json_creatable?
-    json = generate(a)
-    a_hash = JSON.parse(json)
-    assert_kind_of Hash, a_hash
-  end
-
-  def test_extended_json_disabled
-    a = A.new(666)
-    assert A.json_creatable?
-    json = generate(a)
-    a_again = JSON.parse(json, :create_additions => true)
-    assert_kind_of a.class, a_again
-    assert_equal a, a_again
-    a_hash = JSON.parse(json, :create_additions => false)
-    assert_kind_of Hash, a_hash
-    assert_equal(
-      {"args"=>[666], "json_class"=>"TestJSONAddition::A"}.sort_by { |k,| k },
-      a_hash.sort_by { |k,| k }
-    )
-  end
-
-  def test_extended_json_fail1
-    b = B.new
-    assert !B.json_creatable?
-    json = generate(b)
-    assert_equal({ "json_class"=>"TestJSONAddition::B" }, JSON.parse(json))
-  end
-
-  def test_extended_json_fail2
-    c = C.new
-    assert !C.json_creatable?
-    json = generate(c)
-    assert_raises(ArgumentError, NameError) { JSON.parse(json, :create_additions => true) }
-  end
-
-  def test_raw_strings
-    raw = ''
-    raw.respond_to?(:encode!) and raw.encode!(Encoding::ASCII_8BIT)
-    raw_array = []
-    for i in 0..255
-      raw << i
-      raw_array << i
-    end
-    json = raw.to_json_raw
-    json_raw_object = raw.to_json_raw_object
-    hash = { 'json_class' => 'String', 'raw'=> raw_array }
-    assert_equal hash, json_raw_object
-    assert_match(/\A\{.*\}\z/, json)
-    assert_match(/"json_class":"String"/, json)
-    assert_match(/"raw":\[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, [...]
-    raw_again = JSON.parse(json, :create_additions => true)
-    assert_equal raw, raw_again
-  end
-
-  MyJsonStruct = Struct.new 'MyJsonStruct', :foo, :bar
-
-  def test_core
-    t = Time.now
-    assert_equal t, JSON(JSON(t), :create_additions => true)
-    d = Date.today
-    assert_equal d, JSON(JSON(d), :create_additions => true)
-    d = DateTime.civil(2007, 6, 14, 14, 57, 10, Rational(1, 12), 2299161)
-    assert_equal d, JSON(JSON(d), :create_additions => true)
-    assert_equal 1..10, JSON(JSON(1..10), :create_additions => true)
-    assert_equal 1...10, JSON(JSON(1...10), :create_additions => true)
-    assert_equal "a".."c", JSON(JSON("a".."c"), :create_additions => true)
-    assert_equal "a"..."c", JSON(JSON("a"..."c"), :create_additions => true)
-    s = MyJsonStruct.new 4711, 'foot'
-    assert_equal s, JSON(JSON(s), :create_additions => true)
-    struct = Struct.new :foo, :bar
-    s = struct.new 4711, 'foot'
-    assert_raises(JSONError) { JSON(s) }
-    begin
-      raise TypeError, "test me"
-    rescue TypeError => e
-      e_json = JSON.generate e
-      e_again = JSON e_json, :create_additions => true
-      assert_kind_of TypeError, e_again
-      assert_equal e.message, e_again.message
-      assert_equal e.backtrace, e_again.backtrace
-    end
-    assert_equal(/foo/, JSON(JSON(/foo/), :create_additions => true))
-    assert_equal(/foo/i, JSON(JSON(/foo/i), :create_additions => true))
-  end
-
-  def test_utc_datetime
-    now = Time.now
-    d = DateTime.parse(now.to_s, :create_additions => true)                    # usual case
-    assert_equal d, JSON.parse(d.to_json, :create_additions => true)
-    d = DateTime.parse(now.utc.to_s)                # of = 0
-    assert_equal d, JSON.parse(d.to_json, :create_additions => true)
-    d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(1,24))
-    assert_equal d, JSON.parse(d.to_json, :create_additions => true)
-    d = DateTime.civil(2008, 6, 17, 11, 48, 32, Rational(12,24))
-    assert_equal d, JSON.parse(d.to_json, :create_additions => true)
-  end
-
-  def test_rational_complex
-    assert_equal Rational(2, 9), JSON.parse(JSON(Rational(2, 9)), :create_additions => true)
-    assert_equal Complex(2, 9), JSON.parse(JSON(Complex(2, 9)), :create_additions => true)
-  end
-
-  def test_bigdecimal
-    assert_equal BigDecimal('3.141', 23), JSON(JSON(BigDecimal('3.141', 23)), :create_additions => true)
-    assert_equal BigDecimal('3.141', 666), JSON(JSON(BigDecimal('3.141', 666)), :create_additions => true)
-  end
-
-  def test_ostruct
-    o = OpenStruct.new
-    # XXX this won't work; o.foo = { :bar => true }
-    o.foo = { 'bar' => true }
-    assert_equal o, JSON.parse(JSON(o), :create_additions => true)
-  end
-end
diff --git a/vendor/json_pure-1.7.7/tests/test_json_encoding.rb b/vendor/json_pure-1.7.7/tests/test_json_encoding.rb
deleted file mode 100644
index fa7d878..0000000
--- a/vendor/json_pure-1.7.7/tests/test_json_encoding.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
-
-class TestJSONEncoding < Test::Unit::TestCase
-  include JSON
-
-  def setup
-    @utf_8 = '["© ≠ €!"]'
-    @parsed = [ "© ≠ €!" ]
-    @generated = '["\u00a9 \u2260 \u20ac!"]'
-    if String.method_defined?(:encode)
-      @utf_16_data = [@parsed.first.encode('utf-16be', 'utf-8')]
-      @utf_8_ascii_8bit = @utf_8.dup.force_encoding(Encoding::ASCII_8BIT)
-      @utf_16be = @utf_8.encode('utf-16be', 'utf-8')
-      @utf_16be_ascii_8bit = @utf_16be.dup.force_encoding(Encoding::ASCII_8BIT)
-      @utf_16le = @utf_8.encode('utf-16le', 'utf-8')
-      @utf_16le_ascii_8bit = @utf_16le.dup.force_encoding(Encoding::ASCII_8BIT)
-      @utf_32be = @utf_8.encode('utf-32be', 'utf-8')
-      @utf_32be_ascii_8bit = @utf_32be.dup.force_encoding(Encoding::ASCII_8BIT)
-      @utf_32le = @utf_8.encode('utf-32le', 'utf-8')
-      @utf_32le_ascii_8bit = @utf_32le.dup.force_encoding(Encoding::ASCII_8BIT)
-    else
-      require 'iconv'
-      @utf_16_data = Iconv.iconv('utf-16be', 'utf-8', @parsed.first)
-      @utf_8_ascii_8bit = @utf_8.dup
-      @utf_16be, = Iconv.iconv('utf-16be', 'utf-8', @utf_8)
-      @utf_16be_ascii_8bit = @utf_16be.dup
-      @utf_16le, = Iconv.iconv('utf-16le', 'utf-8', @utf_8)
-      @utf_16le_ascii_8bit = @utf_16le.dup
-      @utf_32be, = Iconv.iconv('utf-32be', 'utf-8', @utf_8)
-      @utf_32be_ascii_8bit = @utf_32be.dup
-      @utf_32le, = Iconv.iconv('utf-32le', 'utf-8', @utf_8)
-      @utf_32le_ascii_8bit = @utf_32le.dup
-    end
-  end
-
-  def test_parse
-    assert_equal @parsed, JSON.parse(@utf_8)
-    assert_equal @parsed, JSON.parse(@utf_16be)
-    assert_equal @parsed, JSON.parse(@utf_16le)
-    assert_equal @parsed, JSON.parse(@utf_32be)
-    assert_equal @parsed, JSON.parse(@utf_32le)
-  end
-
-  def test_parse_ascii_8bit
-    assert_equal @parsed, JSON.parse(@utf_8_ascii_8bit)
-    assert_equal @parsed, JSON.parse(@utf_16be_ascii_8bit)
-    assert_equal @parsed, JSON.parse(@utf_16le_ascii_8bit)
-    assert_equal @parsed, JSON.parse(@utf_32be_ascii_8bit)
-    assert_equal @parsed, JSON.parse(@utf_32le_ascii_8bit)
-  end
-
-  def test_generate
-    assert_equal @generated, JSON.generate(@parsed, :ascii_only => true)
-    if defined?(::Encoding)
-      assert_equal @generated, JSON.generate(@utf_16_data, :ascii_only => true)
-    else
-      # XXX checking of correct utf8 data is not as strict (yet?) without :ascii_only
-      assert_raises(JSON::GeneratorError) { JSON.generate(@utf_16_data, :ascii_only => true) }
-    end
-  end
-end
diff --git a/vendor/json_pure-1.7.7/tests/test_json_fixtures.rb b/vendor/json_pure-1.7.7/tests/test_json_fixtures.rb
deleted file mode 100644
index 584dffd..0000000
--- a/vendor/json_pure-1.7.7/tests/test_json_fixtures.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
-
-class TestJSONFixtures < Test::Unit::TestCase
-  def setup
-    fixtures = File.join(File.dirname(__FILE__), 'fixtures/*.json')
-    passed, failed = Dir[fixtures].partition { |f| f['pass'] }
-    @passed = passed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
-    @failed = failed.inject([]) { |a, f| a << [ f, File.read(f) ] }.sort
-  end
-
-  def test_passing
-    for name, source in @passed
-      begin
-        assert JSON.parse(source),
-          "Did not pass for fixture '#{name}': #{source.inspect}"
-      rescue => e
-        warn "\nCaught #{e.class}(#{e}) for fixture '#{name}': #{source.inspect}\n#{e.backtrace * "\n"}"
-        raise e
-      end
-    end
-  end
-
-  def test_failing
-    for name, source in @failed
-      assert_raises(JSON::ParserError, JSON::NestingError,
-        "Did not fail for fixture '#{name}': #{source.inspect}") do
-        JSON.parse(source)
-      end
-    end
-  end
-end
diff --git a/vendor/json_pure-1.7.7/tests/test_json_generate.rb b/vendor/json_pure-1.7.7/tests/test_json_generate.rb
deleted file mode 100644
index 978c625..0000000
--- a/vendor/json_pure-1.7.7/tests/test_json_generate.rb
+++ /dev/null
@@ -1,300 +0,0 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
-
-class TestJSONGenerate < Test::Unit::TestCase
-  include JSON
-
-  def setup
-    @hash = {
-      'a' => 2,
-      'b' => 3.141,
-      'c' => 'c',
-      'd' => [ 1, "b", 3.14 ],
-      'e' => { 'foo' => 'bar' },
-      'g' => "\"\0\037",
-      'h' => 1000.0,
-      'i' => 0.001
-    }
-    @json2 = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},' +
-      '"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
-    @json3 = <<'EOT'.chomp
-{
-  "a": 2,
-  "b": 3.141,
-  "c": "c",
-  "d": [
-    1,
-    "b",
-    3.14
-  ],
-  "e": {
-    "foo": "bar"
-  },
-  "g": "\"\u0000\u001f",
-  "h": 1000.0,
-  "i": 0.001
-}
-EOT
-  end
-
-  def test_generate
-    json = generate(@hash)
-    assert_equal(JSON.parse(@json2), JSON.parse(json))
-    json = JSON[@hash]
-    assert_equal(JSON.parse(@json2), JSON.parse(json))
-    parsed_json = parse(json)
-    assert_equal(@hash, parsed_json)
-    json = generate({1=>2})
-    assert_equal('{"1":2}', json)
-    parsed_json = parse(json)
-    assert_equal({"1"=>2}, parsed_json)
-    assert_raise(GeneratorError) { generate(666) }
-    assert_equal '666', generate(666, :quirks_mode => true)
-  end
-
-  def test_generate_pretty
-    json = pretty_generate(@hash)
-    # hashes aren't (insertion) ordered on every ruby implementation assert_equal(@json3, json)
-    assert_equal(JSON.parse(@json3), JSON.parse(json))
-    parsed_json = parse(json)
-    assert_equal(@hash, parsed_json)
-    json = pretty_generate({1=>2})
-    assert_equal(<<'EOT'.chomp, json)
-{
-  "1": 2
-}
-EOT
-    parsed_json = parse(json)
-    assert_equal({"1"=>2}, parsed_json)
-    assert_raise(GeneratorError) { pretty_generate(666) }
-    assert_equal '666', pretty_generate(666, :quirks_mode => true)
-  end
-
-  def test_fast_generate
-    json = fast_generate(@hash)
-    assert_equal(JSON.parse(@json2), JSON.parse(json))
-    parsed_json = parse(json)
-    assert_equal(@hash, parsed_json)
-    json = fast_generate({1=>2})
-    assert_equal('{"1":2}', json)
-    parsed_json = parse(json)
-    assert_equal({"1"=>2}, parsed_json)
-    assert_raise(GeneratorError) { fast_generate(666) }
-    assert_equal '666', fast_generate(666, :quirks_mode => true)
-  end
-
-  def test_own_state
-    state = State.new
-    json = generate(@hash, state)
-    assert_equal(JSON.parse(@json2), JSON.parse(json))
-    parsed_json = parse(json)
-    assert_equal(@hash, parsed_json)
-    json = generate({1=>2}, state)
-    assert_equal('{"1":2}', json)
-    parsed_json = parse(json)
-    assert_equal({"1"=>2}, parsed_json)
-    assert_raise(GeneratorError) { generate(666, state) }
-    state.quirks_mode = true
-    assert state.quirks_mode?
-    assert_equal '666', generate(666, state)
-  end
-
-  def test_states
-    json = generate({1=>2}, nil)
-    assert_equal('{"1":2}', json)
-    s = JSON.state.new
-    assert s.check_circular?
-    assert s[:check_circular?]
-    h = { 1=>2 }
-    h[3] = h
-    assert_raises(JSON::NestingError) {  generate(h) }
-    assert_raises(JSON::NestingError) {  generate(h, s) }
-    s = JSON.state.new
-    a = [ 1, 2 ]
-    a << a
-    assert_raises(JSON::NestingError) {  generate(a, s) }
-    assert s.check_circular?
-    assert s[:check_circular?]
-  end
-
-  def test_pretty_state
-    state = PRETTY_STATE_PROTOTYPE.dup
-    assert_equal({
-      :allow_nan             => false,
-      :array_nl              => "\n",
-      :ascii_only            => false,
-      :buffer_initial_length => 1024,
-      :quirks_mode           => false,
-      :depth                 => 0,
-      :indent                => "  ",
-      :max_nesting           => 100,
-      :object_nl             => "\n",
-      :space                 => " ",
-      :space_before          => "",
-    }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
-  end
-
-  def test_safe_state
-    state = SAFE_STATE_PROTOTYPE.dup
-    assert_equal({
-      :allow_nan             => false,
-      :array_nl              => "",
-      :ascii_only            => false,
-      :buffer_initial_length => 1024,
-      :quirks_mode           => false,
-      :depth                 => 0,
-      :indent                => "",
-      :max_nesting           => 100,
-      :object_nl             => "",
-      :space                 => "",
-      :space_before          => "",
-    }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
-  end
-
-  def test_fast_state
-    state = FAST_STATE_PROTOTYPE.dup
-    assert_equal({
-      :allow_nan             => false,
-      :array_nl              => "",
-      :ascii_only            => false,
-      :buffer_initial_length => 1024,
-      :quirks_mode           => false,
-      :depth                 => 0,
-      :indent                => "",
-      :max_nesting           => 0,
-      :object_nl             => "",
-      :space                 => "",
-      :space_before          => "",
-    }.sort_by { |n,| n.to_s }, state.to_h.sort_by { |n,| n.to_s })
-  end
-
-  def test_allow_nan
-    assert_raises(GeneratorError) { generate([JSON::NaN]) }
-    assert_equal '[NaN]', generate([JSON::NaN], :allow_nan => true)
-    assert_raises(GeneratorError) { fast_generate([JSON::NaN]) }
-    assert_raises(GeneratorError) { pretty_generate([JSON::NaN]) }
-    assert_equal "[\n  NaN\n]", pretty_generate([JSON::NaN], :allow_nan => true)
-    assert_raises(GeneratorError) { generate([JSON::Infinity]) }
-    assert_equal '[Infinity]', generate([JSON::Infinity], :allow_nan => true)
-    assert_raises(GeneratorError) { fast_generate([JSON::Infinity]) }
-    assert_raises(GeneratorError) { pretty_generate([JSON::Infinity]) }
-    assert_equal "[\n  Infinity\n]", pretty_generate([JSON::Infinity], :allow_nan => true)
-    assert_raises(GeneratorError) { generate([JSON::MinusInfinity]) }
-    assert_equal '[-Infinity]', generate([JSON::MinusInfinity], :allow_nan => true)
-    assert_raises(GeneratorError) { fast_generate([JSON::MinusInfinity]) }
-    assert_raises(GeneratorError) { pretty_generate([JSON::MinusInfinity]) }
-    assert_equal "[\n  -Infinity\n]", pretty_generate([JSON::MinusInfinity], :allow_nan => true)
-  end
-
-  def test_depth
-    ary = []; ary << ary
-    assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
-    assert_raises(JSON::NestingError) { JSON.generate(ary) }
-    assert_equal 0, JSON::SAFE_STATE_PROTOTYPE.depth
-    assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
-    assert_raises(JSON::NestingError) { JSON.pretty_generate(ary) }
-    assert_equal 0, JSON::PRETTY_STATE_PROTOTYPE.depth
-    s = JSON.state.new
-    assert_equal 0, s.depth
-    assert_raises(JSON::NestingError) { ary.to_json(s) }
-    assert_equal 100, s.depth
-  end
-
-  def test_buffer_initial_length
-    s = JSON.state.new
-    assert_equal 1024, s.buffer_initial_length
-    s.buffer_initial_length = 0
-    assert_equal 1024, s.buffer_initial_length
-    s.buffer_initial_length = -1
-    assert_equal 1024, s.buffer_initial_length
-    s.buffer_initial_length = 128
-    assert_equal 128, s.buffer_initial_length
-  end
-
-  def test_gc
-    bignum_too_long_to_embed_as_string = 1234567890123456789012345
-    expect = bignum_too_long_to_embed_as_string.to_s
-    stress, GC.stress = GC.stress, true
-
-    10.times do |i|
-      tmp = bignum_too_long_to_embed_as_string.to_json
-      assert_equal expect, tmp
-    end
-  ensure
-    GC.stress = stress
-  end if GC.respond_to?(:stress=)
-
-  def test_configure_using_configure_and_merge
-    numbered_state = {
-      :indent       => "1",
-      :space        => '2',
-      :space_before => '3',
-      :object_nl    => '4',
-      :array_nl     => '5'
-    }
-    state1 = JSON.state.new
-    state1.merge(numbered_state)
-    assert_equal '1', state1.indent
-    assert_equal '2', state1.space
-    assert_equal '3', state1.space_before
-    assert_equal '4', state1.object_nl
-    assert_equal '5', state1.array_nl
-    state2 = JSON.state.new
-    state2.configure(numbered_state)
-    assert_equal '1', state2.indent
-    assert_equal '2', state2.space
-    assert_equal '3', state2.space_before
-    assert_equal '4', state2.object_nl
-    assert_equal '5', state2.array_nl
-  end
-
-  if defined?(JSON::Ext::Generator)
-    def test_broken_bignum # [ruby-core:38867]
-      pid = fork do
-        Bignum.class_eval do
-          def to_s
-          end
-        end
-        begin
-          JSON::Ext::Generator::State.new.generate(1<<64)
-          exit 1
-        rescue TypeError
-          exit 0
-        end
-      end
-      _, status = Process.waitpid2(pid)
-      assert status.success?
-    rescue NotImplementedError
-      # forking to avoid modifying core class of a parent process and
-      # introducing race conditions of tests are run in parallel
-    end
-  end
-
-  def test_hash_likeness_set_symbol
-    state = JSON.state.new
-    assert_equal nil, state[:foo]
-    assert_equal nil.class, state[:foo].class
-    assert_equal nil, state['foo']
-    state[:foo] = :bar
-    assert_equal :bar, state[:foo]
-    assert_equal :bar, state['foo']
-    state_hash = state.to_hash
-    assert_kind_of Hash, state_hash
-    assert_equal :bar, state_hash[:foo]
-  end
-
-  def test_hash_likeness_set_string
-    state = JSON.state.new
-    assert_equal nil, state[:foo]
-    assert_equal nil, state['foo']
-    state['foo'] = :bar
-    assert_equal :bar, state[:foo]
-    assert_equal :bar, state['foo']
-    state_hash = state.to_hash
-    assert_kind_of Hash, state_hash
-    assert_equal :bar, state_hash[:foo]
-  end
-end
diff --git a/vendor/json_pure-1.7.7/tests/test_json_generic_object.rb b/vendor/json_pure-1.7.7/tests/test_json_generic_object.rb
deleted file mode 100644
index 77ef22e..0000000
--- a/vendor/json_pure-1.7.7/tests/test_json_generic_object.rb
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
-class TestJSONGenericObject < Test::Unit::TestCase
-  include JSON
-
-  def setup
-    @go = GenericObject[ :a => 1, :b => 2 ]
-  end
-
-  def test_attributes
-    assert_equal 1, @go.a
-    assert_equal 1, @go[:a]
-    assert_equal 2, @go.b
-    assert_equal 2, @go[:b]
-    assert_nil @go.c
-    assert_nil @go[:c]
-  end
-
-  def test_generate_json
-    switch_json_creatable do
-      assert_equal @go, JSON(JSON(@go), :create_additions => true)
-    end
-  end
-
-  def test_parse_json
-    assert_kind_of Hash, JSON('{ "json_class": "JSON::GenericObject", "a": 1, "b": 2 }', :create_additions => true)
-    switch_json_creatable do
-      assert_equal @go, l = JSON('{ "json_class": "JSON::GenericObject", "a": 1, "b": 2 }', :create_additions => true)
-      assert_equal 1, l.a
-      assert_equal @go, l = JSON('{ "a": 1, "b": 2 }', :object_class => GenericObject)
-      assert_equal 1, l.a
-      assert_equal GenericObject[:a => GenericObject[:b => 2]],
-        l = JSON('{ "a": { "b": 2 } }', :object_class => GenericObject)
-      assert_equal 2, l.a.b
-    end
-  end
-
-  def test_from_hash
-    result  = GenericObject.from_hash(
-      :foo => { :bar => { :baz => true }, :quux => [ { :foobar => true } ] })
-    assert_kind_of GenericObject, result.foo
-    assert_kind_of GenericObject, result.foo.bar
-    assert_equal   true, result.foo.bar.baz
-    assert_kind_of GenericObject, result.foo.quux.first
-    assert_equal   true, result.foo.quux.first.foobar
-    assert_equal   true, GenericObject.from_hash(true)
-  end
-
-  private
-
-  def switch_json_creatable
-    JSON::GenericObject.json_creatable = true
-    yield
-  ensure
-    JSON::GenericObject.json_creatable = false
-  end
-end
diff --git a/vendor/json_pure-1.7.7/tests/test_json_string_matching.rb b/vendor/json_pure-1.7.7/tests/test_json_string_matching.rb
deleted file mode 100644
index c233df8..0000000
--- a/vendor/json_pure-1.7.7/tests/test_json_string_matching.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
-require 'stringio'
-require 'time'
-
-class TestJSONStringMatching < Test::Unit::TestCase
-  include JSON
-
-  class TestTime < ::Time
-    def self.json_create(string)
-      Time.parse(string)
-    end
-
-    def to_json(*)
-      %{"#{strftime('%FT%T%z')}"}
-    end
-
-    def ==(other)
-      to_i == other.to_i
-    end
-  end
-
-  def test_match_date
-    t = TestTime.new
-    t_json = [ t ].to_json
-    assert_equal [ t ],
-      JSON.parse(t_json, :create_additions => true,
-        :match_string => { /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/ => TestTime })
-    assert_equal [ t.strftime('%FT%T%z') ],
-      JSON.parse(t_json, :create_additions => true,
-        :match_string => { /\A\d{3}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/ => TestTime })
-    assert_equal [ t.strftime('%FT%T%z') ],
-      JSON.parse(t_json,
-        :match_string => { /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{4}\z/ => TestTime })
-  end
-end
diff --git a/vendor/json_pure-1.7.7/tests/test_json_unicode.rb b/vendor/json_pure-1.7.7/tests/test_json_unicode.rb
deleted file mode 100644
index 8352d5c..0000000
--- a/vendor/json_pure-1.7.7/tests/test_json_unicode.rb
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
-
-require 'test/unit'
-require File.join(File.dirname(__FILE__), 'setup_variant')
-
-class TestJSONUnicode < Test::Unit::TestCase
-  include JSON
-
-  def test_unicode
-    assert_equal '""', ''.to_json
-    assert_equal '"\\b"', "\b".to_json
-    assert_equal '"\u0001"', 0x1.chr.to_json
-    assert_equal '"\u001f"', 0x1f.chr.to_json
-    assert_equal '" "', ' '.to_json
-    assert_equal "\"#{0x7f.chr}\"", 0x7f.chr.to_json
-    utf8 = [ "© ≠ €! \01" ]
-    json = '["© ≠ €! \u0001"]'
-    assert_equal json, utf8.to_json(:ascii_only => false)
-    assert_equal utf8, parse(json)
-    json = '["\u00a9 \u2260 \u20ac! \u0001"]'
-    assert_equal json, utf8.to_json(:ascii_only => true)
-    assert_equal utf8, parse(json)
-    utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
-    json = "[\"\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212\"]"
-    assert_equal utf8, parse(json)
-    assert_equal json, utf8.to_json(:ascii_only => false)
-    utf8 = ["\343\201\202\343\201\204\343\201\206\343\201\210\343\201\212"]
-    assert_equal utf8, parse(json)
-    json = "[\"\\u3042\\u3044\\u3046\\u3048\\u304a\"]"
-    assert_equal json, utf8.to_json(:ascii_only => true)
-    assert_equal utf8, parse(json)
-    utf8 = ['საქართველო']
-    json = '["საქართველო"]'
-    assert_equal json, utf8.to_json(:ascii_only => false)
-    json = "[\"\\u10e1\\u10d0\\u10e5\\u10d0\\u10e0\\u10d7\\u10d5\\u10d4\\u10da\\u10dd\"]"
-    assert_equal json, utf8.to_json(:ascii_only => true)
-    assert_equal utf8, parse(json)
-    assert_equal '["Ã"]', JSON.generate(["Ã"], :ascii_only => false)
-    assert_equal '["\\u00c3"]', JSON.generate(["Ã"], :ascii_only => true)
-    assert_equal ["€"], JSON.parse('["\u20ac"]')
-    utf8 = ["\xf0\xa0\x80\x81"]
-    json = "[\"\xf0\xa0\x80\x81\"]"
-    assert_equal json, JSON.generate(utf8, :ascii_only => false)
-    assert_equal utf8, JSON.parse(json)
-    json = '["\ud840\udc01"]'
-    assert_equal json, JSON.generate(utf8, :ascii_only => true)
-    assert_equal utf8, JSON.parse(json)
-  end
-
-  def test_chars
-    (0..0x7f).each do |i|
-      json = '["\u%04x"]' % i
-      if RUBY_VERSION >= "1.9."
-        i = i.chr
-      end
-      assert_equal i, JSON.parse(json).first[0]
-      if i == ?\b
-        generated = JSON.generate(["" << i])
-        assert '["\b"]' == generated || '["\10"]' == generated
-      elsif [?\n, ?\r, ?\t, ?\f].include?(i)
-        assert_equal '[' << ('' << i).dump << ']', JSON.generate(["" << i])
-      elsif i.chr < 0x20.chr
-        assert_equal json, JSON.generate(["" << i])
-      end
-    end
-    assert_raise(JSON::GeneratorError) do
-      JSON.generate(["\x80"], :ascii_only => true)
-    end
-    assert_equal "\302\200", JSON.parse('["\u0080"]').first
-  end
-end
diff --git a/vendor/json_pure-1.7.7/tools/fuzz.rb b/vendor/json_pure-1.7.7/tools/fuzz.rb
deleted file mode 100644
index c0fae12..0000000
--- a/vendor/json_pure-1.7.7/tools/fuzz.rb
+++ /dev/null
@@ -1,139 +0,0 @@
-require 'json'
-
-require 'iconv'
-ISO_8859_1_TO_UTF8 = Iconv.new('utf-8', 'iso-8859-15')
-class ::String
-  def to_utf8
-    ISO_8859_1_TO_UTF8.iconv self
-  end
-end
-
-class Fuzzer
-  def initialize(n, freqs = {})
-    sum = freqs.inject(0.0) { |s, x| s + x.last }
-    freqs.each_key { |x| freqs[x] /= sum }
-    s = 0.0
-    freqs.each_key do |x|
-      freqs[x] = s .. (s + t = freqs[x])
-      s += t
-    end
-    @freqs = freqs
-    @n = n
-    @alpha = (0..0xff).to_a
-  end
-
-  def random_string
-    s = ''
-    30.times { s << @alpha[rand(@alpha.size)] }
-    s.to_utf8
-  end
-
-  def pick
-    r = rand
-    found = @freqs.find { |k, f| f.include? rand }
-    found && found.first
-  end
-
-  def make_pick
-    k = pick
-    case
-    when k == Hash, k == Array
-      k.new
-    when k == true, k == false, k == nil
-      k
-    when k == String
-      random_string
-    when k == Fixnum
-      rand(2 ** 30) - 2 ** 29
-    when k == Bignum
-      rand(2 ** 70) - 2 ** 69
-    end
-  end
-
-  def fuzz(current = nil)
-    if @n > 0
-      case current
-      when nil
-        @n -= 1
-        current = fuzz [ Hash, Array ][rand(2)].new
-      when Array
-        while @n > 0
-          @n -= 1
-          current << case p = make_pick
-          when Array, Hash
-            fuzz(p)
-          else
-            p
-          end
-        end
-      when Hash
-        while @n > 0
-          @n -= 1
-          current[random_string] = case p = make_pick
-          when Array, Hash
-            fuzz(p)
-          else
-            p
-          end
-        end
-      end
-    end
-    current
-  end
-end
-
-class MyState < JSON.state
-  WS = " \r\t\n"
-
-  def initialize
-    super(
-          :indent       => make_spaces,
-          :space        => make_spaces,
-          :space_before => make_spaces,
-          :object_nl    => make_spaces,
-          :array_nl     => make_spaces,
-          :max_nesting  => false
-         )
-  end
-
-  def make_spaces
-    s = ''
-    rand(1).times { s << WS[rand(WS.size)] }
-    s
-  end
-end
-
-n = (ARGV.shift || 500).to_i
-loop do
-  fuzzer = Fuzzer.new(n,
-                      Hash => 25,
-                      Array => 25,
-                      String => 10,
-                      Fixnum => 10,
-                      Bignum => 10,
-                      nil => 5,
-                      true => 5,
-                      false => 5
-                     )
-  o1 = fuzzer.fuzz
-  json = JSON.generate o1, MyState.new
-  if $DEBUG
-    puts "-" * 80
-    puts json, json.size
-  else
-    puts json.size
-  end
-  begin
-    o2 = JSON.parse(json, :max_nesting => false)
-  rescue JSON::ParserError => e
-    puts "Caught #{e.class}: #{e.message}\n#{e.backtrace * "\n"}"
-    puts "o1 = #{o1.inspect}", "json = #{json}", "json_str = #{json.inspect}"
-    puts "locals = #{local_variables.inspect}"
-    exit
-  end
-  if o1 != o2
-    puts "mismatch", "o1 = #{o1.inspect}", "o2 = #{o2.inspect}",
-      "json = #{json}", "json_str = #{json.inspect}"
-    puts "locals = #{local_variables.inspect}"
-  end
-end
diff --git a/vendor/json_pure-1.7.7/tools/server.rb b/vendor/json_pure-1.7.7/tools/server.rb
deleted file mode 100644
index 184a01c..0000000
--- a/vendor/json_pure-1.7.7/tools/server.rb
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/env ruby
-# encoding: utf-8
-
-require 'webrick'
-include WEBrick
-$:.unshift 'ext'
-$:.unshift 'lib'
-require 'json'
-
-class JSONServlet < HTTPServlet::AbstractServlet
-  @@count = 1
-
-  def do_GET(req, res)
-    obj = {
-      "TIME" => Time.now.strftime("%FT%T"),
-      "foo" => "Bär",
-      "bar" => "© ≠ €!",
-      'a' => 2,
-      'b' => 3.141,
-      'COUNT' => @@count += 1,
-      'c' => 'c',
-      'd' => [ 1, "b", 3.14 ],
-      'e' => { 'foo' => 'bar' },
-      'g' => "松本行弘",
-      'h' => 1000.0,
-      'i' => 0.001,
-      'j' => "\xf0\xa0\x80\x81",
-    }
-    res.body = JSON.generate obj
-    res['Content-Type'] = "application/json"
-  end
-end
-
-def create_server(err, dir, port)
-  dir = File.expand_path(dir)
-  err.puts "Surf to:", "http://#{Socket.gethostname}:#{port}"
-
-  s = HTTPServer.new(
-    :Port         => port,
-    :DocumentRoot => dir,
-    :Logger       => WEBrick::Log.new(err),
-    :AccessLog    => [
-      [ err, WEBrick::AccessLog::COMMON_LOG_FORMAT  ],
-      [ err, WEBrick::AccessLog::REFERER_LOG_FORMAT ],
-      [ err, WEBrick::AccessLog::AGENT_LOG_FORMAT   ]
-    ]
-  )
-  s.mount("/json", JSONServlet)
-  s
-end
-
-default_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', 'data'))
-dir = ARGV.shift || default_dir
-port = (ARGV.shift || 6666).to_i
-s = create_server(STDERR, dir, 6666)
-t = Thread.new { s.start }
-trap(:INT) do
-  s.shutdown
-  t.join
-  exit
-end
-sleep

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/tdiary.git



More information about the Pkg-ruby-extras-commits mailing list